././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1738482098.77512 h2-4.2.0/0000755000076500000240000000000014747620663011406 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482064.0 h2-4.2.0/CHANGELOG.rst0000644000076500000240000007443414747620620013434 0ustar00kriechistaffRelease History =============== 4.2.0 (2025-02-01) ------------------ **API Changes (Backward Incompatible)** - Support for Python 3.6 has been removed. - Support for Python 3.7 has been removed. - Support for Python 3.8 has been removed. - Remove mistakenly set `max_inbound_frame_size` attribute on `H2Stream`. **API Changes (Backward Compatible)** - Support for Python 3.11 has been added. - Support for Python 3.12 has been added. - Support for Python 3.13 has been added. - Add an ability to send outbound cookies separately to improve headers compression. - Updated packaging and testing infrastructure. **Bugfixes** - Fix repr() checks for Python 3.11 - Fix asyncio / wsgi examples. - Clarify docs on using curl with http2. 4.1.0 (2021-10-05) ------------------ **Note:** The GitHub repository has been renamed to ``python-hyper/h2``, previously was ``python-hyper/hyper-h2``. **The name of the package on PyPI is unchanged!** API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Support for Python 3.9 has been added. - Support for Python 3.10 has been added. - New example for a Python socket HTTP/2 client. - New `OutputLogger` for use with ``h2.config.logger``. This is only provided for convenience and not part of the stable API. Bugfixes ~~~~~~~~ - Header validation now rejects empty header names with a ProtocolError. While hpack decodes such header blocks without issues, they violate the HTTP semantics. - Fix TE header name in error message. 4.0.0 (2020-09-19) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Support for Python 2.7 has been removed. - Support for Python 3.4 has been removed. - Support for Python 3.5 has been removed. - Support for PyPy (Python 2.7 compatible) has been removed. - Support for Python 3.8 has been added. - Receiving DATA before HEADERS now raises a ProtocolError (see https://tools.ietf.org/html/rfc7540#section-8.1) 3.2.0 (2020-02-08) ------------------ Bugfixes ~~~~~~~~ - Receiving DATA frames on closed (or reset) streams now properly emit a WINDOW_UPDATE to keep the connection flow window topped up. API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.config.logger`` now uses a `trace(...)` function, in addition to `debug(...)`. If you defined a custom logger object, you need to handle these new function calls. 3.1.1 (2019-08-02) ------------------ Bugfixes ~~~~~~~~ - Ignore WINDOW_UPDATE and RST_STREAM frames received after stream closure. 3.1.0 (2019-01-22) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.data_to_send`` first and only argument ``amt`` was renamed to ``amount``. - Support for Python 3.3 has been removed. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``h2.connection.H2Connection.send_data`` now supports ``data`` parameter being a ``memoryview`` object. - Refactor ping-related events: a ``h2.events.PingReceived`` event is fired when a PING frame is received and a ``h2.events.PingAckReceived`` event is fired when a PING frame with an ACK flag is received. ``h2.events.PingAcknowledged`` is deprecated in favour of the identical ``h2.events.PingAckReceived``. - Added ``ENABLE_CONNECT_PROTOCOL`` to ``h2.settings.SettingCodes``. - Support ``CONNECT`` requests with a ``:protocol`` pseudo header thereby supporting RFC 8441. - A limit to the number of closed streams kept in memory by the connection is applied. It can be configured by ``h2.connection.H2Connection.MAX_CLOSED_STREAMS``. Bugfixes ~~~~~~~~ - Debug logging when stream_id is None is now fixed and no longer errors. 3.0.1 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.6.2 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now rejects receiving and sending request header blocks that are missing any of the mandatory pseudo-header fields (:path, :scheme, and :method). - h2 now rejects receiving and sending request header blocks that have an empty :path pseudo-header value. - h2 now rejects receiving and sending request header blocks that contain response-only pseudo-headers, and vice versa. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 2.5.4 (2017-04-03) ------------------ Bugfixes ~~~~~~~~ - CONTINUATION frames sent on closed streams previously caused stream errors of type STREAM_CLOSED. RFC 7540 § 6.10 requires that these be connection errors of type PROTOCOL_ERROR, and so this release changes to match that behaviour. - Remote peers incrementing their inbound connection window beyond the maximum allowed value now cause stream-level errors, rather than connection-level errors, allowing connections to stay up longer. - h2 now correct respects user-initiated changes to the HEADER_TABLE_SIZE local setting, and ensures that if users shrink or increase the header table size it is policed appropriately. 3.0.0 (2017-03-24) ------------------ API Changes (Backward-Incompatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - By default, hyper-h2 now joins together received cookie header fields, per RFC 7540 Section 8.1.2.5. - Added a ``normalize_inbound_headers`` flag to the ``H2Configuration`` object that defaults to ``True``. Setting this to ``False`` changes the behaviour from the previous point back to the v2 behaviour. - Removed deprecated fields from ``h2.errors`` module. - Removed deprecated fields from ``h2.settings`` module. - Removed deprecated ``client_side`` and ``header_encoding`` arguments from ``H2Connection``. - Removed deprecated ``client_side`` and ``header_encoding`` properties from ``H2Connection``. - ``dict`` objects are no longer allowed for user-supplied headers. - The default header encoding is now ``None``, not ``utf-8``: this means that all events that carry headers now return those headers as byte strings by default. The header encoding can be set back to ``utf-8`` to restore the old behaviour. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new ``UnknownFrameReceived`` event that fires when unknown extension frames have been received. This only fires when using hyperframe 5.0 or later: earlier versions of hyperframe cause us to silently ignore extension frames. Bugfixes ~~~~~~~~ None 2.6.1 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.5.3 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.4.4 (2017-03-16) ------------------ Bugfixes ~~~~~~~~ - Allowed hyperframe v5 support while continuing to ignore unexpected frames. 2.6.0 (2017-02-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``h2.events.Event`` class that acts as a base class for all events. - Rather than reject outbound Connection-specific headers, h2 will now normalize the header block by removing them. - Implement equality for the ``h2.settings.Settings`` class. - Added ``h2.settings.SettingCodes``, an enum that is used to store all the HTTP/2 setting codes. This allows us to use a better printed representation of the setting code in most places that it is used. - The ``setting`` field in ``ChangedSetting`` for the ``RemoteSettingsChanged`` and ``SettingsAcknowledged`` events has been updated to be instances of ``SettingCodes`` whenever they correspond to a known setting code. When they are an unknown setting code, they are instead ``int``. As ``SettingCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.settings``. These will be removed in 3.0.0. - Added an optional ``pad_length`` parameter to ``H2Connection.send_data`` to allow the user to include padding on a data frame. - Added a new parameter to the ``h2.config.H2Configuration`` initializer which takes a logger. This allows us to log by providing a logger that conforms to the requirements of this module so that it can be used in different environments. Bugfixes ~~~~~~~~ - Correctly reject pushed request header blocks whenever they have malformed request header blocks. - Correctly normalize pushed request header blocks whenever they have normalizable header fields. - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. - Resolved an issue whereby certain frames received from a peer in the CLOSED state would trigger connection errors when RFC 7540 says they should have triggered stream errors instead. Added more detailed stream closure tracking to ensure we don't throw away connections unnecessarily. 2.5.2 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.4.3 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.3.4 (2017-01-27) ------------------ - Resolved issue where the ``HTTP2-Settings`` header value for plaintext upgrade that was emitted by ``initiate_upgrade_connection`` included the *entire* ``SETTINGS`` frame, instead of just the payload. - Resolved issue where the ``HTTP2-Settings`` header value sent by a client for plaintext upgrade would be ignored by ``initiate_upgrade_connection``, rather than have those settings applied appropriately. 2.5.1 (2016-12-17) ------------------ Bugfixes ~~~~~~~~ - Remote peers are now allowed to send zero or any positive number as a value for ``SETTINGS_MAX_HEADER_LIST_SIZE``, where previously sending zero would raise a ``InvalidSettingsValueError``. 2.5.0 (2016-10-25) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``H2Configuration`` object that allows rich configuration of a ``H2Connection``. This object supersedes the prior keyword arguments to the ``H2Connection`` object, which are now deprecated and will be removed in 3.0. - Added support for automated window management via the ``acknowledge_received_data`` method. See the documentation for more details. - Added a ``DenialOfServiceError`` that is raised whenever a behaviour that looks like a DoS attempt is encountered: for example, an overly large decompressed header list. This is a subclass of ``ProtocolError``. - Added support for setting and managing ``SETTINGS_MAX_HEADER_LIST_SIZE``. This setting is now defaulted to 64kB. - Added ``h2.errors.ErrorCodes``, an enum that is used to store all the HTTP/2 error codes. This allows us to use a better printed representation of the error code in most places that it is used. - The ``error_code`` fields on ``ConnectionTerminated`` and ``StreamReset`` events have been updated to be instances of ``ErrorCodes`` whenever they correspond to a known error code. When they are an unknown error code, they are instead ``int``. As ``ErrorCodes`` is a subclass of ``int``, this is non-breaking. - Deprecated the other fields in ``h2.errors``. These will be removed in 3.0.0. Bugfixes ~~~~~~~~ - Correctly reject request header blocks with neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. - Correctly refuse to send header blocks that contain neither :authority nor Host headers, or header blocks which contain mismatched :authority and Host headers, per RFC 7540 Section 8.1.2.3. - Hyper-h2 will now reject header field names and values that contain leading or trailing whitespace. - Correctly strip leading/trailing whitespace from header field names and values. - Correctly refuse to send header blocks with a TE header whose value is not ``trailers``, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks with connection-specific headers, per RFC 7540 Section 8.1.2.2. - Correctly refuse to send header blocks that contain duplicate pseudo-header fields, or with pseudo-header fields that appear after ordinary header fields, per RFC 7540 Section 8.1.2.1. This may cause passing a dictionary as the header block to ``send_headers`` to throw a ``ProtocolError``, because dictionaries are unordered and so they may trip this check. Passing dictionaries here is deprecated, and callers should change to using a sequence of 2-tuples as their header blocks. - Correctly reject trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly refuse to send trailers that contain HTTP/2 pseudo-header fields, per RFC 7540 Section 8.1.2.1. - Correctly reject responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly refuse to send responses that do not contain the ``:status`` header field, per RFC 7540 Section 8.1.2.4. - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.2 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.3.3 (2016-10-25) ------------------ Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.2.7 (2016-10-25) ------------------ *Final 2.2.X release* Bugfixes ~~~~~~~~ - Correctly update the maximum frame size when the user updates the value of that setting. Prior to this release, if the user updated the maximum frame size hyper-h2 would ignore the update, preventing the remote peer from using the higher frame sizes. 2.4.1 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.3.2 (2016-08-23) ------------------ Bugfixes ~~~~~~~~ - Correctly expect that responses to HEAD requests will have no body regardless of the value of the Content-Length header, and reject those that do. 2.4.0 (2016-07-01) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Adds ``additional_data`` to ``H2Connection.close_connection``, allowing the user to send additional debug data on the GOAWAY frame. - Adds ``last_stream_id`` to ``H2Connection.close_connection``, allowing the user to manually control what the reported last stream ID is. - Add new method: ``prioritize``. - Add support for emitting stream priority information when sending headers frames using three new keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. - Add support for "related events": events that fire simultaneously on a single frame. 2.3.1 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.2.5 (2016-05-12) ------------------ Bugfixes ~~~~~~~~ - Resolved ``AttributeError`` encountered when receiving more than one sequence of CONTINUATION frames on a given connection. 2.3.0 (2016-04-26) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new flag to the ``H2Connection`` constructor: ``header_encoding``, that controls what encoding is used (if any) to decode the headers from bytes to unicode. This defaults to UTF-8 for backward compatibility. To disable the decode and use bytes exclusively, set the field to False, None, or the empty string. This affects all headers, including those pushed by servers. - Bumped the minimum version of HPACK allowed from 2.0 to 2.2. - Added support for advertising RFC 7838 Alternative services. - Allowed users to provide ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` objects to all methods that send headers. - Changed all events that carry headers to emit ``hpack.HeaderTuple`` and ``hpack.NeverIndexedHeaderTuple`` instead of plain tuples. This allows users to maintain header indexing state. - Added support for plaintext upgrade with the ``initiate_upgrade_connection`` method. Bugfixes ~~~~~~~~ - Automatically ensure that all ``Authorization`` and ``Proxy-Authorization`` headers, as well as short ``Cookie`` headers, are prevented from being added to encoding contexts. 2.2.4 (2016-04-25) ------------------ Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.1.5 (2016-04-25) ------------------ *Final 2.1.X release* Bugfixes ~~~~~~~~ - Correctly forbid pseudo-headers that were not defined in RFC 7540. - Ignore AltSvc frames, rather than exploding when receiving them. 2.2.3 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.1.4 (2016-04-13) ------------------ Bugfixes ~~~~~~~~ - Allowed the 4.X series of hyperframe releases as dependencies. 2.2.2 (2016-04-05) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where informational responses were erroneously not allowed to be sent in the ``HALF_CLOSED_REMOTE`` state. - Fixed issue where informational responses were erroneously not allowed to be received in the ``HALF_CLOSED_LOCAL`` state. - Fixed issue where we allowed information responses to be sent or received after final responses. 2.2.1 (2016-03-23) ------------------ Bugfixes ~~~~~~~~ - Fixed issue where users using locales that did not default to UTF-8 were unable to install source distributions of the package. 2.2.0 (2016-03-23) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added support for sending informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added support for receiving informational responses (responses with 1XX status) codes as part of the standard flow. HTTP/2 allows zero or more informational responses with no upper limit: hyper-h2 does too. - Added a new event: ``ReceivedInformationalResponse``. This response is fired when informational responses (those with 1XX status codes). - Added an ``additional_data`` field to the ``ConnectionTerminated`` event that carries any additional data sent on the GOAWAY frame. May be ``None`` if no such data was sent. - Added the ``initial_values`` optional argument to the ``Settings`` object. Bugfixes ~~~~~~~~ - Correctly reject all of the connection-specific headers mentioned in RFC 7540 § 8.1.2.2, not just the ``Connection:`` header. - Defaulted the value of ``SETTINGS_MAX_CONCURRENT_STREAMS`` to 100, unless explicitly overridden. This is a safe defensive initial value for this setting. 2.1.3 (2016-03-16) ------------------ Deprecations ~~~~~~~~~~~~ - Passing dictionaries to ``send_headers`` as the header block is deprecated, and will be removed in 3.0. 2.1.2 (2016-02-17) ------------------ Bugfixes ~~~~~~~~ - Reject attempts to push streams on streams that were themselves pushed: streams can only be pushed on streams that were initiated by the client. - Correctly allow CONTINUATION frames to extend the header block started by a PUSH_PROMISE frame. - Changed our handling of frames received on streams that were reset by the user. Previously these would, at best, cause ProtocolErrors to be raised and the connection to be torn down (rather defeating the point of resetting streams at all) and, at worst, would cause subtle inconsistencies in state between hyper-h2 and the remote peer that could lead to header block decoding errors or flow control blockages. Now when the user resets a stream all further frames received on that stream are ignored except where they affect some form of connection-level state, where they have their effect and are then ignored. - Fixed a bug whereby receiving a PUSH_PROMISE frame on a stream that was closed would cause a RST_STREAM frame to be emitted on the closed-stream, but not the newly-pushed one. Now this causes a ``ProtocolError``. 2.1.1 (2016-02-05) ------------------ Bugfixes ~~~~~~~~ - Added debug representations for all events. - Fixed problems with setup.py that caused trouble on older setuptools/pip installs. 2.1.0 (2016-02-02) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added new field to ``DataReceived``: ``flow_controlled_length``. This is the length of the frame including padded data, allowing users to correctly track changes to the flow control window. - Defined new ``UnsupportedFrameError``, thrown when frames that are known to hyperframe but not supported by hyper-h2 are received. For backward-compatibility reasons, this is a ``ProtocolError`` *and* a ``KeyError``. Bugfixes ~~~~~~~~ - Hyper-h2 now correctly accounts for padding when maintaining flow control windows. - Resolved a bug where hyper-h2 would mistakenly apply SETTINGS_INITIAL_WINDOW_SIZE to the connection flow control window in addition to the stream-level flow control windows. - Invalid Content-Length headers now throw ``ProtocolError`` exceptions and correctly tear the connection down, instead of leaving the connection in an indeterminate state. - Invalid header blocks now throw ``ProtocolError``, rather than a grab bag of possible other exceptions. 2.0.0 (2016-01-25) ------------------ API Changes (Breaking) ~~~~~~~~~~~~~~~~~~~~~~ - Attempts to open streams with invalid stream IDs, either by the remote peer or by the user, are now rejected as a ``ProtocolError``. Previously these were allowed, and would cause remote peers to error. - Receiving frames that have invalid padding now causes the connection to be terminated with a ``ProtocolError`` being raised. Previously these passed undetected. - Settings values set by both the user and the remote peer are now validated when they're set. If they're invalid, a new ``InvalidSettingsValueError`` is raised and, if set by the remote peer, a connection error is signaled. Previously, it was possible to set invalid values. These would either be caught when building frames, or would be allowed to stand. - Settings changes no longer require user action to be acknowledged: hyper-h2 acknowledges them automatically. This moves the location where some exceptions may be thrown, and also causes the ``acknowledge_settings`` method to be removed from the public API. - Removed a number of methods on the ``H2Connection`` object from the public, semantically versioned API, by renaming them to have leading underscores. Specifically, removed: - ``get_stream_by_id`` - ``get_or_create_stream`` - ``begin_new_stream`` - ``receive_frame`` - ``acknowledge_settings`` - Added full support for receiving CONTINUATION frames, including policing logic about when and how they are received. Previously, receiving CONTINUATION frames was not supported and would throw exceptions. - All public API functions on ``H2Connection`` except for ``receive_data`` no longer return lists of events, because these lists were always empty. Events are now only raised by ``receive_data``. - Calls to ``increment_flow_control_window`` with out of range values now raise ``ValueError`` exceptions. Previously they would be allowed, or would cause errors when serializing frames. API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added ``PriorityUpdated`` event for signaling priority changes. - Added ``get_next_available_stream_id`` function. - Receiving DATA frames on streams not in the OPEN or HALF_CLOSED_LOCAL states now causes a stream reset, rather than a connection reset. The error is now also classified as a ``StreamClosedError``, rather than a more generic ``ProtocolError``. - Receiving HEADERS or PUSH_PROMISE frames in the HALF_CLOSED_REMOTE state now causes a stream reset, rather than a connection reset. - Receiving frames that violate the max frame size now causes connection errors with error code FRAME_SIZE_ERROR, not a generic PROTOCOL_ERROR. This condition now also raises a ``FrameTooLargeError``, a new subclass of ``ProtocolError``. - Made ``NoSuchStreamError`` a subclass of ``ProtocolError``. - The ``StreamReset`` event is now also fired whenever a protocol error from the remote peer forces a stream to close early. This is only fired once. - The ``StreamReset`` event now carries a flag, ``remote_reset``, that is set to ``True`` in all cases where ``StreamReset`` would previously have fired (e.g. when the remote peer sent a RST_STREAM), and is set to ``False`` when it fires because the remote peer made a protocol error. - Hyper-h2 now rejects attempts by peers to increment a flow control window by zero bytes. - Hyper-h2 now rejects peers sending header blocks that are ill-formed for a number of reasons as set out in RFC 7540 Section 8.1.2. - Attempting to send non-PRIORITY frames on closed streams now raises ``StreamClosedError``. - Remote peers attempting to increase the flow control window beyond ``2**31 - 1``, either by window increment or by settings frame, are now rejected as ``ProtocolError``. - Local attempts to increase the flow control window beyond ``2**31 - 1`` by window increment are now rejected as ``ProtocolError``. - The bytes that represent individual settings are now available in ``h2.settings``, instead of needing users to import them from hyperframe. Bugfixes ~~~~~~~~ - RFC 7540 requires that a separate minimum stream ID be used for inbound and outbound streams. Hyper-h2 now obeys this requirement. - Hyper-h2 now does a better job of reporting the last stream ID it has partially handled when terminating connections. - Fixed an error in the arguments of ``StreamIDTooLowError``. - Prevent ``ValueError`` leaking from Hyperframe. - Prevent ``struct.error`` and ``InvalidFrameError`` leaking from Hyperframe. 1.1.1 (2015-11-17) ------------------ Bugfixes ~~~~~~~~ - Forcibly lowercase all header names to improve compatibility with implementations that demand lower-case header names. 1.1.0 (2015-10-28) ------------------ API Changes (Backward-Compatible) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Added a new ``ConnectionTerminated`` event, which fires when GOAWAY frames are received. - Added a subclass of ``NoSuchStreamError``, called ``StreamClosedError``, that fires when actions are taken on a stream that is closed and has had its state flushed from the system. - Added ``StreamIDTooLowError``, raised when the user or the remote peer attempts to create a stream with an ID lower than one previously used in the dialog. Inherits from ``ValueError`` for backward-compatibility reasons. Bugfixes ~~~~~~~~ - Do not throw ``ProtocolError`` when attempting to send multiple GOAWAY frames on one connection. - We no longer forcefully change the decoder table size when settings changes are ACKed, instead waiting for remote acknowledgement of the change. - Improve the performance of checking whether a stream is open. - We now attempt to lazily garbage collect closed streams, to avoid having the state hang around indefinitely, leaking memory. - Avoid further per-stream allocations, leading to substantial performance improvements when many short-lived streams are used. 1.0.0 (2015-10-15) ------------------ - First production release! ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1584304126.0 h2-4.2.0/LICENSE0000644000076500000240000000211613633507776012415 0ustar00kriechistaffThe MIT License (MIT) Copyright (c) 2015-2020 Cory Benfield and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/MANIFEST.in0000644000076500000240000000040714744263537013145 0ustar00kriechistaffgraft src/h2 graft docs graft tests graft visualizer graft examples prune docs/build recursive-include examples *.py *.crt *.key *.pem *.csr include README.rst LICENSE CHANGELOG.rst pyproject.toml global-exclude *.pyc *.pyo *.swo *.swp *.map *.yml *.DS_Store ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7747867 h2-4.2.0/PKG-INFO0000644000076500000240000001177414747620663012515 0ustar00kriechistaffMetadata-Version: 2.2 Name: h2 Version: 4.2.0 Summary: Pure-Python HTTP/2 protocol implementation Author-email: Cory Benfield Maintainer-email: Thomas Kriechbaumer License: The MIT License (MIT) Copyright (c) 2015-2020 Cory Benfield and contributors 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. Project-URL: Homepage, https://github.com/python-hyper/h2/ Project-URL: Bug Reports, https://github.com/python-hyper/h2/issues Project-URL: Source, https://github.com/python-hyper/h2/ Project-URL: Documentation, https://python-hyper.org/ Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 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: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: hyperframe<7,>=6.1 Requires-Dist: hpack<5,>=4.1 ========================= h2: HTTP/2 Protocol Stack ========================= .. image:: https://github.com/python-hyper/h2/workflows/CI/badge.svg :target: https://github.com/python-hyper/h2/actions :alt: Build Status .. image:: https://codecov.io/gh/python-hyper/h2/branch/master/graph/badge.svg :target: https://codecov.io/gh/python-hyper/h2 :alt: Code Coverage .. image:: https://readthedocs.org/projects/h2/badge/?version=latest :target: https://h2.readthedocs.io/en/latest/ :alt: Documentation Status .. image:: https://img.shields.io/badge/chat-join_now-brightgreen.svg :target: https://gitter.im/python-hyper/community :alt: Chat community .. image:: https://raw.github.com/python-hyper/documentation/master/source/logo/hyper-black-bg-white.png This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection import h2.config config = h2.config.H2Configuration() conn = h2.connection.H2Connection(config=config) conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ python -m pip install h2 Documentation ============= Documentation is available at https://h2.readthedocs.io . Contributing ============ ``h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``h2`` was authored by Cory Benfield and is maintained by the members of `python-hyper `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1622991709.0 h2-4.2.0/README.rst0000644000076500000240000000476414057161535013100 0ustar00kriechistaff========================= h2: HTTP/2 Protocol Stack ========================= .. image:: https://github.com/python-hyper/h2/workflows/CI/badge.svg :target: https://github.com/python-hyper/h2/actions :alt: Build Status .. image:: https://codecov.io/gh/python-hyper/h2/branch/master/graph/badge.svg :target: https://codecov.io/gh/python-hyper/h2 :alt: Code Coverage .. image:: https://readthedocs.org/projects/h2/badge/?version=latest :target: https://h2.readthedocs.io/en/latest/ :alt: Documentation Status .. image:: https://img.shields.io/badge/chat-join_now-brightgreen.svg :target: https://gitter.im/python-hyper/community :alt: Chat community .. image:: https://raw.github.com/python-hyper/documentation/master/source/logo/hyper-black-bg-white.png This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection import h2.config config = h2.config.H2Configuration() conn = h2.connection.H2Connection(config=config) conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ python -m pip install h2 Documentation ============= Documentation is available at https://h2.readthedocs.io . Contributing ============ ``h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``h2`` was authored by Cory Benfield and is maintained by the members of `python-hyper `_. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7444685 h2-4.2.0/docs/0000755000076500000240000000000014747620663012336 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369228.0 h2-4.2.0/docs/Makefile0000644000076500000240000000117613711524514013767 0ustar00kriechistaff# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build SOURCEDIR = source BUILDDIR = build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369228.0 h2-4.2.0/docs/make.bat0000644000076500000240000000143713711524514013734 0ustar00kriechistaff@ECHO OFF pushd %~dp0 REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set SOURCEDIR=source set BUILDDIR=build if "%1" == "" goto help %SPHINXBUILD% >NUL 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 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7519348 h2-4.2.0/docs/source/0000755000076500000240000000000014747620663013636 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7551484 h2-4.2.0/docs/source/_static/0000755000076500000240000000000014747620663015264 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369308.0 h2-4.2.0/docs/source/_static/.gitkeep0000644000076500000240000000000013711524634016672 0ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369297.0 h2-4.2.0/docs/source/_static/h2.connection.H2ConnectionStateMachine.dot.png0000644000076500000240000244015413711524621026001 0ustar00kriechistaffPNG  IHDR J#sRGB@IDATx5#EAX"h"(%5UOQl`dž"bPA39wogn–wwwK|gR&            ܛK           '@@@@@@@@@@@B*@@@@@@@@@@@g@@@@@@@@@@@B*@@@@@@@@@@@g@@@@@@@@@@@B Y*@@@@@@@H@\);[:xP!)-MJw<#CT)$@@@ x"       K99҆ iƟ۶I6mgeI{H{GwRʁJZ5V-v>ׯ/5l(5jn   ĪX3 @@@@@@@G`VitzjU`}^^3Y%ݻS4g̔7ZL-[JmHmJG-U@@@#'#wzΌ       &`~̑ L(&Y}{V$OC@@@ %xCw       $@NN `?s4cd%Kʧz} W*u"u&|r`j,G@@@\}`.@@@@@@@ Z4}!XgO3S۶q2p   (Nr       #'}'҄ ҴiU/&ժ:U&UT23 ɶMOSSdoڳGʒoyڽ,pƍ~3 -s6@@@ xt F@@@@@@( [~8~*͛NMH <ծ-jM~QZJZ:0[_>ΓN.@BKr4E@@@W/        C`׮@}S17iLQ:8MԶԠA1cY+ŋ%Ky$~iV.v-r@@@$ x|@@@@@@@(,@*ۗ4l*YB6pԡTfsモF[i۶_GK]&]qE#   $$\6       @sHFIRPxժ)H.vZ l_ZI͗/Z2%0-Z$YHp[n5իQ@@@ I'@@@@@@@!-j%l =}SRzzft!eҤIĉ*E⻺rei@[N|7@@@        5ғOJ='mGӦK'%Y؛V+VH~(~ O=5կx"z=@@@J}Rn.@@@@@@@PK=Z:xMVk']ztTR)] 1cݻ;a ]{ݾl   6s        ̚%{o W!+[  ?>d GH`߾@%7ސ{OڿWOۤU["  $\        @DywމI؊jZ:4)%%l:bD +KzuӋ?( 7Sjl  $\       uС+HnyM7*W?_1Bzei qc_ZJM->l   rQ       {JJn)5A`>*-YRw,gQ @@@ '-@@@@@@@|>@2DZwuHgժuIw!5o˓{/ ԩŻAG/l   0"\       WtZ5U &F_JԿ4eRE_׫J+=d}   @9-y.+E@@@@@@H&^ T߾̔n]Nv·em |4tWE_c~ҨQRӦEo   q/@\       @mWHS,-]* 3Scm ѣ ߎ   !_4@@@@@@@G` S'7 =YU˛4)|[&JI>*UڳAk틼k@@@_}C@@@@@@@=&~fMd^LN8!vInt;ŋ4FN9%¶c   @ {@@@@@@@'# ,~t@d/,~)%%vAhPzMܹ'K&@@@ = @@@@@@@غU/P>DzرR:g-͟/]sMm$#o@@@ xQ#      8kJ=zH_~Oi #o#P4rR{<(ҰaE@@Oy5       ˖I&-^O&L5߆^G`ilK{۟o"o@@@ x?"      O`R3իIKd|-Т4e4hP#?X}-X   / r'       +R߾҆ -[J3fH㿞^JK 3SzRR3迎^@@@ x?"      I/uk tf?ENҴiR۶E,KzE)=?,=:z@@@C}|'F      $%HKSvRÆE,J7NX,ÆIo忎^@@@ x"      8CH_|OqGIի8w ϖ']}4kV:z@@@b_}#F      $/J>ХRժE<,|RZZY~+iu   Ķ@Jb{@@@@@@@ -:uvWhBkau'hС=:^{֟5jvڪ_u^zYfaձyf_9993F-[_>o:󟇻_K/e7˥ѣы          CҠAjդ?н+Wj֬Y}/322|]zuOwUÆ {<ΝNYӧY>܅%Kk?ͯ|a;n졑G ?kɹi   !d       (`Ug#v*7 .P߾}2;s/ы   {T{ˆ@@@@@@@C)nERu[)߼y!ر#,]Æ YZjӪmɓ'{qƾN/l,]t)luLKwR.peK6oKz~@@@bS}lF      $}I;w3}d 4H6lt..K]{ZpwzwrrrrJ-]To^xᅐ-ZH'|$:wHm7>       Nn\#G_W쿎^B j۶;<=?~ V0a7\.L?Tb{ @@@ =aD       @ _ǎr-͟z ={*UBYB@@ q       #dZ_/8hРA^;w*vRՎ;:Ү]>68P/͘!h   '{CbD       ('M~'$'OO+W){Zo_]ʿ^@@@#/@#       #rm[8EϞ}@fff؎{ +jժk׮QFQmK$UH.FX@@@k@@@@@@@ ,[N^ '''lJ*wG֭5y>;_FԾ4sf"݊%@@@#!z$N9@@@@@@@((|yr6F/Wݾz=J,z )/ć   e @ P9$       @7Ӣ? l۶-l5jQ~v.ss@@@Go       e )p\Z,ItҐ+Tj֬BDsA   D xI~@@@@@@@rػ7t*H… CvرBX(UKz@@@S}yjs.@@@@@@@+:p@ 'z={hԩ!;v%dؿ\ @@@ =aD       @R T~wRxr~,P~v+R%|E@@(/%y@@@@@@@ Yƍ_`S^}ذa!;4h@w^H ':IqTV~cL    x_|+D@@@@@@(C-d?Xl#nA]|.G\os3} ;o%]T   H/l       @Y sϗ9֯_1c޽{C6l׮B ,XEs܊_6l}5Rƍy5J{@@@2 x_@@@@@@H.={h׮]5ر*~Qg^SHw|'g ŋC֭[K.$zn-`/`}v-]ԭno¯U^]*U䷺>M eŊ_NUTш#dxk Q}ȟ۷OWvV·0ȷ؟[jZzѢEJKKpD@@@Ї      $UC߹s;Yh>9tP)te\9ARۃ~5k25iDv@@HzIG@@@@@@Ga jԨᆭߩf̀k\^H :YvU$GA [S"7oVk꧟~r+Gx'~>>aÆ3Zh-[( @@HVzn@@@@@@8b|yg [oE-MIIQժUUZ5Y}vPU;|F>Xl ׮][WnԳgOǽG~D+~cXb&|ĉ٩S t,X ʛ[UK~_ޝOvT 7v 裏1F@@@DHq %q]       @i Xux g9eؽ|ܯ`߾}J{XQ/33 a[XB6//βK;h;CQxCY@ ;m{iat ijʵe^sbj?:&8Qʕ+B[vMϊ2   @${ G@@@@@@RB07߳²GY58,o/j/G2Dzp ,X:uƌyGO?\o{Ič7A߯5khʕZj;S1J*| {S۶mUV7   c02@@@@@@Poߞ^.mnSNNa˴/55U՜5kt^X>88_68oԡCњ4.4N_sͳz猽+jի o޽n /[L޴bŊ֯_??o޼g' @@1r#      I#V7 lb}yUZ 罠|q,toǡ_W//·Ai~zuզvNg9iO>4iRСCn|/͗:OX(?;;*Vwۻ-Z؊l  (@19      I#`J/ UBEw!ۿUL7y-6iii5\??>;zuibau < 1~qǩB ڟ@@@"j@@@@@@b^[ނ~֭[}pƒ"y/7{y/DO_{ui@5![?_>nݤ>kv‡oY:=;vT޽uI'S۶me7jQV޼y4|wbŊb9%##CڵsBk׎Kf\   c02@@@@@@dッ/\0\UbI=-<-}4ު8^|1|Oe;у@, /C(-M9SuzCwyE}]t|jٲeo>-X@^߂?֮][4kqfP^bF   s      e*k.70oy/8_g 鸬-|4sezk8x-[$( ֲ**X}hn]gƍ6lFUjVY~?Sy׮]UzuX={;͙3ǝ/\P,rGuT~`a|*  $d\+      @N7Pu~6͋n~4?*(o@N:V}>,#7ߔ~%z1%`iI;w&76T.gܹI&wK/TO?s7ou5kz<}sqw.ۃ\V6P;U=|`#ʕ+   @B OE!      X/0}ʲ 6&@gx = :RkT~ uT֮ ?{ RN"?^wy-Zi"~~ 7oޜŸ l̙ʂ/SO=U=zpO>Yg|붇f͚%{[Ma-==];vt`ouօ:@@Hs/@@@@@@ |&ou%ZjHh  [x[gE @p={Ays2NMR^rBg}1[{A1Bw_x߿ߪKjƌ*& u9?o 7;,xb{>4}n-ooW^B@@8 x7a#      %`a۷~)lCVZpu-\l}`ei Pf+W _G/!W҂g:g7++K4|pw7{V}n ݂_}MMA!cUϞ=ug&Mul:t.\믿vB??R:tiO?ݝG>@@HbI|t@@@@@@/-X[&IKKsC~AZjQLE_~)''pwu"PVIg)-Y'%8|˗;رc[ڰȝ;K~*ը῾$_:Ow+G:N*֗FmsXdDȼua_WCX5/R~z~ O6M'O֧~oFKժUg[n]t=Y`{_a{X2RkذDhڴiMG@@ x_v@@@@@طo_H ͷnݪCK ^/HWV- ҥJ;wF>K>+ծy P 7r~Gɇ V-6f֬YcǪf͚q>=Dht [~p;` u·o߾d}ğ7o>3w2۷G)r$yIVE #. k$c4rd-7,=Vv-\KMt^)'7V?su9c.:ٳgL/n! .@ڵ+)V8OX%|,&M o߾RVt!  @`F@@@@@#$pA'$ [hޛ,X}-[jiii6l#}[= @ vwszѧoߏAm|^LiA}rbKԹsH7 I&`/1Bzi˖/ޚ']}u۱|vޭ'A|~znڭoASO=UOcڴi[>py^VŊճgO46@@@0@@@@@JO +++,8_0Ho[[^^^88L)DשS'aWA@85|p3Ƨu~L7;SŰ+gG)l5 ,`{ZK??Kg䄕#l@wLwoVƍ{ァ~w\}.%\^zn(m͚5!|o>Kлy}9tw:@@HrIG@@@@@DrV}&(<^>;;D ޹vnUFsPomR4 *`AѣG'~{!?z⽱ w9 &g4jTmk}q - -[Ğʕ+CSLi`VBS  n}V j*kiժ· ~=>D'  @ O›%#     P6mP}@-6~"OAJCgo @˖-SO=Gi!{W^{n&*e?\viܐ#.XB>+LA1BΟo,Zޞ-b_~fX}ر裏|+W^]w.R}٪X1MG8|Aw}}3[ի?߭߷o_wv  I*@>Io<      'oeKIIq{ ^[Wfh I(`o[U~_|2d1$B#GJÆyxݿF9a~~V';Ho|NZ?,kW*V0].BV.322¶uֹ!|{ / ժU@A:+xv`  "@V!     7^+da[59jܸ,L7: է[X %aV~S|ʕ!G [ԥKu-XGΝm T~_+F{NZMz}.^l d!{/mv}k%\>ӫW/@b r@Jݻn=_Xm޼YV&*[>RB%=# P~Vו}˖-uM79Uu!+XضM)3fԡCc˲طO?^z%9a⟳S'+>lpɓe?,nAnJƍDkswҤIJf~`h^  @ O%!    ĉw M7nԁJ|EV M6 N_0X_N  PR8o3g.%%Egu >T Gc̩;o2dI#7ߏ! gHt94`NW999nwdnyJ 4HG}t\]_qk.tYaըQCw po`:@@I}2m@@@@@|2P|ڵڻwo-@_D@VZzJ#GԖ-[BXV-  8~([.N=T7<9@IDAToU񻸅{={嗻;w.H2  &@>E@@@@8v[x/Ti&:tDMMMUzM4 ml[ * &-Zw5-lW(33\/[AǥO>l9/~!,O;|e:UNWYw_֕N&騣<쉀/? 9ϫRR>}k.XXu|B4 G+s𹽽[999[`oO/+9_f͠|D@@ ap     "7z MJ%iiiin`ނ& WR$a_@Z`Μ9nuW_}U{ 7xS:կ_?d],8_+ ˹*w:5hPcJ H|de/IkFNm9% mD}*ķkl'tUVbz뭷8OFCW4@@bX}      P Nkaz\o! 6%iUV W}'%g{  mS}2VϏߥV_>Xr =Js^|㎓,<^F!9o/l;YBcXg84pteR·}vD?'N?w}7/"]ݻgb"5kJ /{fXkV'pB,"  c60@@@@@_/To! {A6mYJ:f-D_p Z_z}@HJ{3nuJUT ^0풭 'HgKyyeyNhY|,o=GXr蔞.d/)5UΛb!U߻70Yv,\M[ &+^U/LͮcA@@@@E`S;ܖZmitQG7nTeuʲ@@ ZJ#FpÒ۶m yM7Y ğ2E>]9SN4PEHtv;ՙ ZN>YMNkK v˗/wZ%|{;Xpt]veCN:U y >{@-}uἦ  @/g΂    ďCqPWVP]Wg@}T(# PVyҤIǏ}n';iin?`UX1x}rs 9ss%;/*-wL.g3_g)[:vN8A:DkWh$U7n[~y~^z 36;;[cƌqC_+C ͛v]{[n,"  PK"    1.PZVނ۪W1T333 GP`ΝzOh!#0hWKMJ,ap럧e< )s{Lt?Ԯ-l)m>0V:V*2j(m߾=d8Szu 2.]#GA [oUΝW@@ x_ @@@@8V qӦMZjUĊ[.2222ԴiSYU ۼFg ħB'm_z%޽;"M7ݤ뮻ΩPN2ZpizShڥJIIu8"}峌n ,Uj ToHjPFhV-! ۷OGvϞ=;dmzz.wUOvAM+=>裰7t=mW  (@19     PZnV^N>{8j9) 7o<$X9 >>;" @ yN<9l{vÍWZZZz:V`̙>}hҤI'$,% ̳%'Nviu*H+KUV O૯r<2f̘zn.J+VГO>6@7p6w, @@R x_ @@@@(5 ͯY&,L׮]+ NjM4)4X_2C> $-[dG~/ 8pUW;.xYn?uԨQt1Sܼy*U$ &z6foC ѣG ߉_[iӦ10ڲ”)S܇ƎyGP;u+P{ @@G     @Vi޴rʐ[n-SN~ {s תUY  護rӧO 55Us[%RRRBֳp>#  {Xɓ#~N?m ?Oj׮]c[}3<>|oFZ 3  @Qb=     ,`_2 ϪN U60}r*U  X 񩧞 ~]|jٲeؾty Zukk?#?(F1%xb/}i?3.u=?Q?x=1cFeڛB,|o!| @@(B}@F@@@@$(6m X\45m Gu/.&! a L:U=ƎOt_q YBׯ={ވaY%k 'O?BO   x_E@@@@HpׯwկX/_GyD?caÆ颋.UOtR?K/$5>[ӟԳgO9  {O9    $@VVP}U65RC*Si4ZUG@e,X2:K.Dpy͛7=aoڵN%Ek@(%a@@@@@/  {?֠A*͛7WŊ  Ǎܐswͭn?` ;vȾa{ےUNpl|F@| ؛Əx@3g q8p`R9R>aֺukbРAJKK ^g@@ x|+F@@@@ >6nܨe˖ׯ_/ D۪UVoժ/8̌l Ą޽{ꫯӼyBdZnI'x4x`wwq+` ~}!k۶+Hй=o?f͚bq1ǸW^yCֱ  4Vs    Ę@NN[IΪ/_ܝ6XQG}ݺu=$# 1-rJ=n۷I&ݩ~!XO3q-W    @8p@+WԲe܀͗.]~^jrrr>Q:u{ 7iD)))Q@@D_O<yر#2?7tzխ[7d %ЫW/}E͝;W:tH j@ fgUwypݻ|Au=;?O> !yQGkTBu,  $\    %ίZoi͚5͍iiilAz/Xoso^zTcc@@ dUu~([ngq[ /}%MԸqcڶmE%su |׿j!;cǎ!0sL7o,.r @H q @@@@ؽ{w~`}^n]X#VZ7Xoa{{zFFFQ`=  @]v^õdɒ4hn֤ 7 $“O>!CWo׿oI*e#|Ms=!RSSuUWMvҾ[7?~K>CgyfH?   q-@>oG@@@@;tҐ^ުdFj֬c9ƝZ 6xT$@ қ*U X( Ҥw/ =RRQ@:Joҫ )$kϜL;9{k&x@@>|XL^1[Μ9SNҦM eVYƌv޽RhQ9DgЙF˩Sn&O\z%aSڎ;?\no +Wn;+  .)@%6:    n2z C+ږ/^62d5Xt=x  @j%KdbŊf ^nߠAJ4hf*QQQR@9tgB0jpJ0Y9>3 7'Һuk񱶻o&|h%QFf62  k w"   x;wرc5`fРνmSN  O.p oe„ 3_3HBZh!]t… Ų L8xO?P ,pUןmVW)"#Fڵk[}Ao{[5|ǒ%Kf@@\GW@@@@ǏXo\Ӵjڼm'Z=Mmz T4@@ LEH6mu&wҹsgS8M4vXl`aϞ=RX1a f͚2rH)Zhn)SN筱w4ݻw~I@@@@ xoD@@@pi(>lpɓ'ݻ53Zz |,JF@E@o\b7N.]jws>>fO>D<&P=z >\t> 2Dڶmg   s w!   @ppYCwyaK.P3\:u:# 8F@+Ϙ1sa̖"E iѢv[`XFN`ʔ){m7MXA\~0u?[ː! 6LZj%z+WWf D2vXym,  8{|[    S E=jLjx*fˏgJ3VVMu& 4ooo4#IP7n.Gh + >}Z#sε?[n-C[=aaÆ f;wZ~/LC@p*Nv@@@@D 1ÇˡC̲>_r8CDϖ-5h3gN8@@BCCᅲc:a~)b"0k,oH޽3&./@֬Y#]v[}>SرGݤtŋ-jĈҤIk    x    $z}`-h̙Ǻn4iLz[z}='OX`@@AAA2uTz`4(שS'i׮ch̛ܸ7ϼdڵ /<9pjH?ׯ[}-WL2E+fm5Oda Y?n8)^@@ w=F@@@7PS?*6Bז4iRɓ' Ǭ\3fi8@@M4 ݻwFYJ֭kzd'ʓܹsGҧO/nݒ 2=pMޯ_?1chmһwoP IM FS.]j [ڷo/Ck;   .@>ɹ      \|Ylz۳V׊:5w\X ,(;wnBRqE8@@C4=k,;vݻnɒ%f͚IݥDvXAiW_}՜m۶Ӝ".qFyVW{I&I5mxbի)4as,Y  a    'm!+Wf p@@8}|W&7lYf;Z@| jJOnNdSN|_!N'._| 2D¬5o\Fef6zzL;kՓ ɑ#@@D x(\@@@@>믿L^ZLuJ۷ow6= *d5t{  #w56|{iMuFYNЛ3g,.])S+@O8r䈹m͚5֐ӥK'#Gw}) N.]… !HB>  @ OP^N    n[z Bǎ/0gymz۳NMC@@iܹsM~ǎvJ44iDu&e˖  !7T\ٜ7ސy%e8' ӦM>}HppWdʔ)-[6k,My̙3֐K,)_)S  @ O0ZN   x7Lz\?Httt4B}޼yEC=U^kG  )p94iy\xԙ2e:V!XÇ͘1Cyĺ4AN@gѣ̚5[4idرG2qDRi{g@@ A'+'E@@@Xիvz 8p֣/ 0z $I""\Z1{ʽV!zA .Ht \p:%KHvٳVׯo{ r[n˞={,ٳ˄ A6@@U}rr2@@@@\bYqV U9gΜp   O+)7M6ٝNg^jԨtM*T`Sѣ7$kR[.1/ϵ@vYwY [oeml3j(} 8… !^u8qd̘ѩ;~tI-[f>K,2uT[@@ xԄ@@@pׯװs,wdw6 zc].]dV3d ~+6OZ5ktUڴi#GTR6  ܎W"   )" i~ .lЀV!  Ѳd_r]7MOիW  p5hdd k p\sE@ !xsh۶fȾH"A  ""ӧOq_e׭ԩSK֭MܹscgI&K={QF9S  /_6a X}ﷴ>{boDܼy |6l{" cF@C}|(r@@@@ !j'd߾}&dw^{ ǥMք-jma{lOC@@U?.ǏoV_n7yYV$UTvXAߪ@Mglx2 7I&I^DgԦVvIџ-W?~1c/_  @Ǚ@@@@D ]mZ3.-EVȚ5k\^1  ud̘1m饗^=zHzDp:K,r낃%iҤu8)͚5={XӦMӚ|ћ?۷ <5" ZA^   vX๶̙3w}米̙-[-[XoZ%d;Fk#    x0!   O+;q ݻWlGݻwyzЩaEV/V˗O|}}z@@@.^('N4e˖M:w,K..p)O?T>#I&I]tpF˗󃷷|.{Z"Ga Fmɓ'Am۶x@@' x$j@@@MV^k^o޼mm{}֐>RHq߱l@@@ck%V\+WNz!7Ԙ0,@ *dϞeB@gZj%K,UV-7w͚5Z&5)SH4im,  '@>6    XA }ت؟.Bg}Kt[{ge֬YRR%&@@{    ܸqc5j`,k^^^#G+`o ˗O|||by@@L=m47nviӦvI.]n'ÊhiӦf8}Ç TW6/\`$I9rtͩ_M6l.7:2D~IC@ xo    xVҀ-`o{>qDLLz^{[>UTqz=!  Ǐ7aoFn޼iGP`A޽;eϞ]Ν+*TDƌ &@>6!   \t5\o :tHIjZJ+B)RxKُ  DDDȜ9sd̘1sNZѾE}B; >|؄=uzy p* ڷlR]f&M4{j[r~ECknPЛ"i  T   V:v ڵKA{>:.M+ (Qg˖M:w,۷][nfp#G޽{@ 4l̎]ÇK^ ->YfvZboL:$   T7a#   Z)v!={ȍ79IJ…MA{hEC@@cǎNܹcweˊVNmܸ$In+x@_5Ck+Ig Sw~?Z _oL,͓tЁʰaD hTgɗ/'Q0V@@ ,#   4|`b dgӥKg쵊 *Dr  h0kٲe2fYbI쫯*={J*cOЛu7s&p~>˗K,Y-_w;XORN-3g48st@H|o@@@@A&`sN=/]znϑ#,Y҄YٳgK؇  $jBXZСCvg 6mHnv 7nʕ+͛!<#N!0o9+WF@wĿ,WD@@@O8}رtA:w,3g 3gvQ"##Musɂ D{b˟?lٲEz-YdDDD4?tP x? ƌ xEwM~vlߣG)\>V@n߾-iҤp<|㟄W 8D`R^=9{~,YdŊRHY.:qDڵgJmeʔEI̙@9@@@p[nΝ;e۶mرc~``c dH6@@@n޼)|Rz fʔI:u$;v݊#vZZ9Y۶meʔ)sb΂ (N:uȁS|_\D^dҤIqbΜ9Eg (Pv~! +0q_    w^+`ȟiUz(TR&`_lY+Wv@@pA'OʸqdԩV86bŊIϞ=Yf,Y2f@ ֯_or2  !I֭['u֕[JppK`^k "zYV-ٴi@?kM*U JŊ@H|[_+"   @| G {쑰^&yRdISV>_|ױ@@\S@aF~\@+\st]hU`m: ]ܹ]@N $$D6l(ٮ7,ҠA}ۉ{7dʕ2~xԩSN! q9 @@@$QFR@IDAT*;v0۪TkZ2v!%J^>@@p# <}72n89~2glO;vcN@goj\r]3#$V7ojJ{475^~ݣCRŋK۶me̙%;w+W"  @BOUΉ    DGGˡCd˖-&h%KyMо\r}ԩ!  ?&l?uTWVhQի[4iҘXFDذau*UX, Vpy@@~ǫ!s wu=Xg̘!ٲeC}Gre3fh  j]   n%dغu׊cpʔ)L2V^<̽  &m65jA/[PSڵM_m @\H5aI& 2\{&\޵kD^? 2H޽M :իWoi ׿wYFR+   *.:|jǎ{p|||D+Rj{[E{N:v"  gDEEɢE/ OZh!={B c##GY)k׮OCp/AAi _+{zmڴfw}WJC@\D`{y&   ={ք7o,رcܹsɚ5/_ބY+'Oa'  x@hhL>]F-GȘ1 wuIҧOopsDVZ5 |'5D?yz[p4m\gcZ`߁{? Ə  by)    h5ݻw-htV^+gϞa/a  xwjI$88Np¦}%YdvXA x@W@+D}d.],:tpAad 4e˖I͛j*],^XRJ3p  X   .*aM6YA;wZUz4yJ LE{f_X1Wy@@'w^5j̞=[ߘM+[jժ%^^^1wN$uV7 @>S!Cgxڷo^|EYr _vM֯_/5j04i>>} ;@@@7fHΜ9ѻpװ@@xZoe̘1r-ٲenݺI% i/@tFԩS˭[$wr1'!AHljժ{nsB Y[ӦM]q&|ӷիŋJ@@{[΀@@@]v/_HM%{[EY>xv   -pY?~L4I]fw%JH޽iӦ$I} h3jԨ38F /^4]__|$M./ܻw1Ag+Y.0@@el8   ܹsGYn]V6ol=hK*UCM2g;   `퓑#Gٳ%""ºԮ]_z%k;  ;wWtik@Ș1XBʗ//Z}͚5Ү];1cg;bŊɲe_7oʯ*-ZYf1@ w?WG@@!"6m2A{ k>,,,mA{5oXC@@Xj kҘ-YdoK^p1wn.ZRl<# 9sEɋ/(oߖ3gJ޼yeS\9cSNc3w\ ɓ'{   8.ϕ@@@pҥꫯJxxޔ' 8 3@@@\buܽ{>/Z  87믿cӧ;wnSݾUVf{O>믋w],# _4ߑx CFΔ4ydste͢jh"YٳgK&MA@S`ob^k!  KL?p>>>RD }ʕ?DC@@Wسgh%Ra Co$nР 64@&~ۢ-ZZf@4\~ Y|%~uVI:ul{Զ.]eȐ!}-$C RZ5r`  X   K h6dzj{A%KJժUM*UH@@  84pj*I˖-W^?~} *{ ~A*U$}C> .ԩS%<<2i&)T0~@H$e@@@w~[ kX (UתT剕   Z^+ۏ1BkKNDnjM E )؎ %ߣ/\Pʔ)#Z_~1U?CO^4i /ZH]&u֕-[HL<# @" x=!H2   +"ׯv풻wahЊЊ2bO&a  |@@@<(ׇNӜ?,XP^z%שӥKCَ  5kL(gҥm=Yd;H޽@v@8r{bQ 3f̐C~o>iӦ̙31➇.\ܔPV-3{P[Hiٲ{Q! ;-   @ ={VVZe=tzg}VWnӡ@@@wY͛g;vV``tQv*2e  $^?~k@G eʔ?Kٲeƍ2w\љT:w8qco&L:1{/_>Xێ! ;Ξ+#   "_k%+WdȐTתt޼yx,;@@@W oFF-ǏFΜ9gϞrh)<F";iذܧO/VX~m5k9F(X`|s x0:f#?Wtɓ{)u1+ѭ%JM6b @x:AW#  Њi+V0UW^-7oތR\9װ}%I$F@@@];&FiӦ۷톥a}ٿvij@ŊeͦμWt &+T ;w4Coݺ4ޫW?/9Dot8@@ xb  8B 88X~7ɓ'؍B }5jժ*U@@@o.Çݻw oRHk;  @B d˖MΞ=+Yd1 y-΍ 9*/UAϞ=|Tg`رc[n{@@ G!  +a*٪kx$***NdΜ kUYz@@@wXt1BtFMoDn׮Sy晘XFT ,,L%::T&޴iS^#xw}'tԩe׮];wnBxhF7x3ka^x!`  'qb @@@ ?.˗/7VKUT5kV/VXG@@Y@oX3g ۷nzVرIn+ @bh5K5kLf͚ $вeK9sqٲeeƍ3=_2tP)S&ٹs'ǁ O+0i@@@L 44T֬Yc˖-#Gn޼)VKӧc=NZBUԮ]|lD@@,/6?~[n]S =9   nwޕ~T*1Vְ}$ .@x?ooo +Cp>H>S3%KC1xرcz&Mܹsᬜ@}wޑdɒcpvg}VN:%zйs眽@ F2eȾ}hF%={t];&=z ttB x@qʗ//-Z0/ Ç?)MZc?  (*?J   :/b*ۯ]V-Yd}Æ MeY{   )p57n\t*T>7@@Oy5ԩS[,  |򉙕*,,Lƌ#]v̙3'v7zs%Jݻery\]C 8{|_  }?8p̞=rK3f/ʕ+E.K =@@C@@bULc…|bJ^3&   k׮CN ;v=zHL n1$KZf@G KL|ܹfŋ;;Nq]///Y|r 3r坢ot@W7 @@},]T~'_͗\@/} $C :   @<DGGˢEL~˖-vgԐ;u$S  bQ9&3 #RL)~tM3.K/:oBE0~@-@F  ,pMYx /YDbNm8իguR   03g 6L8`wܹsK߾}w???} /p]k#{@ kN ".\03=zT^9ժU:zj0`  T؆  .p5Yp /_\F``hE7xCjԨ!L}@@@xsL6MF!Ǐ;wbŤ_~ҴiS  bV翟vb @ M={>@/)S$n'j9r䐜9sʉ'Dgҟ4doA@;Bw@@p'ׯ˂ ~+WJxx}˘1&l_zuмO    @ Ld'NѣG.Pre#uֵ  @5HC@Y:vhfbI3gΔAIlٜ{[nݻL2E@o_z  N.aNׯ/oٲ,^.t5kVҥ贝gϞɓ'K͚5 ;{K@@@._,g}TS[N֯_OjFY. p@ԩsfK5j}xچJ*YC޸q  cSa  <7d…+$,,gϞ]7n,5ˋ}ǰ@@@ aN:%_~L2EBCChUf=M+ܗ(Q Px% @ to߾m # 0@Nz+Z=ۺu  T؆   ˖-5l3ϘG&M?R@@@8r|ffI&-Z島 I$NF@p@ m۶2~xuL4I9҅ )R }/:  @%  h%%KȜ9sdѢEPmٲe*T@#   k.:tOe]Q%ڵ޽{,MC뤱}fd@ S 'N_|}=3F#J-W\t9     DFFʪUL7n׻Y}ƍRJb   87n!CҥK.6mZҥtޝ + @ $O:){@'ȕ+ԯ__,X OS[ٲeM^ǿsNQR0n@xG@@OjZC+ϛ7O._|NEڨQ#i֬T\}Bl@@@O`Ŋ&pn:fɒEe$UTvXAHCCC"@֭ i&L%KZ- @@  @@O/ܹs̙31kf/4@@@DGG/"l߾ݮ9s_Zn-ɒ%  @ whv5" 8@եPB{a)PS1:3xk׮ĺ,A@ xo]F@@ >o5k :tS:ݨV]6؀  $@ddlСrAkp>zK|}3+ @" Mֺ{@'x YڵZK'ew`'wܑ{& #   \tIbŊ'O8p 'MT4h gϖ/@GÆ ?8/D@@^ ,,L&O,-Z؅K*%͓;C9 "$ M`ٗP!;QRJɏJe YCQ~ȾEBEvETB}}1>9{lwƝ{*}13`@ ra[ZP@Wٳˋ/hfF>s|wR^=nlٲKddyȹbŊIz>  ޙ׍^#  ۷eҥ&Kɂ D5LnC W^yܻNmC@@@RT`2d7ohVEdɒE:t oΝj@ {{n1ca@U=:1ׯ__nfWmfߊu]abŊH $Vʱ   }}2e y㏋f   ڵkޓoFNfϞ]lٲT@+c۶mSO`4{ Ks? ׍/^aaaPFA@'@=  ~(i&6mph=|GUVҰaCɜ9s4   UL֩ އ @@hC 7o\zӧz5kГ   RW\… K^e˖A9 @ 2f(ŋ;wʆ $22RRN#g NxMཎ"Eؗ{  A@@8s挌=ZJ*%?|gnA|Grq_?$>A@@'xbRԪU->,,̼۵kk׎ 8xm6#O>i_~Rɗ/hR,- a3N@H bS@@D **J4aÆ %ҵkWپ}}ȬYJuIE(   ++XIßn@,   ~,p-9s ߻w[O5#{>  x裏ʷ~+G[Jҥ~!x'"jժ ׬Yc׃xA)  %@%+  w b 㫯7oI۷nZڶm+ v[    eȐ!]?.ovet5 3@@@ Y䣏>͛7E?&}z$44m=    -UO:U*5k֔f  @:ucǎfŋKoi}M @ ,00Ǽ6qWrdժU˗/K,Yw0U`AׇT@@ @@ l߾]&Nh2ˮ%gΜҲeKi׮vZ@IDAT   7nÇѣGz\vmjժn,  ΀Ytiٺur1co+j@m;l-S ;wJʕٽ@vg9bש  * @@_֭[YC|I)U?^\U&g6A#F >~R@@@J2fN:?_w}'e3 #5jdym?#L'@[hѢ6z0T/_ 3F@&@}¼@@ N<) 2/,]Ș1mV6l`U5iDҦMk   ׮]QF}o8qtZ-^xoxC@R_5m4N@(Rݵ`  ܹs{΂fPA@H#g  !vZ7n|eť}ҲeKɚ5:@@@!pU8qeN;*U*/e˖۩  X03cիM5k@Wb1@ Y *dv=X*^s:cO  *_  O֭[&6_|͜9O:|E4i"[n9sHɒ%Ӳh"ƍ~3~*%KxZliyV.\`wmU 3tҲyfQwSueN{77RJ;J\L}lV9l8t@|$G0  $ŋeذaRP!)5\r2k,ٳgtԉd*@@H F3f.\XwnkզM֭[C'?GEH:QFI% o.-Zݓ4+VLЉ_g2Y tf7Jƌݎ[o,]6l QQQ.-"Ixcu^?)wswc^, 1Xs6:w&@@@>@@pf4ӧW_>q5jo4iơ  8P@g9?~-ZT4P2M4m۶E.#f/XrpBL$YlM>|حoqsqfw rsa> w;,~kxxܺuɵN{]ǚߗ_A MzE3kчΞ=@b >@@Kȑ# {W}t[ԯ__֬Y#K.gyƿ:No@@@,P'N4׿_6gϞmgN @?(U̘1C9-&LGulW3f (v- xȫlj+^wYBBBj;wuϊg rBy,Cə3gܚ}y|{gh۷߿{9^Q%ν{&=w޽{ͪիcə3=lߡ *  t%g  s#mڴ1ƍM6kNKʕ3(z   @DD|'&:tG4`M޴i̝;W@ ԫW[3^,V@D чK.m5 @ o^4*#Gƍˍ7&^@3{׀A… r;]ܖ  1z~%Kv uQQQO?IÆ @恗خS@<ꘔ~gZҥK'M6MAd2ȅd X{r8@@ h0 / ˗7Y ###fjW>p=:Zğ=@@@RJ@͜9SJ,)[][[N.\h#+  {6ZCϥz&k<`'43o޼Tbظqܾ}m[oS, ,stk @N>-K%ٳg;<)wu׻:qu@ҠA=3^h=C@ $ 9  A+_*T3wA.u,   8S@3Λ7O(;vp3<#g0z[.^owGgp_yٳ˦M .vN@py饗dڴi2c 9zhno?;v4ߵmVʔ)m;lޫ:<}y`:e2|p[hh? `@>@   Pxb]/=z0;C nX@@@pEdj֬iVV͹ HiӦRhQiȑ#r%i޼̚5K>Cd~}ܬ%!7l kfv)b ^R^B q7 'Ocǎ>qDof'/^\ "O&_Nqϟ?/ƍ3?=΢QF1cFe Z%ν~gwիWaÆr5sۋEܰ>  *pN&M)W\*^u}v̙& u'š1RJkLۤTZ۽.Iy{?1!%ӗh2,tou]2|ɔ)/OcޑN# '91'@@/ 4^$r{>}HV6A@@H7ۨ4Lԩ .ФI?i 裏ƍ?YcZhafɕ+W 5V05{mv͛7[4]]x0ToOluk/1C]^z%ٰaN[X1ٽ{WӇY f2~&o1AXnm۶)Vv+LRwʽR7Lxx) }D=_t_~u9  ~#@\ : ~=p@5_~ҲeK ۩   8[`ڵ&~pn& 0$$m   f5jhC@k׮ufi߾htZG5 2bn#LHPܹmo4;=rk@&$pS6/ΝN:ɬY|Z۽Iy{ zr9~ltA{U…/7Zɒ%lnݒ( $T=  @AT̘1|e/_>۷v5mڴV3   (k3ס/^<ݨQ#,@3͘_?d׮]栚  ,Q-[rر>ŋMܻwH ם6n(n{A˖-sOx"kn E@*!w1D }Y|Dȑ#&~P;9^'{= o {*?y>3-?My={VԒ   >8yX)*S:t dXTxE@@/gX?w\4[7kgcb N GҫW/zjxvInj~<ܶm[ E$)ֿ۞9}yÆ 6 o<3edf\|muݖs$1b{9!>gΜ2lذ؆_. . @e}]-[63k[J՝pMRNד~6j׮m͒Z۽Iy{)zR$2eȳ>+ZB@SB @; @n2fĉ2x`9s挍A;w]    cN:e2"N4-@Og:Ӭ:ә9# pEрJ-|sN?m4YhiTd̘{ɓǴ<`WPABBBڵKEnŽ;ֲ̃zs{#;!}\Iu3f)zu%JĶY{ޫv+LReɒEwСts1e7ףM6n3C 6t;?]}>qtޯJae˖^>O`z^-:{uq<|WVxb]cnާKjKcc3@X @H oVz-7o>7iD $ ۩   8[@3}2rHp=͞رcGѣd˖n Mm$$WuF+V"ڵ+cۊ,x *UgwݻN`lhO?5Ol%o޼f}H"m7N+wu#wu=K.Ie*  ug  @6l`.]mڵk/˗wkg@@@7oޔɓ'ԩS@4Ct֧Oɓ'N@7M6Idd[x$.]xւGg{ע6̵ɭyvgA?k]KB_ շo.1ݧJJjժe[Ip'z%νHX\5=@p;  @=zT'3fpjժ2tPyR_@@@4(OG-[~[ ,hSA@U37C RdI2e$44msɼydʔ)vZu?gI>[%0Z|x~zCK̙%,,̭1۶nZ{q$o&ν1v ׌@@{@@4Mk׮-Zׯ_n   |Yg6aRJf6"U~\dĉRчJԩ#m۶W;8^Wۤ߹םp:;s@J  C4ԩSMC*ٲeo!iӦyE@@p%Ko߾Ѳj0|!G@@;w^ qѶ+TP{|ӦMn^xQ49RH/bŊqn,kp$&q/4~}m * A}< ܹsGr!O<2diժ @@@O6'N(` (`[l)iu C@@@@<$Se@@ 6m$o\iڴiSNү_?ir)   l|F2?W\#Gݻyo>}z    ߂ W{@@ H.]d2?^"##Q׭[WF-aaav@@@ hV{n?x`lVɔ)tEwC    "xX@I`ڌ@V`Μ9ҭ[79~mPxqgۨ   8W **Jfv{ Ү];߿ɓn    V!ޒ@ >?G@ؾ}믿#͘1Mn   \~Az%7n"7AI"Ev*     &@}]qƋ A!p5ywd̘1a^z2vX{6*   믿gϞl2AԪUK**Tpkg@@@$fiҤ[nɕ+Wۉ@@ @@ 4a-*ƍv@@@ ޽[#_~ x6lԨQí@@@Hfx\z5; @B@TɓҤI]t>}z8plٲ /6  S7ސRJ݇ɼyD3tXל   k)  @@ DEEԩS{ry{4Oo޼2`iӦIGμ@@@_2fhFཿ^! @ )|zs6@@;wvȑCF%-Zۨ   8S֭[';#:әUd"ݺu]}Z+   F{8r@E@@J@/Fa/n޼iYf2zhə3F@@@-^z>tmPo-s続yE@@@$Ȑ!97Dg" IpH@pNR@͛UVn:ۤXb2i$y'6*   Xzf A2d@@@Hz+kg   S @@ @DDp_R%;>uңG`|т  8I`Ϟ==W^]O7oAN@@@Vڵk@@; 7  ,nZ6nhtg<`QA@@p3gw53CV)Y 6L}YW@@@HF ׯ_O3s*@G2UO  4RJ;>M4ү_?`|U@@@ X_X1?~XAyɓ'w   p @n2g  [nf͚^VPdW    3dΜ9ҧO9t=̙3KnOLv*    2ӧOL{  A+@ @U@0F-*UCCCwߕ5kAz   o&>+v}ԩm۶{n0`t#[    dOq΁  ޿C@ 8xlR-[ft2sLXF@@@Yv=z_ڵkˈ#DQ@@@@2d`w6@V @M`ڴiҩS'tZTK.2x`I.u   x!pY3ĉ%""Cg3Ӏ5kmT@@ؿL2_C?@bXzu,kh}%q@ :2 @p ]v2|{  6*    &ȠADY%{IE  (vZiӦ?v>! '+7'C@KD@@ V\)M6Clݺ;VdbQA@@pW_}%={{ڝΔ)Cu&3f۩    L~M(=C@d >Y9   .i2jCkɞ=| /o   #֭[']t+Vլ-[4gSA@M [l3jANrmV pxO}@ > /+B@^[YfI&^@@@"p1۷L>]^?2j()_F@WW_/@RD)I@[T~3: … Mt&MpҥfH   ׯ_ɬx2m4;^ [!  k7| @ }|BG@| !={1cG+\̙3GVjQA@@pܹsÇΖ- 0@:t v;@@ 'O'x ] *Tٳg͘1C L!=Zjժ' £߼y32  xA@H hذ^>zF?n   k֬Ν;˪Ulf۷Jv*  4̶mۜe$ٳg}k{ҥD. އǷ9@@  @@ e{i֬Z6)   8~[4bTT:uȑ#ۨ  N 3fap@|2d`F8f`' {@>X6mZ(T@Z3p@HJHy߷2 .,ϗJ*%96   nܸawW\\dI3fԪUn  / 0c8{7}tiРAJ}_[o3A5  %  4n/?lw^zgI֬Y6*   -pBڵ߿hlwޑۋf    @ ޓ>p3#C@[Tnv   lذA*Wl݇ʨQD5ߏ-@@@غuԬYS^|E;^|Mٳgtؑ{P@@@$ >9<  .E@3giF_n:7o^?<#iz   ` ?^  'N[n?vX)]F@@@_ƌ@>!Zl  )]vMAUVutM   ܾ}[&O,aaa2~x;H"f~{h@@@d >9  㽃.]E@8w4h@.]jwm۶2aq^I@@@VZ%o_WLO>!tT@@@@ BCCGDDu*  ug  ;wJݺueϞ=hh?n8y|pt   Ǐ={ʬY$**>f6l0ɟ?F@@@S@Mv@@ _~Eׯ/.\0[͛W,X =P{ @@@ 4;| \|N d#mT@@@@ @ Se@@ ɓ'˛o)n2[/_^/^, gOV#  >DݱcGپ}ݍٳ{gf/K*N@@2}tYjڵ$ѹPBRfMy宻rÇ?vkm!gΜҩS'ټyfuԑ%KˮnAL:t^5h s!%J0?ߤ5n޼iZó)=z,YȩS̃}i=[lꫯj5Zq}QRJmaڵb e{xK/{3ƝӨԩSEgc޷odʔI ( w]U__`c x["  Uf  k׮n>s2{lɜ9OA@@@|/p~n޼y5]v&G(  !~zi޼hPkh-.]:qj9pׁE1+WݻLҿ9}iq ׇ@]]v2rHiӦkiuU}=3SbiѣG>Fݺu~[@J*Y[GEEɀLZ.]*&MUJt^zɘ1cDg,ϗ}o\˾6l|#@o9  "@}\IƁ I*p5iԨϣ:4ɳ'    `">Vy衇?+ZM" 3gD胗Z4s~Ϟ=&޽{EU4=OpE3j*YI@@@./o!;wwΝ; 6LZh!!!!v;@@V}nLԩSۃӠEرc*o=$RlYYfMgر8q5[><꫒Vu~ǎѺKƍMfWʝ}3f0 tlޔ w}Hۢŋ ~~YMҥK3%hA/_;v̊+W.] ꒘k` kヲbC@B UPA" 7u ,7K,!>  $hN͚5  iٲ%AI}8>  B𥖻1Y丮kPΆmѠ~_݂uETk׮k.îXB"""L;-^W>zhС۾kiv~?9;1-_|Y-[&۶mۢY}׽ݍId4 8D{\( [y@IDAT/vZto}@^@Yr<Έ   5hO4kUauE(  +{n38ͮYt\ ԿKu%_ٳK͡4{89FJZl| }W˜9s~믿3תUK-j,u5eM E] 1:3d"E+fu։7oZ̘1 _~s?#RJ_O<:tssSH@=MIpZ@}   7`ԩSf2e!JA@@/UV/]t0%gΜ2eu@@ I4hӦMIrz=+bVϘ1C9ۦ joݺ/ǔVVѣh[nɈ#>l-ZXU^kϛ7ϫ}u\իWQFfw-r„ tk׮~ZV^m gϞ:uf,Mm۶ҠA3C.Iʡ*T5kxr ѢS@@ @@ ͌իWjh{    ;wNڵk' B,t 0=A@HRʕ+O..\ۼҫWX4(6ҳgO9<<ƴMBcj~LnVv̏Wh6_~pԩrĉx{zJ(VEI6ml^P@b9i$0ub˖-f֊;vھ~zck>S9}gΜijv˗ ~ >i&}=}v1y{@n>@>c3m!VFD3ӤMކ    @ {nݺӧh`ĉۨ  Ad&΁e˖&Iv4#}ٲe?Eb+2d5jD[/̟?_}m ߿;vL"""$444GyJ[E3Z9sȍ7d̘12lذ8;U:&+V|gfD'o޼裏ʋ/(=`FB&ܼyӾ~Yf_~E.C//YD-*ǏѣGKΝ%K,1 NuvmW3Ỗ+Wz`&_K̙MΘ{}WRRV '}^Ύ ?}@@9r["tN   F@3jT-{ 7n_s  A,p.ʕ4HRN>|i׿%:d={v)UT?[ݻYuڵ3]Ƕ_\r25i/Ƒ(S vCb͞A^"ksAJ*vݵ6  , gڵ޴K.rw?\Xc B%YOfN #we  :u25Z2d=+   @ h@f-}w%<O.rX3 Xa~X^z%WIzAŋ4 fʰa$pk`xMȵqm v]-sh׭@HM+]eX;y[&@D򞝳! ? xOW  @ hFqƙ󆄄NiM   nղeKy'Pp˖-RV-Y@@@ &\rIvWOvוGyD4]˘1c3yBΧAgϞ5q' 67zBk\f;/V7:CjdΜ9/]4[gy۷m.0붮۸Vw=NڳgO?}l=b{"@@O A7@@ 435~H9m4СCw3"  D5k,YROnӌׯKv*  x#PlY)]TWGDDx[5zʔ):?YA܉>;&]*U>5J4=RP!Ykݻw<'2Sqmw>mm 7͔)lnq}TRN '}]Ό x/W~  @ hнfעAѼyd'C@@.pygYfd͚U&O,+VI    (PlQQQ-o=bĈD[^~D&q%Uz{YW=zTf̘cׯ/S64u3g{8{6QO!삂 -&@@ :u$}~@}Auy2^@@@7o֭[I,Xм[/N1@@@믿Kڵm۶&Ppr%Ydh+Wz*A3gΌuhԨQu/(zΝn ,ÇݻeٲeuVܫ꫒VIC|./^olv]H>Aef/VgnΜ9;w6׸qƢ~i8qtUjQ,Yd߳g; ;ʕKVqћk1cF۷o_3ۚޘ={ϟ_ԾUVZΤ35x`JgK]VRE4ػ8H* XPE*Ŋ+b.Eł+`AE^Q;kEDDUE@AE)7gvLrrMfv2yQF٤I?}72x_<E@ ϱ  @lnɼ.YL^K    @oРA.DULPfTz@@rX^3=TVZ e2&G v9b<ڈ}׺h-ZN9$7ʺݾ}"%cBvd4unݺE]^Iʌ3\7^ܳno&lW/ͫ,nPpxAAh?)8+ю{,:9}s嗻"tԩSmvpV6m IPn ={u*U?&a TlTxlYC@ $v@H@?bznC~&>6@@N@, *ѹtMin @@ *}<:tLC )SX88ލTeb-l5 .muZvG.g}t[G,"h"&Rw^o{Wۿ=Cm֬Y6WuJgΜiW\q_zKЍ￿?Mc3[}È=9}Ώ>l*^н׵O>ի:vE{]M8&LU΋AQAvP2//  Lu" )PWu    >׻lÇFOJ_X  Æ ~Tg.]"6xҥְaC7MiZxb[l r-qnݓ?g!~嗶`fml=5j+Wڒ%K1@ lLRދGm۶>LIqF7osV{-"k^^j>shjIVl݄!꽏 y+p߮φ# @ ,U/=-ʸ~"̗@*U\l-ELjY_^dOY@Q 9]l  `ouϠ>zd@@@,[޽SN+sСC]FCӼCX  @ٳĭԉ>[#|jLu" @ >vMA@ ̞=N>dS*^xq[5!  %0m4ѣ-\П}裏Zfi   @|6l77sh.Q@ 肂ljX@`@rD`ҥvGڵkx6r:6@@(ׯȪUf+‚J@@C@Ɇ>R5EZ@|2@Y+V$.@ G@ ֬YcGu-[m[۶mmtܞf@@@ f̘ϟ?ofǎ]]vş  $.ЩS'Ӄ `;=+e-  U4 @(M줓N9s渥6mj'OU6A@@HT?믿:t`^н{wDE@@@2-@}G@ {x=  @.R2e~kYzX+#  #9O۴iccǎ͛@@@@ʓfm7f@Ob@rRQFmS6ŗ_~ٚ4iF!  $..kٲt_relg΢-    @0^P@@ x-G@ g{=ӧ=G֭[   F`ɒ%֭[7:u=Ӟx {i    UB%}y݋@[Ar@@ ?~^s5vg @@G &^{"W_mf">@@@f'>Gw2 @d@@ ԍ/_׹sg2dH5!  9$fKmܸqV5nqر?@@@@ FMA@ >=[ @PoA.#_@6@@2>-;Zj@@@@rE x W@J'Pt  YYf]#6|s{ꩧ~mkG@@rT@nVԩyAkvbO<A9,@@@0 f'#@ }~@r)ᅴ2*矮7puر\n F@@]`ҥvYg{7UO>5lП  @,Zƌ;Ė @xwlڵn3R /fWr  r@ʭ^k_}k6mL@@@ L$Vs#   9$@ڙl  e 𾌀, +mne{v-=+f-   @ XN;46m=zլYӟ  @n v!Fu {ܸq}?+k SuGqD&! #@}K@xwgu۷M7ݔʆ!  SO˗V\. օ  6myeAKh@Z<5Xvm33'  @/ ! @O+~d\5@@@J/X߾}MV*5I&Y֭K_)K" @ŊZj9-ld@IUVJ*eFdu7n4=(   >=ά@J)@s纥۶mkݺu+eM,   ] mر>ȡjO=իWϟ  @ tI6q`@ mmYҹk.]'_6l/ v@@ Һ6V $ j*[*TJ-@@;:ut߿{ ϻ F@@@x ♍y@@ x;MD@ y睶zjݻ[˖-n@@@ 3g4e.]|kKSO=5m    @y Q\yK@ >uԌ eXbw}*UP"  -0~x;蠃ƍ|@}~l=   !@8@< >Ov4 @y2d_|5lذmE@@2. 7|uYaמ>>ck2>   '2ޗE[@H@WI  @~ԨQ5j__ Y@@C7Z駟 /#FXŊ40   #xO}1P @pu%v2 @y뮻Lv_~ @@Ȩ/b'po\O>m+G@@@@@ʫun@rTzm]ժU+-e@@@,ZȎ:(?[zS>:5+V@@@@ x;MC@ Acv@H>h֭s+ lmI @@!?.~p[v+bom%  @tf͚+T`;찃5mo?UVw}g<7Zszw1mۼynݺָqc;㏷J*ejk׮u7tSTRnbMſƎk|}WzjkРkaf~xXmܸ Hye=|p<[͚5?E T~a_p:ugϞn8?_Mرi&<11m4wl̙3t,5kN9w}裏.\hիWw>csޱ79 ņ%Ela@@ Ͽ}# p|ͭo߾YV  dk'p Qc{WQFTڃ  @J[|y̺8}׺^7ŋ y督+ꫯaÆySNuJUo.]n~u׹ɭ[NZn֭)^p|+P\ߕWZe\s VvXe-,Gh/T2{ʬv,Yf̘a-b[o T{L2ʕ+]K7og_`7nt:Sew/q@Zj.W~ɍ*z% 2Ğ}X/G2N:$wT  :F.wy"Cl- }g{޹`x|/;'l.BA@ >=[ @ +}4@@FqY=?t;Ufcsi  )PO|򉿞?F2ߦ]vVZ.첸{ˍ3oڴ曶;z/A>)_~n\_~Zp@A^IVn<*M7,xEA/{ޤZլYӾ"uE7(SVʲSq޽W\V܀nzV{ -;a?aÆP{cRoo{^vxnxm{/ߛe|4&dO̎@5n˵=  PNfΜiTEݤAA@@(^`ԨQ֭[7?^=Aų*  @ T\_xn@9mڴ)lڴW2O:5"^/(K.'|_ofl]vq _ xv[o~ЫA{ժRei׶P_@VǎnR(~nvO2\^ٳꫯ NvǨ- t?Hc+KiMKVRWo@W{y޼y1іMӧO>֯_meX x<x@Ȱ@_).b@@@#G^z9T.R{G#TF_  o9s(%K\5 Vn`f5kV+VG} /2S)&|n)eW7d2~x[x.ϋ/g?#I&1Q6`m fxUPvmyr7\Plܸћ5YZjֹsgwDvnݺv{a_X&<3Ϙzк;t`mڴ1'93% ~{>` dgOٲ'h y,,'NtAOc 6@@(Y@7/_ve\s1"iA8~   C^pmRŊe|_zJxZB\>8-8op +Sm٥"߿?CƵc{q-#{Ѽx(;Q .ߩS'M+Eukw 3c 7:?޳ʞ.ʞ~X.]l.>Ir=#>Qo xzdO9kA@ [=C@#~6϶-"ME@@5jnus>`@@C-Zၷzˮژ)SD,͚5Po5ܬZox*U2k_/x˖-EO8;v^ڟ@V֛)蠃LsWUf !ca6lqŶX^fmwepcƌ1=tx8wAqU3%o6nڵk'jժtoaM4˗=c}T={s5# dφ@@c ӝ~@@@/uv׿^{Uf;4MW%Kף $j4M=%(]E7s(+yq;64O#fU@np>X,{3ݠeW0ga ᇽ9}3|^hs|I ba/ý7Q=ڵs˖-&iӦ|\wu~}p&paTN@0fmF@2gͮ! ĉ ׏Z@@@" w^N]/)bZ  @~ (K/T$:,,,?FD!}~z-;ݸ{ի>3S ׼{6gf_emܹ-D˖a< tSĈ#o):6,3Lb>{Vv0su,e>_~ͯ:?muH"&SE6mrkov0釋A振ʟo߾' c{2ާǙ  Px_mD@ +]tyF@@_m{nʙgi#G@@bԫW&OaSNn?:t` VNfQx~駄~m}q&MX7:vh W6uePn+Wn)ުb֭[ۡunݺOAܧrxӣg.:Ɣ]「<HMϷDM+܋{][oup2s!XbC?-^@fy6@r\`…m~kܸqo1  $&R.* xnjnsdn@@YyU7ߔO>AArKRA -M2.{nPW*k7eׯoz2eVʛo _eVWQO<} ?C v3O?1p '|]걀b R:Ntk8Xg ,(kŪinHt @$@}Y  Pw^QF    tQk׮*{=sVR  %pmYFܼ#FHjv`b{;︛6m׆&i=cW2}{mIR徚C9ڴi6G+ccʔ)f)Ӵ`{ܱLMn N_MW^ԣEq 397zyЍ4*!Yp^qyEo@~Y& J D[@Xx{)0#3)s']@"֭K˺X (PbE/7ΡW(]\ڵkD0 7`/|,Yb Ww}okܸq{KKxwlqj_lGu]p.X֮]zRp%QRMJibՕk֬^z_Jt3zDʱkuFc>of.sqEǏ7}gq;6V^mGn+ow|.-X^{ݲ׷mF''Ƴot3|uʕ+{AdrwU.2]vR(ul [ȑ#M^3J6j(4i}ᇶ&eTRzU, @x+{@@ L2o!;13]@@У) Pnݺ/T솹Xœ\ܳl @6 ̘1ڵkMm\gϞv뭷ڏ?h?MAޥ^yӣҹsgvmYo?ح ly+(ZpQ}rGN/S}ѱfO^{PQ#/WyV7~.UtfkE+cǎ5=JAStM7d|MwuW{M*w /((~{3FO!:9}ptSܹsMItQV6m Iի;.~֡CT[>('}6. -B@ ҽBև HwuQtA@@]iӦ9&M#<$l?  q xh VZz^RϼR2nПhN?k,Sfrewz׭[7昽;eI*? ,U|;eW^н?3O>zꅫXǖ׮h뵉'ڄ zk_wu((n?3:Z  }:Y 8ueGUŪ~H   . ʶʸXF|ga@@[ヒk^}{{ p~ 74ʎL /mƅwyn-q2Π@p=xb[l 8r-][6l2pG[MTzW,m,Q^{m5m^+{%P.p;6fc=馈ʕ+mɒ%n?)PA. ;'k&1cȑ#m޼yY_bU+z.s駛ڿʺϋ>8+nxnpsX= dP j@UY߶m|e`@@@~4 o>uF@@@(+wRR%zP#]~GEz~.| TRw_Hp2Ϯ}KefLidO)/# P*X@ u֭[{<#  y+/~e[ւ G@@z2q+w}_9"x_@IDAT  n d^?߈VZeP'N,k5, ʴ\V-,@$pk6lU^ϧKѣiV@R&p;쐲2'a۸qcPJ2BrD Wo&@o{ dD@*+V͛' sε&>*B@ A}>l;S`'UiN9t>֥{j@r,pGx_MG8 />fZ-b  T@Q|l3 (((/ҵI&Vr U#  :t߈[of@@&ЩS'Ӄ Z@(ޗD@!e/\~ۢv-e[֫W/;SV?# iӦ⦱M @ .wΝ;gm[0܎  <#sſs" (@}D̀ @x7 E@ ;xFyIu]#HzT @. 3&7mCRue ㎜q  믿̎  P% : #P!6-E@l$ڀ  dL^pTu%c`    q] R@BAO   L>j׮ l2    ^o u  rSN @@ (fN:0   @ ̚5N:    dC}Z @ϔ yp@2#PN??M\r͜9M֭;rYk Y{>cUV-2oqMf}EӪU1#w}g]-w9ic*d ̚5˞z)4i}wEllw7:իWdMHj:~.]ص^1-<裏fy<󽚬c=9)p>VZy"_GL Z*POY*+ʰz%g]J*aqEkժjtnQe aÆWR%8:KêU\O.zAYFNn]e=fzxFeW/BʴYB)@/s^W}E e8qbC1s }I楱cFx(ZV}9F،3qӼpl Se9f0 yK/n&LnF|w R}}\Zu<`i޼vm.+|pzp^s7\c} 1>*r[v7Fd :/?~|pv E%:'^5jDLHlj]pQ=(N6adz"?=K@M`qSN;#[K D"f@@ ϫ" /@y +deUMIurew9r)s[˖-#2Ϻv-pp^Ke}2nP0q#3Ns?nڡ w gQZ[OYxh:u [/$8ܥ OםmJ w߹<￿_jժ'a}F>6|5 ҫW/<8+f'eP^KKu{$;lFHzww:˭7XJ_=+iy뒿Ϩ1##ԩS]ƒKuQvG3<qSoxy^np\yJ\жm[=,!>-\NP {e/&M|V}^wlRm=<"U4\oН"d0͞dB@߿<4V գ.@[l= Pޫ(Xy_LO?d,աneYj˲+0$|!Ou:YjGQV *XL/+]?10xdɨ#>ݠ_'-숷X#Ote 5jTԠ{ESO=h䕥KzʐgEL+i SA+ J*ys*Uc&b#AHgi@O Z}'SO0 4$W,9Kdmp^ϺQ5X^|ui.]ѨeyD001|Swta]r%ֿ}foUM /,[Ϯͫծ]xNM*]"6 #Nاץ@ʴ glZ@ oJ W2ydž*ɒ 9SL ˞ q2kx ꪫz̩`)pp^ /iZI}Dd[Sgu'zqVm,YV\1{vD̔# ѣG۹kFN;˭;w :4 (3fL\A FIeunR2ޫ:̜XJ;蠃LYU/D,Un"7Mˠ0V^Jas{ocظqetzj_?=UNjVc@@*{vsIk;ryeey]p^oۺu쳏?^ցT~Uxݔ. W#!+ 4۷7JTDlDGy(RO9KFui8餓lĉi_/+DرcKisaÆzͦN x R'E @_$cJ@Ƞ;hڵs-={M>=)yW-QR@hp[om"ƕ#<c:h_A:˗ې!C\W>iҤ aFa {キ1WmIMujDTᶵh:t)}QĸF/{;M,Q$yD7`/ĵԩS'b+VG3{G,mD/EY ?X¶l ;LpFHnS`;wv+nݺYN_CrxMD缮,p^駟F=3b# ZѤuEL,HX x&XM6mDl̙3#5G+[*^2'R_?QߜBhDY&Zwo֬U^=h9sDL> NN1 U@^~e >ּys@~_ /9uqX^tn|_'i8|'n8Y '>ܦ]w56#ؚ5kY*W p;ejf$u< "U4\/uI= @H@Ί@Zv0@r[SN1eWQಂK/|\ܞhڂFB]˪;Ҵ3Hi"gիu[~'뮻\PAdƍsʣΜDoEK//HXm{5VCZ`)Zj^q='%0nT7o^DMg}vx``gz ٨sҁHpFkvkUf.}|G]oKi+q5es+-x;O.Nh ӧO>J{G4*HxnyÄ "jԹw/.z ֣FY9dMKp9\dO>U%.@@ =ާǙ  P^*N@-J*СC]pmY^\lMmh[A ]pav[pDpkժeʸnݺ6{츫Y^8fL7I;D%؃>hz['NY?_flȐ!6h c_x"|}Gv\XLuQe۔1ၑdWSu&{k}֭{z/X ⦙x>;,o&8J j9#^tsѮ1-Hxv".Zmڵk] 3<Q?i:^L3 @tcnTp7l:_Ryvm־}{;͡f|#eyuYm'x; ͔}\=}=7[R]Wm_٨Q_;3jW?ތF=>OwyईTڤ%bC8RĐ}y]2B@2,i&J.GA@ >?[ @D +VpO8wѸjժo ִXZp,]Ǜ>\oў6OI{f)+GWzeŸ9sfM>}Yg=TZ jC0\U(j2KIxZWqӣavͿM6Ώ>{NԲb+MH83b8Uϙ3'ha{-~/HgF駟ʕ+G/Z31xbylfAȀn{LtcI?p ޖ]裏6 ӪU+bvVY/?s^?>Tw܈y]GB1F1[㹰_lxq…`de)Vo."P?7ʨۅ^r8NԩSV1VCi2ޫUhz8+<`MgyH^QHKZI&^}^x` #_~19H$ӧ̕as]vXF¶EfcBEtI1G@  :;v7&)s'|zݶm[]O黧2k Nbxxq^W#n;Mޞ7l`?C^܍9ݫ'xN/ȾY:w\ٔ=7XnС't# hv oK2y ҵO9KG  @fxw֊ @ x{v! G۷W_}Վ9[n)C.F)˘g2}[#x-8_x8ZY6leg ]GʢL_>tSN9KZou;,f |2d.^V= R\OI?g]wMjxh|`$|&㽚c=ܶSPI¨{K/y'R ~Q0y6gԢE6|78ua"33Cv=lf םE םc&ڶ2 @ @߿/+ WY~M2=-M{R`սYr95C Ἦ8q^W$+ Aָqc;\ҝoZJ#L} _^<î7۷?_?d+ꝶy[%c@=wb%S8cK7t5lVphi;>lg:uXϞ=-ڱcGN͘,+ݤ/z͛?dqG$HUԍc|գzfnٲeoĉno4uLVFvAjՊԫգWϽcR#C[tsdv;ȢJKStBcmo:p:yY#@l) q JA@B00YQ"oق.] +< %^ \wu USx#AA~m㎋XYfQ+@1_ ?E4 &ȽIDUi82mCa‹ETt]z]6DhΟ1^U8 /TR%|ڴiQˇ-^:fO;) "ePU#%mݖuP) x_  !l,m]ɾ{+  {]vݣe֬Yc|MDfE\wJӃʜμֵk,p8fOgNp@/Z(bD "NӈL'Zui_R2)듗i4$k /H*XmK{5UǺ8)W( IӕIT4zxg~"\uKpÈ*v[7X0*Q‹JGx74Eda\v€{+%T/Zo&@_@OwjGYfz>;gQ~ɍ+PLN0epT}erԳz) $:Kw)Eҽ}ו][w5=t*KԩS#*0/bFR]Ws;K.KY-Y+Me弮,G˖'&SE?p; Om,dW<DUKS oqKk;sJSm2Nߞ|ɒ%l[eL/L/"_}V6uwg}6N/z:CLUM@ۧ;Gᾣjʝ?$ê IӋ:gz/vDyEO,\tK8=WO?M0u>_ o\R%~- k^żLʺGRpd8O#w  @~ xG@ 嬺Ea]|WP?0zE?{E?pkhҞ1ѠpOt׈ٺu1בhz=/jx hUi^6޲~z{]o;-`l^J4{o`eoziSy+}ӝ)XRHn*o0nY!bWye٠A'֋Y]0r׋~1',\%E+Y)5}-M}{,]?~/p1gBi kU]Ӗw^z\ +o|իW1vZ0`15kžh_=ٸ5umWTwޡ9Sm{K:Rxђ=SV[{3Rp<'2OYDü' [ E@@ K楗^r?H+1ZQ6)ʹE2eډpY\=cƌxYweiv+6Xxnu&ˮjz.^1=Vԩx(eMW)V]jժ2 xոqjpۢ?+;wahzE{[ǚ2&eK f_R4^裏Bd2Uyd/ꎶSu8}n( dl2#ޢ+nwt >>ÁQ|  x }+H6@YUֳKV๜i4Y{w'}1dό@esym 䀀~馛Ot9Yg} T`Q\si(Yf?v-6N]w=<WVpK8>XO"ẓ;ZSuD3PR z‘s.{UV7_~1=ۨ׵uӝ,x/Ly@Iowwj(Pf=={(@V Q)޳2r*(@P)(D/9n"=^J+ME߳ݘ:?-.p2> +Mw zuֹsgoTلMKXy67l=\o<0=.RmA_&L8ɝr,:yK/uAJBcVtcAY (_7Nu!x\Y-ۣՇ~8p38+%F# W6gҪ.-k\ WQ/d]t)nvYswwy /,V_ËxYs}\wu$xQo>4^MzOL7nz|3<֭t軺8sQFezt% @0D@\@eH g^WvdED/)dΜ9M*v?iavix#6ʨEe~BaWR+P2Gw}14)p衇`{K>:vJwyǿjWVP@TDIQL*M[ܵkW{衇oͳdޫ=]JiJm֩*W to,?zhM='4ug߀sM>|{ɛ?͙dM fnL;kpoWw_|1/K{L\TIHFaӧOwׂcRwkL~cqM4&g]ի{oz/(K2eہndiժ7 |/g9@2,@}wG;p)  "" V ( "P@ 95\1uMP0`D "%(n_=33p @ ? hLֻ}ItYJUY7|竁7mI“8Or`"w" *.NjbРAv?Zd5PVB[hW>} v%RLޏʑjuY92/CkЗʞ~X &IDM[nY.;gg@Daҷۖ۝K|ryτﱬ9x&u;E?~Ԥ}R>Y,r!fv &j{~]q<ޯKX}ɶ #A|ҥKb#8VnJ^,{"HAC7G&dKW:9S4_uZs,"H[JK;\{wM6I(y-ÑD%\b~a;quB=ܰmIN~̙TW9ky4W]uUĝo*hdv$ "5]~nKi.'^|ͭ"ݓR3ihG)I?${kSsM xd(D %PDHEgy$ I^qorQ}@^w}ԩBVh]o~֊~w)WXx @@U@ T$ ! %Qĩ) * /\tE~6ʍ&<♴V_ٲK =wnƍg~oƼSW}A:IGxs||w:ԀSO=Z"+/hH1R ϒf^-ⷶ;۴i cN۶m[^_,8իWsߒ?njj+?HL/*Pټgƈ׷ "&^~isggN >NG @'~&^ ǧ_-wVJe/6K.yW c- K&ۺR [3\ywJrSrr~g϶;,c)3N@IDATV)6RiE P:U3S4ȷ~viNN@42m4KCz-W];~]8QF,G辍&ZD%%pYNh?jժZ%ngT)jyݺuɦҰzva6,k Kvq1Hve˖YgrJWcY'phF9 3<8Wp2ñjxI&F|{(J6IyN*ϵ[q'TKtjaw$|^}@Y,Z\4>]A%zE)3ErKh @ (O!@%O`ȑf8Y Y)Yk0.'ڤ@(+V0HY;lZii(7iC a\+ ljtܮ];sW8.,puQ`c)NJ4֣G3`k徐;{ML*iYt e G}aKe~5]z?KDZnlW֌d!< mO"3꤅ ܉x蹦{TV{m?+{Ǭ  ?/w8t/;v6xꞋ0Ih7 oM&jl}1oiԩ{[KߝHg[7q; +ޫ0k,DH)w3tea4bd~ _gꚆ~1Z{Hg q'_HjDd?_{5gl$RBf!RxOc>?֢v +q=Dt|i|Uwu킫T59xnkИdrogp":_5_X˛ȱvW',GСCç*=ZuM%jtź|k02v I?$r0*G]i}Na.@bwT^袱L'ZD M7xy@($(բ ײâO#)kb7<|r#eDO4 ^hx"OJYDEJ??N- sR(&r&D RL5jT`Qŕ]JY$tޏ.ʞ꽮q7xŚlW GYuJ& ?LeG)gR/ځAeC=4j}Ԅ" /J#P"k& E/UGMײJo O 5e Ph2^_߻~]mQh?Qx)Gp »*\$vmvmg'Nx/{~XdYVhp7lfK"u7l!T0{zM _'[p)=쳏G?Zer-E%KGfjXJ5j (gZҵSbH^k/;~_R;t`:wl^~eCS.|4VNX5r4_+V,sD-ZFF0{ʱIJ0d^Z䢅'NY[ eq] `s)vI>}E%Š5k*iV8P"Dg2_Խ,“J)s|vʭA|TKiq3閅˛o92Ŷe(hW/t?S {:г㏷b[&6hβ{٥/ LGkƝگ}: k%wO(m]e&F[}em0YCW_ydM.T-֯5-~?>KOxD%Ouʔ)A-ϔh)k=S4Ui'~۞ҽYϖvҥWH+c~\ﵐ*N:R8H$J=Z?ӓ4ޫ% ߓ_yQ;}p/pݟ">_~}Ph |?|tԎU>Z\O |#}]@@O嬪$qX8"KmXٳ[oőM6$#(RʹHZᰑ87d9H[?~Ziذ.oXRg~5S !‡?Td'$?Zxq|V&(h^.Iv^'t.Q~z;S=ױPݲ*%+msε}kr*+RʗװB3 'b6.+{ƍg^z%ظqJ3BZ =M2Un}+Sh^K CDLLѳujizfs, KhBSMBvz]+-æzln0e IX'문(Iltx~5>q=S>i:ΛJVF dm;Y"&1'~\S+~LkSߓR&F%7\ @@^( @ Lw=z<qO&D|aLC% +,s8p]dSRP"{mK2y?f򿚩{]hHD.DJ;S~`,km݋?IkI'Mf_T\3p-0otb?s1Æ 3b2)z殻PJ9!@ dHժU3;w;.:o*뿠ڭlŲ*m] <q'*~S5W 4]b띯 \_](-]Lg}6d̦nlă @9# )w%!_({9[Z)v:)>1{Ǵo~"E.RaHi$we޽{[D⹰ME NMAY\cҊ+lj vѻ\J˗/й[bdW;vDJJedC;HaYƎ;d{YaLNsbպu ZpWלhLI;9;tJIo vIнr̚5|wk׮f >}fٲev\-+>B-^.jGv_u"e|֫WNhwȐ!o߾Xt_~Ɵ~+@"| @LR @ P46vXH1c C SmAϢ"  @ ;O?UNz!3Ϙ3< `R0.^xZ9w{5I)~?QGNȊܹs+ oUmǛСӧO\UVV]`0*nY|wJbH믗[PW\Yv|SXPWχɰ"T c={gN;4믿l.,  3uQFx sZCϟon&OlvMHZbhW_;F('R?De&Dqҭxʙnx:u ..Xd}i-sꩧ롲i`gT۰aCs 7gv3@;tjԮ#G4O<>}zvHܥR P@ @d ՑGw%q.]D-K] &L`na9X -21zh^3͚53R矃j1)Z2uTX]${o/ŋәix^I #}]0 @ @ d1>Xڶ@h\M6JdKe,rU_ @(MJ'[kTaPY V8Nlo^xp).[WE]d=}$"R,I~5ט?6GxRfm|Y6sY΄(}'a{‡ÿ~}*͋/؜~)?l8DYI7 2?qVY;ult?\">ޖnvmç[av<5jܓm۶רvb}棏>~26b4WUꖒeM_auaeiϥruTX~9s)G ќҽKy{|u^紸c̘1Y7)wJǵv@rKW  &}i_j@ @(9o'kajj*;vڙqȒB!@ $ cYCv _Kt#e EY 40-[4͛7֛CZ쑈HAWWʐ_uSO B @H"xDR]*Y'e][o5~?];[H?V=SO=es)7i*RnOveӸT"pz/rثq>}>H*'xäz|ԩcu]F;ibN&ѯޙD>c1,YZBƍ+*HW" &}i_j@ @M iƬ[bMP+ҁ@kGi}iK?] @D~]>](I'dUZYF0[Rɂvr䖀vѐ>"ڱcǎR\ʙ&j2)ɸwxfx'7@@>@> e @ #͇~'&fͲLbV^mZ}~) @_?+B#uYv70Yzߍ6<@INH_\Fqa" =} @d T-ٚSq@ @ PF`76'N4/Y~93̽k @ PիgzirJ3a„b.u@B֮]k֬Y'SJ&T"5* L x"@bP@ @rCzVn&asgm1})P @ @ K=X3zhۘ1c`Yʚl 6mjFt7d1>\8 Hɳ#& @ x_W:A @ ÇUaÆY-t5@ @tAF ˖-3?B)#2Jnݺ̓S#5J! 5k֬<! @(jUvT @ $H`Сf6+?ꨣG}`* @ P8DֳgO[իW &N)) @ _F̉!@((U @ dmfze_{Y-A @&>}=䓁 @(eN^;@ Ph  @ D QFv͞?9#  @@qܹiР̔)SoV @   PDP/IU @ @Hڵk~4j&3Ϙ#G/R @ Gj֬i>`[UV)# @ 8j+! @{@ @ @˖-C= ̂ c @GTg @(UX/+O!@ x  @ @8CM߾}{ʕ3΀  @ $н{wSV-[I&e= @%E8@@i@43 @ @ ri֬Maʔ)ˏ)$* @ իg:wl˷d3}-+ @ kԨ <'}_ @ @@ lfĈAA d֬Y @ P,9䐠*'N 8 @@)mQ/ūO!@ T @(|3f0<@W@H૯bnU޽`Nj,X`FiXx L@ń !gңG )2$8Q:4F{\oj |&+VssZ6͉"%,׬Y3: @AL D ;@ t>|i߾Mo43mQ: -@_|@ ]-Z0첋.\h7oB[ ̚5? @ xSd@;UD @ )vڙ={}wXD @ V#6 @(`X/G!@ @%I@rC@gdN "#аa"Qs5טovsg*U/R Pfu%|: ޫJ͐!Clt)ޟvi&E" QT&M5:y4w:Ax85j0 9S=@@)zM~J h۶+b>s3i$s!$d @Hт~]]Wj@GSNAffԩfڵzu J&VuK ! y睍>rM)ݫ5kuq < P5@ @ @@A8b 0@ @(Rܹ͊+ӋfT Ox@(i%(O!@E`ʔ)fU)j@3g ;,n.P=z0M65~y̒%KLƍKU ^˓  P(r=I[n駟5>$ ¸NJ@L5VG1Æ +֪f^#F0]vXoF:C "} .Y^O R"oH`B3@jon&#Vcƌ1 Hy@@ ~KE{5⽓_|\"%H/,Ղ@x㍃.]6A@#~J}zy @x_ W:@ P@Z> '_լ[.jkڵDdV2k׮| N1^ @ @=znYD @ TVV_.Q@ P)+ED@@@.9 @ @ ]k/~ҕ,@ @  40{챇-˼y̢E\ dx_FldI 9Q<@ @FmTN ~R2@ @Iܹskԩ @(vGPEg%@@I@$/; @ @ ]dٳ_@ @EA} @%@x} \p@q@" @ @F`wN{ @ b ƵjղUyWJ EWQF\q@@q@񾸯/ @ @ vm 8 @ "!PvmӱcG[ }@ P ㏠XP 4%]{*@ u3>;w/MݺuMfL۶mM=̮ZL??~H}1mڴ1{Yr ҰaCӯ_HG}dLb>f=iӦɓ'qWnfO st|f… }go y|w殻 N_˖-cYJ?☪U{UVFV7xr֭3*[oet.[4mַK.栃4pTQKJ z5k-y @ }]3nܸ ֫W[va;V8Զnk㭻k׮fH_3g4&Lwnd9HүS}:[stM>kE-oܸ9ܡ_uI@K2Ơ^{5O9$S"ZH{#oF^ >ӨQ#;w衇;8Ĺh2l0[d;r!W8~믿n?|1c̜9s* {hNީ>LtוM uy3c {}Znmumtr&+,9M+$cZ#u- @ *  @({P֨A . Ώ1yǙ#P\;w ÿx?b!Ri~jLiCR oh$"-4>s$ _)׶l#GFP 5n8Eҡ_WGIDh3:_ЯH(SZ[:E:HUeVZ[B$%%K?KŋEK,VY _TzOi.l<' >dMVZe[[#YҀ %Y/S1e!fѢEB," }'Wc1Mvv2:u27|Zkw}J[Yȟ:u-kK/dӔR?$V봓v0P_I&v0`yͿo#˥D;ĕ)E;mG:I.%@.Qb񇗵ڵk2%} Yy~?j',Q=5V]WR38ޗ?lÏ?蒳;C+lD':4/8D;-1,i8<]e #⻦ *S%H|@ J X\uU6&ˬ( ))j{b JmmmqY)$*wq_~i{̬\*~@zig2|4 Y'2ӟȩJ̚TvN4\tEv9$ )_xfСFN40~xs뭷:/~@*ω"GC Ih'zxh @H7'tRP5)V׼;vgi,ÎDjߟ}ف}َ\7NHm{)sII\Z жmpQZnfֿ*U*(rEM_צM{-0sα}B8p=ЯK#_Jz|ƌ,EbXHP ${xejl[o~jHa>{_^cYò]ܹsSQݩ<t/({uv nc:V.\viB+xu饗^zUx{glVj8C~a[65fsZ݁H2xM&L*y24x_יZB!w"1 @  mXVA^5mH9J0ʃkbPJ~*&r}z+ID&Lw5sͪl{^3x`s}苳{oذaN08`wHsB)H A%8QтW_}HJ&Mf8+%\z P  Ɯ{*_s=ҽW_mҤIV)'KNU{w~}?;_ש{QG9sa#G4 ,fZep񥟎~h'= G}dDao]7!eZ%g:޸ ׿5J5D";Rxd$Dcy_寱I3x/oa|?&Ss3OzHI_E jlJ%Z3dȐrŽ+:TR %ιde /Ƞ mUf̘3d`n#-&=ClOf2fd:sb|7O/pvVC @ @' ˃NhSNY=:mذaCC=d-g^ kp_ڥ@7d,+R~ <"sB5AY.mNAM?ͼy|7;M2%x'{ュiM嫢F ITP/ I!@ iRjݺEl8:%bm\[W+|v[u52@óƇ~]P|FTYf]wըO%_o5%s"jEqQ}M7'ehtRkaXZD>WAqPPB ;J2!J.NWWyeꫯ6,/^luœ;UI)XcrzIX!%tnqu%p9yܳg 9-jGmi,;+-2nT~]pIpH_'xcƌ1_S¹vOieIA5f]v/6*kZ}'F?o5V$A>'2N"gtI;G.N\s KP3!Vdٓ)||m1߯:>n~s/ct„x V&8yg-"-I %P^`A!@n JaR^v._X, GV7pCZ>c̨Q̃>h*k}B=dډp}C²`WdXitٲe6=78G}Z[zo'b}UuNb$S_~d'uq<ݯm JUS<+%EduR;m_LcKz26?v )_p&^`ovL7`]Zn⽢jRRJ[̰a*˪vO8TɩdJW9{Yd|2J*;4aW_YEdm=-Djz}ɢO?mݻ3,k?K'sb͚5D 6^~e04Q*R̈#"ս߯_K>}Bq ͛[~`^zVo1_U':tpm@j !>jKQJZ8\rI&ZC&*A+Ѥ$NtD2!ԯߒ}˭&ZtI~]4b'B ~Ҿ+\s8p`T}?h Y3%?'Ol%.]زZ˻[nw,X>|]@ҔW(M[xK/SM7JgI+1<}oZ۠e˖ MXI^cS^%|TXm)+n "&*bSA˸j%gi" dWznL_nݺ8?hrw%p %}gT(GE @@Z5 @Y% kaW\qUVoz{78͡GYiӦMhʋ% -KЩok…&W!&W#SH2hfzJ]2qDD%^VɔYe>j,ر)D[ϲ/M4hX[;&4-)^.I@֠yN̝;7P8{GG Ez=N~;UWEhԽܩS'nѢEk' )K|@gq]H"?H ԭ[7@(RZ0K?9͗_~ij׮m]tQ̚'Z~"fɶmZUyi/N^k/Tԯw /}$iԨQľF[@A.M%hNRDO;4ԯSN[:t>ᾝKbXD.];W!HSK_}q?Xl  jGq-Swj?$SXN+=su[;}8 :\ձہ5_X2&+c/2!ba9"ߺXGjM4)} b%ҹD)eVIDsw+iKWW? @X @ M^)SX+,?_JReJF.r-WW\i-\uU$YjU-):!_h$J5Q&ٳӧO7_lxeh+_1MLKA_<'d(a ӬY@OY /7o^Lڽ9qgB2O79ϕ @E@֛e2Iݯ}hwd6#G4Yb]0М¨?RʄSN|ILt t,t׉Ҳߺuk wH֩dBB?zf9裏w_-Tr;#hBM+} ERBZ5q[n4Rט{g펣9N>J7ceyEkԩS'+e?/&O>a,C 8kEԜDD; )O]wtqa8yJ#~?>qϱ"ҡ@M!@ $ c @@dD?ZK̲xdذaKoLΝmrvݪ;J#S۴RD:k'NrMp:G2ͪq}{mիIiYb>c$$%|MxK9f-UVW_}u<$LH9OD}TM4t\n]'xe}tVp - A2Ksϵ1cXE{uV=}-sYW_}&]|/qAt}:~]:ivZD[;'X_You 4&,< Q~~]W̗ݦnj"U)]>%O鿔wN^WJ^-d5|CL+'|k(.rg9Y|s +V,*rjyK.Ϊ1= ]:S{^ɀvpce)3>D/ w} (x_8׊BEl&@ 4ɅѣG^zR"ELHdK)7حDad_AC52}]^;h^}.boijkvep/:'%@ 焯\-ka04<ђ?_4fAR ! >hh])ю<*GJ6]gx$yK/d/֭uW&uRR_Z_tq_.#ֵ6}q)+ Njvy,oW֯ݻGK.2r ?o0OwP ~{[ K/eZ^%|TXm|W+sWBu$>}1O>hCO?O`SN iw'7~p/zɑ[~8{04(?s-(  @ _x/Wr@ '[3F0nkЛoH?Yq O$^.ɲڬY*E-) bZha3`OyFaN6,hr) >'}^ IYrRn]4m7g&7@@)P{뮳U_Uy)Biv2}8Yw}m½UPzA2ݯ{Wtm+N2BF ~ᅤuLJT.d*)sU֯d,$ 2vA &;ܲe0Ycn8+t?i$[~x~ xb{)M#ceF5IΝxsŪN:Ay|%0pj=3qgHظӀ jw}J>.cwf͚/% @ P% @"ЬY&>2)ɢE#c%kQh#|;Yu&M6$(oРA xcҮk׮H1xsFq~x?Lnw%~; ^ r  JP@ P4q9bjժei8WzZ\+iIAK^gW;-_-ŗO<:պSN;>O3Cu|=ޘ|w1g,7if;}tdH~ߩTA={I|[nEp ` CڵE{W֢í:\ܴ|iecs-nE垭bպu레ZڊSJSLqxQYLm_~ڵk|7e˖ U*}n _g(5Ć  R@ \`j?| Ku[o &7l3[ JժU {c=HYDVx7,+~™,,:YYG,kѢEh_Y5#M,Y4nܸ\TY[r8υ^h9#))K^u{F95!I+V^x"b&bdũ"#sB[JvWQF-nM|ꩧ Z24Tp5lW;wy]wY=Vӑ#G'xH wHW\2Ȫ~ @|)_HD9m>3{キ?a nݺ棏>2O 쩾KXd_5 ݖxY_śO?m˪ꫯ]Ĵjժ_h>h裏{q3(9@<:E?묳؏o]ܸqf6ci\+]rEgׂ l4wtM"ܻK$zk6z6kO {CU'/R hRIZli:wg6hժU`Q}{PT8nO/Rq'˗/NE͛ T&>]:ɌWR֎Hi,hR*VzuQ'4o9c3Y&'OI=R7޼K Th1KK$sD 22J0R<9 B-n>PGDo @(c  @$ D):ѤBrK4H5Ȫ_eI|` ,*&[ |8Le%%5kWnݺYuYkR%UVϳ2w~u]g/^l'POh]}$IOn[|q9EGHi֬}I& NԩSbILԽdVξ엄!@# %)izJ/2?W_#߮P~J{cw7E˰>a},f@ٳgޭN>o-{=h6{Mf̷vAe^x"|K*i%rtuرgwNqm0ۑƴt bvq&L0v[԰ɜH?L>ĉ>g|7Һ &IM@ A@VauQ|{ Ϙ1ømO]Ʋp[̑~4/b3 i_R"ф&<4ОNuu >]Rp LU8K?ү+;_bD~u:jrηBߓR`VL,r WPUKAc̙Fֹ52twTv:smU)JzjwLoOc] ~!@mWbjY2$VpSO6z$%ڵk=F)>ϥ.J*+K>~]|5jd:udN9DU!rJ~]eDK0 WG /RPՁ[la#YtWv^ʐ|򉵲=7ҽ}wgs+k )=wD{~NJ)=;XnYˎ;haa8aSukƉssrnrJ31gcO}͹[@uzi3( ̱ jӫWun[wW#>6v֮OE[D;hD(JLKإ~isg|7L0D8 @ʆ2 @(}}UVmAP_x 0#FAq %Kح-Zd-7m*:Ō<)&(!RVֶ'0-Y)hkf7]B8 RbX.Ȧh)Lh{svi(s̱R=[&ڄK z$Z! T$ k$)>}رc@~+ yMয়~qI9VJZ(-4 Я+7j6ٖo|6[) 3UkZeH(EAKHSˉH޵zj Eh[6~i"$l{Ddhw>̟?߶4.6$q2@@cwzFMQ:'ƉΝkޤI#%XIeBv~ B߭U>|yNN;h[ 5% b!pmb  @( RG#RUX1󡜔! ԪUn깺f;[h"oB !:t}-&;ON&?YV߶ʩU04d h )UK^B /.S 03 %i@ !SN5+VH(N)֜(=3ØT!@HBj J ;@@ix>2MWo߾}#}@%EyI]n* @_#PzuniӦ/OQFWPJ "0 AsOS'iD'}t6 2\y@ @R!; 40ZJ%)B @(X{GPvr  Q\@@`>K ? %mن@LÆ ӘZq&pBh"[9)TR8+J d,&+@yD?^.ޫ_^ :leM>i$00I H@&M8x mFv䌟UrIO %P5F @ @@6mZP88 @ $vۙM6\@ P|Zjzu(? @i"4$@rO`ʔ)f/% 3g>0w\V.̦Nj6|bbu{7mUV5;vL9= cxs@(M?84!d֣G6kRd*ULK/d[iڴiŀ5y}y(@۶mͨQl=y3lذs+8bӵkt'[5k,YT P/σ#@ +'|R5 ~@*Cq㏐>*O 4O $ >O 8/{默zfScxk֬ C>@ PP/[ $8- Yn]T]vL`ժUfڵO[kf֯_oor8 }@ _ T^SN?o˵zj[gfAeٳQw0 `^8 $PFmdjԨQ5N+g'oSx_לZB!}<@@2d4hPC@|:udf̘5gm.>}'x"H%W_ j} }V$@ T8#رc^[n%'g͚2iLKRbRJ?ݻw0|R}1~@(TU  @ K/dV_b/ @ !ТE fx7@ $_IB$ @ x_*A @ 9-2s̱t4h s2 @ "Ю];[,\JNQ!@@yk֬ Qz @ Xϧ+CY @%}n; @ @D`ڵ^%nذСCB @,ٳ3C XfM:  '} @ @ ^oYl ޽{wSZx @@h֬iҤ'E  @ `// $M @ R#0qĠʇrH@ @%[ǒ%K… @ x_V @ ?IR @CY|yWZ2SV&6xr݁&>wq΋ffڴif֬YO>152-[4z9L5lܛnɬX_}QӉC_h +6F2}[}LfԩW^a `Zh3NNí?lϟ O>M6kƍW!`zvmgva;V8+WZ ~U#>L2Şg}̞{1w}gӽt3f3gN8 o9,?޺vj{ ̙3̈́ 졬D^֝5rn:2[f޼y֒uӦM-.]:s ϝT/6wqG\"M"HiV]_^ ]䵁v;콢XP,tņ"X@r~sr$'=sٝݝm6n}mf 7, Hg*r&Nhә1co@n9ꨣ)S2#8ZVZtjժ0  P%@@ Ow^fB'f˴zرÇifm?~+:thI( ny4mڴf͚PEyt ۠;>C?l&:B%+WK/4;Ĭ&}kDY"V?Zu]: qzo-z-o}0=x8)x>F=@O?gwxI͟u c} 5̣O `_jwZjs=~ {qPԛo{i2qcH:5q]Yt}֖]S1O=T/q7wΧDy&?;i<6lX2rȒu֕zY%s3VjB ۧܣ[RdW˳=ף_/xg@ R`C)  kB(K_m_5]tQe3VB&t"8d0|,4ovM(,XڃYofԬnQ(O?,S7C߁/(sȄ7<|}(kNhrfL,\оT70;w6y]]w iq{KPKqz +݅ԝB?$X3ٹ߭SN QKE3kVE$"-qݹ(۪.۫Zך$2Dw*߾zs22NԨQ ɼg3;UrkrsG駟sG dW ^|E3m4Ӷmۄ!t2MKIݕMw {'̘1cl̄ oĹRq/8cֳwsqUx-Wޟ봍5o uox2S(l&wRwww`6s/6}w9NRt> QPN]?گGJvB^:2o $(P)@(HHYV$[o/$`Z2lذJ*L^2eʔRu,,5-'~f%fSfi9s 2+ ƇhB-z<< B'c."̈ W^*x?#ի CS/U=tkڒv)0(3~ٲe%UTqZޢE7U_uԨQI{챁ŧ~Zj{_u3&ܲ} ]T .e){Q(ȶdG.3b;vF*k6,-"Vm#}EWm<|o{ǎFw $.,^1Sߩ9昈eqBF7dM7 >oLO@2ו w|?F/,kAש8vthFTq7Y3Rk +rE?;i :+>\zX`9Ǚ +r~]J̙S;8͔yjn_i |ǹ~' ՝o6{gRMӑA>Q+ky~~ %)27o? {w3h5~{(  u 83f+:0f̘4ݚ4)-Eev>*3کT9TPc/U9M.*}Gr:u2u5;w6m_{O> ݁{=0첋kZFEz_r@:LGuT0 @SN1S 3<.F3nᆊ.2"׏7"6>E#9+ ҭHY6X-.NUN e15ڵT:ҟt|{Elx(k=ӱ.4hQ"VZcPwӣGq? M(Tw:FT{G-ǻ{5tԩ9^@EI~$]s=gtQm6Q T{w3e~.     C@'\\cI'eu*2g[ fT{} 0(͚5k̍7ޘ *]t<{ -/ׯoBPDF*2lI&v8^EL6- ufud+:3=_^fذaFE$iXYޥ W|EٗN?tӽ{wQ9B\#^,'O>`@ d{۞p aO ȩ,'Ux#H@Ze5o935;qוo盺nzŖ{n d{キyQZuCӶm[v R|]}'yyv@2L櫓uq+JB9z'9,'~on 7B.O㾣`7 $(WLu@@ y晠 }@h?X2ӕؕo =ύ68.NL+CV |͍3i֬ TDK/\V_?[֩SǸVyc1>_nu +cڲedwq~a{{_Y-'S^Hݺ㪻zyS=fv_3_޲cdk{T[ˮpȑ#]5̆ ?̤I[nžDj|7`seR+\r}P[KͪWQŻz߿_2ݕBx󃻺NqLE@ d{E]dz!FQ>nWʞw /T3p\{Ai*7d{҂TVdpwyq曍ef]۷o_{!oٔ>R0a= Y ?xd!2y!k=?Mps=(*kʢ#yHסC`,Ϥ|N0~`r֭T $c'oѢE*2R,xCDSժU+@HVd@ J@٫\~l[` b3fg LϞ=Y٩(2Zn?Hщe@W `TsO{kl$E.]Zkt۠;KyY뵡?NL uV~\U0pjgW\UY.2dY(+zJyFn<^}駟{>ȶ>̥_^ItwK}'[RYzL_F:_Ӻ`C)]~2 Xh>| Yf.߫W`~]/42EYVݺZJf۽klqL=E0OB{'# ;^}]}.$QR1E@E?qC,H@שOLVхѺ[M*L,v=c|é8lx\WOaW^$z\5$::34Fu:떩,?1A輡KZ5Uus*W='ӝqgoIf%F9af2 \93S]rG=ݵ;r}#|rLElURbKԠ@cڋlf̘\Ԡwa3sL;_D*+}'E߳\Rm喛DWNKfU?>[AB\yj(+]=c =WA.* X@:>ޱFuqnT+'>fL_Zg|\z?dXqi=n28_[lit7ۺ_^c?s:m<uWAw^HYw|h6mD il&wR<{lbȐ!Rf͇~h%h?>WFselmW^m^}h@=z@ԫWE٦ن$t0jԨ~ RιxoDwI8蠃b;W& Z^ oé3=+UnXNXzK=~%?>ڰNϟW^(Ɨ# ƌck[nd@\:g] +#F<*0C*wDnoDO9W/F-f&q厱biтWGNӝ&;tY% ho:2ڞ/I]{>hOڿ{fݻwʿXnY@}x'(,8?ޯwѯ㏏6/єrcxpP@@'@ན@M&Mo=~V-u+[ৠx+]MsHs=bBs(pW){W^Ynt+mwKaÆ?K?2}s)%j MP&νۮܻG]lfMV&}eq%9S;TgI3_{=uԈm#Vsd-BJI<,gϞ0 'uSǎ-Ѝ7ޘśzk|1㍊?|~EyȭHL9?s\Vc5qwΝ;׎ruovVCqA].+W2]R_Tڅ@F2I3J]_}|0ΥS-|?~~}NÜMT,{]-2gof@rQ\* @rF~|xi|6mnΞ=ی1"l+W +TT褰]f.]I2/Z~}'nl2BWre3`=eB%k۫D uKHgyfp_d{ hU]vYfĵ#GƼW_}e&Olնm[dr@*޳(9T)UAuֵ4zopWlnU6PHpLǰ^|EM74MǺX& @r{%\b;G%Rt.饗l VT!7Rq(kOY9>s\v6TNo#j J:2(>Z9]we'k3RQF|7Z= Lz.+My[liviH";䓍~ UVFF_:-pFܝ Ԗ&MYK=v:t{=tRS~Ruy%K~7+Vz} R]tZ?><쳶on~ToE z*ӥzk|re6Qqd7oxw=@+]`߲3u)ռTgڪTSUp o}z-=Yy݂SN{YgڵkkEFwaWwu]͝wiTnu{nj7μqn\-@GO<1Gu y)u!yF ]vXuO?m3|wޱw< ~1SQR}q] "ROq֙L~م|\mcwpW?x%_";~#CeW>W 'U`BAPy0NJEWЅ%Lze /y% 7K{z 8 tї\zTR=mOmxH'|ƻ\Cg͚kͣ= @ ^<^-4hPxЅAWtMnZc(dҤI,NH9D7~מb;SqC!D+8:B.BlA[B{%;ViNAEek_r -ǗG=׭q:goIgmT]@ 2(c>>1?gR~'k_%Ie9TXF}?}[nң>OB,nqݮ];[S16;ͺm $,X`ѕD$WYf=ӿ?Ow;|?7 JeIFFj'uq{Mm[D^Zf>֓c>_t\~o j/7s.^G.NP0e޽rJ_Ņ.0/Rlz#7]Cnݺv}``z.|}? U ӟI彿9]?iD;#eG<+.ݝXFvt(>Nw9f1nۺUi{=j<QCF@"XOEn@@@ O>h3n8Pv 5_TG%;IyۓΙ3̟?DV[me6mm䳀u[ ڀ](׸qG|_ڞN:GZ=x} EUķ~k?BM(KbF9sukx7Ox݅Y/.pS*bN>xg @97V( e4,5GE>^W'r;u?{qP{{qrK~~!WI1R"ZBwII,K*])M~f͚KA8o~kDEk?K.~{qϤ|jɵYI\o: 64:DZ:>qc_%Y^VCz_رM@@W.Y@@ yC'fGA (\_֚k=6VС+;5cl{w%Et(@E⸋tkTH?9>"5j/ӥrn[xǭ?^\ТEL>2&gRƨ"eYZw c;J{6(  xD@(\^z٬ʼ_9p"=xM #@*Fm r '$]2maY  ,Hx?1@8&dL@|gnGC>pdHJkfe  NNG@@V\itdJ%.A ^^JQ뮻Y 3 @֬Yqھvlw#PJR y7G eF@y  E лwoӹszڦMc&)k:,0a5ks= Z @. 4js=I7vIˌCtLrS]vAxOA;-G`jժ  @@@`2 P( eKrK; Էo`@rAFN˅R"q]JYy!иqcSn]/bH   P`~= l@*(P3;    ?ygl?4h`<ȼ@@@rEm۶) .4K.͕f@@ U  @H{^    PwuYzum1_   @ ڷo,  ~jժh+i dClN@@@e/5jmO*UL>}rm4@@(v >`@rT'IKn$ @g7 C@ +g"   @. >0w_!u xK,1ceY`rR#Fۥs9TiBھ_߆%Ps~/`iO6-WI`䥀"0~x|\iNεCRR/ޓ>,@||z@ ;菂 Poh/6>\fMsGx@, y%xVlN;i HP23g͚@ ȑ#cW`*iXjUT @@ $P @@@@nrJmתU/   QFu> @3WV- ,@B޺ @"qͽ[d NiӦ|8<֩S'KEXu]qUT1͆*@%*Wl6pk-B( 6TRZ菒Zߴjժ]8KC@ >7G@xZn]  !C.`@~Y1kE@ m-Zd=<GaƎy"c@ z1CݻǬSGa_i黟P@VR޶#   q O>was9'@@@R)>}z0  +ʖ so"@"Ю];S&h@H[n%wqW]uU+"f@ -[4x`fW@@ >QiӦnݺe@*@}T&  PK@G`XZ 9#K/?ضCk׮96gaGA@h۶my2  @ ժUˡ@ȶ@l7#   +4(f@@@ [oh슕 䚀x_j\kA@, xE|V   xG}dWҾ}{ݧ#   zM6ނ ^֯_ߜ{Qf?6f2u5[mcvjTbs!0V2d?Lje]j\ӢWw)lҤiٲp ,oɒ%n+3>҈3<4jȾǼkAC=Դj*x}fŊf7'ĉ.vvmQGeoRuy>:u^zE\>gk`=4KzD `@|} @@@@ >}Q@GQ   @!x_[>Ç7-GVP_l]_k=شiӈk׮5^x1bD'L`z!s_~NW[oew5]A\r;$>6l(ga… :lI[<^x_n~';.R}II4hm2~x3rH뮻]AI.oi$ <@Xa -@}qoz   @A ##mAvN!  y$ ]xQh "LڵQxZ梋.AʎԪUѦ+{}x+nf ,0+W fQ25IudMLƍbuy"7Ƕ,,\]Wߕ5jR/6mi۶m=QkrV.PP%(oyLOu]gz/% y N# @ P)b@@@(6uTۓ:|@   PP.뽲 t4ibIĜ9sͰaLJf(3G}嬳2s΍L 7on_y3dc/q6t|Wyܸ>*7|/(ݕ-Z/bPеoצM7[믿̸F3&j믿nni_~Q{W^ޢ&gy̞=;MKg& /-O@(_򍨁   y"n:ۂrגa  䐀K04%UV57{-))1'NL:V^mjWZ53a[Z<#xeo֬};,Doo馦cǎޔ *[mf8eOGq@x{M:Ǥ"Ϸ~"?̛7p N-_w~ )<Ѳb }j֬YQHE:'O6SL1W*˰ 8@5F@@@xᇃV{챇9?4@@(T^>}zv~!`\ BeZo:8fx [,j?hu!d4ta̙pEN9k׮ .Xg=xfm:S2/гgOR믿N .0k6M65쳏0VZ6V<6pC .:ud֭k:wln;ӰaC.ž|I;Uh:.5k}7ط gNY&@M|b@@@" ǐtq    @n xۅVG@T\ Vqԩ2N:`8x.??ίIװ]х*M41'p]ѣע}O>9yYػYxq\k/3l0~Qo(>|6;_|aҠ3hFe?M\ 뭷0DwUh߾}ċb—xW @!x_[>    5jTꠃ2{'*   9*кu v*3hwiV <3@6m7|\|Qo&x (x6U)^3YƏN,]tTQP)s-♅:Pc9ƮP^3Fi0;;Rs̱5O?5r#>,Yb^믿ŋSO=ղ"ͫv6_j2kY{6֭Y3@']JO    PP0u>)3.N@@@jԨazkW_Yfe|eV& ˌ3vAgϞQE+lܹs0tM TVt}ʕɥ:ydpUVY  eKN@@@(n;m7W]uUzD@@-I>Q3f0[nen5 "޾Ã@se(;?l l*%{C Vo8>װ+ ={_xQ, >)%;t`>`o7^xakErvE~mSOQA~RyVK/Ah^~Q1b]vX{z[lQ~xqwG`޼yA~:xf-1=ާǕ" PV   n~:餓L˖-X#  #2ޫ Ogo|_ylf͚e^z%~f=0SN5~wEU vZO?r7|sӾ}{g? o6i8׼ysӶm[TM41[o9蠃~!_yʎ~Efy̙3%K6J.[guy̒;ltbz-{7Gmx~7 7?ޯA`ek/~6h"raw޳FU`vdO+3 G@ /F@@@@@շ%nCt_ sG'?epB=L8ь1œ{Q;/^Tྲྀ[v s963Z^w#  E$;ц/^ofOV[m,7p%%%ff„ ezvY^>UᄄM~e]lc fU>R/Ѕ+?ޯntWjԨa|QF:Ѕ4x$xD@'@ན@@@J?7?msݺu4:Ac@@@"P0 @3gN]Iz T^\uUg kSKewٶzy|M)\O{'|頃2;vͽ ߭[7>`d砀;OpB3z-N?ޯr#[hԝ&('@}mZ @. xK[    @^xqfLڵ㞗   !ЦMې+WFh)8 U7|5h9fϞmFqڿz뭈*Ud{tTVK.vOdٲeڴiSsqi3rKz?}D nvmy(8UBw~plFfw*n1/6~? dO3KF@ _-G@@@(b^{͸[EA@@@p3#+W6\p`^F* bZ(x^_~?_~ (nݺuLz2ӧOn}#~R6nвɓ'믿b y@2wݞʆO?aÆEYН EV?N^t92㏦k׮ᄈ:묔%SN?j}w͚5v]kO4o9sϿ UT܊Y @h%D@@@P]w!P   W~ག :꨼j?E ^^z,Y<FM4)5K/dfM7 tꢅ/؜r)QhB˖-A( `^-Cs'muW]}&L0[lQ`F̓hItgaƏoƍgMfco[ W8$xD@'@{'#   䅀nTvygsGEi$   @Y.IV߀<pcosϵM[oñ扴ޟ}ܹQ={ <[ԩS]v69p@< }m0   @1 _os@@@KYfZjfժU6p~"w}/[D[~Μ9fFAtߴir5qr뤢BE۶mۄzm(7|J0MAЯsÆ ."hz _`ѢEDbyf֬YoڦիW:2*>s1-]~.[k| gP@5F@@@1bYpmc׮]^{q   )XY}ugye%-S%}J$bgZrX; RC/=RF;ӫe}Q]2; @@ Tr<"   ,?!C&C6@@@8\ݾ8dZW^6'ׯ_L7!I >)6fB@hx_4"   4+V-[l   V̙3 XrYjURKvVL @x_<k6W]uUw#  +Ϙ1tA޽{Ν;'ղ6m$53!3WZ5ӫg}  y    `̹k֭[g)lի    @xOAk( @! x_[! PqJ_K@@@@'0vX3i$-Z}oe,@@@ l^]/g  UT0 C=@@@Y+W>|ǎ@@@ *UdZje2|D իVZ5f@@@@@ gn&7tACٶ0@@@Znmg^f7o^ bN@@~=I`*ɬ a   .?!CnT\(=@@@0nc3g @@2)yLʳ.@CN@@@aݷo_ӪU3   @Y@rLx_jkA@l x-@@@@)S#o:4@IDATIڎ @zO+KE@@@$JJJgmrW:u$4fC@@Mիۦ>mD@0c  R@@@@2ޫi;Gc@@@R/PR%ӲeK/fS6 DTZ5r%" @ T.ڞq@@@9_\r%AnvS2/@@@hݺ̚5k̼yvmW-Xx  mǛ˗g9> gۖ #}n9ڍ @f:3ά@@@ҥKmc=qE@@@BgΜI}7lN;,U#9 2*@r2@NR޵#   @A |Fn I@@@" (+fr<"  }ƨY y)@l4@@@())1guYnؠALF @@@ TiXNse,(OAAߟ@#w1Ԍ*gRJzL@@ 8;F@@@ Fm{=ۦVZs=7Gc@@@/дiSSZ5j*C}PF ӫW@?M    P0`@еn͐I(`@@(_ߴhw޼yf͚5Ew: !WZ57E+@@ gx3    PW\qYd|M.]^#  ֭[iӦ͟?ߴl ,^ZAJ o* @@ $@=/@@@Ȋ@II۷Yv]MƍV   xʬ@@@7|c*+뛻Tĩ ^   x_ڃg  9?rʙ[1kB@L4@@@8͟i;rYg:   @Zh\M@@!f;UIcHI 醧   dR駟6/]eFW_ճ.@@@<` V[me+C}mjڵkC=d{=3oϟ?|/4V+h6h|6ýbe~_fy',iIuAzlfqL7}7[qƙݻ*.]،"ƒ"ۼ.fe yh0   #[96x62wyg4"  dM@Ȯ̞=<"M@A \W ̐!C])))1>ݨ Gc_oǨqoo>#;mٲeFYu4qHe8~vJpGn} 2:u{j3k@A2 ;SPGC̝;7x>zhs' օъ+LbrK\A;S_ Bi"z`z?~K./lS^jaÆ]P;"h9MժUm{]33$OJڔfGy$/h)ڴ@[nm8  @Jx_Wμ  @ @@ qlY @ MQҦ@d92Ν7bذaYfDZ,Y@u 8} sڴi{w)wǏOmQ7lQ䍬l @ БxߑWƎLQ^~sϵ]vٴ{gcFfzU~{MA'O.1J2%~/Z7Ⱥ߿$Ҿ#yVvErs2՜KגzDrie_J?J܄{e۷oV?> ׿u"4zYKKd?Ǣ'nxR)=i˲vi =!#{%7<iNO>di$_ҟ4a @ x_  @ @@% EtPʳAqi֪%+ @@~ҤI)NsXo&;c3fL!8Єʽޛ="(r1d"[rFّU;Jx6￿h;vmAyl-X]"p9?7b Nwiqo~裏5\3=\3摩~=u嗧w}Ik袋h?? >nܸ,}gҹzK|_K/M}QvCD~LU߹W_}u>:=P1>4szǵqZơ  @x#@ @U.n=*W\qWly @ y}/2ݧOlUzoҢ.6`A?|V㏧O?i]v]r%>YE})mv'8!}#__YH###">AklK<Rz,_ڶ=\:# y睗eC6x,zA]tܸY&N>칮+,sO䕳:+{7id>|xO#x>jKd/-~ivSOׯ_6t,|͗ۏ5*;%oA@v@6`|L @@d:ꨣiŇLz*U @ @@SJ_z饦] ?=#)%(xtgd7lo}]xSdxok%yqe>z3]7xb#(]nִ{g_o}vX1LG r77t-Z`'lY4>{Y g/vҞs.w^^{͐!CRg^xa11_~9Nm꾯wÆ ˺RXR_ѣG3b66~|wwy'ϋ[9,?4}do_w @JZ)5O @ @~j>;NO  @ @,ޗe)IZgM:v,{}_O/B4?S;4}묳Nw,k|$(;N4 ?y^Ɩnn޽{WUZc5wܑ=mY'6Ҹwӧ* m976rK/R\Ȳ.ӟ4ϲS~ޠd7(͖YfzO裏f;gȑ#S<#/DY ym}>nP @uM @H > iQxB @Z*Px?nܸvtMS|E4iR҉'e 'MxY#13OC{7_l]X<% ]vٴ˧m6S*,H+/b;&~:Ŝ[AW}1&OWS9s>fk.R)kXGcצƬ~o-2w}'FJzE6tO~W_}U<O6~?[%T@ ,_Qk`|L @@|^  @ @@\rɴ /w;tB ,頃JmQ`?<"<#g?A~av~[Zn-~lnzG}9dqÙgⵗطo٧g̘L(=VZ/ ʯ/=\:/_">o.ԣGzσ`NmS}i6swW\^z5zȳG2޷ @@tX @ qj}miȐ!7# @ @@*Z"_|Q5벐Xc5ꫯ^"JFߗ\ve-(/U}'WωvZ1?Ebsj"9,ꫯfuO5kV0aB{H={ۤs[lE` qF"|}w߭I*_ھMOK>}o+t@ 2޷ @@% e @ @ "3Ә1c-B .(Y @TM;j_~J\92,(Nʶn]wݬ_7e;h{rDI'M/O=VjLg/s-M4)ۿqm9ƴm_~tUW;Xi O?]omĝ+r2޳Jy x_^l @@9 /ǫbN @ @B>t,RK.dB @E x}Kҕsk@ࢋ.JO=T+L|xQoJܔi}v! 4(븡VZ)-YίT|~goOh[:Ƈ~O^Kdoc` @*Zk @ @wA31, @T@>6nܸj\54bĈ~7xY/LY#@78r^} {;"uSzk?&L?^x!s)tJ׮]ӑG;,=n2ytwx衇zۧ}uNkR~. }fm#zw,kJ91w`'^9mf1t@NR޲Uz8??>_^{mZzӻロF~r衇xgkxOǓ gUd䏧3D>Q_SHrM7G}4:1> }4!@5. O @Z*?9NӧOKZڕ @ @@2Kdg=wuW(=sZYl;K6"|idlխj6bc=6 x^{-.zd厠o~s+qON~+2e]6Sgz>f̘_yyDz`|K.˂f華S=Jw7Мxc yx_mV}qs '^yg7{*nry2,G 80 /vB堃JXsϥM6$u-;g( ! @@]ʸm @ @*0utYfe,MAN!@ @) +ݻg]xߚWdY ץK#/\"S">18K9y}6J_:sҳ>&Ay6_k۫WtgO;L9uk7w6~zyzܨs:]ŁJCs&WlI:|<7_5|>vm;'x"{gd{gz",2[?ulx;vlvHG1cFvJ?i\syx>F!@,J^ @ @*pQG3<33> I: @ @@ 4(F?sl?ӨQ#sȐ![o~eXzzS.iY㏳Xͺ뮛e *(6p裏fϫ6mZzӛoe;zC|=WK/17j^[{ĉS< СCUW]Cl=/ @ @v|uYٸS<\}_ @ @fVYe, 1"_{+-e\ydzqV ē rrU@ܵ:d_=AM=m  @ @SNMÆ KcO:  @h+w7/>|x;"4kȑN%@@{ Sҵ|W @_ 5 @ @`.'pBʃ6`s9a @ bm]r"jגCJ(xOOQ @uM @+c:+;^+R.]mk' @h-կ~T6|MРA-:I{k[#h9 @Ԝ@dR6lXꫯtIiUW9 &@ @Xy啋A;TԠ_ 3* @@@璺* @ @^N8! lA:#mg' @hm?-YM[{  @d @& ~nB @ @xYg)#]qK.5b @ ОJ6|>X @@O|x_#2  @@37Ls @ PKSNM_?p/~V]uZ"V @(<>"}\S @U( }^TK"@, AuG @I/o#,i̙4O9唴ꪫ͍ @X@}_\K#@e"W_3ڵkQW!@s  @ @@!pGW_}5dMȑ#c* @ @Yf4|eÎ77 PD -@s  @f{']tEƌ:w+jF @JXy啳iki0es$@*H@}],S%@$8oX @ Pq>|x13<3 Ŷ  @(UVY%=髯J&LHzGMǍ.첪_ P2eJOfcu9li}.]sVE̓ys2 @.魷[C9h5 @ Pxq 1Jp@K4O 2gҚ@澼t*.JWskF @jZoOW_}ufB lW'@ @@ / PW4w vnk;[= @ @4iR:wyie)U @ @@G ^~墮:}M^zit4S`+j<*4^YoXzJ3wҥ6v @- 𾶯 @ @LCI~V;#)0hР_ (x/G*CseL,  @ @3fL[]ttP%@ @-ٳg߿v3:h@4}׮6d7iBo @ PoF\0\r% @ P+rzɓӻロXb2UuLK[lEu,*8^;]{ټtW:zguVfm:z=~iཌ})M61 @(o3g}'M2%a{fG @5-2z/3fH/bu'4C`(Z~MmZ/]  @D@} * @%ѣGz([/=ZZ @ @@ *Ŭ#vz]vM{nD,ޫWԭ[ζ{ڴi)(x* @PW6 @{.J;wƌX% @ @@% DD6;S;vltWtԩdkjrȐ!s'8ӨQh@iཌ Pel=C @E 2 iYˣ:*ms9a @ ƍ  P5_~e  @D@} * @tgK]kI'T ˶F @ZxbUpA-@ixRB+_uEl @ @*xYgGkIݻw[ @T@_/Vmk @Jt0" P  @h)S}'͜93e4hPt @ Ny}M8F5  Pcj[h9 @T~of|ȑ#+n &L @7n @@x*:!@U- / @ @\k6\p4f̘ԩS'< @ @J_~力  @) hzGSO=^|Ŵ [.~֭[v4eʔlNh8_*}gGomS6xB.ݻ͋￟~g};"RK-5ǡ?)~6()y2/sn /vx"G-ls4ˎ[/E3^>}ٱM74{Nxm@M@܄'@ @,>C S'@ @)+ ~7{C&pYgwyg}{Ǧ#G_=r)f+ByQG>{|4f̘~7 |}e!CUW]ubGwqٱo|xߔ.E:蠃]͋od~0\~t׸!99wF˶n[unM~Y|~{9J۔=(rK顪*q#G^愯fgߗOx_Ȩ' > @R @ @"Z|K.ki0[ @ @B"tGYb-V!37߃ZP%>̧M_9=* .`J$7[ۮoq67|3=c^KSN-N-m qbeEM˺&W{C\_8GVZXB|O4)ێ' ҧOZp+̶>nd ]>n_~e曋sJ+-sO(ĉLxB^]^\r+EV>K/tz뭳#Dwn7g-q<r-u/˚Vk{S}{TʻffL @**iƌY۟\Ӏ @T*l/rx_ WO?t1矟e9sf}/ڔV"xmtc.@?)y/ž5jTvXqAyi _)SbxJ;\sis4߳yꪫҾmF5G6(=OtOx뭷 &w֒9ǹu3SF/]O>NS '_q׾ύGn(o;ݻ] qm sNq+v[z饗MqSB+_uEl @ @*O~(lAG/+ @ @Z"x7/ ǽ`p?3Yf~`"駟ףG,yi} #?OExg_b%Һ뮛nu=Jd鏬s+mAyP쩧ZǼ")W\qܦo97i 4ȑ#% .套^#FAv6._xq~LOnnOR|/{)}.9}YO?M'xbV'tRV?ol]w]zכ7yiJ$6,!f̞B1mڴz`޽S6(-i7OzZ|w]Λo9{2C&d T[?S^G4>y>#r̓ @4Ag:w^Zqm @ P 2WUl5Dm^Z3IO?wgޔJxm+m[ڦݺu+Z7ȦOׯӉV[-7B4'cy[yI6sGaviY׿Rdrg{/G@~߾}zqGgO/ӯ&3Dvo}[i)Η^guE?<Ѹq# ?L=xoxiȐ!iĉ{5~&ō5Tx ތS/ۭ+?U#zumFE@}\I @ @lwDu]Ӱaj @T2,z-L껾mnzРAEn{M{l_[ZW46 #7X%ƭ[}۳py@{JSbCulM8eҋ݂eEr6|piK,QoJGi-LﳀȢAQ" >7tۣD\PxŘq@2ukl; 9^KEF}ki96~e'& @ PyfNj@.믧_HZkeYnelsJ_w*ὡ?# O>]5ve"8pOO>$Z[oM{wۧ~aC1"E r2ukl4k׳gϢr;W__ZO@ֳVze @jBkMW_}uxu]W<&, @jVn9g裏NYsɂ^#ig9y-Q=ƑȞߣGgM%[2kiO}nݺeO|, 璿s^W G}|]r%R}3( ԩS}MRK۔o^wߝƚJ}kؼ ^>dFv6 P){Y<  @ @@ ?aҋ.(FVP!@ @U,P7}/ZAN2GW~ͺXn劮?TYf?=YykNն#9,1cK &d#AEϞ=hSߎs}c[lE` F"|} 3iR>גxD^G}C_޷ @@ +g @ P_~es=Ӕ)S2}7?i'@ @Xh@ܗ_~o N:);/qO=f 1>z}7Ԭ(}-ksfc#so7zn9lK<>K_Xv<-`ҤI 7p h974m+Y骫w@~6K۸;KYJ5C!@:Z@}G_ @ @p #KRdjS @ @@ YO?֖okR<{WZAgy饗g]̦NZmйsf#>l喩GYRh+aÆ^ziQ+j>|xQoJܔi}v!e^8k_|EV*77|i5o\O[;ni~a>}z.6(  @!M @\H~z6nݺ믿>Ň?  @5Ǐ[o3v횎<J^}Ս~ =S9jԨ4rSOeAJu{Vk4vmMW_M?|V7rטɓgs}衇e<#裏cQw\rl5\"?,'.XSY46#YuDOf?)Lw\ݻw:#6|A Q}?{)+Q[ ޏ'F6tдK^x5Gf͚U;T @J @x\{;/׿Y @ @V3GxbﺪFȄA~+e]vy)+[mUZb%&޻;RdNs9'*_e喫fmR.]W_}UW+ҐsT>Ի1cƤc=6`|3베)Sd7NԽyO>Y<%9F]b2WS 6llw⩡qKCK|0-2)Ko tPM7ݔ{&Hc&߻ wu02(g @(l;o?z[CT  @ @@ f~&ض%o^z?<;Y;L9S_@fd'o"voԾFkV\hJzKM"owNk8gA4W_=EVD}UWM{oߙ-\׺c9DZ΋yo5+75?m9&7_3|>vm;'x")z%sOEYd~b#﫡86v&O( "k/Gog @JJ^ @ @*Z_|ϦxU @ @@ K)D^[s]gF!Cv[ocFi@d7n\8qbt +Cg!gAq 8•op ӣ>-`n?bӦMK/bz7^掞={PsdY=Ab饗]};fg{}j r-D?"vsNѶJ7P%@*Ts۴  @ @@L2%c{lwS3P @ А@ݳq|„ 5@U ><ٸ5rȪ̙3:wVW` @  @(O:(6xtI'D͊ @tJ+^y7i%Y@ L:5M6E $TvLt@7$ @h~t7f훮Ե7O; @~뮻?^}__6|9 4E9 }-\ek$@&ys6 @h3^x!~E]vY߿B @y0aBַoz%P>KkQt| O*@s  @ @@ |iwO?aij  @ @X4  @%[ P[kz[- @T@dQZk4z i @ @(x/}FI`̙r:uTU @\+ @(n!wfӧOt7={L @@~7 /kc6 @+骙+h_m4 @ Ш AToV^yb[ @]siW^y%f- @@q{ @ P&ӦMK[O) @ @qVZ)k~7o( @E& ~6 @ @~򓟤oV]u @ @`y}?~OЂ PG & @x_P @ @;vl袋 ;tMO>7!# @ @ x_AT  @@ tԩghz @@G (y @ @8qb: 7iW/U @ @J'LxcG  @׃c t@ @tin햦LMbСi  @TY?L^K]vYNvZQ/~wڊVMW=Xլ"9 @x_ @ @FylJ |ŖG @Z_`K .`<}}#@{ @ uoȐ!iʔ){Ƿ50 @T@>V6~xͼ$<]sAR|):JSN5q  @2\3= @ Pu?O_l]+r袋nD @[n}{o< @ @W: @(3믿իW馛|Wf4 @ Py,&=a„B @h  @ qƥ:hy5XV!@ @Z. v$@ @.uM @ @U?OkO oy @ @ ,iO^?~}:d>[S4? @ PvnF&D @LK/MW]uU?|ͩW^UJ!@ @/y0aB^J @gP @ @ag}6vaE_im @ @Jkvu^=?m6 '@ Z-=fԩSYf̚-hyiM @,0eʔ뮻Sfzivk @ @(x?~\wy_  @ 2-;Y @ @&N5[ѣv @ @<G{ \+=s @QsM7|s6b߾}رcSq"@ @'0`ԩSlk[1҇s  @x_ @ @}tQGe#/nj[n!  @ @@m ;-٢ֵZ @ ZX @ PS&MJC I3f}Gvء , @tqGN @@ ̚5gm @@{oec @ @@M̜93?Hov6,z5v$@ @"|d/b @ Qޗ2C Q;J޸ @ Pu?}ݗk%L7pCҥKխӂ @ @@9 /cn @|:wO(FfF:Z@}G_ @ @@UyNҵk4vشW, @TJ+TLWBsrH  @ @< kiСgO?&cN'@ @Z"P~-9 @@ n @ 9 @(6mZu]G}e]ҨQJ @ @( +ΝQo( P+>hl @^C=4+wVF @*@Gief*.) @2d:A2(D @!pWK/4l޽-ܒʘY @ @*|iҤIURK#@ZK4~֬Yխ~ @*x_ER @ @}/N *U @ @cwu02$ΝJ7sJ @$-Ӏ!@ @.ve_dK1bD{+}YO @F`Z* @@#q{# @ @fe#W^Z9ӌ4%@ @Z`'N,* @7$c? % @ @&|;Z."[nIݻwo™ @ @%Px/}{Tʾ~fOC@}{( @BC/~K.nHY @&[.ݣ+k- @:uTtOU @uM @x^{fΜ=SҖ[nYOK @ @֭[('N^AhL@t#@B@ @ԩS;e-9昹0 @ Б Ȇ2eJz;r*&@*@@}\$S$@, /  @ @Fyl+R3fL*}l  @ @@ 8X   @>G /P'@ @u.tWf{nִ ie @(7'̇(3.]3ꫯ  @ xKx%@ @ux{eW_V!@ @W`d/(T @J3 on Pk ` @ PI.쒦O59rd}ol/ @ Pv2ޗ%1! PgΜYs59 @cwQ  @ @"{zlַgQ365 @ @r-v񾮎m @@iཌuul @!  @8cߟ]jرc4I @@nRM8LgiZ @@tP:rŨP^2 @ !7xc=zt6v|@M7_CbP @ @`u0eʔ[g&@Z4̙3zGL@}ܜE @U(ϧÇ+;so\l @ @%0`b&L(* @2ձM{ @ o?8N>< F @`<},A}_HS'@ еkb/ @rW @Yxd{^y`K^xazX8 @'V˲hU @W @ht]we'.[oM=zh~G @ @J`|d/(T @zJe. @ & @ @өcdǎW&O @E`O(2WU 6m+ P+< @̋qҾf͚usg6l^t. @ PF@׿lF˜ (C(3evAL @GO>I;S2eJ6~4r( @ @@ 0 +~۸"@*K@ʺ^fK:B@}G @:T 2>)2GYs5ӥ^ڡs28 @ 6,:P!@u$@$޻ @jNSOM~{}n-ݻ, @Ԃ@>*5 @ o @@- m @ <ܹs +@ @RUza-@i3Zw @ 5 @ @@Ək4s̬}dfmtF @ @@e f @uV _u @@. >J @U-0eʔ;ɓ'g2dH:czG @˧x]'"!@+P^}Dv @x_o @~YfCqe]s5W\Q B @ @ u=-척{o @!3f4~ @ŷt @Ԋ'l /pS>}jeI @j^`G}ռ @`Nnݺ;e/(T @% @ P}d'g ҥKGWJ @hH &Lh @@ x_oK'@o! @l_|1>i֬YBN?|e @ @@X3qĢBJOJ(* @ PMq @ @@; 3-2وP @JO^A37U @޷q @ @aÆ=:mfŶ  @ P ɓ'. @ t޽?cƌB^  @ @&M>ld @ @@ ѣ' P-2WU к[So @ yf]wMoF6n.!  @ @r( 0aBNӼ @( 6mZ° @@9 /cn @ $?<=CYۥZ*z뭩GM:W# @ @6X,TB?{- @קb @T_\dٳgӒK.Y17Q @ @}J3 os @J(M#𾒮 @x~F"@ @VxaVz%_V!@ @+B^MJQW!@ @Mq @(K7|3iƌ84tвI @ @/ЧO)y2w0 PnӦM+ P" @4O/HN~v[oN?u5 @ Ps >o @@=z( /(T @% @ PÆ KL81'@V$/ZhՕ @xS @K`ܹaرaIb/.N  @ PFC @ŋ-  @'  @ @jVX;o&1n6; 555U @ @0}zkT@=\2,] @@;HodM @ @@ag}vx'~k @ @ 80+r„ a @ -={̆hѢlY $; @ @,npW$}ڵkСCˢo:A @Tn;> @ dF 7 @ + >K@ @%χN:)_vu @ @K{U`{#Wu P"%U- @&8 ti;mE @h#{M81[V @- >_ @`M$d= @L࣏> cǎ 3fHc=_^TL @ @@S={.6}B{ @t@}}}8#+?rpwΝ;wH4J @G@}zH  @@KrA& @@\ e @h7;/K@K@S @U^{l/<y @ @@@CMx_jm @>) .ۅY# @ {ーŋ' 'pB8 @ @]`M7M\`A>}zA @rx_~G @@G H#} @D /9L6-xv ^{mJ& @ Pn#FvɨY  j^zexP @% ީ@ @%Xre8+5rp]m  @ @xߔe @ q@! @ W@}2 @D>hRw߾}r|7 @ @:J@}Gkk, /N @(M7~ӟ&mᄚfM @ @$x?a„5mn= )8B$@mx< @ @?O>9u]/f @ @%0lذPSS4?qĎv  @2ݻw7ϖ @Q@ @J"o<0,[,3 |IR) @ @=znaٞT󸊊K@}$C @Yٳg}'̚5+Y6f̘p饗f+ @ @A`ĈI7O,XP] @$w  @@H @$˗>8[Ifp]wN @ @4dcFO#X@^BMMMVoe-H4u1 @ @7~Gy$ݻ- @ :sVt߳g$=>aImrH P* @ @ׯ_ӧOĉKۘ  @ݻwŋe˖UDuh @T%K~}$v!vm* @ P}Q{ー| PD @@]w˖ @ @ jaC =PѣG# @ @2+V.} P>묳N3  @@{ @J / wygo^#< ԪD @(Çg8qb@S wsA @@d @V'/dN:% FZ. @ @R 3}|x'N̖ @ >}\ @PJَ@IDAT @)?~|׾/pLA @ @@rGx#.F м@>}+gϞ-+ @$; @ @`ŋ';pg @ @jM@R 7~Μ9n @@5 Hƣ*& @A ^D3fL1cFRn6hW @ @@y 6,A#g) @@*:wznT&@ Ho  @O`ٲe ?jp.]C @ @@jzkv @f훬x, @ SyM @N:??{,Mol) @ @D3u԰hѢ*L( @@K2)& @@F@}F; @R.8|͉BC=r @ @i1bDj}}}0}Z8  @@ŋ2 @{ @{77. ~{y @ @R#IKOa(hRO>gΖ @t HO= @ /:Gs_92 @ @T ><ĉe @ }f  @@$ާ @ ՅcdžE%sL8sS"| @ @ FOQ3hZ`ˮxP @xS @iF{/~oL+  @ @ x_[[r  @t &Ϛ5+'@  @HҥK|$-2k׮A) @ @ G`gϞ90 @ FO d Ќf`,&@ @@5 {gMB` ?S! @ FaÆ%Յ5no @: L}B^@}O @M{^;(n>h:thK @XE`ɲŋ)S @ #Ϛ5+AX5ـ @#p-/8 SNᮻ ԧ'@ @ @ 0bĈ޵ٲ .3g+x @ Ho  @T3<od+رc  @ @ dF~6,пl3fȖ @t HO= @)xWA/_D|gSO=5%  @ PœlE] &$aJ-> P­lI @2eJ3fL7o^?\veN @ @J)x?qR6n @tp̙eS]#@S@}{jk @,`$~ҤII;S;CN9·Bs @ @@ 6,;mmmmX  @R IF/z  @@ ȴc @(H`ŊC /r}=z(h @ @&н{0hР$li;%@2s K.m J<&@ @ rJx'P0`4.F @ @@F;mڴG; @-пl3g̖ @ HO9 @U,p%o1[noyG,4 @ @@qS3S]]]H@`F< @@s @U&p=s=7&za]w(C @(@n}mmmiQ+ PlA  @ S}O @@ O GuTOB袋^ma @ P2' @- 񾼏 @x$@ @@ ~%K$wqaܸq%hI @ @M7}g @5 H_ @ }wEL @@ ̜93?L=zt0R! @ @J+0bĈl  @ uSwL( ~D6 @ @@y ,Z(;6L0!n~߄.]w @ P1ɮgϞI$ޗ% N Z3 @$WU @ \2|+_ ǏOV <8^ @Tix$uY'I2dHD& @ @@ d,Y눖  @XwuC=La0 P>X  @Z$p饗k6٧k׮ m]1 @ @&zo"@)0hР$p#ާ H1O @ 9眓M7v} @ @@rkkk[_=  @p ϝ;7,\cy @n @>>P__{E:]1 @ @@5 6,,H@&>n~ @U$ޯBb @W7_XdIN8!gvX @ @(` ] @TeA^~qĵ{,իU @ @@e k0q¢E*zKE`6#>K@R+ >^ @T~餻뭷^x'À*I @HÇ'uuuN @m2dHY  Z='@ @?p']޽{xȑ#+H @hL} B}EJ'@K@R'0dȐ$> ,[,u [( @ @,^zp!˗'oEt @ #ާH^`7N6Xre4i7jU}xG @@ Յ1cƄ>(.J C  @ @/0xЭ[$xDS`С}lYHs @ Pf {W6mZ]w5~L{[ @ @d+Ѯz ZM6$^}BR@}*  @(7ŋcdžI׶jfGU+ @ @ Æ KŒO'>}zB# ' >,H| @ P+W GqDӟthРA'}- @ @ ÇFn,H@ 81wy'U h, 񾱇9 @7$;_lY~EH @@^|pe˖%5tI/R!@ @(g|t(7vD @x뭷˜1c‚ k,S @ @x_|S5 @JvmC.]hVٍ @L:5=:̘1# _B;CNI@ @ @@$ާ ?X{a뭷Nf&Lf͚H,ha @ :s=3;IF =P֭[* @ @@E 'W*2&@#N;e+2}BT?$@ @/cǎ JRO<YgVi? @ @ Ȍz?iҤbŊ D  @|ӟ.>K@^@}b @ G{dz* 85ه @ @ 2˖- 'O@F`wٲ P];< @ @u'|rx{馛2{ @ @T@&>SWW6dK @@FfϞƏV\:uj/B3gN:ck( 8vmW}щ H/  @P??g?KzZk?ln @ @K ? _BV PA5553LxGüy+FN?mG |p{ڿa-@okj @~x;{iU; @ @@E'WDu(>lӟe @zx_Vd @P }~ꩧfꪫ¡W @ @Ht @\]w5;φSN9%;_bT(@|W\QT]n @"3τ~aʕIƍk!( @ @@Y :4۟lYHoz.\~߇\ .(VU!@ L3&O<9`>`֭[;XJ @ @A 3}ĨcBX`ԨQxkT@Q @h,`{7|3Y1rO޽{7 @ @<$QNfϞ>OdtdDEg}6=da]wuaܸq%_ мo7&SqI @@F`ҥa/bh駟믿~f @ @O>}zxw{~yɒ%1!DT>|詔wyU P˖-^b$ޗZX @ʕ+W6S~M6٤l# @ @%0k֬FI/r_~yO~oN;5r @sйsbŊ+]"2dHXguڥ- @ ~a6mZZw@ @X`AX{[ɓO>9{~z =XjZ\ @ @O`ԩn4b}]]]?~Bw޹lCT@߾}.?&7+am-y$?O\v4@4 \q3L3$灘%@ @jkk{z0bĈ;}/x]v w_g|6$@ @T@>}%\>E5u(/?Iz%CS:% @"pUW'~!R⋓M;u0zBv  @ @@Jz=ژt߭[׫B @|Y|SN9%we @ @Y89眓/Faw,F5 @\Cʖ @x_=R$ @Z`ŊkY%Ə>(|_{ouӟA/_, mc @ @@@G7}y P~xtx:HtwQ @8|0;M{ҥ qD8Gx>aѢE|\wW'e!@ @ :8wmR>}6۬mHTnP[[?Tn0zN4) I  @(7+r]#wqaܸqaaΜ9|wdGYm%V @ @h(֨;caJDਣFz-d  @@uH(  @U-K/˗' ]v-h_ @ @={,ʨ;P @ EtP۷oqj)^*S`̙W^ O=Tx'?ϰdɒ &mĉg =Xxʕ+XW|o7 ,(Z*"P]*='@ @9cƌ曇G}4իEژ @ @@_r%a#ޛ @#QﯺꪰhѢ(7BO/Bqvins箲SNwDfmרQB4k?1~v⍓Ř=MU}_]mExï&L4iSjχxmR>swJ'~Ns?[]tQtucW_|$6`0f̘~w}R}JSm- >_ @^`ʔ){iq?HַtOځ @ r̨guV%$޷Ύ @b{1>N]w]:w\vaڴiI'ʾ~ ~>:DBMcJO=o޼l)sTqx]wݵs_O>ƍKnRnV٧cŋ38#wf*1/Kk9~yL?ëԙ ~_r-k 7 TR{|422 @(GxArٲeگ~x1D @ @1l--~ذa޷U ډ( -"I_{$,:Ӊ8U[cU?.&įSN sLiB*do~ROSL815>O~-`xǖ[nƤn8/?~g?ڤ܎ńǡ'ǧ{ŧOtF,͗곔ݨ&fZD5h$`Ff @('xg7ئ.=y䑰:봩.; @ @K->]h  @@g|d_>GtϭTwy'l&T dQ7x|Gz3=z$+V1vms /b8SO=r~Lϯؿv)If^6ֵ@Lg}… 5qLg>s=&Ol?o_f&)rpᇇ^z)\><"xzex᪫ ~zvYoO Ui7?я.-?aܸq_F]JTRǬ2 @ PAx!"32AU @ @@u Q㨵-xR1 @ wy!^]S~l%Ӛ޽{2_wVtg~.e}1ni3&dɒpG2!&cHW_}u#<|4iRrono}ҟܤSO=5ܩ'HħpGgWtkh Yʯ7;1:  @@7(j1ovQU @ @@u |a٥KfG, @-/9dnċqeOh-I1cF¹r-ٳW;~~mL@IŚP,]4,_>Q0z_*Ŀ4ŧ6xMnV1ެ:w~rJf}NAMޛ.O6 lAeԄ>8mR|;fu1YG # ># @+Jҟ{/|K_ s-I*%@ @>z&dV @?nar+$ݘؚ;&.hׯ.>?CL͝6*':*jb&8sFkY|梋.Jnhl]]]K/mA>}7b"{[RӦM wygt>2>M%w }Qv#FQFeQ(g=c:_@}c @88@skK0ʱ<6pumKU%@ @HI'_Όn[6"@V 'M2%Drc?הKiAdr=V٦%kJ_,O7$T]qbbԩSCq$&fQ߄8~%M^{*#_y啫s)/_b~zkf߾}mR/hm٦|1fJY.wL1WG Hc,B @'pUW;^{ג ɢuRE @ @e-ЫWpgǝvکlDT_wzuׅǗeI[_hСC5dBԱo馡wޫ%oO7ZLHq}nɒ%6]xq8 ފ+-kL>K/;q?=sEJ @"f͚㎢u/K2 [lQzUD @ >O>Q%ާ1hN`ذa?Azʕ+_JI6R]hRk&&'wtJr1wrk_O5߿0f̘.첰曇/| ; M ,h)h-3:M oFy䑍曛;wnU*;)&ޟ~E}A>K\e貺 @ @~ |3wu6ץ @ @Q 3wfAYg$ @R'pg?.wq2'~,k1᷶{5/tſŚׯ_xW >\eHo}  @ @XӨ;* .Mc co~߄ . )H'Onԕ&/G>}zK^?&ƅiӦ)S4 79FWȑ#AO>d8BW +&{_}am K[2* `G}<=wC=43wQʥ:{F7T'6wL\~,#' 4(;6">S>KXm^="'@ Pv"cEB;f+ċcƌ)t7 @ @h@jvwܱuV @>|x/~M6HU,$Xo#mG7x4M4iBGoɍkG~״}Sc~5NѣG'N:5vi&C?~|8cxjSU;yaG-wҗ;r9S1=أ྾km*>n;hLG sLoK38C-Z $ک MڏOM%d_Ѧhfff]Go勇6̙3hZvf'xb?o& Ӽyۇo|ݤQcc|Rzwy'ěQrBof!\/peԂŋ'O0O1ַl۵kצ6.+g)B?~dP PlB @@7.s=7zaِ @ @@ g}v8sVS*$ @9O~dgb5\U[Ԛe& ꫙*8FmhY#y/[BhS33p@3[7ě޺8K<Вꦛn~5mr-ᩧJ~s^z)In/][lE` -kLC[o]PW&7n>wQsaܸq!~{ᦛn Fef{*뚚UKYʯis1bH_ U @@ݯ:xwA- @ @hj(G4 @V'GѣG ~?!&vQ&Ɲ.\boThԿrw 1n]L.֔LhO.)bN;C{f͚N;_siӦ5nj4֙R,4> ?pwG&?w};gIn8cWeKYjl  T66!@ @@I#նGL/~ZV @ @Z zYg5$@IDATjh8 @ 7ߜ$|gXbE\ܹsĉ5Qh|{k!˗/{衇6':uٳC]]]%7ڱgI4,;ɓ'3L'f̘(4oLxC[PwHS`]'')45b_l=,wLAYA #7b @R \š1{r|2b|k#+kq[,˼7<1o!4,ѵk]uWWn}խﱞbLљ2viر*o"@ @ P,kt V tJg&]e"}.nqkvM-k\S22= Py7O}Sk_Z):&.a GuTI ?ZB!'!Ǜ7|fߟ|Ɇ7Z\mhb&=nR ON(\ݢE<nw훜M*٢3?<@K35^1?_~u% ɿF;a&~Gq[o%7|R}K5lj=1X7ugE @F &<0C)}k5\kHv]LG̏{ Ow kMz ]oZ$>O+i"@ @H@.^e\MV7\ q&;_մqğ{}.S\k\8:|ʔ{C.(@_ 7xc83ҥKb?w߽$Oj#l> +;қM0+nx>dȐF[l⫽>I{oi]w |8蠃Nm٭o ȝz?4|O>:vpFލ[3?3%/kHv4iR6l*U곔_ocV d ^{pG7#<0aװz#F$7!g5>@MUBwt @P٬Y!{|5<)0[Ο?e~?Ι,?o05h4Z—.\pga 0(B?p,YG 3 @ @@6cƿͭ:]\IqNie ;qјkoScB~F_s54+i(@% 8:'; /ļNW\,QGTl߿8j>(Y|͆AF:˙ i#gz+aTnrns„ ͶoZ1&ԃf+jÊ8 yx8ByR={lPtu5,>-c=l3Hz9S75Tbi˲xT|e3m&ɓLvm0Q1d^ZU; @@⿏? S?~_ӧ;Gx|fd@uqԨGF75&K}Ł#2ƃ?W$A#kdF˼YXYpu/4tRGgʔQaoC0Xμx-`Р^& @ @ kHӦ:]\eQGM:[s25M:]ܧs]~a,~׿:׫!Qwrxksw˹b"~l-S/s\[ZOLϽ.)gu̵߂v @"r̙&N~naIbhKl?;)q=&wq 4A)~!dfo?ضzF۴e&b&_oL\m0X~k:sK_Rl~5=wN?mYx嗳˖Z?_y>?iaAgyQX_WCL/Ɣj&|b|;PV(~p Ib7K/M!f{&wǛX뮻 'xb>|y!&vxߡ'@'`)mdLkMfFmjʙe}'H7xx3zOPl#U4ԋ7J4hGíݐ v7crShfGz5cƛ3I=SO̼&5f  @ @@e :Z\u ktq>>eܛ6t6_\r˹b|?0Rm[jyZ+^]32O<4Yޒ㞹Q 6\]|9:F}ާOv P1xM7M^ tQ qܩ%ɲ1~YC0gZ_~yG'pB 51'b%w昸;Ɓm|M738wކ?sLrEL4.iȑǏfϱt4~5)K?X#<Ҩ>ߥ,wL )&g x T d)E BmQ!K-d )K,Q%!K/YW R*U{}{ܙ3sg>swιg}~No휢SB>לA7yrdTaC>ODž}vDPD@D@D ̙3)2xwB.aԩWgN~;x5ׯPжpAEC5@?b.ܹsC:jO;4DZ33x5::?裸Cn[pY2G"ƨիWYѣGvlfcȑAG6low睌gmCל TfMg939bƌ&3' 7[sYF'_FRD@D@D@D@"` U{3`g6LHW|%ް60vήL/肙fBKo H8 q*yܦs$|}T7g¾ N@ P܈9}u>:nS 1v?g)a:C}q %K {(V犵jͮlaߜ[UޏċyQ'}ü'm\ժ6짣~]!" " EߩWV쿾nݺnhG_|ӦM ʛNo*z!ڛ&}LYFh/ϙt/Y*sc[h tjnРAXA8N :t(^c67'<YI&sf}=l&s&\wur~sѳgO7P%gL$#sϊG~i 2Ĉ|{\pA2$ 82ETs=Fܳ\S( mL/+zqռz 9A>қw;RuN./e`]gg9(-h P=.CH9cBݷǠLb!@z.U|'~:F`m߶-t^yGgШV-oOGa @ /?גYfd۷ot;s.|N͏T*nS3eIG^ 3?v5:5{>wqGt_m۶͗.ҁf>kd2ÕW^VZE%)oq4uh^vɹiJ@#F8NL'˂ɾ+TNW^y`{8ka>'Gy rk׮n_:?{dd_ti-H?D?cl}ӵ">U'x™048\x3fs9HTb;DaNmDܵݦ  ħ" " " " " " "Pd P޶ή(/8u|R%8rWWlE1F`?ys:?rGǾ: {pLD@D@Mǔ)SbB![nyȷk.*5oG*mD,*^B8qU3{GF7tO#&駟>,_#8qw"8'dgضl5NؠCr8nwUG8gP= yPoڵ+zꩼqlIR*1Ѡ(y)aTd~hذ3q*R@bm@o)ާ $9?k3yQqWw욃w\.xJqհ2f"w܂׌8edwԫY~6[" " " " " " "seO::e7`=Olj짫\(Y2ЪEmc H웳t쳣>EhF qKC o? E@D@2_rk~tOT*u]؛ 0uÞU͛7;Na/D4c,7N ZxΝ1a„ZӠAy?BI.ݻwwp=K #.Ha?SO=QcgԈpT)"%FJHt:~:%#Jp\F̫UivayUіUvBU㨣w}$g2e`fC瞋;ΈKmQZ2IKM7lB wȄ:rq9jw}w}?_|17nɼRQF BXRжm[y睎$C3 J#Fߜvm70ߏMFHJR$މzظ4%}-[Μ9-ZIL$.J(v¼"D@D@D@D@ ;ўk. F:: Sva]nHr2$`.LA%h v>B^&" " " " " " "z7 >h6l9D&Si\"i/XpP\4f}u(Smtv2e![?nݺ9Dۮ]֋@̢3g]7L~DP:D5dUU3y3H,efkޜH3|q-wǩ{}u^(/V3#A{K.93gs?$N6lXW>*&0Q0u|-|ytU;`narKzH,Nn9DwAzvm'pyݼSTcm#, eז@ P(o\ Λl3240`I.^8?NTQbSb;Xw͉42!VZ%h\ڴi81/\dO! 3 ֭[7|M4^/5}p4EtTȢ8G(ܙ N> y+ۢu5E'Ø(rm%'p@\soo*w2·\hIu<;g"z~}ae" " " " " " " 0‘<9ўQ' R;9yػS/JD mV_xtOE|o?W b0Zu·{ej-" " " " "3^}Ug#7w|o^&di! `W" " " "P0ѹǻy:*0t-tA<{tVD p_!|TǷ|ӧ9gu+G9g"n䣲LD@D@D@D@D@D@DdwOőArBgd/1tVmĊ/kF],<#w>1t;@*>W^y%yGo7c*[iTp _:3,0Oe|*S x\jזjE @z.^궞2q8LjT>_8Ds^|8{͛}{k4^\%c]t'WGQJ^?(wtV:ʕ.gҥK~:ѱn4`͚c .ǫWw5s%#D@D@D@D@D W:ہ`p׭Z'VCD@D@D@D@D@D@RG`*7X<|`?8Hwz+tFD@#Trѽ6&O뫣84Qs/O;s,e" " " " " EW\޽{c2d2efxx'" " "6nF>u_0|{jNpMˇO3" "hKݜWƎq_7U{[ϱҥmJE@D@D@D@D@D@D 3prwbL lnپZBQH}ƅ|f}ut1m3f8-Z fP]_&" " " " "P4-[\r }Y?FF㲨rϢKUtV׾JWysٞz2ӶN ,ZWSN*zw)Qc$ ]E=t:{_w=pO=ugXd Nj]X_~q9A ܖPmO{TƗ@2 j~:Fv8(ӀvӨE@2@ɒ$!FϽ^`jWb[$?p~jn?P&" " " " "]7n}ViS#h(R-|6 6-tӪW: 8 CQ6<ĥkW &&>Xm '!.ݺ f>.P!Zd*͛wRq28'LU+3]оd'}ڵs`\Y~Ix1w9 W`Ccݪ"bŊ}-[oa͚5\ԫW/QrOz," " "̄Q.q_ٞ 1t];[:@l8ysw3uԩyJNRrmnhlw̌Sj0n+WT!5m 쾻?E@DU rʕyNT_mB!epјFѻ"Gcqٲ^)<,U@s=;Cƌs$}f3TLξOZ5H9!|>9%1c)|9$g{w]W_ v?PgO<-ZރP" 9D\9KÁ>Q@1zu+}X֞ZD@D@D@D@D 4h P%:RK@D@D@D@^~], 8GO< J >=]QC~0uߺ_Je_PP&" " " " " " $q#w_t'TUs'uouE@D@HD 3eWVFQCOr ж-й3!2!P^@e͛Fj1%@O>qղ8`w}fMo_`b`Xtoi-" $%>7sS>Wynժsc[:Z@'kW9{\L Ptoh-" Yg0lp@b6CQ,?0@*1yHˣxNq˗/OU*g']EBD@D@D@DX ;]dZ`T`\GbEQ( >Gg0\8}NgWD@D@D@D@D@D( Ԫ_*[|Zsg>s[&" " " " " "P/0dP/X!}{j2P=ۍ(ҩP[Ɔ n۴&e+7 X+VDR&QdK*T↡^mAW?\tU}E@&w,y2r|~9.~[իt3'M>p!pBe" " !"/=P[Q#cSS"" " " " "G۷oY>uU@Rr׮򨮼y[) ;0hPNTVU&@C>\:W7|K?o5]D@D@D@D@D PC=xq 8l`WhpWD@@`}[o}h8F͚͛ yg%" " " " "L[ m۶|J>c " " "֯zr5z زŭvUz؁,|.LuC>ܦ99|s^&" " " " " "I F\ĭ{,Z*,sBLD@D spԹ'&[mh!s~;-}KuYMyHY*HD@D@D@RG!C;/+F Q bʕ+tRNJ*r(SL.PDFž{i+J*(QDjb3;wvU 7ذ~)OcG`]2 |=pMqyR ɵ[!U?]? '||p=8#-0UI&Э[7mPE@D Ч&mjPؐ}*( 94)x3^{u7s~ժUxgMXẁ a˗矏+GqD!:Jmb~oݺ5fZj`?ލ#GIfDV^=+!~ѯ_=XH꫁d ^+Y$^YW;G,L믿q6IaÆxcYm1t.,[QP:vjժ|||(z-̟?^{텓O>tkOß';h m^#E<5a0'M65)"ϤظqӦ'=E AGiӦ@N:f6NKf,6Zz?9.>Nn;ئśo<\zi|y* PJ&" " Q+UTnBHSx&*VD@D@D yMr;xYR@Ϟn\9ĄH?+V੧r^JIufN^ 5H=… b̉ӼY/ʛmвeK:|~21x?LP[bO>=ęJWd۷Lΐ ck׮/aFޜ]w]y\Mw:5YyǽL2Hu(*Gx3裁=/Hvu[iTfwq~S~,L~ . 5,[,~1cKh샼曝膁ҦvND{ދe'N;k:{-Y\XFxmӹWW;Q#r `MtS7:kbR2tKH>u|PRfC5e# ԱVI" " " ) @l:aΚWXv@0jPyruW^fRejtb:mɀ%SOu§GSN?_/y?_|wygJ>K/ѳbJN:bN j=oԭ-" " " " " "Px^Fॗ:p駁SN;[O>$nᆸ|KE`_$=kn*?|zL3d-b"ie`+7gOF5BD@D@DLcAG瞃 W,>$㏇t?wq? ?&O9JK=*݁hOGG vF7M\݋.(ԡ!YxSsnC^sc.|NpN;44nTzꫯkqZj/h?]cg@I&8餓u L"Pu-mO]%EFW$c0LD@D@D@D@D@D Ef(1o[((Q"EbA%x⬳BժUA=ϝ;׉HUx-}e Ah"0޺ұ /tyAH;̟4>ִiSG{,vD UDS?]DWW0# F&'7r$FT0'<&*틀DK~}jy4$ز*W20N {hC/D dMQ=z~УG@j֬ Dı1N=C&CC|Q̯Ă_2΍?Q]zuL:ʕ ӧ0}  .R=Z 2L&qw3;=w;̙3,\ޑ\ah)8يO8d;KD0r($" " " " "Yu'Do֫Nǎ<2ꙮ\~`=髦cM6PК~!||"A C$aÆ!B*7G7ԋBrv`DNޝFghYĉeΚYD)=~ .zVޔU/&mY0 LD@D v駟bPW$@ `ǎkD"7' eYy:krJl۶ͩAΪdrɏ]C` ]J~T7"J2fЭ.8p z{(ߺRJ-\{y:0rlް9l 5FYޞ2Fa9A8*Y t?xnw'+|u9'] L̳p&gQi|(_pj8 0svnRrzcҥ3k<=ӱI\yz'x=oN/ FAbf͚a$%w'YM0!aq/(dM2St^WOAg&(p=}E#Ç͛t΋ pܬ[nHc7c[ :*2y [IJe)K-ԖD@D@D@DP/N<1чh}TpO'{]iz#9{2<^=8 x"/۸q#Ώ)rF,eXB֨HOGDw9[X,gϞ\_`SI2ؾ9dI:Zr$";f/Ǯ Ϟ6EӦMß1x`\ѣG ׾}(lߨQ#L2%O?u]/<7#?s d{/ ݨU QLGE70=d" " " " " " $@_w3*W΍6v ̸^>}VqAEiu&A&1avv p #$c9&p,ԆL8 dWtU_]bMXC"z[*Æ(ƚҋk׮-" )$qko.eʔ7?,&Pgy'W^=U2x/" " I`JE<3pC(Iv_y啠"UРUډ@)3P~{ 8~ҥK~ABwqA|B]1*yb,Fo&bI:D@D@D@D@D@D@'`DN'ih@2HÇF˗/7N^(gF+8׵kנl,;~U>8ֆJ*fFu*W!uN~I[wށQs Wd" " " " " " 0&ʟ{ O?;,|rڵk5w͚5h߾}>ጠDYWg3p'N͛7m1e˖?;:ceB!N.:x꫋S b h6ě!0sL*U m_@`8DrHpPO_)83f8/$Tf)Wp c=?#㏁\믿zGa"I>.UVD@D@r!uMଳrE,-;+V(%M [nŋd[o N ^%jmt)-_cǎ?#8~U?͚53\%1#5g@Ю7킯T 8ѭ[0N~qg?V^T`# rWT?Uּys{,Զ_ޯjo;m-dHض'j~H.6^w_ܫv}^D@D@D@D |y䑁mmn+J%@lfƟO]lٲ&S1kWB#@1 b]_Hlw41_x' 8sυרdgw-WQ=?'E*UKy~)BP{2"Mg#ӎtsҸK(o9`g0%/;0h hԨQ'bŊx7B{8_]L9dTg:F_ا5Caߛ6vd ՎS?A ~3?~[7(Gv|M {l`[#J꣒D@D@D@D N֤1ӁZm-?Ӧ@5WOvݝt 1s*T3>:o۶-PO!p -[Đ:卧O>GsE\_ '^S{71ο)ltd1,Ntoݺ5F_|8~Q~hҤ F38#Rw7ưaPrHɂx8ꨣ0}t3S~8sOf^>\XxxۛmNQ}u3 ͹fS'W_KJ+" " " " A:RJn4:Z) @T>(Emk`rHP":+Y{3,=PotdVJ/" '@- #5qctoSO=eʔ ؒ%K ~oĬY0r@2fF)FWX13i1_2;\r8Ý ۦMzݺufLSiӰvZ2'^ez\N>wSH;HX[9/_<(jUΝɖM#mE3/ĸqkn&ע)9w.=(hР7m719vڸ ⎽vF ʼKKDPX ̟?+Wt }xoIh-" " "{z,~{^>NڣG曁| fp'D̈́z6lZҕ.]:k+JkQjUgY" +N./DɓL E@D@D@D@D@D ' .y;eׯ,]tx Pe{Ձ?8z8ꍣ>SL Ky\Cux*|tsPDu}Pv)L6l⣩E{՞{̳Oet" "tKɣKo&L_gx%aU8O0v[ رcQS aw}w`ezw-[>h1Eonϝ;s3A9;x/m۶:KA9av;( ><{R1j5|'a=zDx(W7MfOC?9 _w}Y^z᯿ `m޽{( ZYz욞bUDOLwDIYB9g 'To'r21ChE*!31*D Aˀ6m8j t盈4}|Ezb 3M _uZ+JGv-P ⵙ3g{M=t_xq騟IL6l⣩rKJ+" "|7:묀=t}w:իWw**vtx?."'}x߰֨<We˖`mt$8. T?餓IT={vN`;cǎεt(Ayy |W'W^m#L|~C@RE@D@D@b j3չRJ.\P2~E'| yUKjc˖-PT%~/E,*RYՀ,lŊq=՜jTԩSPx APeUVA=JNTNXa$꧋g͕wN4*@P[q Q{uĈ:?v9rdF7H'Y^T_bYxs #9*_wu`FbLHVt"1cb¾lҥ=ө8ٕN>=$OHX`խ2> %I4PDcIc)=c(^s#`"Zb YheAVwbF;c^ErϒJxpƾ(3D,v'*p  ?USk|uTei\_RE@D@D@D@D@D@D 4i%KycCuEoAֵW^QWѯbO(ɓq@>'pMVX6j'JCNP8A{[(@aGu{W_i> x ^~eoga۶m;}Qց?DA Mh:o89ovX`yov8@rt10I'ɓ3#7]uU\'2Gc|<˲`GU!H|?"gsb71?L`c3QG~./`+T2D@D@D@D@D@D ԭ T֚f[=# 7܀KF*vˠtV2`tM:5ј_xwAG~h̤4avp$WW8~60yf:&" ")8{8Yh:uˣQFS|ntׯ_؅ws'&|O[l^<ƚ5N gsVޛ? Z{o#y&b^/\cqMJ 5 8YsLJ2?+M89Bw9d_뮻:F8A㠃r߹sg'N :;?ׯw&pQ&LN4=پ[nNr:;v.sNh֬(9dJw˔" " " "18's8s2[:9yذa|9=묳о}{'$gŜ3g̘#FPҁB#le?rHo [5RM:c"/T8;}@RegϞKB.aŽa9~νx qM %5f%ٟ5O#~F&" " " " " "Ľf\&Qp^gu9A8ܩG:9 ctd'7U|vƨxo*}F$[Y}L}qwDW:]~l'ΦO?i/itjDa[pߦM{g̴1bŊc-y ]t`]vñ`uͬy|Θ;y_3_؉]sJe]>}8fΜ D;?|p߮}*hnj&rOx+" " " q ]l+5\|3fLUK"͆%5jKΎ dQ*_8 cGD< {"zo՛(msv:;HN>dgm믿މ`I:L/}3'=#(8~{ FFݲ"? [Βl#ta t]u뭷: $A㚪/?i}?>-ku/ xNt8]=7߄rk`4Zj:kE@D@!pG8bnt}Auz i6vX}ј={6N6.]8]v?GVZ3ntb; ǒZUun^\ʨmm_WXɓ'9Qs웎twN +/cckfT`wO%uY0t/GIL{C9|lćվyK 74+g'yo}駁'K/wRzE@D@D@D@T71OD4H/眱N%#Y`H3B)  8HlCPFS$Σ M^ٜ&d}^ /RrYDD7TF ]u:P XrsρdUVͧH8tPPu ͛ëYP>z0l& ^jמZD@D 4iĉĈ󛕑i#@vбƉ]XtaͫUgtg4v.zh2O}lڵSkxЪsSNqּ̅x:ӱ~֬Y;4nQ}]X{o~kc*TDDo +c=693*Ć 6x.҄77pl줐۷{xω 'v^n&L4ϋPEAO>" " " ! pK#P6u3O$ޅeϿ.d/+W߃@KjnzFGuD0x`O$vqT+#M~3s߿sYp=Ύ]s:/r|f͚)}ty:Y\X_~lf_t.=}X}uDwhʱ̰LD@D K 7*92Ђ/2O<tQkqA`Ӽqg:*VÇ;Kvv\Hs3tc\"9~NK,ԩSm:Ӭ9S:RS${Tw7x#.pmۜn:d\w˸B" " " "I'& yiu0\a 033f -[βLq:A33elL )m箹pI1 Dڜ9sʎ ]]Xڵ+dc{ xCӉ*T0ď Ԝd|;mWɓ{/2 2Nff}tyjJ:#uY֯_(ORxQJt߅-֭[^ oAkrX|ao .l U~:S_]aᄐ5kJ>~RD@2@zPN̞=TƦèu"OtMXܪU+g_;ѣG~&ߌJqFL2QohNμ !͛d ިP6mZ4E᧟~rKo]o2j|򉓇uBcULXrD5jLxL[B^2ʼǽCW"իWҜJgX'6V)D@D@D@ OࡇoƏwmۺ ]/|,䵡LHF\pAksEP"4QaaHb+WUD .>ܩEWM@ F0V2"Bv93Y"nDu;;<#UX180pI"-?|'U{=t!PNAt1b3uҤIhڴi%.bqt> p䄖-[^8UoVg:s"j4xoェ))HNgL`Pu>}zǭyc񬽓6x?+5|~N89(vTD@D@D@DK}40ߗ lMm& ~_pG}['" " " " "  &Z{ hf̀scAiE@D@rs} xe\$6@v4hPD5u*O8i\/={:R]͚51e u bEŔGĬ[bŜ$<ᑮ.,dm /M'V`lx㯾j,ҥKPYM J(aȧlٲɠjժ}o>D %pghtne<:h^cą^z9 j[n߾}-cʕغuPNlO:Չƞz,x@5@rW_',ZYiF]&"#Q>b*(W^J) &z5LtnU#>O:|]` \$~\s嶛~o XD@?[j ֭_|*l_i9t:th\Ge*[#٭Y&*WlO8y`*o4U8oذa`˦ȑ#tw,:c(HJ+8$҄ҥKhv;t{+:E8 3믿{wB|й.][< )ޟd򎙩9ydMHY ּ! pW" " " q ;tX^k5Δ P EdԪgLrCOIkU2Pi}4s+u^D@D@D@D@D@D I2xeGE `chrPK@tES qm7tDMQm"g ;v18Pe*{ml2h?ѣGB|tm9xm=p`s6v #駟86o߾,:|#xOUrug:k(ub pK/36k׮Ɖ(cLYM{QF93gt&nB)/q|q9N#sY&DD@D@D p Vs.be3k/4hާmތxPb~} bT}ӽ0 ^$@_qql t\s Lxau fߜugbi> _D [ z뭎zWtO>}`tV:btb-T*{ON'3tϲK*84SZjݻw:Oo_b`ӡCg2?i"繷~ۙ@BgڶmۂyQr(h9ᥜ¹gǿyMʘj"" " " E~N7o™\8|ƍ17˘:r"03cJ@x%mT2H|͸+Lxh\z)@" " " " " "  0t(py?w:RbŔpMϝ?d>atw:Y7tS"U'{D@D@D@D 4&4 7(u0k*T@ g}djvRQ᭿x9uQCRAA&E1~Ge(OmL'p%@l܀0wq:G_3TI@t餯Ma:}r#G|{Ӗ@s}5%{[3")sTÏ纘 9Oyq?̞j}ӦMS]lF7bĈ@=6O@ TjT#߹Vm!P^z͠eO q̚3AafT%"|Sw*]LNnݼcH>#Qpt0"ɯJH>)q0:'NS'*" " ܹ3^x.E.]B@~@ rqKE@"|E@D@D`8';w? .\/8SpGk΂r=CQپ0FiӀz_ Ojr PTaJе" " DT{ 7o o7ۣp݀ڑ,_|(WK'-Zm> OHcwh3eKC ҆d͛7c˖-q5*L9RTv" " "rK:>Z|Jz:{*UXbfW::YDrL:cs We*IF\uE" " ؾx{\ {U#Z#R u3{s&x|tPe7ݻc#^wL[" " "M63O>个\W⦋D@\x¼wy’axa#" "  c,Z(^o^n]U(W\@\衇Ur`;]+z.PQJ(" @Æ̛W:vw\[" " " " " " 'P 0p peM7۶Ǩߵ+p뭀nds18Q^{-л7>" " "}N:$p@* 2eSdzT &`^yd" " " EYfa̙ΚTߴiSͮPj׮,j g/n߶-@ %=zܦRLD@D 3 l  <0~^Usϼ<G!+/n_|[Nd.]O? gw5kמ@tIܮ].R}Jq0H ƛ|z:sYbETb<ԫTp=칔-[6<291|u/l:oRT2&"sV{uX,%JW^ upyǵ%" " " " " "%Ι/-Y:?ס_nE5\!`)>'M n'>|q퉀Fw \ ڐ}F}L`Fw~> f;oqu@x_`h) 3IXEZ/X BYi{g$"{+We _ m#f HEݻ]pa fC f&h:k5beg؆ @ T" |ٸqf=d6~|r¿v;0;d=],#>(XyO dV&A @LUz;uo.dBu @hX z3H%JK`@J,VXWs:3s^sYfc5+WB*jFs5k> rG`R_ :m&!&w`&- @  z'l>̟of}k6Lm&ۘ1STihѺu`C+!Y~X?&:6ww@a$ o/}wΝcx'}a|  @@AX|yT%(,U6oV(-\hֿlW/OwYfAw+ &?r~( Ưңi"Oףp @G *֭[݈L}R U˖- ^lK;תU+}FrW4{u_% ᇱwoH%$mܸ4@i*6QInYӧ&,i3*ViUF @ ,Y$0(\VLRJM6ֶm[jJ*e[ٰaf#Gpk;{-vU96,ɍ8@  Xa;q֯OȺu9'0G f}~*R7I_I&TG{72oN\/WZu5;8F,Zd1w-O%Wtزfkvɱ~X~BHF %Kĉf6o5ͺt1S'}@ @@jK[ThI^%Guq2. kزnر~1c֮]&f!# 6o.03 IU ĭ8X?wO I |vk85@ ;OʕwHug3DvggєUmRK !0O{7nܘiH k֬5,:~-,!]{xk?>:A Ph o[`Ph|UbB{-1'B @H &Lp`f3lZ@!ߺuk;ݢeʔ0^O(BcGk[:1ǘ5i8G!6Y03Ð~Įkf~:>0Ԟ:@@VY%d}Y< ]O@GjԨ*rYgsTCu| z_B#Ra&x ;-[ܹsC'{g9CwX' o$ %Ė?`1%-9`kQj8戯=- ه9gQN:  P3pp_@ @?FhRٲek Y;+V}U}p~j&|͘C*W|hhQR^v;5' ]A@>ӧDŽ 24D"b}K @ /vѣVpQ@HNf?{l$+LAM""C9$3\Lq*&6flAt+sjւI ʶխ8/G!72lrRI\rfGe־)5l8G!@ @ (b콫… 3lT ţz;h߼ysS˜V4SDǛ-[q-VN}uO,q~@ UbzW'㌆4 'O7Oyϵv=?(5B; @IDAT^4) dO }kx_9|dTkO}+BMB| 䔀^0?~~=-[#;#vԨ\/ (CIk^#윀 !3'&x;|Iun'7 ]01͌? @ &nݺ ڇ(3lW<}8Hh_x j陸%MHojG_ޓ^-Cł1 1Wȓb (S_dFs@VX>}a)H`vYgըQ2/M>s /{OEN "κ0}oa|, E`֭hpN(OzNza=8)K6)A@Urf\%—B_GžFl a:(&@ƍ-Lmbu3gi$?O%Vh%n_l|.!@ @ l ^g/wN{M:ԯKrFfZz6 ܄u}QlzT(:ŧ:ubsuW.鰆+V Z> z%D㊪Xm6p8--Tq[k*EDrѢ$y,˵z!g%[ߤɎ> 'I`͚sA`L"?̼=Ŋx`}O֭-C̩q @@r^{9Kl/}FaÆvI'ى'Kc4['K7m[.<C)SvIT+# 䚯t-ǎ9{!$ŽSc $oa~:٭\u{VO:-͚9 @ F@{-$@`0`@~ q'3m4ct጗[;:;8 z 'Md'Nt@_۷o0͚5Ǐ#Cfr )J@N7rFJx+9KeWZIz0(QJlC`Р\"h^NwߘkNN{L9@ @Hn}3Ǝ뢇nUIQB?x'*nb L3G$ĕO֜-ӣ}tn}va 4Fί㨬마tꫫU+@ _~9l9nQ /ψBHYkG}k (#^ZFgeij'[UCh/g :>I%{ S `fۯ1X P~=Bf_4$׼cxZkk  @R[f/e ##ȡr:A~w3c9@ 6lz5W2B %) '~z?tsQmQH w F)4sG;W{ +U& l;t->OM iwf${.vS= ԭkV^lM۴؃@F֭3rw+VdtUrNx K  @ .sBS]A'\˔)P Q˄M%WlEi/>ǎD-;*eV~L~:ZhN!wvIh 1t8&];M6v @ Feh~vjɑO+y5 t6'OgΜOYfvqˡMgN /q_/Z|C떮(8)/.>bD*4yEǖ^Z~-gv=6kO)`0$@ @(b&WDŽ\%W?Z(DP(Y҂"E/wmjħMv?2̈fAt5kH(2.a:>;3JG}qB!(*&Ð @ d/fѣGFr@xωZBH rS1clx7.f-Q⃂I k.p $@`@em5ؠA:WkZ#_tKbb-ᰕG5b{ӢpZ4PQ:~DJitْ%9 ;)ĕZ>l֍50., @ ]?/Gvb &؟z9M)\@aR=DOg Eȑ[.͋-U}~[w+_>*!P8 C}]uk pib  @@^\/{=WDe#Kq\  й% T"]`+%}!8qY&5 z)5@ |ZKNi 9˹;~I侥5FBZ% ρ$`\%L&A hbɲem/נD~\AK|ZkA @ s֬YNh/gs&}B,)wP}cZ9&m$Hc2uj^ٲ;|__N10 X t?}tZ-2i[t2;\@ dM`ĈLe{A@4CJ*qQY@@Y+7{/_hQPzG{Va^N@A@jZڶM_`R-آ?nj]5|yl3'}L@ _kթJμxrEwϖ&ϗ֚<"8 E005`rS'ֶ4hWR"# @ 1Nl/w_ ^<;v%tr}'TDyCbK|%ZFi_a?\_x.?4 nH{tEzKO:>>فa}&7]^/ @ lÆ o٣Gp!@7G<+j @`غuM69Kl?sL۶m[ºT zӏ?x;餓O j PdHTuMV_ > NږxfIh ֒U`|[ŊE%O$g-[Js(~J3-rOQ>S|KLh m/~1#`S @ "@޲#G:MҵZgZrB{Қ,.mִilIUFNkG$Y~5|Y;8&L2tcI7+WnGlt*ZF^ʬNtږ>&H Nkik}*7ʁ x ̹&MqŃYm҈Ƞy^{9w~ x>~7u^aAɓ'a_}Ub]{ܹ,Y]{ڵkߞay:ѿ$n-Ӽ9=:3fϞ,;u饗'*SQF:}t+B~[6m3&f=pY0XOӱ Yw;5;$G}]wu^ Yvx Kߙgi͚5_||ƍs0oQ93غu\s^|?ƍNuQs( 4j(zՂJ}^ r= $߆'N 7U/mk%?C }@л~%[2ilYa %G~Lj`л%e1%˗- ҶWm %~_W㈫A~Ǝ? j0Ma"4pQZkS[A% z69ay6}f^ۥJT ( @ 77|Ӊ?&'ŪUBSO=5xg $%#-uԷNsNk(`fIe%zv7Nr}sί\eQ}6]euOO~9>{n)&9W'Ë^  @C=|/ f$馛>ŋ?t}@&^  I&ِ!CCN .Yge&Jp7SvX kҥK8b_{5mРAZnjDv"|֭ :44#F^:[d__#stW)O;ٹ υiREFwަgHׄ契 -ZZQׯxWȤ=>R $$1P3~;E=AjxGgg na@nؒY5c{ߗ$֢HkQ۴eoǯ5 ,m%JŊm1bM0ydMpAl4nі-EK("?9ܔ!F2S:ώ(ڎi@ @((r^9&JՃk9#]D@M:k F&g.:e7OJ~-$E폋#V~}sjC?NV?]|\F}skcXj 6%wYA˂`e ,n _HG @ 9|T./^EY̺׿r((T՗ R>>)&({!8WMt6mI(/QwF{_k+r 4p&j~j3fpn2W=.fs A{{ɷFx|όCzP+-r>QK 'Jpz>Iv!{nɪPRXc ~_!{yMFx`l]Nf\4 9h_{׀'  @ +P /w4ujذ~niժD=IC@tBJ+1Ow[u91HT͛޲`QE;u p,cE_A*X_DFIA[Eo.w~ʕ4@@jYfś/\?s+3(ɹܻ': /ׯoǏZjY3ؔ)ScK\ș]'%)UW]oFmZ\pAcYDzmU/ T}&ҚK o fЪ_4) 7{]rr_] )i|eR IAI>~XkI?BQ2d<zC]' )) OF!䜀8+d V/rlR-|0>@q H _kpGKN|xe/0?~Y>1IE .IlȩӦ``CX3X``>.W.}pB\$@ @@2^iPDI%!q, HK:9o|ߜkO?m> I}Q'g'?WQU@bgk`<3y# mG@T:p/NVN@Ho"w}gO=T=kөd$<]^h}`pRbxH J% U5ۜp۟kx/1z9 &k` kԨQQf䙀-_JS$i_t>D:~D}tڎh_}m}r}u:sio˺uF5Z[-|~3\x8o;_sOx.[o A.E^ ً#w|?׷o_~ GAJ$}]![oՉ,. M^̰ׯV)3E}x;ڵk'Θ&(s=L|^dD1l۶m'pyg͚>3*D쥗^Dcޚtϟ~/dwEHE@HK}>;j@ }6mZj?gΜtyt@_Lڴi9䐄8@C@hrגI={ ܾ`8ҥKx @ @rO@'OvzBg{ BKh"!HΝsȕ@AN.ދBԩS(핫$%ѣ?rSv>E5jՖ@ Hn9OI>~3[k/Wf}{{WH~"~pըU%]bEkܸ&$}5~€ ;?x"աCD8#1hЫL .\h$'Ax:FI{."[rso@ =/Vy7h;~vƍs2z}]FXϑ_`]eŊoun^O"Sh8q5kƍ!_^aXϛ7/ 䒒@ !A@2Kl^Tx}*U3^|iSw@i D/oDwن @ @ 4'ص^ܠ5@裏Kl/'g? F Pt4i>l'rKBNxw@_B @'0rPӦM o  n)*zG%ږkvYP %K#O΍^e5l0GEL3}'k9K4iҗZn^K3f3}tk'yYORxlԩ,|iG󳝖&v8p`!m{O?t(oٲСϷ#<] -"Gd;> WZ&K\|.JtQ_I&nprW41De)Z i5y{?dm "EFk`|,-Z8W{՗""A@Ћs| u䧛D=؇ @ "EWhW_}~tM^:ˉ]@A%4iRڼk^ۇy7onsԸ~ Y5 @R&){S0 e-ZdO=3T% 3d q'Tti;cSQ}jߥ;.wvH庞ia1UV !O~ߏ~t5)'/4Ez~:^vmHn^XHxϫx}N먵Gqi>I]D :Т M0`w}gB .*d MАSe졇뮻.='uAN6v׻7QTJ(#%K?3ջ".$cRߒ>]vM&PlB(;7Sp!7|ӽ z.3gwav{5 %"6O}@ @bnݷo_'Þxg{6=ta @0ԩS=9_uUiơuYcSᄏ~Ȑ!v5dZ'!@H]!^DrsV[n휫x7+"dċ $A19M2TX_$,_ny}}UwIwry9go 3cXT)_dl6QFVfMwJ*IJ2qK,t%?O8q/ի{9+8CEc&Mz?c΀"M(*&H3Yo;stjJ0o<C}&ޟ߇6mڸݥKn;}vnPtt嗇&'OJm.\ @$%7Q{@ hfjF˗_~zPifFT' *c~De @  )6=>yg>@g@a'бcGO>iǏCQn>wnsO AࠃrĥW\qs.9`X.x9>S[.hۧޫ>)"@4/Rۖ")S&@!Y z/-ꨌk&X#>?"A(be-{Ɵg @ PH3XvbC.d?/Zn{'B 5 4lׯ-Xjnv'E]tAYb\{?[  !Pre{"GۑGiׯ֪U˕m6'i4k]u뚾'WUyQ{K\g^z:&yap"d{>ɵ~߯ǣyy3ڎ#&dJ.ByN: a&%?@ șX9Sh-QBΝ^p3>$|T@8p`wx7C@ @@선rg޽;iD0*Aw}^{-T @ W2}`ּys{GM_9*ҾƿH ]׬Yx-#g]vxlxqL0&Ms9)/r.S"㳛$`'86(:*U*,^lf 3ۘ?(x{WJ^x]P_r_]O_w~|*(E'hRK=͟(ovE5p{K|Ѣ(ɖ۽-Rj@xϑV@I@@!^}U;묳ؾk׮+ Ym\p;/O&RE@{裏ȑ#C@ @@5X{G?%PB1Ι3Ǿ+۲tVK6yVBÐKָdTQJr?\5s\0@ $;][$]zG%DȊң[$m׮]Kt[nzt 7l`SLIW9/_oݺuo(r=8qbo߾5Qz/ѣG<^p/{微`~;=KGl(EG'ʛcIS< sїΝ;;^(4k5@.RS+}d}R @  5dȐfϱB &# @ @`ضm;.\؟d{饗%8.aF6 A%iLL`rr߿(Shϟ $% ~7p&J:4%^hhe+Ǯz7OdD&Nƍ3u?S .?mcn'ԯ_}WR,o{?Ud&O܋/%s]weO=;' >}w1MT:MUڡN{Me˖&n%Kt答u#_ C@2Keʔ.>s$]4p^@޻w\Er{UO-lݺg꣏>;ϪWn_~e\ {׻ݫ]v-ܕv9"K @^6n{^}| mgc ]pMoECf:A @  85MH_lYɅwP/TH8BI(-1|p駟6?C':餓pF- @HRr`8~3E[ 5ZKfI.Լys5k?ޯk׮7ӭ59[MSNmذanr駟!A${[uIk׺ sOWnԭ_cȊBf}O?u,,.]gvr%mڸq|\~ח: h>|Wϛ&M$_jUx>^ㆌk'L`͛7MNqɜ^NI6Q$@%<ؾ{YR/Qѽf]s5nf=v"%s. IU97 @ @H?pڵ3+u]Dz"d|Y$fp*?KLRn]k֬+RGS^@%&:QmJ.m^{;%}ͣ>3&Q9>zN3gt9u'9_x}9ķi&?C8<b!<`p@Xݗ+WΉ[B6mĉ֤I4$oԨV" }ʎ^װaChoxӿ7x>~Ew7xcy91c]|a/=zp1*W2i"&H$]Ttϙ\a!YF'pH,uY(1m* P _ΥC5+MI! +W~d? k@ @ؕ4 /+\ukXN}h!@ c>`J#} Zj\,˖-qE8@# ɴiv"Y߀O>ĪguV&'w}g>*n/p$f˼xժU+["i 5 d;(OV/k?wTĄ~GM(UTE)+}}%ﴌowe:(_͚( %EPR[4@(@ؑW_Moy9縐7= PP^zU#G@ZAr!@ @Xb : t `(?ߪT< @ {4yIB3-Zȹ^^n”tbcƌw=?oEY qrؖ(XK$ ?WWn.7"O`=C=-;4xt7pM(E#/rH@!r>Kwfr)Nl߱cG+]t< 49sܹssu|Msu=A @l<-X ]m۶ub>st9@y# |0oDի=VLo3 ^s >h$7 @pشiS"5gl w׍87|(d?0aIM rq9/_>zm@N'0hРڴ d Ν벷jM:KYQS@ (LJlРsQѣթS'y@v5QFʕ+T-[om l #C @@̚5˹64WVT.B`Ӝc nf:t_~97+^zַo_S錒&ѽ zi쳏|]q@ @IE@<>TާsU@}_}U'2eJLlSnݺus.r'A 3K }@ @Ȁ >}Q>>yݾk׮{ğfv";Xx/|3k.[5馛lҥ㏛A_9[h@ @0 tRJ@}q) Px l۶ƍgC z6mڔr54A4x؁ BJ`ɒ%6~|OaL2R@ @<*~i{g~ݺ|n"_nM4Is@ux[f[VlWGy~1b_N9qVݺusT!@ 6˗/wUW5nܸUb A/AK/:ku;gVjC 5M(믿K|Ky@ @sM_yֽ{w&Q P (B"ȁ>TT);Cln:7jҤIVx. )ߋ/&f}Gnݾ}{'RJ @ @F`2&.ni $ؾm۶ִiS{ӈglΜ9gY>}ݧs ]~7x#?,@ @(6nh/5k̎>h{B%K9c'OYf_~Fh2 <:uie8c py?{3."Q5ʍw}7l}@ @IG wkNC}@D`vWؾl'uuz-SX5 @ j=ڶlْeR @  ?_.gz[^Z5۷)/lGq? 1!^zDuAYrlСVD ך~̙3s29VF w&hil/>b>=9@IDATJ %3 @ ]L@:2&.liR5k쩧͛[˖-駟k׆m=](e˖9g%uny6 @J`^իWĉ\  @ %0m4;쳭nݺV\6uK/ُ?ha4@C~ְa4{mĈ3XҥsTu뭷}=\˩c}՝^P.s @ ڷo^1\> : E|~gW^y͙3'LٲeW^6}tԻwota&6 @IL`ݺunp 0rȂ(2!@ @ l۶^uզMgzcJ>z;SZ=dɒ)z@hy6w\;3Bm~;Z>}`ƍ]RJl2 뮻2s @ -;ںQ! tp@Ϟysݻ$@@c\O۸q[k;lڴ9J=!2eI'._:"H @ D֯_o@]sѢEiTVͮ*L\J4؁ % C=dv~VD /z衦>zֹs ItBC*۷owSsOc hқ G`Ŋ_~&MdE g9ޓR~IG@i&L{y4mBUJs@@:dټUV91XR%ﳆ @ d%KGuWNsl_s}Ӝc@۶mmҤI&1|vRz\%\k=o<]o7pgϞ1b @(RF }WRԦ@ ,[,,bŊ&) OK 4$2d=SP]vNlP>d|!@E& @ @%0{lr<|p@OŊO> ' $ }%w .c^… 't\~M25j2@Hu^{z3i@ɒ%z+W͐FnDo~7s<9"P,IGFe!Zf͚Æ 7i>c^x~iα@@z , 'o?[ti @ @ []4y(7n=6 @ +Vh޽{ɓm۶Y.]l.{ڵmڴiVj\N@@hӦߧ KI "@SO1cƸwqV&+^O!]B@AafZЈ#L!>D)qS@HF8'S @v ^{5kѢtIiDUT}?`=]+ "PR%.M@a#߻PիW/fΜVB vݬ3<f /` tG @ D NLgm~ixZQԞ}Y_~$@@v h"W_ˈγ[f0ߞ{kժ)9cw؀ @ ٳgիÚ6R|4 ^79Qԯ_z![jUXA)=tR{ᇭaÆ96 @x='sƏ @Ru:uإ^j ,۲eK~_[^TR96 @9!п.%pu]9<[Z53f/_{뭷W @ @wq ~WP(4[F};i .ӧ*zieʔ)Th" @` q*Xޔ@ @ ov뭷Z͚5oe˖>wȮ]Z p؀ \(] :vm7w=c3fUY77x#G| @  SurG@ E %I^kצiA^uUNh_b4؁ @ ~[K@ @H62z}s=g6m /qga7t)")  Iow֭[γ9sʈsѳeV^=ܹs~W @@~ ] ]?G$>t & Q{g<ϱk\suJ( @ qg@ @ ֿ8paw}w;`Aq6 @A[nqouQWdޕ_-2٣GOYf)k @IC;HRQ@@Q!@Тi' \ykڴoƎ˔)c^z}6aҥ x @ذaCt7 ; @ $Hիs~ꩧB}ٲenpE#OO :2:thrO8#Vo߾Np*ïe˖8 @ E(~W{'M7˗/ON:vWZϞ=mNs@ @M @  =c/)ĵOʕ޽{?OT? ԯ_x7v^tE_z Q\4lԩd;lҤIVt&n@(h?^oC G2*WlժUc\ mR2T:Byl6lذ-ꨣ>}XΝxqix.!@;oR"k׆l@ @@?}ݮv۶ma*T`\s]wu6@:tw}וԭ[7{Wr]of~-^ؕѵkW>|+V,er! @ ظqnͦ ~mN.'or:6 @ܜ1c '`r <8ݗ,YجY죏>.] /' @>c6 @ *$޽5iĹiy}Ŋ;tB;}N=T*vM7P ҢE :ׯOss[ @ &h" iӦN_(/_>I!@ SO ꪫsgr/QT`b@ @ W&O^wQGl s6uك>huq8_|Ex¢<d7Sz z{/5 @ [K.+6lR}ժUw{+W.:@@8]$mhժUv%:teˢ @)S۶mnQ4 \0J@ 3˖-GyĞ~i[fMp7ZNXbiα@@!pi[oVh=M6l@ @@X|3@CpݮRJwVLi5 "O@{Enn=\r'*UӝX @ @@bŊNcYZ5TH=o kٳծ]Pt_xqҥiv'|b;wFtG @qP@ @"zjpN^t^{Y߾}m…Nx>Wxv!۞}~!͆N:$w&u֮] @@Pc}R2|4 Y5kq֤I8pm޼]$g\b ȑ֦M # @@VP @ @"w۹j$WDEY~L| @ Y t!t_n]tE~v͆n5rH$9sL.$@ @M`aCEj}z4f~s}hժ,9Lr-Ug   $#E\m۶$kՅ @ P~^NrW}ꫯE+Uk @ ~8ާCEvÆ 3ԩS}zL .믿 M !K(! 6 @ cǎu\rI(פik{EE @ {ֻwoW&/cGy$nϞ=m֬Y> @B`ƍ_"6m>/0ZI:2" ہj>0w. WL @ 5h6fVx$@ @(>S{)_|VK.gyeB ]sJK]96m2_\.@ @3gy F˖-RD /f&-[8' E]d}]6mo4vݢNa&6 @HZ7o6-J1Rq@ @ E vy&Lu'ȑ#M.Y$@@Q"PLg&/J~{?uQK駟ng^Z@ @i"jj "E"ivjgqzE <lĉ6eر+V,< @C`ڵacg e @rL`6lh/m߾ݕ!W^{۶m T!pG 7#q\`TdI{׭f͚iӦ_" @)O-Z𛬋E"Χ'x…Vg?6Oɓ'c @@jXn]0 ,Ü} @ Pd[ݺumڴݴr#W_}e]v-p@@;I&g϶/ϵR5䪯4x`9S @ Pd |%Ja,"pE% c=fp~駰1zM>}]C  A}xδ @(n5믿V\*\T)馛ᄈkƢ ! @` N/񊒄_~eoڬY3W/H2-#A @)LCA>R$h>wZlb @ %0c kݺu.\Uxq;o{ʗ/_up@@hٲx㍮sZ~muYvmrUOk"  @@N,X jyAR)@iNjغu 4͔mɒ%Ŋ38̙B%h"5*@$_d @ }5CJB"RE|Qd!}f߲,EH=cf;s|׫}LYsݗ/_PtV#eb@۷˗OUF͙qۭ*WVM_t y$,,,nA8@@l-pa3 -$3ioPr05nXΜ9c*ܫe˖Z& @-X>((`8* F@@@JG ̚5Keƍ|vkh  dIbd~O? p*fs}饗G+   [> ,h5y6L4/M D-Sbm*T{ /G@c{m@@@|k׮bK>?^:$@ k&]tS{^UERJ%+WiK,qZE}_ @@.p _4m ~{¦H"Rn]9vo-;wuW_5i  J j6@@@")TTINφ $]{cR   @TT̞=[^x>| BBBd…m6)TPA8 q(VtY_w} g+Wc_zUjԨ!6@@@qCsB6{ xoQҰaCyef$y%K޽{|f? @@ &?N,i;(   `JťQFre=k~w޺nݺum"4@HTm?3)yI\tc.<<\L~eg'  ڲef5y6L=ׯB Iƍŋ@iٲ:uJ/iҤq`@|Z͛z~굅 :VF|˗O֬YcT\Y=*ݻw$I4@@)SiӦv*yưaäL2:\5\  Pw3fB3?TKŊȑ#hjɓ'SO=e@@*`UO. z@@Ν;pҭ[7{s֬Yeҥ: ?{p` x@rt35VYhV6lUdѢEcn߾]d  ^-`,Y2 0 xpC" `TPyWdӦMf믿.+Wʋ/h@@%`%ާMVz.  ץYfRT)T]رcRfM'@@F)Ydu)S&YxYFzjg'  x+W)7щC+#ljA ݻ' ^xAf͚%QQQ gΜ~Ac7 ,{n)Qԯ__Ν;g(ڵSNe$IL @]t| q   PjM&כUǏK۶mʜ@@C)^|J*ɑ#Gd!C  j7o.Y^-{Ɔ  QR\9iѢܺuKd͚U֬Y#-~ڎ,@Ȓ%5C}XXyІZgҥ3`  N@UU.\X٣uY>,K F@njiӦi2Ν[fΜibvA~G  ݻwRHa4+WF} 9ZɓzzŋIJϞ=RN@@~W $ ZjI۶mu\Ž1@@#GvTcǎD|wD@@@Blx߀֭['/N"ȑCV^-_ݶm :T+a\ 7 JJ&MdбcGqH@CXhNZG/e޼y ȥ   Txgz0K5rri= Oѣz؈  ze~dddr@@UVZl23P9t萼f @ZѼf͚?]:#w2eUVrI  ̄H7nck&oQK͛WVXa]lY9| O'8-6@@@sdK{Ϲ/9S";w,'4h9sCɟ?5 K.4@@@&Mb  >D]ի'+Wg!&O\>3ٷo-Z͘@@8 8&[/T0LJq   TB Ɏ;tM޽ᅲ+)E\QcH!  (>-U9T^:tH/CfL  %S1cƘvAܹc; ̛7O(zҫ;+>q@@@ {U1#FDω-@}bOZoɒ?~ٸqנA9v^줁 cU}3@@|H`ŊRP!ٽ{UPP7N/_.ҥ2@H,ڵkmsI]2zKwc|ׯ$    dɒE{%@⽽_~2eH֭%,,L/$$D֭['s1U_}nL@W^5VUYI @@@K5͛zTj^a2 @I&$*.J/V?Kǎ]A@@@}VISzh=0"## m۶y+Fw)@@pxX^nbC@@}X>22ҋfP@@@.]$eʔ?LA,X죁 Z\rRvm!}qYӦMgyF_~L8e}@@\'Su{oc60}tA:$o E2  𗀕xWRG $   ;wW^yEԣڒ%K&3f̐9sPL%1n}" 5ʼQ93ʬYD}]ʱc\A@@@uV{]gmI;foRR%iܾ֬}[<{uV;v$OFL@x̤L2$Ib$    Fɓ'Jڞ{9ٱc4n؍+@@!!!ҳgO3""Bڶm|Ҿ}{Vy{   R@~]xJiMw/یv?~o̜UÇ74h  v{Ԗ9sfCx9  A@%J֭!pٲee@  @Ν[}vꫯbW +&}DFF}eʔÇK:uPB@A 6IC   Uߗ.]HDDUreٻwϟ?A@p@9[nU,}.RR:w\I1I& PnjcVqji8Ѯ];Q+ٳz '&   8YNpd8{ơo߾] *$_~۶me߾}zI@@UW[- @@@}ɒ%:\ld׮]RJg'  v{Oʖ-_dر.Z%h̙*U*ԩS.   oMxӷs&,.\)S&YvL0AT%6@@ \|\SOv$ILѣGM@@HѣE%0Ŋ={Hk@@DPzecʞ= >oڴܾ}<  !n☇avҰŋu~JWJWWTɽ7@@/Ԓfӧ73sxOa  P+Zh!DFF(Փ[J̙@@(P4o\l@IDATH%.\˖-}={Vt  qx(((ȴi[{{^-;/u_* lРAO?@ec{5_{7l@@@57oޔ *ȴiL}J%Kf@@]`.]:=YfɁ\6%???1cNZ^k@@@sx9“FB' JرTZU]gsɶmۤgϞϟn  Vr9K,gT O@@@ NbŊ͛U*^%ܫM@@_CU~:t)f˖MFahڴ4@@@ q R>q'N' ˹sTR2n835jȡCDf @@ {xXs%  vP'Nh̙3֭[^zvfa  mڴSR\~]&gΜk.iժώ# 'ᅴA⽿T7L4@@@ j%SUުTbE9olbq5  /PR%Pٳgeȑ.Te(iڴ˓]:!#  #}dzL#$t钼2tPQz~]3i! 8K?U+78   ݻw;y7o.WԩS愙  1cgÆ B(\ڵŋ'N'(#  @$*+H;HغuN߶m%mڴ4*E@|_I֯x @@ 5Tfm}SJ@@G@@6/!-,,LҹULg̘!I&*tiG@@ Z91_Q;xo9>\ʗ/o~"*SN.ꑰ  תּ$[b<"  ޽+ժUٳg*kTY}@@V4i9O>];͛WzP6iD|ץG@@ FNJ$He$v;gjՒnݺIDDZB{k;D@@.]deɒŴx l   v횔-[V֭[A%K&K,-[ ^ SLҽ{wO\nu?رc]'   -{m'@ny&| ydٲe:_/f2f̘\  k~͜3Ϙհ~mME$KG@@p8{{n;]taQi@@[ tQj[flݺեs/B*Dj۷9sF  WH;\jNS_Ĭ^ZW l  x,C Rs*ޓxO#  #GD MwRtip@@'O. 2{t"QQQ+EvwޕVZb"  x &ަ7>.ӎ^zI֭[ Ⱦ}rq Ź  Nt钎jU񍠓&   xJ/UXhߋ̗ @@ 4… $'QV˂ @@@IVƓ x8A3yTTIl~_^=$gΜ   qܻwO_]=gU  ƍB i+VLv!=/O!  P9ٳܿfC@@ ΂LHqǏ^{M6lؠS[GJRHD@pUR5kvd%;'@@l!zjZ*yfɘ1-$@@-[֬97n\BZڭf͚]>X]I   | *;x wsXn?2eM6%=  @ \x ֛Gsi   =.],_6@@p]o=xwcV.]Z͛Ie,7oB"  p2'k֬ eUT?T@@@^&Mf͚UdM6_?_ /" 3BBBDR۽{d Xɓ8ǞN@@pcC*;# A'ꫯ޽{uTRɲeˤO>@@{ҥaÆX^i   \ *G7!7kflYܽ{W_T)ٳg(P Vs  @XڽZfq>@@|[gϞz%Sk*9kS@@$ЩS'xb9x"G&]tV6vډcNk?   {ΉNox|ΆqJ@Yf'4h 6mX$@@x\rEw  F{@@@TUhomG=zXOyD@p@ʔ)M(R.]Z @@\#CW*޻xw-cyTPAOGs!\ I… m~xɆ  +Я_?qS{o*ŋ͛7%K& ,޽{+! _Ә+ޓxoh   s*٪f^&MVZ4@@\# 9s ֭[IݹsGt @@ XU ~$O`Ϟ=RX19~q̙e˖-Rn]0M@@7x+lP`   >쳿V?~`ɔ)k…n   "`ZPCn {ƚ5kL2rM|dݺ+%6  }h;p|Gh8  =ZzaƯk<  z۷ȱmv.]:2d^FDD4@@@ V{G% xw :u{r]}JߵkdϞ Wr@@CBB2g$G@@R`ڴi>\:ud@@p@ڵ%C] yƍhѢ#GȔ)S/   `ǭv;^mH^e˖ՓKڴi~nL@@lqm-fW3  / ̟?_Zje4p@ڵyN@@U^;aVoܸ  >,`9$އorUX@@Wf͚R`A=ݻw˺u2_]>C׵kפnN@@U> e >Pr۷r2g=d+'ʰa/ݽe.@@gΜ;{_9&SߎA@@6n(X?mݺx@@_PUUywmC)S>s9q℻@@|Z,1§'b%@}+W[o%~peҥҦMD@Q@-~hٳ$Isz3hv@@@F=n*†  9)RDh߾}_epYfT?-   .`ZPtG}ܼ)@⽗Vpҥŋz&/ܹS#  o UI$Ib*֛A  xիW?\pAU%pXB<~ @@^lڮnԫWSfΜ.  O XBɑxg2Ϲ`ojGEՕ%}DdC@@ XH9_/W^z7,X ݻw [l3z6  e>|D@@P?]۷Og7Jpp  D+'~9ΪŋZj/_,#G4㠁  qx77_?{/_||b%P/a֮]K#/ @ٳg*gR7~/   x@˖-uu{5ˆ 1@@ ԩSGrʥO޴iٳ'v:ᬡCUeĈ@@@ V_>+@⽗qI%22R\} pB 0\@@ XUҍ/_xWiG@@ q/3fН'MTVZ%K+  @TbNzUܹ#}5㠁  }tf:v2D:vhFڵkW]d؏  lܸQZha6j(]yN@@$I"TŽ*-88T܏o  P-00j򈀐x xdСf#Gd98A@c}Μ98iQޒ@@8zN-ԩ@@_iӦ9sf=%Kӧ6)g3V\)wv[t  Xתyxwӹ'޹Nh޼?^U OcC0@@_ cxXÇZ   9T\YnݺUF Q@@|C yО9fMLݷo__=L  ,xzU}hhL>]P;k,iٲa! R?ĮxD.N@@@ߗUٳgu̝߯;WT6@@PLROh̙r Mqƒ;wn֭[ou[t  7 Z- w5j$sѣK$,\P6l聣eH  pLk{q@@ DEEG}$wի%E™  ^!!CQ jsL2mV B4(  ,Xv{W2 UHm*~ɒ%RV-)A@p 4iX}̆  `/}\7m$'Np+cc2[Bg  xk倀-sG_mڴ/RUI.]*+VY}Zϟ @@o R⌑{78P {ӧK< C@YԒjKczt'  >!!~z>%KQFܘ  @ڶmkL4ɴիJ/DFF4@@@@YfCpѣO>'Z-#dž  @t'O4xO{CH@@D-[辞yYd8JA   (P@J.O?׎o!eʔݩϠ/^쮮@@pq*͆%@%/RtbzQIZ2i   8>@@'   x_At$G'ǎ+JXXg̘!~~~   vPK ߾}[O7o޼q6q&@@%j*?~6iҤdI6mbq  }BBB?ӧ%[n|ذaM@@; xoI'^GϞ=+˗k׮˔)#-x"@@{ Of IV`2h   f7nl7N .l@@@ &MӧO7mw5j֬)j&mܸQ<议@@p\{e`$;뢖cxꫯv!  ˗jz k8@@b/!|υVV-iѢEp&  V*2e+V0- vt7|pӦ  ]xo;yxdXq}Qo?ɓ'|7:uXD@@,Txo  s $۷oAe&_|s;   $ID6l>˝7oܨQ#yꩧtK,_cC@@{9B@@ >VYJ4iªxk@@??~I%#   X'>,ljݺLR/͛鈨  x^pi$;~С2i$I-|r)T"@@\zUO?>ՅVÇ%**ʮ@@ iFΝ;)SFz>  `/F ϛ7ϴP7ܹ#ӦMsW  8XyP x@sʧ~fΜ)ʕK`T.G@#G AM;. sL  _`ѢE2|@%'͞=[=\  j׮m,XN:׶'NG{B@@cx1· %[l&MZ^ @@ 8&,X0^ᬊx"@@K… ҪU+?  P?\˲yurw}W_yYticq!  ,@7=׎x?~\j֬)>ڶm+ݺug4.C@@ X>sL},8 @@h}ܸqCQ~}W^4g@@ 87o^8N:(cƌ1m  I{;͕y鳯^i~MJ*2nܸxD@@/`%K|3H74@@nVAUr?iҤx"@@PӧO\R߿ݩ.[oI…u={ݻ]@@T=$H=P KժU_U_p.X@TB  Po=C̙SRHT!  /gJ~???={K_@@b*իW!n߾-6lHHx_ۡCs)SL  vpLW !` -nI144TvڥΚ5^ZRL˫9 @@' y޽{WX@'_ќn@@x@-$,,Leʔy%G@@ ^u1-^شPc*/ZHn޼ @@D2c0$ϠO>D%ۯYFT=  8r {r  ]`֬YhHH >ARb]Y  $@v+W;W^yEww^9y;/@@UDIɭ Z:<*#  SJ%rw {lq!  6Xf,_\:s2vX 0]@@([IFw^FDD$P>M  .@⽯Ϗ߿/\tI[ocC  $L@Uΐ!yN@@W $IĬt5ٹs+6/Vph  &e xíl֬%Ԗ#GYtp@@HCL… v|U  N`r)}*Rn]Y  8IZj&ҪUL۝{'E>|!dA *Q2Qӫ(b>L;é`,<g()`" AI¾]յ333=|NS<]]zNϗ9sdzB@@ kx5WL}Stw˳>lVuԉ7@@F/ 2=V2  $X|vm>ʕ) ؈  G-:7x#j->&Md@@g얬o{뭷ku#"ƍ'ڵ'@@V૯ <|:+zxQA@@ W_-7ov:t( 'b#  @X5k֔=z8ϛ7O,YVU 5gޟ8qb}و  @x]8b^,X vw|bm"   4ߺu]R%۷{y2   [`ԩ;֭+rKY  @o{Lfgq_O? @@Y4~Æ ȰaÌ="  o&:smzNF3U8@@"3]ve^wov]L@@L oV;cz   M{㌟:k4iر#"    ̚5Kv T u|7xJ  @l˗_~lb  h߾ԯ_iɓJs;xy2   @i g_|YQ+Rjv=_@@, |g^tO7Ìq  @i`ͧ1Bʖv_@@ }qqF/nݺQhzDg'!  Qo oꪫ3܏7N7o^  E3s%nIʕ2ޣ   @}={sF";@@ va^m:}6Rw^f[I  7-YJ}ʕ+e#ٮ:9K  !LڵK!f֭[YB@@G@oR[< 힄  @Tz5%[?k@@]@'&! ;v',?qGʭ  @1sk߾TXukw%xE@@/裏ʲe˜wtݿK  dQ`}ǛT0M'C{WW@@(m:ꫯv0Փ Rl&)m?E@"#矋Ν;.fB@@X@o>|Clo5@@\pg߼y̞=;+Ч֮]۩{ʔ)Yi "  Y(Q׿wu& &H:ut@@ L>#ҥ/I ߶m[IX@@Rk:};DH  DM駟zLfʔ)#rS=wLVO]   @$Je%KsN}':u   iiӦyUv˗$7i֭nW@@(ЛSaM:aÜ<   5]zMV6Lk@@@ J];SN;v%O3C@xmѢE 5g'>R A@#qɊ+_ZlG+  $ЦMVӥl7i3}A@@(u\s̘1qi֬<@@PLVr/.A$3^g$!  v%w}qzy2  DM\rrA9Zplܸ1+M6h[4etJ@@@BRx{tpJ䥗^5jp!   Usfnݺ3c @@<0a,XG1A  @ tYAA̚5++ZfϞ-[VA   @JMҥKsG)pL@@l |'^AWX+{   rwx vQA@@}W^>ә.]8UܹSfΜ@@Ȫ@?N?tY~}'СC O  SNue˖ݻKZL'=iڶm[ˣ@@A>/JΝχn@@<05x_   AT~"ڴiS=zti8@@ 6m=]vRF@[]re8޹3x8-" %K^sZިQ#߿&# F+N4i޼yY#Й魚ib@@Ȓ@^oٲE ${7J׮]DM  :uG^>;mۂ*r@@YG}TvСތ9!  P5kw/dUV͛;u72Yi "  nAϟv] R  Lƌn=3{d@@JeرNP.t@@ W{m… ֍:8u΋-Z;@@ȴ@̡ҸqA4x ! Id͚5NwNk]X3WTɫc֭^   IgwAW@@<_כUVyLgf *8պ"f ԇ  dC "/Rˋ/X:v WD@@ ?OFI& Ow;O}  ƍs3y晹ڏ  PJի'l֭˚7mԩ…MYk#  ȫW_}UG>b͝>CT  @ӦMnݻwǥxm۶Tg@@r^૯s:'M>9':  P:ʗ//ժUs:{mzI'F\|@@@ &^t}IE^@@|Ag*UɌ@@R$0~xz'  @. ԨQi|7^`@@@L M=#K.u#̔!   @ O4q  @ʕO<1zD@@Jx{[hᝆ{y2  @ٲWڵ+D(P9Y-frw;mPt>$dz*0,X@x իˍ7ޘ&P  ) A=}MTw6T  T ?cKZ#  u7}V5j$wGu@@ ,3Rrs~뮻NtF"MW]u瞹y&h5  @p+T {ߕ+Wg{   @)Xf̘1iqZH+;  @׮]eܹ`Ŋr{-tdɒ@@ZE󧼜6mL09ח+2 =A@KEhӟ$ժU އJM  }p~jYFe'@@0l͛7;v6bsׯ_/6l5kF6!  )s ြ(˽t7KժUE^@@o+42ާ!  y!{8#<@@rY`ƍNwmwc}@@<0oݵkW.%|GC- ʄr@@M7>ꨣ|X3~֭aUC  DN`N*W,=z\h  uI@1.]h  @6Ϧ~[nœ\r2@@(vomԨt!fjlfyE@@ VZ%-rعsg1/9@@U6lnݺY{d@@u2ex](((d(SNw"3nf@@R&ȶmۜ^s19=!@@|^+?yd/^,~aIX@@ wylU&ՋS3n2@@\`\=s;'Oꫯs^  ^{x.e# DU`ڴi^ӂ %  xl2I&^>[3l[C  %@}PWN\7|#o˹瞛k]  P`׮]ꫯ:=`޽{gD @@( 3g٩S'/O@@\?3wj  @2e^xy2Tw}_WTg@@ |駲zj}v-#m\Wϖ-[<@@Y S4l08Pz  @n >\kY6hg+SZ5YlذAY^@@0> (3W\)/#_\xq  @ L4 'Θ3x6# DA`%kj߾}(M֭wyM   =:u•VZD z޻'q   y#Y9G%;vp jժi!  d^`ĉNʕ;.c >cT  s͛GU4@@ l߾] ;JјgqrڴyfٴiS:  DDL2^K <r&~۶m;gB 2tP  9!W_ɢEr!OoT2nݚj@@ M6Z;@@ O.SMvd%* B~  DEr&׎ eՎI'$2   0~x #~).  @> ,YV&M<@@rY?Gzlg+Wf9ԏ  @ ˜L;۽/8/OB@O7^0ӛH3 Ϥ3  @N|WpBz_Bd:!@@l [kBݺu<@@rU`޼y2k,{UF+gG@@ 34'=zg>d/O@@ <^3{M[ndԅ  @V:ud T  @}* m   +`3}y\w)=_R%9묳L+@@?^x_˗dn=3gJ@@2,}vƊ+zy2  m't3?R02E}N A@(%CGZiq'k׎zi  )SdNO>{dEJ*~z!>+T  EreԪwYp4{キ4nXUZA@ 4t~6m$-ZMec p"%Q.Wv5>J{ڵQjmA@@ m2exxy2D>|dڠA8c  䌀gvk&v @@ KQB?|PΝ+- SzcN8A8qs=\9s֫>y/;by}իKf͜  zmT$%Yg߼y0}A@HWtQ~i:7}m  K@gܸqn5ʕ+;u3}N# dPN:^mׯQyҮ]6׬Y^[YKtpruFڷ.=Oݽ~mW-Ϙ1÷rѲôNwk=ݛm;C>su9s uꩧ:Oaӯʭo[g/76drfú_{27^ov.KMo|jrg_fMTH@@HI|~&FBH<W^Bzل  @3k>n< ߹s$@@W=ڲeˤ}r3/R58wޢ3}k/~h7|5 ^;Wjܸw|2Io 0… eӦM*iժO :+Dgڵ%\":tBc XzuwwuoxaVc!,hPi&_|t}JĐ!CqCgqW|h^**U7lr9ׁ|:~^eu*mmd̙ҹsgwU xe'L\a؛3^]tO:tn:JXtR'ǐ@@fχN"x[N4p5VzwY%ֱC@_~_SwCJ;J{]߄{WW@@|hѢ׭s1-g3As -[#F86 9_8߱cGcKѬlצM={vS\cO:Uv}w_IH˰a|<9L ^Z5sU \0m|a[n7xW:qD1723^r=n>Ln۶{(Y{ zUB^HadR sm{3qFécܸqOUմ^{y3߇S[K]SބM%@@G@odvNrHBl*d>h1/b?ߓ@@05jd.f4Ox_ہ5m*kժfP'  \7tUoݹ-Ggի箊zQGXWvAͶAfҶA]gӧt͙|ɒ%av Ureٺu K{3kཝ캃rz´> ~Z@NoHN}jQd޼y*?^J]g'>uxbYfyy3l14/6WyyZб=fk&1ƾ{´pra^ߠJ .ps5vXqۃ#rm26P  A /Gxu|Ye@٨6_vqyy2  DY@gr3f *2m7&lْ&P'  YVfDiP4_WApu'KVU1_@Ġ? 8 fJ :tΟ?wべў^g/.-_LZgr6mSC:ѓO>3^Л* N'F3gm.=;_w+G::!Ԃ xɾzū/3\b9oXף}MbH&~I%+cҥK!O_veҷoߒ_|!`އ\#  9Y83އΝSqKFĚbJ!Cɟ  dJ`ܹҵkLUrڵζN8y p3 2X3U!  yLW^o*'oQ| 7ol;v"nyiNP=c<۱ޛ'xI+E5L$l#fVZU䦅Jq׋dDi&_ w}}h/"{챇>s7 xuUTOהּ_֭;H:zE4smѣI?|o" { z {|aR+d[{s?^o=?#(򄚒]m> Ig'!  xg0G2^gqWڥKCVJQqQ2  @U͠n_f'{WW@@|ׯx}|eĈY_]v M t/.:z5L+WӸqc\o<Ϋ瞾u '3K.)s&[~r1t :Cfҙt&|3yNvmVz!nྲྀcƌctV\. C^>|3j㏗+Յ߰L/_ z{0ްd8j|G݌/N0A\H z @@\`\??2՗TC<   _O6ijVىnfY   8SбcNJf3,A?k֬Yt R-#{=:`O}}8ߣ ƚ5kzg6A@@ ̧<=J1c*wP}l~IB@@ ˖-;}sdl~oE]4@@0:?1Bt}'*ݱc"~aywEo=Ĝ%IYf%qw^zUbϺ\lhu)Ȗ-[7n,^zlg4h[(^/_3O]{޲ EɄݟ.Eׯ_uV6 .[{m :t]WN2A]:3w}_]V-'\og:KE G&&}rȸq|=zM%\"gu EM'x3e\k>E@@9=ExJal+:t;[JgM϶xTc@@ eQyBȑ#eǎ\Ax"e  @vsϕѣGkp/Nv 'ȤI|U]t\yLl L%ZJVX;dԨQ?ɦO>Y^z"A?˧'|ҙ뮻dj6e]WI&*/V 3e'kIh"~{o]b x׍ i/Fg6SToT1oީK. .f͚yMd]#iѢ >\n6yPF39ݻ;zaa^5=+Mg/cHaÆ97c4i@(zUWqeL3L%  0ό2@N|̮]cy3V(! dU@Cxn:ŨTR™f~͌8ԉ  -;әU~O?ԙ]gFO>4ٶmkOʕtX35ǹy;@]ʫNc' 7glܸU,Xlڴ[2eȽ6X ޿[7xGk_lgrz2ecv`{M{/^},w;0vʕ:=SW߫+V5)VپXuav٭Z}?jtw7nބ?{lw+FO7۷/ȋ/O>ȑ:_.gqo_E qEX}ͤӅXctXDŽ=ƺco/#w*?OoTܼyWzAŌx7@@uMxJ\0?aSDI3@@tF7˒>;nw@3f-[2\;!  =9^gq?Ce2qD9gufa71{Jl031Ʋa L^N8O ?[ 7[rz2ec$Gn9m۶u _ܼ͛bԳgOsކ$2=z#GJΝcmԵeZ~7h2gy9s@8_VA&}2P4|pg W_}w3_8OFkL/zed&ebTz؛Vjp>@I&ɏ?;J*r5\#um>sLv@@WAV' ! D.~nTFSOFq$  d[@Rp,wiI&MMT~2M޻" &c9 ~f˗ˀDgym0a7 LϋΒs[45oI'oѢE2d', pڜ}վ{L30r3e%UV)&>w3}DΞL:zӇk^_zc.'N4]++VXZ0Kԗ |MEyeĻ!NFۏ>hG.̹ 'Y[{7%Mے7놱7ixO6bƍnҰaC{ysastEjռ꿷   9"u] ^UlQ{tի;yA@@ E}4M "%~2}  k}qf6gY?|+K.uby; K/T>"s{lŋ}8r vPW\JAt7 L3s2t93goe:O0;7i۶m,{ zƵ.]LU'K;dнݡa^5Ǚˤj([?oeL#G9<ឧxEe&^S]o~IA1y>֌Oώ- +Sú3=0f {0coV_|E&CP'{[uQO]2?uWY_شiSv~! "XRD@WD*~ʕއzw8 @@ C9GGu{m>  @i8N0c= wm4hH4e2xL2,f0l25al5r̙3Egy5S}QyC_'M$gqYDܼ)YFƌ;No(.fڦ&]-ͤ3&t{,Ugv"eukc]I _'iԩNpAKz .7wo`/۰_5#젮um]vvgrN7K荏e˖u~Ч>G]cuΗtҤ?@@u3^FJBTv9z d@@'|"@IghS/Y @@J>#>`L\ʯWl֭J*uB2Ak~Wu&W >K}A9묳<.L޵k?uzk9ȶM̲s-&Lc:O Gof:Ý`N8 \ukoXc\aa]VQ{w@6mȜ9sDy3sA-|7@@U,Tm>Wb8N)y8u-|e͚5@@%_ ]zWچaÆEQ3~˖-٢^@@HR uw̫mfM'#wSmۋ&m5:4~̘1vZouet:3moذ+Vc-1W/_^ kW\-[̷-޵)0}fkLA,3ѣG;O'Ov:g|a9t}Jf z^ᾆ9{)=i@ Ls@@ G$ei 7g(n,XQ%  2j(/ uR*TGh;>g! 䋀>~nUVԥ#G;;栃- :3lx>5Pjܹݒ (Xva^ur{e W 3ipo23mɆiP=%KdѢEq@k;\5k{n)Q ځԮ][-{{d'1Q^Vm:(8q;|piҤ[֖ú10f2 seɷ73We8ZzOB@@ t MY W Rl ̚5bD;7o<ٶm+ _|o83^_*@ "EHvŏ?vuQ}R4zh  @ | FNE{kƷ_۶mss`jժIiΞ=ȗIWoslN v{h™I[ V ]MiSǎEov~n|mO>DNWZ12U[1_2J_yAgPˑ?Rnݸ]-_~om|Y:tL>=Cc]vYo3gΌ-ٕguV:k>VL'|\{"#xtP+ |(m (]tQ@V̔)S' & C?hӦ%J߾}*OwnI~IӴiSiٲgDdžǘq$۲'_\z/1&~ sͥ%9勵Omܸѩ3,2c[|@@p;w-=8gjY… ED>`V3U^]^~帟ulڴI .&{83A*Ur>N@;~?\4`9Qs=E#f<8{rg&[*4h O?6vXoE_gz܏==?쳢)^+#z젮u.;Q|͚5oz[ҙݎ93 ( T$s@ȴ+VC&O,Z^x!m& 6ݞ *q QYjU-ɯזEɯ|Aq5={/[9sE7`@IDAT(Jt=z8ef G;ٳTA}ҙ@LTǘq$3.'ϥcoc0\^Wz4tID=cs)UZi͛sٴ@@Xtimӧ3K>3^Ԭ-=Y_ux_uUI?i3Lmxl⢥ApbLҿ%Ǎ'%%]#̔uckXt"h>LL"?kƍnݺa,K,Y|uB N; mti۶YowNvv 9sfk@ ݝW~(q֭skܮ󟩤'._|᫲p)E 3ޓW^yŷ>K/}Dtd/ڷe1okW^Eq ꚱu+k{{Wzsk՞5zX_h:emTތ @@8q|GR8k\qh t[o={0l.Gfonx{ gv&(|ʦ.V&VoLRDX\V-Msk[Th܀n-[\b][daS|j~W(?RPU6Rsy߫{  w=s$@@ A|^Ps ?Ě4i" . d3f z)iӦMjJ D/}𪳪*fJ_q?OEc:gtGbܹsŤ^@>5={vR]>!Ŋ7o,tMު޻c3[7v!~l[H?y|\R~i'@Wlw)] /_Mwu{k>%^^=9 rˎڿoG^cJPx r P@@H _~#<"su ,|LM6u> Q\@IiիScImΌog.dcy;<_7hתUKpC'yI6ga]a޽{n&&~ü50&١ 0}I9@@ jx3D*^) t},~ă *2ӽxn:L>l뺠ﵬXKu-.#6e}@/\qjp~l Oɶ!~: SNonfv\r5r;$xE~1:ۛ7,VRXvfa^/f=`oj_ޫK.+]oP1_|c-YtdN.<>Ŭ'3<#=S>矗5kYehe7o&>4i F@@~vQ h5k?*͢*('$$DNȝ  PBw{KgZu5Q l}uݛӧtI*_\Yu0Nceޤ`Xu/ٖ>>-Æ s얥O>3^fҙb]v̙3}Ջ ^;v.qdzq۷l7ȷRi{,=ܖO>DxH~n@@@@@ xsB@@J&4jY9:W"7}~kq<ц\pA$l[}mG>SۘB5z͚5`۹p~kVZ`cAǵVTIz%:S& _nHf0'k[xY͔qaWZk&[׋s[dr9/_ZX|s{{zzn@v '>uCYg%\N٣   sI8qOIWn./iyco>E%t6h   @eD.}{;oXB4hu~4l0$X3Edk׮kO?c?v;t;6} NoP׌L]/vyfYr >\F!Gq/+VRS㶅7.{4_{ r}{U<~}oYfϞ Lp=_&^ݞ->ٲo̘1b;u$ݻwטŝ\oEbo\tnv\o.ufz)ЧG{OGGmcoc_^S^=۶A]v_/%ۺtRݻ_&N37,%{A؆     @q{7+  "@}̶3r3k,v<}}СC~1j7md袋|%]9sڵWL؁gSB;w,:KkxoײeKm݌g4Jc/tgq:kz3gpO朮YF^ugϞew!c*7K6e{[ݺuc6A=y1NX7J, C+{CǺXfd[^=;Ao:e's*7K2mKg Rg_lsx&Mߗw="w ;%4@@tRvډNHFJuҝ0@ @{vFhO O&>&G@Pb D2Ar?,:%\"/rgd=}Z$`dhըQCt60]g:Av6k֬]zuo쯏|5Q5~ܹζ>̷.mJ&p,Ǜe㏋ٯ_"bX~o&]lч^sCvZ_qdzu:b ]wP?vX7n,_H g:,'m۶E X%?݉J5c0dg4ѓ'OȺuw_aÆI   Pjw|^j`( co]*o^* 4  @~ ګ;vxKz@$7|}8l]/E:Ý{A&MYL:>Oݝ0:DyD:"^*c0|^;۪7$-M6 O|:@@@@xό:7@@ =sNwx 5_~س{C|駾pƒ;_H`ͱ)n]bbݪU+\o׮]}̘1[ֻfϞ-k&Z >w` ˱U76 Xr3}'z^}Q_b>J!Vd_c]3v^msӧW^xs7%:{R~}ѧ/}zeM,k_5J>uNc6JKVere]KF| WSF8@@@@@ 9a3c/@@h jl* ڸsN4h,_\Pg׺d0=Pws G~+m `s=aÆ)lYg@_3x>}~N1}ė)SHxuvjԨ!M6u7guɒ%l2_LkA0w\͛uvuᄏ$'=<5%u6]¼^ms{_6U\xΏgtgy 7'Oԩ\pL>a{{Oi{l㘮 j}TSzSO=NOp>]Io,ӱ4SjռnEH     %@PRP  {vdW QE{lܸ ڵk\{< []?ձKz|J3wØ%-?v^:v۷O<1Vuqu-6lCnnӠy L6فhQHLڦm&մy}ӷ _ѣ9R:ww/L]/q;†N:ItRfdIO;e;8A-/K/4cO}{zs o-nԖ4^aÆɬY&ܹ[fÓJ@@@@@AIwi"@@@ %w\;79"x_lYg:uw-047h j*_aqUT 3Afreh7ޘq27ۧ.'Ny\ ܐ`h־d?_[fXOn;(΂ΜARL6[~Mƛ SS\99裝ue]&>lCBf_~|{/cOi{3{)7߮׮^Z^|EyGEoF34C;YgfM E@@@@C%@@ ;n)t?n u?_V\);wgy׭iӦA$M4իfߡ{o9;No* ذ҆ dѢES r\~,^De6̙m[oЙԵkW/~۶mΌ]t;0{ ;wY[;y5k&"Lļ{dŊbqqQFk֪UWNl]/z}R>H7NO?]佐n_.K}3oKw[&M78?N:UIf߷.۷:f͛t@@@@@ :Q ԕ@@ ^s"Ƽ`{_伎=ZG$WVM4PlwvHk}\ۗJx:U fPjvj+Lxoӧ;7]h̔Jf͚Бqaw=jƄ>ȷ!vOc3ghŋӮL23$y; bŊҶm[ws(ve$k.9s6g1 {/|; aɨDY CEg5?p au8{ybH{8?)z=ܓ{dM|U{)$Lmkc&L0ʎث2i$$7k֌{OCDo1Vyc Y@@@@@0'۹sgZep  Qx^7xJWa-ZOeÆ u%YZn-曵$e:v˖-)^`׀ow&Yw}:+ 2ƌc%KWo .4lWۊ+|˱F!&cȐ!޲Yv,[]t^Sc!k&[K.FrѣEpOtR ]/”6XZGr2t*U*xoX*^+Xr|ZͺvZ"fUu`+ohCWY*ΩL^_a+W4ކ e]a\~,t߼zͽ7|,WW9'~ Sڬ s1/z@@TPrYf:G@V ! κN}q@@ O|R3Dmذa&:ˮG+_` e"WP\twh[F&d$XX1ZjECh2 >sL[݃Ȋey\v`uyn{Q.^ ]hn:MK(aO{2eI'msNgB۝[lQ*UۻGʕѝ{oxdY N{rA<~ Sڬ m[n ;0+u?  ,Ϛ@@S +4 F  $xrgbݻ,ޮz5Xv+ZjFl+_~iSN5ejٲuZhaz/$B*g)?vU57D`mVx@@@@@x 3x/UA@KR?(<`'NM6[AzdT"ǧHݻM0!M7|Ȩ1E%G(†[v3 /VkpwmyK½7UKڽWW8 кu>RHRxq?jDW# %`4d~i#@@@ 7xWW" Sxj&O]Gq-Z죏>R@ЀkspujˁlŊY.m׮]i,Q?dv\$_3KV5kִG}Y2+sY :~Ϟ=wߥ*ϩL^_@k-̸y{$R{uusl? ʎ^u(}%S"  Rln)g:  @ wU   . ?tPwI`IjUfϷѣG[ɒ%3oR[ouA7?q[V6Iرvޝ*ZÆ  kצٽB V|4B_{p+lbO94;=zؼyRJ[qQG ,Yq`=>X<.rNg9MT7/I`)٭@@@@@ * DxF@Hd`Ç+=dFhq֭[7]+W͛NpЕ+W6e/RH5GKҥ-RJ xiӦY[AYm]v9FLk֬ʽ@)<)r{M5@@/,f͊Ԉ @tfw^~H}B}r\Oz S~k@@@ dO KW@@@@@| @}>4@@ nǍ2*"}R]N:W+V:N߳gOԩSO @" pMīFZx~)X@@@ C o=q &0f۷onWPV\q;)K./^Sէ|G  C%~A\ #ݻ믿1;vXT$Dr;/ݛM  $Gi%JH>x@rC@33*ʎԌؖS ʩS xo: $@ѢExSB@@ޓ>E.:D@@@@rI\4  "PH<)@ 2eXڵ~GuP@{z hF}@@@@@bc9c@@o+?C}"UfK.M^|@ &Cx~C/     @v?#Uq<  y.@}_|ـU4 @@.@R!       $@0ICq    (@}^4       .PhQYHmS{@@(^۽{,        O @@@H2ާʕ   ~7{饗lѢE7خ]B v'%\b^z(Q"M֭[g>lu^-[ֺwn_}͚5߭e˖VF upg1 .T4h ~XL^{ L~'5*UΝ; .o ؀Ҵ?u]gkyӦMSO:tஓ"pB9s#SO=*Y-Bmlڴigv5kL=tދǏUVٚ5kc+Ygezy晡_ [0H?#YB?@@0y > @@HB%@@H(?nf[lYv+hSEi]f] VG}dzw7o͘1\m֭nU0^ Q #cǎqY[~ Νw}"t„ 6gΜRZoF:7t͛[rMumO3<*o֬=#a ٧O9r>|8]ۦLb~nV @\0"lGA@@ O+3'>g\@@|'luC_+!@@@ mfW\q_ޝTܮ=6xSN… +gacƌmwOk5C@r6l-[}kҤ}嗦}eᦇܪU+_31\Ҕ_ޗ:YF sMu;  '`=+m!>o9;  &P`A;m߾}?y9   ^wmCB 4$[o٨Quuipi+H>vڶxbw?;ln.<+V#aXYTl|aӟx kٲof{W^q5Xᢋ.J06kͨͬо}{wvi]v5{eϞ=T4CY5@lܸѽwOAbFD  3*dϟׇV! dM@(B'sA@@@ u+:K}\sz  C`ٮ!*TaÆ ]uU~wNzʔ)){]s5|r?x瞳kf|wg\L8cƌ۪^/Y%s(oiޗ ,HsZր z_nM/) @vﷺh l(^0swi?4G-.4h~8J=o@@d>SQ_O+>xGjA@@ !/I}B\.  I$zj]rr-.k/RtiA]u)x{61}t 4ҥ6oRJ^|ES&(*UO?ݝJ?Z=%K׳ d~fEѽSOu3dvigT3D L͚5o6lhO7ijժafʰco,s_p֠AﬦMwdX S^ Oy@@B xСȾ@~R  dCxW@@@PpUVҥKs=Sʕnr0a_>.o߾_On?q,(UU.b7hK/u?_rV9裭M6_ej:8*='O׳ d~_G5 }OmO%5_}Ǧ{Won-[tu޳;ud^{EuPr ؚ;wuYxb( È b  lm# Ft-A;@@@@ z%JGFd)R$@@@ fʕ+ZY8+E`cXC=c/[PA#G %˯˗/2,+~:v7et4t}yCۮ]zy_{gW^y[+yf+VZ`u:z-رŠ^z vر.`^ ͎QF LϏ>>s{"[:({ꫯv{Əuѣ{WQv~~7qDٳܹ駟F)+k@@dP{ t&>f|ͳeGZ@@rU`۶mzd;x~);/N+L@@@ 4ȦNjkZv\Fa?_tE.#}ڵ3m#RQeի )Sس>k߄ mƍ Դ,ߺu 6,xG/- >}x "T@x/+dxKUd6Oh"S7PCri@1cƸcƍgzָqckݺ]qnpE8@ cX w5{l>S}SJ۴i=cvwZ6D:ЯY\uw-O Xd_27A+֭=fU@`WGi>u]*yԨQnօ#F6o'z(V|KAz]j03mΨAUr 2ȡ#V@HZЀ _6lHm. _+f/>ӭjCux{ˡd5  @ ,C%zWhR2>NvT  @ x{&\i0   gy}嗦@ɓ'mٲe.[Ҍճ˗q]v5e}֢E '^z j Jp.;uԱŋiӦ6wܰۂ+z5#޽ W&a^}=Gk6;WpO~۽:ud sk׭[7Pl1i$wȰa\hw6D6xiAHH[pw +dӦMi k=  lQd'|OA@@ x  E\rֹsgkذ)û￟cͻ \п9Һw}vw|dE~ FJ{͖p嗻&icʐkLO0p7R ,h5r}p>hƋ*UDխM?ؘRY  @2>b|_;6@@q   k6of7e2>|pi( ǍyΝk^f2oܸ>Ө<49hnAs* Gp 7^_f~'l޼9lʪU{s1.^H *@'>T  *pG8p Q@,2z!S  &0sLwʕ+]j(+иqcׯ_|+Mڂٓ佥{   @b TXі/_كYc݋͛[ݺu>Gy$ ѣGMD]1cy m֬Y|~} B .tUfg}v⾮SNcٷ~Y( ~VvJbżE@ Jh%Ktgz\zu/?|5 dU?  @"x̎Apr)x_ǣ  @vrtXmRW4ۻwoR!  I`رV~}׮5kuԱ"E-n^kMZE!Cwq*S7ޘj J.]rKFh.]jڵG;_<{Ν;n־}4߅۷z9YN,~o0H>    .ޫz3&ς@|+  @09L   @om]v-Z+hSN1m{2+2p-@IDAT2p mڴ :ͺ֭[2Z*p/l9uT[n^ڔ]UX``+XBu˭;sqgׅ ˻l`h"۶m-[GYY޲C{]wuޮams؃ì?a 7 /fT6olwu :NkҤi`z!ԨQ~~r S;@ 3h ϣf}E+&Nh'xY[=X֭{챙6J2O6lp?O=5h %{92eε;;+`~F@@2(Z>EJ/d+܇)}< Q\r%x{~.Y؀@ 5k@ͩQRy{Og@@@ }]CE 5S#e2GڧYf6u>}93+]}vSfe`>m/+22\<}ee͛@TeյP`{(=[b]@i^G4eB٩{iw}^30xe֭.{}/t) uhwqn`ӼybŊnΝIVqXЌsq .… soٲ%gT }\i @0Qj P WQ0g( @@O2K;~nmų'ݻwo*h@@@\Lk.w\0^Aͽz\%hjYAzx%7x~Gk=t.K2uY{WMA졁޶pDž{Dx?dS}98;S}kez|kZ<._˺Vj^eײL6͖,Y|_*1Qk 3;w؟|)„ 믿YmϷf3Ѡ`b mS>vmds7Nw=zmzZbiաCŊ;vۭ_~.m /5B .,X@:xoJ>h7n=SY50Jkժ@'eϨ5Ȩ\˗/7 +[u'ft(p@@HE]!ާHSy@@Tf"}]}  A@UVuڀ\GݺuA| >=r9\xᅹ}ZΗ'E   -@@@0M OīF@@Ȇ7oLlr(   @x/@RKԺ@HE]%O ާ|76~x[jYƎ9XuYֲeK;3UK/ٷ~n}]wծ]۞yЖ*U:tnwꫯl֬Yn[ƍA~ C˔)cիWwO> ,owJ*YΝV(P eݺuφ=&teٲe{'Nڽ>S}Xe#Fݻw{uϺ.zOUZ֭k ̨C,y.ZܵkUPt/K3#ن@ 5jm\P!ѣG}X@"/^5F"6"    _ﵡe   >vd=d+FiNW)S_~;L0̙\qZj.-[)^zkoa֫W/R sɒ%MA;v ˲wgx?w\wϊ)׮]k:>rꩧF ]P֭[]UŊoт#Ђ\-gf6?ci&T5B;.\8?nf[lYm $VQh4<@ G}Ga޼y6cƌ4x/~+{*<'7_QGݠ     D@7{#E,xF@Hl`=1x}-zډ$$M@jeWv+W… +{@peȐ!o۔:^+{m۶mneYԩ6i$SV^|RFH}~gS#g*6+{7[¾}Lz?ܹ7C%E+pU5^3,|we 2_KZ:u@ i{upϞ='핦c     @>w9   @ xl+CҔXE7e7 ʕ Nb ei\Zj׮m/vi|`wqm޼-ƌjs|nݺE>1o[U`A ZY}vbmsʕmɒ%~7:dO>­+3~6msQ S}6tPSW4K[oeFVQ h J ŋw ;     @`wvg5   !xDH2X`>|3ptAPB}meXW,5jJA n9ck˗[J\u=˰ݺӧOwiڴ]~nyƌ1vU"EgϞ֥K\]e{Æ Kt Y᪫yc2eiXfOCAͱر#uP58vL=͂CA@@@@@ ;$ι9@@ }N&n'(zjl@5e/kΝW_[|ҥk׮^ *>|x"_j顢 ^ 6g}ե^wٲe{ Ȳ-b 6}8-Y-~y晦 ~oԪU-Z:͢rGLJ~h7prEY2e܌ Ton7p(QªVj͚5N:3( ?C}@@@@@*xO}V@@ 38p 6vͩW@Ž2ydo1מ{ÊGy$nm߾_ҥKD_Pf{\veW~mo1KyeʹƆ~@/5 _. ;#gʕ+M7j0a_>3kv统GeWXa^x jY?w؃>h?] sYcu1v5kqֶm[4H+{<#    *x_PX8@@@0m4&oțrVKnݺ.noueW^;ҷo߈C=SO=ծz8q?~ 9ݎY\Q|ya_~~!GgӧO曰+? fFnӲ4iڼO<8 No֦OZɊhbmsO6[Q~}[r{٪U+S=Xo@ {^z%;t=6rLkQwѽ|ԨQv7[_n`]wW_2Ӈt޼y,UT ؍7h[l1z2t4թlܸ ={VlYyEW^q+Ýu)(xgϞ     ~P,.@@rShѢxS)}| ڵ3Ɣxܸqq[ƍuvW ,c}{թ`J] aÆev+wA ,\pTE֭[Neq#R9ꨣo۶-Z fo޼)/t N:HF\U,m >RO?m&Mr9]vngРA6uT۷o]mׇX(rEݵkv^ R2e=֯_?ȞR߿֭k)}=lΝ6zh 9sy/7JYuO?ς+#̛2dͦL=+u%Z JFS)۹] /UTj\r.[19H'T-+k֬qm֕.]:Mfgow1E%xeޫ̘1#MP[?XfZ=wy/ːkpBzҥ@O>q^x6a\r=d{fyM]2*T;wn[n4hH۷Js 6xYUt?T`hQpu۶mmر.ۭL2:J(/| @@Z@  @PIɓ( '5   @=P0]6aeW eV߱cAٌoV>p*@: T޽{]* 4eJ&M\0Ca0OfXΫӧO7+gy`Pozl妬N϶-ZػzJ7%X?^|ɦ1BO?tݬ۽ժU`}ʘ,^{ X=ۮ4T㭲͈`!e      >[|  Oe4WжʬI& fX^;=\m.sϞ=M1?OXeW{纠`se>)Z5leV0wNZ-[^x׌+V2+^A\p-Yͪ76=TnjӦMئMLbx:G]vF;/>LA޶ȇ$`~ͫm^Ѭ%g{ >y3=C@@Z@H!.s)OgC^Vh-@@H2ާʕGoŞPVFmԩgLm6X@Po߾MgX8UJN ]7g۷o;\ .Ç̙3M6a[Vm/ws޽G6j(SFkя1"\ҭSvΝ;u@O+@ c zр(1rH޽{4K%\0wD>{EZΩ_mёvןx2 -i^ NOg@@2Y&؊ ; $@0>T(zIo@@RMv3owaFnw[zMZ \> suYu|2޿QSde_UV?U\'4/v]yctP@ k줢/ƍ`yx*Ua~ B6/_Շ*Ud1R/SL ~Ϟ=){     o`}i>'!  diīwhq>X߲bŊ9@VZن l„ 1"믏p2HϘ15B 6qİj׮ `wMDm!/ ڬz!7A؎EXlG8@ͭnݺg#<q wL"eʔIc?۪U:/H?1V}駶b |_HkTP{Ͱ dOO@@bЌh|  2o&۶m[lqqLٔ 6g@@rVhѢ~|ŁrdԞ'ey-lozvGmN0^so38Ö-[=z.}1d{wܡʊ~7f|O7mteE]}_駟]vM3dTJץ._4}(;ׯf[pTN# 7\{k6Y'6lhICǏozJS+bso~qF{g;X'pBlH-  ݻNL[@@bLff͊`B@С0o<[~H|@@J~kSIT5f}v]wСC;&MX5\ڷ~kFr:Ar΋x._*T(O?9眈۵Ajm/O:֭[gW?eAW] {ݳ^秢/rMjӦ (WWxhk ϮUVqw`Çk{k׮>u4SN={{gAYUJ? u֭[[jlc7$iӬgϞ0:H_x[v=uV޽˸L?Whj$xא#    Er%h  @hbG}b_?Z hTq(h^ge%/UTurKe.]dxpw}]}ա]23eԞf͚ӧ]tM.HA3f̰<;ٵJӜ83h ۲e U@}ʕ#}]C%{R9t bU>},wmذa{/7|ukī\l樣:eWF~ Rz)S~4#mxOA (PdI7(OP@@@ kMoA @ 3&(*T`+WLA>qy݌:yE(  $U8,]௝lqh(]%KӠAQ{oY*vYuyzcס-]ڬuYXwL/ڑL f/\p2u  G)Α'>D#4=m6Pa0LrJY{hNfM6y(3 T ]^hmZF?-Y9f骊Y[.Ri+c}h/PڵkMɝ;w2|VR%C4@ Q?.nƍmٲen]͚5bŊ1;(㎳)Si (l(@ P=Pݻ33     $z ':@@DnO+vx_OjKe˚uMDP@AA!AYzv5jp>7K<`fN,*@@@@@bP0xI  'U_ Ư*jBdСSSfѣGd  fS2S@@@@@U YcU8@@(ovСDڔdElN@"8p<SSc=.q dK 4}*`@@@@@ }J_~: $xN߿ߊ)s x[H9.]X&Mbgq /@7     @ >Y,B@ &:D'OkNP/AA@!k׮,C@@@@Q2(/# @h}6SE   s[!  @^|76~x[jYƎ9XuYֲeK;35륗^o6p+:]=3w^KRCvf͚5n4h.\h3g9#SOիGpS"Xb_*UҝmkZG[^6mnXV _@\~Vn];裃#li,XнV+QD/{Mw Z֭Mye֭k /9QF@L̄Rk;u-  N xO{   l Pӧ9҂W~N2g?[ &؜9s".WV? e(^zKy֫W/z~m~ ͛7w wW]u=#i.]Nx_(Z.^;P^~+~ڵ~^?B˗/oΝ;c٦M5`CY.\8vCuj I(_M6/{MK~QܼyNA VٰaCv7۲e˼ܳU\hQ;p{xiW}Qy+i` Xs]}  -LƠF=o@@RPt@@>|顢/edWx <^r~A#L}, 2|p2]w)6+x `S638ƌcm۶ʹXw8]moi>3ۇf'\F?Ǖ+W*UQ&{~[o WP7¾}qzܹ7CCKǎ_t;8kѢP_uS7x#Psg =P_*kpWF/`XK.mrI/m6+ln~QO?.ӟA tPoe:u[h9*E'=@@Er%ډ#   P{}qNA@@E`Ϟ=* U`oܸܬʊ+b SkԨQa=.;׬Yc>+w^ԩ]tE~w O>I߹sZ]pkO>d6FnL(S|pI(x>^ߺutJ,Y?C1 A_9eW6{:tI=\W6  - R+YViv mС~&}z-5jT*nݺqpg6"4ʤIQh 9/`^!'3  @2d}Ȇ@lˡ   {/avf#  i,Xg8p`{\B|m96/-ꂊh V_[I&6qDt ďGk>֡4hBYU8`qn^)Rzi]tq.`QbA 3xϛ@@ 4+W$RԽ@@ Sxo  @ (WJ,-svܹ^}U)>';_tQo4u4jeY׾ Es|}kS]y~U˗/3[߲e lӋf͚Y~Q8S0֭[>onUTzyٻŋʩ|,p-A'Y-j%8S,'vwaޠ@kذ.]4VZnYf;_o_:4h3ܴiSX@ @0~P@@H`=cH@@V@OH@@@ 2l{eb=eV#<˽6mڸTf* 4Y夝gs޽;S4+N:*UN֬YӭWplhf;*r_wu.|J»ƫVKf6G q*Wl7tkfX~}ԍW_{GMYE|IPMެ5Ey4F0ZmZlղ:ukek݇43䬳βŋkى  $[㳱$0XD@@ J_ܹ3M_@@@ ֭2l[oYǎk׮1e۷ol݅ z(2_6qD?~vǧ/+TW@luN>+pzÆ  ,Fƍ ڵkӭ˭sO+2X6m30Hۦ@;vM7{=S2r{z͢R~}[rUV6`ӳ>JQf`p=c/:tя92;kg gF.^>#w[U yꫯvm{#ѣG9_vk?.wYϞ=]tO?44"%ON@@f'>%.yLyYٲe3a# dKg6=-[`۶m2eӗݛ6mOY:  I%pi@1cƸ, C7֭[W\a/"d>\ӧꫦE\6,)^_|y _fxy/B9; F^xvc5㩧I&U*suhQ&i/\{vmٲ_hCpO?-\uUv뭷]2fW^4ȦNj3 PA[.."vڙ?(H:+l)}ʔ)Z~2nZlnVD է3UTq=cvwZvQ:toS@U&`,ӌ +VlvA7K@@U 9>ϡ@J{ d_@_AA(UkV+ek    0j(88bS0͛]Lm (̨(pPX~U+,leQ,W׺ux.|.FTpg})qN<İwnNyLˬ˖-sfvͲ`Тc .ڽ>\k/V+y*H"k-w饗;cvۖ't-\Zt;|'1|p@ &Xʕp.]:#1D (˼~(k0JFExfڶm{hf2dK??-Zڷoւ9 6t{3x;h%PQ{o5hgСnА~sQСCQU=`Y{%gM/4Na. E@@(wNnC ̇ 2+;w˹k_|͞=e; /ȉޫerٲeSN1׿_m* s!5NӫVjuqU(^Yռy \_xw܊+\  |Wvؒ%K܌ ^ۼ`YV&HE꽢cn[jeʌӬ YƍMkڴi6`e{۶mرcv@hֻ~v~i{"v-xi&J# bhF` k/}prh~px@@ OїR*^@Ȟ_@{/< @@@ Y(ިQ#PpԩSM zn۶mt[A ߾}=VhјϓJgf`}0+rh͋kloV2k/ܝJϽ{6e5j)V1ovWÇ-\ H%JѣGv6lZEVFΝ;{\97'A 4FN4ȑ#{ (vGZ֣aTiW>\6 `cJ >.7E@RJ xOa;t$af%  gաm   7p_իx/4m4h}G]PWr*W4/ni9Q~e9|I_A^5kָ|oXjt hٲe]re}ڵl :h`d, 7n\.7o_p}p;GRwxcq P;ˣpV   O ϧ)2z!M m9 I%0sLן+W,\I9:կ_m^7@@J@3yXbb<+UVa0aBLl…jժgS=]s=緼Cr^.;ׯڡ`:uX"E:B{k6lӠҥKێ; [0ǏӀxjԨ^;Ѿ}4 sVxq~^(, > /@@H@3yE(-2}=  Oo@@H|͛7]weC;Ӛ4ib5j0*~6j({g\G˕+geWPBQL~9Dܮ  0]*:GիW۪U쭷޲CC=\뢩&)S]s5ooLٓ<|pfPˬr~yJ|A)n;\Fl*x]Ev 'ئMLJ*Y׮]MOUc~u4L^-9oڨw r)g{L3Ax3"\y^55X_N>M6AXw[vF# .m6s?qD;ML Yn;[nu$RѬϭf=E3wSO=eiC%*[L2YWo@@rG 80cϒ+VpR C@\r-^8bSnv2dHl@ 'P͚5sꔫ3Ν;St@@[`֭.륂w{VfFi63*]t4^+0.6 -j(K9rjw^}27Y_|͛7*V~G?Z Џg:wlsqe .… s~DA Zb?@@DuJ@p#>Ѯ^ۛDפF@L nꪦwj]莾`G \/>S    7ʸTT5@IDATiӦْ%KFl@(ohM%9Ug޽M^{,çzː(|uړՠ~~.SԩS5e˖*UٖkW '\rr4uy{ ݻ#`6bE]dsuJ0fyA7mms=Q[C+{fEP]Ϡ>իL>+Uš3%|Fzj֓ۏ?}ڔ={*[=}Χl%Mu*P_FSs辬ה-[ػ8M.(R$bE1bQ$j+ ` !VT4H3F(M.'97wwgfggg^s)}slZc|#?[Jm/7'  @H hgv  y dJ 5W*T`gu6%7lн arh:ҥK[˖-+NO?=e } \DN@@ 2ޫܹ3jvY"  @H7]    @Xd~ ȉ6lP2y'%6<"yׁ@RWԽ  |x2{ @@HCe$\vmܸ1 ϞSF@@}l n[ڵ+a8E+@DOD6  EEٳ{%JC8,@}A@@$PR%X@@@ ԬYӆG n[ڵkС7k,v4B@ O͹" 'Plwaʕ YH/zs  dP֭[MKXA@@ ףGBztN;4Ӌ y#@}޸+  @u4;w$p\9 j A*Ǐk_… mͦEճ>=,7^|ŬERJݞ^xm+Vh\sMfM8k۶i-Ϙ1&LQ^ QFU|`_29ի/Kpx2uԸ9-[;fiYL | :t&MD?޽{GFqoڴɎ<Ȣv /     @ (*U@@fz- 1w}gW_}͙3'ù*TEK]veؿtR4hPmV>[vmP㏷N8!X ӦM;í0 :ujq۷onݺ's{/9vavwg9οoOg݆ٞ]F wg?$O`NN2ƍq{֭[xEP xqF5@@@@@u `l@@ >d^k.+V3Sxo~'۽{w3WjժE)k]tQVcǎ0#רQÎ9 ukD_V-/x܎u?>fϞm-ZȿA x_     EPXN}2  @gK6OK͉VG}4%JG}O"-x2Gmѣ~&MDuw/^x9rm۶ͮZ;3N:Q'#7nٲeŏ~_ۚ5kzo߾WҸqc[`U\ٽgi='Fj6?zz(@ @@@@@ >."  SL2;w,@;e%0i$w@5kִ!Cd׎bŊ P3њ'@=      >7zE@( ?ǘQs^@P{ ٳNe߾}#$e|*HTEΛ7/)fI<>x+7?5`_~%دw}4(R?a-Z0}vWCqʖM7Y.]"5eN{@@@@@r#@}nh  P/ W)qf n:ױcG{lx4ާOɓ'GAֹsg_5kDӍחe˖<n\ew;k.O j<9:E .={c=*p[n1)Q=Ӷeۺu >MDnm)S]v6w\=O?Uz2I{~}W'h~ڵk][+cȑ#?t|A EXG@@@@ȉ9Ѣ.  @QPR`_*-PpG@ 8>۱c-]Ժvj%KVZIe^n޼yxWra`HNy6̆ ZUV-ٍ;v|2+V̔ZuPP&thԨ]r%6j({]0{*UbR߿=zp{m6mz`xVZ6a>l{]zz֬YvMpB>tP[}M4qS1}͓[0 EV"{8p@@?M8@(̌U)>Sc /<<gIO  SQx_ꌉ@H7͘1e,={ۣ_{)O#FXݺuC-3.*hz7bk֬]tE6f{\+Z|# r^/d7W@TMto>l<ւ7@_xO>iTL*8uueڭ[7MU7Z}݃{߉>|Yr_t{=^KK.ϛa\rji # $$ zQ@@ wׯZ#@ x_@@cu_+@ wq˦N$h"Cෂ4O8[vmT^zܹszv( Te۶m3ϸ| ?N#MW9jk\MlST|{Z_n^P&4hٲuOܺukL dzY7nV}]/~1DŽWr?e~͚5VvmYfQ饉[|~w *ظqc@@@@@Pb9_J*yG@@ e?\o,~dOkbmۚ^* =z 0V^mq}yq 'xuY6i$[o0K^Ygױ\ÿa)C.qvt@ hBmi wuWT L"~VX,UZ56ee~}N|Yj_9p?jEv=A/   Dhڴ?N" @,Eڲe_@@ }DiS\isʜ(EC#뮻N:$S|O?4O^A WН]tNjpq45n8w]ToȐ!QtGA>d8SdiӦٰaoX!v)Wt:1 .z*;rZ"ng#+W&o@@8c]l@ݻwEEr8N@@DOT.OSH-͛_Z$LZg't3vwd:rHVdݳxk vM7EzVFّUT (X@@@ d6q XA@暠)SlŊ:  Pd/גG@,paYb\lpRWy!Pf^Ϸk֚7on׷['|boԿ2-QkGN ׇLʘ}ӧO7ڢE\6?j'h_~+I&7n1^;U+_~2sz5nN [/F#ӟdCu{ǪWn;wv=zz뭮fr-Hh_y[tvmn:]}M"Z|sϙ3@$^xOA@@@@@ ^}U (X@@H!U)S%7S8x,"Ǐ7T/n0o[ach?6bs9ƪ} п짟~ʮ=YX:h tB6d\M`ؽ{΋9zMwc֏ƍuLC ֧O֭[Gq 2D={W_m]w믮>p@̈́ٴʰ Vz)zΝV;S&@}4#  Y`v 7DV@}٘ߪYA}/>fΜ_å8dOK " [lٲ`M@ ~.@RA7ovGX),K(WJ̝;}3[dIkРЗ^zi7M{*ޗxSxſy1n@ 9o~=.:=z:ʺvڵ5jK/nlBHk͛>^g,Wp}@A @8~Ѫ@@+p衇Zr@@l|b_^ D}|^c   ({2ާՍOVD O:,KXt\6md˗zY:u,N>d;x`kٶQf M%qy+Ҷm۸LΝmwy1nRr,,z*/[,VOAj*3gvZڵUX *ܯVjF2=uѢE%>C4@b  @@@@@>Km#  PT/W.M}r=  W@PzwQ&MW~xE[ }-9z@@@@@ x⌇  P~vΝ.fb 0/ %Kr'ōD@ ?Ÿ8c     #@Թ   @txA۱c-ؓާU(eݻ>'ܖ  [ x~ًؕ     @H xR@@HEeE}@v '.9'@ԬYӆ*TH- @@ @8؋     Q`޽RJ,   J ۷ojժq.q x'@ wգGuBk@C9Ď8۶mx't    @8){91@@ 2ާ=HxF@@ ,PJx~f@@@… _ ŋM Qj׮mu;,gkُ?e{ _~5o^xHթX]s5o'Ntڶmkmڴq3f̰ &mנAkԨ{/_>ؗ셁ڞ={n8?nzxx ?V~}޽{&wAeφ;M\7q3aN |(6i$YD ݻw:lD( ۷/8l @@RL@keǎ~4 >.8  @$/Ye?p@ "6@@@8xdž fጳFez>bÛ.s1.k '~aڴivwSN޾}{_n]UwG}4 ]nBϮJ+]tKa Sdpwp@ oO4Ҕ)Slܸq{XD/F@ȑsĕ OKˉ!  G*6m2e    C^*J;,7o~a^U6lhŊZE#iW۔)^Ǭ~Ҁ7k̞}YҥK}$RAHb O۲e]{;[oegUg6ydӤpѹ)&GGx ~wX,#@ |G6{lkѢEh  &@}Q/ԗC@@ |FSHϟ#a@@@lݺՔAYZjlL.Vr ͳ%sѣG<֡Cۿ-^x9rm۶qVNvm̙͛3]=gvM7ٚ5kr]ƌv/^ܽk"eWg߶+mn,u"mwHmن''ht >]4 @ٲe=吒m`z;g  gS=@@@hL6-g YԬYqӟRVvessw%L_ {2+?K K/sAÇKFzرnߙgi^x[7n\Q;HpGA 5j zȔ)S짟~Jޢ L_|iR&7[4KOJ_\4@@4 }\lNl؍  @:_>NsD@@RB`ѢEy/_>Xί]|͘99n*V蚼ꫦQ*UdzrCݻ7y ^*pܯ\f͚z jܤ!ݺuRJ@!CuM4h`zGmwyVL;sl…vI'iڵM'L81R`{&@iSO=ڴiczj&-_<   dOūs">f@@@ xrB@@4P6{_}]owy)[y䑤N:ԯ5W޽{0ٳ2`W|3f_L{ACRXnݺvUW31bX"UvN;{1SpQgygާz;wt5sϵݗ}6l:~Wvk.2_%KbŊ 'O?fΜ@pཾ(  SϹ-@@H92ާ%@@@ MZjeŋ=~þۄ>}D|/bܹsg_5kDӍחe˖<Vkժe͚5sYZeر=/Ըyq.@* u]gD>.`^[nmsqwᄈ'|R[k׮i&_O(ڿĶԩ._:&MR_={D5!  @* xW5甖SLbጞ9g !e˖'_gxژ֯_@+d'u벫~@@@B"^zٳ>kRK/Wխm۶vE]:2?+X7ߴ]vٰalȐ!d}']c/YVZe{RJC_~[go߾F7 $cMƱ&ШQ#KlԨQ/&.cB 6i$+W>;ꨣl-bGqDG`Ǐ*~l߾MҶ:uM(D?h sO$q42{ @@RMTOZ%FF+@|EA/@ 9@@H_'xJ>裦MeW^)2ViҤ+V,bXk]sϹ Ί+F'ލ6KJ={evV}8?2>3ϸǍg7xcRwRPyG w80f ,pUK.AнotaYnlyf={r)~w^t ýߨC't]ʕ+f>m4W6e41cap{@@RL =`c!  @jn>5)g  #7e#VO?m^xUT)PFcN?iAs΍ҾXvmǪ>-ߟXckrJn׮r!n v&a&hٲ5)g֭1OhӦMĺʵk6g.)"6mʰk…z޽f͚FW֭]н*fYtB 3ǚv00  @J xR3I]v{ C@#_gGZ/MP)?Y)PCz    @P2l_} 뭷 2eBgpOYxvYg٤I\v[o5W]/A8ޠ ~l15nV  @x?`uBk(tŊ3e_f]@@ȱ2|`>>uTҥKLxa{MxTq?s۱c7sL+U[e޽6aԩS] Ը ,@ 8Sm۶6m46l| ,~O넷G[3qD;ꨣUu#eӏـi#A(  veʔ1'LRSxz6g  |I㏷ہxT2fh V?`WM1 >s&@ _lj*ׯ7K/"ݺY*Tp˹RbEӓU4>#}(&ujժesu@f3  >!S g^i>L1o<6@@ gmz 7?fmN@:cn44:  yuY~PиW_5YF+ݺumٳ Y;@@~)gc[Lȟeɒ%v%dZYUSNɰoرn]ǦߙE+ڵs٠cƍsƳƍب ѧO{M7ٛoۧLbkvM65l06r뮳?FezȩjJrc#iO)(Q"ΜSE@H7xd%2^z(W\z]i@)gj4ɕ֭[s՞n@@@ (Gm~mp{N6m~!zzWhw1E}y睦@}_|[gdɒ֠AZs饗F O+#  E(0lF@@ @ \{e_~)SOS5k XOr|vWζ2(((_(;wիWnҤIֽMX%/ƍ5@ 1M O4ԋ2 .[,Ү ʔ)c//1=]teoڴiIAʐ<WҹsgK%sε͛7[*U^z|#  @x24r3'=XC@@ mOKω#  @(@RVZq @z .]Zl^-ϑO?=e".@}>  @۶mSGԹ    >W|4F@@C%KX&MAO\ri 8,QD  &W{J x~ל3F@@ Y؈   PgwNH™x  Q 9[xu؈  @*x W1w@}h  @qv衇ڮ]lڵ)s^   @Y ><PBmi |{c;@@ (—m۶EH4؜*   (    *PlYѣG`  x_DP @@"*@"zx'r.pB{mxb/k׮mu;,k?fi_n͛7^x좊+5\}6qDm۶֦Mؗ۷ې!C\W: /0n?S:uw-Xʕ]O?m[Uի)cP@u4i,Ż({8XUz,L1cƘ$⤓N/8Ccǎ3gkeʔ ƎGnW-.T-m2VV`f;#{'m[o5?ۋ/bŊYݺuq֪U g?oaw׷ݻ]skҺukرkpNǣ>9H}/'Q.c}&Q@@@@@&@h2lG@H52ާxs3Z$A@A\}aÆ޽{8j(ׯ=C^ˆ#?o|1Ǹ/CVp YM6}A о}{ܯ@d?.K/+޲W^y M7+W<*_ӧO ʔ)6nܸp`{uֹpཬA/h£>332"\wunRFԩVT)[ۇ;wlM6 7˲jժErx3Ϙ&yQz)7DKK. %ˁwCjDs/tԬ+J.,A/t5Og8$[ d!P W籂FA@@@@@ ɰ@@ xjW4C}hI@iO+2o޼~Q{ݦWҰa ș*x2x`{#v똗,YLPf͚ٳ>k]tɶ*(c }Uw} *S?|˦M*UXJ.`%GٳMsZl+Vp{jekw1Mqd.z\𫯾6\?|^ΫWvmsu Vjn(w6֩S /'T]k.曳^ξ 'O6M(\jԨ{駟ܱj==תU/fxOg8C' d|(t@T^=WA,     D }6! S!uVSteV6́Hz͛7Jѣ]sZC.xȑ#m۶m.3swL [*|A4?ѭk)zsZ7on3gt4>3e_f[߿WY^EA_7q ?] &N,Z>pPkKNmIOVϊ*zJ_+3ƭI *ŘE ۷镹4n}U\9\z$[ ^(}fkr!@@@@@hGa;  @ >ծh?Q9oG 6mZ)4;Y=?oJڻe˖Q k}.Wiǹv)W_}ZxÍƎV84M\dSgדf͚@7qgGv6mKMڗ_~QO~)S{}(YOeST$N: 6W\a'^jFlG @8&R@@@@@%@},! Sj&v.'F\(/_̷;Ӕ~߾}#$e\L*(REΛ7/}0ŋ]@MO P6d_vZM[]uU e_bEn v=X={v:udا{n[Ty-Q_Vz=󮞾: 4p Blٲ/f7Vf{_4!Xbi# *>Gc7Zjd,G&4wm}ׯ_>lݹsg_d__|_OQFA3(_۴`K_>](wu^{{,]2jJjݶyf]YOTa/oNw^?W%џ:E@tYo7xc fD߻wo۴i=Sv= 3aw>^^Yf\4Q :n`_&M\ܱc~Y@ @4:Z]#  zĉ9o@Oo@35R 'OH O+y  D(],Y%T<%Ok^(' *أ>jr, wzxTqu(s+Vz\ۏ<Ƞ?,'WqBl} +˖-Q)XSeΝO֍wxUVÁʕաeVr/x:(7w^ \Wj&謀>[t; ל9sk;ﵬ{qe v%џ$]!Q =eW?,}veWhݻw}'~_4M. wyǭj3MTҥ=a7Y)s= D~_,뱌  @: h^@ȝ)!@@r&J(~&4H+[^h*U M3zSXe6w܈/U2U?} J%8-wzwoݽ}DƊզe˖v*d/W2efOJ'%|v):2q ?`o{)(OP7l?x0DOTyBY}i׮]}~p ^ppߧ7nV}]/p]vmYfQ5bĈ&!QGߑ>-     -3GK:=  @ PSw>dωZy$`oѽ4 rAoqȐ!ʆr'Yge&MrYo\ LKL+XRAj`re_x͚5+&su"QkM+J6{/=OA~g[яMÆ e{VI'KWshѢ;>׭[ׯ2$=Yѭ|N0=a@;T89)+^V0t}}GБ~\j,#ؿݺuzGv%s~vٟ||}%.}E9s@@ThڴiBR<9@J@r#@ h^7@@ 1<(4%Ok^hX] (kSZ.]T 6GC+8> c7jmRU䣢, gqOV  ӗSO=ڶmkӦMaÆ 왪ĽQ*VhJ{ek8(ìVZrJ7gUfΜiK.u 4AnC.`D H]}.r$]>s۱cZ.rTt-&L`:um@N{=~{ o .zhUORGFD4)$~  @* {6`T:%@ݻw |#GA  䏀x{[{axa9W\.Z(XN™gimڴq>c.?1K8oK+]׮]@DƊ&*hK/Ou&OjgJ@>O O(xC xӧۚ5k\weO@)~sPLzϞ=Q{|ݨ#3fL#nܝR""}tV:u$ܚx1GuT=3q mZ߻Z      Y' "(   (ߦyrNxم,Pvc9 I^PPeǎ]#F$Ylƌ[lP??#+رcݻо}{kժ|y䑈 ܹs M4BO;җ_~i~z?mݺuneاW~^n'ӪB 8v&1+S|<]qƹk֬ioFڵ-[ƏoX#vFR@ uόQr g{ 6B+}76o<|!$(PF`իE:   s Z_~誫rOZut@gJGH']ϴF@@ {ٶm,c\ @z} _oѲ7oΚ5kfsqA9l٦e_x(+Koݺu_ti;ܲ2+[YUJ*ewyo߾veҜuW^yenukÇ`Y $Dߞ{ƍ>sz9眓*N%;g*Rγ38-grs=g7oSAA tInb2Ͽvwd9rd0UuUUV /`7tSԮsZ[ ?3A@@ 4'; @+VH/"@d/\ׅA@p1y3"& Hcn6{[nvY&Mܬўx <(#<2g53)DM6ö+Ͽ*3gקOn7nE~2'x]~jR6lh~u+[lt9#<2z~.BXbm/Fve}V?켾 ;wk衇d=8t}ԩczr̪@pJ*'~L |gm=zڿ]zn€u2Hڵ^0QgW Vt-E}2~?H@M\t 4h ̼?7 X#/^خÿk/ަM]ڧO^,Y.,}XD47tA|¥lٲ[o.ag|Zj&ڵ5 qgmذa&_(>OƐgI1 ƍ'|2Kn(ޟ%}O2d{V?3^wu3_u+VJXhaz&*Wl;w4?:M}/GI")פI   dSoᆌYC@,>}Y 5kִ~@ od3g̷R} >ϓC@@@{eu *[ԕAEpwKd~;]h=,ߠA],瑎wKzH|DkeRVpH픝^ǧ&\8 1K'Id.ٍ~MѽRhw^Qpnޓ>^5! ~U\t:e@b=H|&DK\ D{@.M{.@@T >կp#>{@B .ӽݯ_'\eVVr' S@bDUEzE*guVi-bFuK*e˖- oʰ,˹-P?gۼys0AC*Vk+4Z6mZ]ޮ_ _s5.V \?! <'Dk["իWx&Mus-$3]G 7ɸU=Lۏ=X]]mbk:Z5MnF}FC*U^ I@`PT]>h**q"@4L.ԤI/J.زqF#>-g    $['"}e@@0 x_JSH/e=3}mذ! l>kԻw:jE@ jԨ!>@@@@@@@E:Q>d7gwNa avJ:D@`x?w\۹smݺʕ+W0¨     EBg/A"  ¥H3SBrOf͚6|B a={v TYf5@H-^gާl@@@@@d +V,Y]  ^B S^:OgeZ=ҙHifzQ@@ @Fe        fާtga@@̪W0(=@@(^{;K[pm޼4zgm{n'x/u:UToپ{8qbЦC֤I`= /ضm۬Dֻw`mϞ=zʕM/^<ؗc̙3]W}2ev߾}v:-Z.֮]kO?tv~g^}aZt3ƾ+7o5nڴic]t}m6d^xa/§~jSNuoL̝;~m׼cǎֺu,]wu/;:upᇻ͛QG73f̰ &%K ߗ˗e/ ]s5:qsZd"h/tR <>F@@H,jx_ԮNj  @>ԪU+eʕ2    @aꫯ9sd8$@(tҶk׮ =hР ۢ(YӧO;#6e7n\^{mݺunS8^cm裏&) n:tsִiYWZ(^`V VפbImذ!8ٳgx]mۺ}K/+޲W^yŵ馛1Yqyg=.R?Ϡ&jGay̡?#27O?ݻcޫU#>,9- l:vʖ-[kwyЭL-2eޫ/+pٗM6 t*Ulٲrx 43tu, ?L4!;-uO]iayd^*T`UVͼ[li ~ -[=z͚5}ߖ+W.կ_J*eK,{N߬Y3{gK.Yڄ7 HXmcV? {Æ +V^e|}/_AC@@ Rȁx_   @AZqt  o~a+QD@?Оx`[o1CHum{衇\|Ѷ7oܔ]eg2Y-:Gkp6\ǷU f4?ѭi#GttΉ{+AV7yd޽I W03<0~iС ~_xٶmgqթS'K;mDMhPQu^\7n*W{.sp@A $z+e\r+@ @@( r!nߝPKxz.g  3xu@@@ ?&M] !^;?!΋c5j)~n_z6w y.H:7m8 \ٕHٵw~Z)^O PQ_{qOжk{/>)A;nV vocM`Q_݆ ďVƏd]57.Z#gHOФ=B9- /LT%c֭6c 7FT /ГDW:  6vex{cF@@@ .]ڔeNeժUE9`@@HmE|W~qn\Vo1*?RJ֫W/ו]jU+_"T?m4+󕭫^z:h[V'N 97 #8.{ni׮]6vX0C0`@vZS[έ/'|AE?;p VbEWW_o$={jժ6~{{@Q}OO;4{LYEyPyZ5F?_}֗ 6X\|Ϳkѵ^k]v{K,&.i&i6sL߄wx   ).@}_G} v!  >E9    PXZnJǎ^͛7]P`p>}}u].={\dx_@g h_]Fb8P믿G$;<~|`}}o*"l׶d{dMPYrVOBgM%ԩS=eVz*'|w_~y2&"@=MR>̙c |פeW'tˑTO_j6m2.믿?eϵcg-8iX!%cƿsTپ믦ZϞ=R]O>x԰6m|ˏ? _~\}A]I'zfi:dnR R?zuzŋ7W=zn2K,(ݻw<>JGڵkU<>`޻PXE@jgwxO?M>RR(%C@ ""΀@+WUBxj;  DRaÆ-䫙h2>|X/Ǐ%...Vbct@@Ё6޽ۮD@@R@ժUMoP |]f4֢ʓ&M <{xbٿhpf@ =Y[7N$r`rXׯ_6llw׷L_crrA;={vs9vw}wHϛ7isw^YlߊwVmuه@ joŽ][@gFYxN92d0F%  @, glve L!Cf  @hs1[NwZ#@6l( s4g4Sd,YD&ުD@@"׬Yc}M65kʊ+dȑ!ΥlYOkPW_}ef`3fnaUN::b6e5n2O?ȋ/h[Ϟ=.Č@{@˗?Hot 1{  @,3x w>Lʕ+Eǣ  @4 I3 GUZ:5ubd֭k.%   Ǐڵk؀jժI̙U ۶}o dСNuF#ی6\`r ųetZj.]T֮]+*Ur?6{Ŋnݺ>@?kӃ`tmK xƴdʔIJ.m֓5\44ɀ;4ys`WVZ%mڴqZ4hd׊;v%K:uqz[(랾˗O2e Ǒ#GDK">'iGsR@@xǴߟū@@@ %J0GSNIrNgю8  iީS'i֬<&Q5`o1Ym͛f|>{aÆDjM6fZ4ZA׉6H`z]ssϺd^pV3E6d͚>;C<V8Ν;S&M$]wҡC9yRR =̭Gfۇ~hb߿_ڶm$ܹgHJu[g={׹7|St}w8qL>]~x_$]u_   owHwmD@LkvIA@M4_~g~ddYD@@rg)h%Pxqvv  ٳEZ40ҥKDn{xOk'Ӽ{{[nq?ӧ Zq۶mҢE זV5]T a;^S)mY ?s䮫4;|֭mx_aO?msV۷@vCF Z`r 1lA΢{X]4h>x`8OE[Q,@}\  U^YbbcL{ILi: @R_j/S}=Rv5-w&bD@@ٳhp =v옹wн K9'yg0[|#ȀdΝy\|t^+ oϗe2eL ._ g;]k &fbkZ~}'ҽ{w38@3ۢ^3ֻ{޻ٶە+Wlo /[.Y *zl?Z^o,p %Cz{{-vi =hD 3_?5?,?emt ,Ǐ7<`}:?6kf>(x?{/_6!ϜlC@@ ܟi"Jd}^z  @<3'5F@@#иqcчn߾]tv4 N̝;*UJtqLL5(,AW|;vYԩS>ErSh"_ZjiJ^{53f[N6olu=:xBފ_4>3?6lKBL4U܁x޻woGEHiذa@fk֬ 9S'|*"@8#)g.&M7|Stw̥U\,͐k>-[>>l Uf'>п7lYNz,@@H{H;@@rόQ]  iL@˕+giҹd lRtƆn!\.׉Ȓ%ԨQ<"м&5o[x u@@*+W.xPsDw$  #xLS@@@O]v&q֬Y^v=.4ϴm۶~9r$: @/\-ݢ  pg''ST }TV:  @x܁v O   3gٳqܿ&ŋO^@Ҁi&q  aȑ#O^.]$qqqamRpu  @E 2ާ   ;vF*Ut'PhQ8qbpjɓU@Ҧ@L 'C   @ hǏ F{t{"  ҥzeٹs;XC@@?% hvۧ @Hw'9  )/@}߃SBs"E@}eҥqF9vhRJI&Mʕ+ޑv &Ik׮fo팲ʛ7ka̝;kذԩSǬ/YD̙)SF*T`sv{E6oޜٜ9ssWZUʖ-`ne͚5^7j?}Q)Vvu}ٲeh"\z})_hgCL6^-[hѣ矷X"@ ˢK=(M)     Xwsf  D NxwΥ{5H y-ZT/^w#-},YiN4?)E h>@Fa,IȮ@IDAT\QF:@pP4~Ȑ!2Ht;ҧO/=z7ri  0}tY1B-:UC"R֯_o^㏀Zz}0pgm@@@@@@̙3K@@T W\NBr`%xfn6m2]OܥM6}?Ӓ7o^{'{ GQ^=)Tϟ@*b矋j[lٲ>O| @m۶YYt lYlT^]5N:;wn\,]ks .ٳ?  "EYHt֐˃>h79rDz!?u-"(Ǻgu<HL @@@@]w&g    ;4ӽ 6ȪU:&zm_pAF5TDhk׮ K6b2ԠSNzXBZ|c=欳S@}QsqSLݻw|ԯ_߼ky[t]_oFywfgUO6B8וO?TtPRZ58qTpk.]HV6pc6٨    Ąn˹s*K@@Zx}s xk@ڵ}˱cǜm|wҧO{mL2ҲeKoɲ~ݨڲc`سg9jL*X^Bp] @}Y3~0|jAm+\S?n*KZB@H;ާ+%Z&@*YdXj*ӚfEC)5|ʔ)oJ|H"vWJ뮻?zdϛ7϶Q`Aڮ]phŋE5 fP7At`}whcƍ15vH~ RSNk&:H_LZ4C mV{9ZW?F܃v'|bV_=ѪU+?~\G{V9 !˖-3P@@U  $MҴiӤ5 6^6/ @@@ SNp1-PzuYr,ZH>SYp^Z.]d\4HVZf)TWN: djཎ;vɰqh-7-iӦymFg,W_}IUΜ9i֖9r8ϟ/}\W2eD}< 25jԐf͚ٳkb^==Uٙ=J*%fkF~W3Px|vYӌb߿_/./_vvuMũ AwI}vTE@@@@Y k֬N;Q    %"},H}kz6l(r!9s 8P'&kq$rKƍe޼y&3<8p9l =c2kS ҥKKʕns4 J&+<.]y\Ym [}B͖{UK}فXb˶mۜY6  D~4`h&C@ b^j~uq%q @@Bp'$&>$4yߑ\ihW`ҡC[TVtoh5T9bΒ%KK{ņp`VAjl޽ܹskK@ L`F2zhڵJۃ>nw/m6__뾪:ۋ+欳@۷{8@@H*U2I2|G @@ @x=  . @jiixb@jժ&vU3*?>b曥N:QFٳgC>>2P+wvnsĜѢg&Mun>}%J>v.\XU:lٲ>|hpi{      *!)1  @Zq;zdOKw.iJq4"PxqYfhvcq1dzw˞={dʔ)!5b Yd9|RFIbu}ֻx{ҷo-\M65k9' )5$VDN8!6l0l~ !>e˖ڵk3g%C qw=  @ hC #@I_~fQ=ݣ>*N3s ̙3&*?}t  @43x w4>xv$[nuثU&;J*zjDm[jiƩ2h ɘ1:_j*S<ƍ^]:> @3 uu֕?O! ,ڵsγ`ٽ{Hٲes:@C   @ x7G3Ggٌ@j@N:If'UJҥ%..N-]3%ki޼.he W|DӥKg?#r-^Xٴi63Lg}hI>\t)U_wu&?FדZr-&_ݧ-[$VU ^<ؼ$BF%_|Ek}֭M6 (^k1д+uþ[5S JwO>Ҷm[W#X.;v45Cfv^zI (ೝ`wٚa_3닶 ?uskxOA J2,\x $@|   (0tPyc@ƍEʺujCI&/)  ĢȑC4 RbCظ2 Hjмf?ϛ7hF_ gȐ! ϥg#n޽Mg͘1)Sd֬wԩS֥=^S챉]Kc7nl>ӠܥKɓ'H7ݯƎ+k׶Ddp~zY@ `2eپ}{)[i;s%W^yL4nlߊ-oOlFdڵ&C3ڟ?ݷz`D Twδ~j  @ZȚ5ʕ+-^:׌ @ {O}y| fϞ;)@@T@ux7GfK@g9zΝ[4l%$SL^/^zN >6۷Ǟ7kf}x+(|Mȧ1cF&}B Nׁׯ͛7K…rfw]@ t@>}ޱc*fk{իͶJ*I}SJKR\@j0hEgȟ?s A~֭ah&@@@@@Һir   h{-.\ӧO{6P-@}?\Q#o,gϞ ?/^ XD@ht˗e˖-iV@@@@@Ҵw§NJ}@@F1'Ѻާe#-*'N  Ț5+VLvM}xHi@@@@ zq9ydTN   ;>..N *aIާǥ#ۧKZ@@@ٲeMCĉ3gN/؄     K6^?7   +rr)/@}cz  @ʔ)# ,0mٲEWi@@@ i7nɓ'ˆ d֭pŋkVnv{eUomփ+ڵz.s56l(u1K,9s8d̘Q*T0ܹs;½k.0aBfӥK'%KkFj֬)ٳgOPo$mCNDguh=+Vv!C޽:9?,_\-[f2 _};t z@ r=ܕ2> 3# .w^Dj,"  K@@@ e._,}ѣG\ӥ_~/z SL޽zM}EmZj٧rѢEҫW/|N… eN=ϕM t wپ}s .,/h ۲gϞDuxxb@`/V|Dg-~ݺuҼys믿!CȻ+w{7 apGRi Q (3# 2S I!>9  "x-   @Z1bCKL6;&Ϟ=kY\xu52tPϼJt[ҥ5o۶4T"ƍVZ%F ,(%J0?~\4(ŋry'̙3ҵkWy͂l9z(_@xuo嫯UVIjռモ{ɜQ~}VX!?h5kG :΂@l {h֬Y#w2ZF@@ ʕ˹G=  MxuְKC    z)]fjlpݾw^yWDkJƌu4sL_bE{on S'xBn&'8kIبݙRg;viUg`w_BٰasF-3u^o Eg6mZ UM O;A{Ç;^k' "ErR,30! JgF.*!  @4 )Sޖ-[uV@@@RF`ѢEN_|1Aн^UѢEW_z*%K| 6,ImgȐA4|d,\E3@攚~ O.7oO>D4^{vlx  DN s+U d`|tOE!L):ӧ=z;L@  Ċ`cx^"  i1BJ#   @6m;wng=VڴicNGrZ7o^{g2i޼Ss͚5zRWڶm+2e2ނ}ﮫ6^AH9P?^z)yM~\}.]HVnVɞ=r-fNݺu%_|ҨQ#\eܹu6 4:u@oYvc_:K@@h >pxЄ-   Glٲf~v?5م   iw~%hwޢÑ#G& }͡ڮfkN΢?~ܮ&yYdIyGM;SLݻw'sdզ^ŊK* @ {nVQFgвfM;vh@>=ԩS&;Y;tvGok" ͦOof3ftҙBϗkV~{,*@W6" DG =⦆ @@| +W/tk    @ ԬYSҧYfIe!]s='}ׯ65#s˖-;ɓ' vkˎ;j,{<*UrñϚ\Xٵk\tTPBbُ@ s{Ǐ7vfŋe&n_^UE_/<(=zT8 ?my;>0f_p & muy=zr6ƼG1#  d۞1,`)P@,v># @bCĦ TF ÇP*z͢~6   @BZ:u$ƍRK/잻 WOp{o޿_]Q @k6l0uUVNн>ג-[6i۶ :TjժUR~v͒%nΔ)ԭ[|g,-Zd^ wWz'eذa_.Y{7@@ >Fn1x?   ;^3S@@@RV cƌ&3}ڮ#G?Mhfjd\/=N:^ս]{ /^ lΘqx4-ݻw@ E ע| n    ܊pEB4 RR4x\2 K@?0`@(&f*W}OɎx@@-/_>ܹy\tI~'?m4sM&䫮w#!q2o<]$8p9<׫oUfΣ%KҥKKӦM%R紝ҁ g6ug}t_-Zm+W͛7HY@*݁Ezʞ3c}vPŋ&tޟ={~gkě1{~ @@bE@gTqqqgLk=@&LZ#iZ@&s~F4}+x@@bKzC1cp…ҪU\L5^3O0|ꉒ#0CƤנAiذ,ZHF-]vڜ;m+&qj/{m 2`)[ҥKgW-ݕu}Rʖ-뫪ٞ-[6dO@@XЙ :dfeX{X(D@@ ج;w4k@@@-C9MFr7,u15jThXj 4i.iٳ}:ӧc#N@~ݯsvw}h?9r0|Qh[Z, L,0;`   W\q ݍ>L!C!1@@ D9s#׭['ݻwC _~m/~gk˖-RR   @ ̙ӮFdAw}ٳGL9VX!K,1ǖ/_^jԨR;MJ͚5E;rH9K~wߕǏ̙3Z =w/_n]n eYB~Mׯ,͚5?P+&:߶m[ٵkDΝ%O]~Ǩ$,4bޗ8`@@@ Vl?4cϘ _v"o8}F@ &M/󐧟~Zs?;NUOvHצ[/8a   YClڒ>}zt}j`p W:vhA-[kE]hg O-e֭Һuk>l駟L}k}ӧ UG;re6mq{Luh~ܹS =ҥ`fY`/^ܼf3 gС|&^g=Q<SV ϟ_4^P@@\r9]%ޡڕ %t @$ pM딡&à Nm*K@@@dl>sLY|svwн&W:س$j\躶ٻwo@}[1vݮˌ3J2eLw}ZDŽ{=okھuvΝ;eו-[6[V-ZhAWlx 9lR~ 2e\pAlнƏ/LW|~駟,zݻwkf/]=%K :ZN<)O}   i=%b2>o)C@@ 9s4Y8#@@@_y15۽fm-N3-ZIjb_o}gwhe}x+(sՃ=jՂ>V x;fޱc] ik}h0+LpJwUW\8bpgϞ]&Md,+W,h|e̘1e˖}/Ѭǎ HRM ό-TD %  Q+@}Z#+ @@@ 1b_9bsرG@@L5k 㴘t0EƍS5q1 >,YH5#|֒x㍁U6n>t>/R+j4ydٰalݺUˏŋ˵^+ڧի'8n޼9voxZ̙3G,Y⭊mkז,Y|wme͚5~ϥ;G5}'yvڙ6l(ub/[L-Z$\zREgA=F/htO"PX1ə38q-1A@@@@NB 9;p   ,'ҷ xϏ._UZnm]M>@j >s{l߾]o'eʔ1/^z9,X _~ܽ /xt޻ɝ;+teӧ=ZΟ?>Y>}O^~eS]aʔ)߻7\r #ozviFtDYiӦ_|4M::t0BZvEޫϘ:?^nݻ$)(^C,wu޽mv{ήe[lgmU .쳎fV+YjTVnt0fk~h9~<'kvp#F>dʔI4@]tu֙ jWr$]t>/M3ki4߳=Y xۯx5 }kWdxmĥK̵klzСC>v= оԫW(3-Of.=KgZ, Z@۠={ʰȧ!>k,3fuٹs瀳{65H>آswҥKٿYlƍ Yu:¯E,\0^Pn߻wɸ_`A}곬]V2fLo߾ϢYv7l 7KyR6<3W)3g4tDEL%Jo pk:Mf{a #D ۲f-K@@@@@ ҧOo?j    pW8$ޡڕQ3:@3G-ZT/^whVv<` [E3'ɓG>7 2qD=)]h?lzu|W婧r:+ 2d!ϟ/^wW=z7k{'-'O?lA=?uFGtΝ;>$ERJ:     Lˁ+A@@bEXغ֏M^}`,m۶L2)4?%_|ҩS'Ӕɏ1"͚6>ɝ;wڍڴicG<? r뭷Jٲeͺ {d%X"@R_-[&իW}/Syf_t׋YCgn?,%E㦛n23z<ʑ#G䡇\rr-UW]e;v؎@X<3އQA@@@@H .ȡCdh@@иsj`GݔH+gGfhײaYjߺYdIyGMSLݻw?N8dO?9+zmfQF黢k˝g= (% P )ԯ_߼hy[t]xRG>}<( 2Y` ]ڧ~ڽY?VO8agΜ,5[~.]UVN}Vȑ#iVgܡ     Įx]z  3ҥ9sx0@ڵk;5nyرcζ@W;ӧ6ϚQOΝQFy… z܎;=g5k:#f͚%۷wx|ZisS2ee˖'OЇL{VB:{ԉ@zݺu} ϐ!rq'YMtM=6_L ,F/9sF[)T3fx~@A[{ͱL:U@$?*U2MoݺE<     ܁K"  +´B}0SySqy$K/$3f̐'OۥM61cFf \ԌUVMz4>|lٲJXݢE >}L0A4x@Ղ~۶m3A)S<ꫯN:ɸqD39O4byg}+V4ڦW7ogp T\Y~t钬[NjԨi @@T'~z;wn..@&~g{?!EJ@P"#;\3GJi@@ x>q}&pUWɒ%KLUVjv<4o)SHɒ%}^W|D}4(RO:%` { ӌp1cHtױcGP͔hh*UT1>sy뭷Ly]}zE=Mf@GvmGN Ckz-:`C ڶm+:Çf׺q'6=ٳǮ'|bޢ%wҪU+?~\G{V9I{[tK@@h  @>,M6MZ#JDt6  @ {MIn=z@pիW+W… MjժIhdZ>Lk֬Aj͚53m;V|'o}qϓ`~͸|w:E@|Ire@;>[-:cE/آ_e{,^]k'Ĉ@;v02Jo3Th5\cغ(˗/`=͘.6۽|*^hЩ\l*K*PR%իW;     Ėu-  _66ŋ&2.+@轷,  6}h9t̜9S(ͼѿ=8 yfϞ=[;f?>q96:fΝCO&|ڴiÇfpW@)5׹q2o<33z:s{'}Z/ԍܣP8.}=~Mt`f?xLeÆ f ҏW!'˗e˖ڵk 3g%C :3ŋMC^g   M:C!CK@dׯYO裏Ç _s! huԩSH|Bl@@HID{oYǏڵkCn*K,14,d} Nooۅ dС_jGwHP4>'|RgXw0@/pwf^z ֍geʔ~X>ٸqkҵkWoUl% a! z\n]MɓW^7uT9y٦uUD+otg+~v TUO*(# :lܹ @Ҋ@vK]`޽y D@ɒ%,;  DW\ETxN":uf͚O}zy_/{!Æ nݺIFbŊ6o,cƌ1fnټfȐkF:k… 8~9Ifo馛tҙ Ќ}z:C=$:رc;x=W8#F-?)RDt]9s<3FL_'w9\E}]پ}y]>tuf0[z-NA RիWw^r      @l *Umku  @4 xw{={C_t)k0Ymy_un_z>}H۶mmVÊ-Z$حAy~ cx괠xz$o޼Jebرc5j| _[nloڴi@z߿lٲ9sEh&5,:TkרQ>uGNc Ç}:wy]С]=}ۗ^zI (6lٲy!E_#}}hNjϭ' AHJ6  @j&~p)\ Z`ܸq~W+Z[.UN&M/Kҙm]@@.@}Z_?[Q3zi5h^3kqkf׿%3g/c{{A }&cu=)4K>4kf͚Uh6Y/_N:uvvoK>{ֱm٥~1vH]utz]zݻOv76\ts挣wWʤI̬*$v#k׮5&ߞGoVс")3:~ᅴ?<7m#  [\@4'TiF> *: :ߺuk*".@@ xY:np-)*Ѐ۷˞={ѣ;wn)ߩJ(!2ezsVQv᳊f3N'O^>|kfҥKr7߄׬Yr[;cƌϳo߾D@@aTtpMPc…rʢ%ȳ=#x=>{իW͕*Uŋ* z{ o/TL>].\ 6m23iޥ|OA 9WnޣoYz@ljbm/]MRET~l銠J*Ac9E:4Qy39my&>w6n;$@$@$@$@$@$@$@E:- 8h\B$QL(> v/XZ+!reʔI-[6:@xxk !pmqFpoܹmR#  1Kz 4          $/_>ټyܼyS=*sM5 @L>&$sSPg.cƌFtˌ$@$@$@M3d"O Xw$@$@$@$@$@$@$@$@$@$@={Pxo @4H:խWZ܈>G1eH-{WZh6 #IHHH_e˖ ș3gȑ#+W.b>          %Ppav풧~ Dz#?޻f      +WN mÆ ȏIHHHHݻeQr)KZjɃ>'N{ w/Kɒ%eԨQr$}Ҽysge˖-pBWreX^jI&| rXҦM#Tnܸ!}+ڵaÆSNn^ѺukrqCF|w- ]H$oi˗/˿oY~[N.]$FAZ 28wsՂuEվ+Wڷl26?T!ҙ~ǎ/*Yƍ˾}ʄ }5 7[jP O"_!X"s5O?! #ԩS \z1{QE: $,S=HHHHHb'|"X`ɒ%S!:paױ JD\&w{gˬYEy ˛7jA ,%J.5X/ B pl1cFƌ(g0… P>SLQ3dRT)g.~gSm xGՌW/m ?{#ٳ˧~*of:G U̘1Cm[ozv=1@dʕq/F")G8fe],[ 4 窑UmzHp~af laqҥ\apfhlJH > ;gϞż$@$@$@$@$Fa@ ㅏIHHHH*T`] D3SL6mڐwI&)SR? @,([|ܹҢE Y~_]K.Nnݺ9-_y7~x9yt\mқZ'4x5>3wY} 0ד9rD޽.\S8^xA&N(/^$@|=Wu#G*J돞 E% x 7o^2PxIHHH"=G!1)SqzEHHH\7,4 XcldO}     CUA)%*b7AΊ-*%r$I$N^ϛ7OK%L>DdΜJցf~]\ q+3W,YA۱cG0|>3ߙx@VZ%7͛7onO>'xB&M$sv(;$|9Wj׮];=5jdK24mT>c5G}H3E{,Y2Tz1+VP|Zto&z7 M:DbŊɺud߾}j6|i$@$@$@$@$(ƣO1HHHHHG{mHHHHH@ҤIWǏg 2X}ga{a9ۀr۶mN-va@#FJu8\yWÁ/ eʔ5k^|e̗Cs7|L<9Ny>lڴI/_.m۶RJ9jY˕+'Ov(;$|9WʜQ|fr4f9s*m=Ņ vmo^gn-K =݃¸A;`^ 0$   :3>$vP     @Töo..]0$     (!РA'{챶SOlJok3:,XP V].0Ǎ:xsf]?7dɒg#[n[@\Eɓ'0N{X`A+ޫ߻Zgn xKωx @h=}x G`*;}\$`[n.<:_^og T,HHHHH"ffa\C /ȱcdҤI~aYj[P!)S_)i_BQ-[VpR^~}0a?g׿Ц8m۶My #oUSHiUk30օ A裏Z @H&͛W/6m;wH$IUrJش ,ǣ ďV?8x`O _>\5pB}+HHHHH {֬YoX^xx =sRD ٺu]vҤIzIZ)XY]Jz<]{c>}!d˖Ur#GJ(RJIɝ%c <oU nʐ!?^8_SLiÌǏWrw~Ifs}s݄m ~ƵkF$@$@$@$@F_z5ں@`' ŝ6"^sM$@$@$@$@$@FɓJwޑ'|R-*xw^:t5Ju;sD0yd`)"*Tp%=6l6\r|ٳGv%sΕ7ozH^~e4pcyQY|wV˗[|=X>OwQNj/WV`A)S(c=& J*:֭['zK{͓֭[K͚5e˖J ŗ/_E fU/_|E{v 7jT={={Vw|ȑCplڴ9rDضm[I.]@Zqcܛ Xls3k3Ff̘!kHg? H'YHXӧ]8*l @ PxhY^L o߮R!aHHH |TZUԕiF>cW ' bŊlXs\rk֬۷o;b`[HHHHHH pΜ9#NjK8ܽ{WW_}VX ;{= ݻ˾}0`nh;2pb˃ƍۃĉ6ՓtE rݥ;v2uT]]JcpmMVZ 3ĔH\}뭷 m۶ɲe$gΜ^q`Hkժ/JXN0@'YdӧO*N bIHHH"||hzL 1^4i|Ĥ$@$@$$I>TFxQBxƍ^ C"wl) gY~ai== D0Z(SN6:&M*S^џ^zi[uY*%.ZH*?f4ѣ>|XeeLRy˕+:#{A$@$@$@$@aKJ*Vۖ,Y"o       "pJ-"l- @Xxe̙Jyf)]tX     @3صkU$ 3އas8q^ZvޭÃO%y;vA[Ƈ~(gΜQAu{3OڴieРAA<4i$_*l׮][ _nGVժUS|8eN:U85j8ޯ]Vj֬)ΝӥW^T\يFB >ܡ4iD_eֶm*$̚5e:F@48o$ gϖ .aHHHHHHHHHH v@xj\ D-}ܸqCM ={VyKs%3g[;&OFOOʦMTߏܹsKB w ,h#0⩧FA`_\9?̞y]B{v6ԍwa&#G~ PW3fHztkx =RN+$s=en; x"{ 0 ޣ1Ɠ @t(Qz? s'f} @{^E x7 Zt{IC>w\:tZA\{wId~"y_dɒO/ [rIݣG}-$M 4kL!/#FS8am#o[`M{ we& z Ν;c-Y?aÆɓu:Tmڵ`["ET?3f趿 P / ɓ'È.]}<2rbn_ ׆Av:uһ\ 8sóiӦ)Grx/@E    X!pZ]v@G.; O`*se{D!@ڵ-:'<Ã{|,]tK/ɶm,ocƌQ"K^xo,{cp0k,k׊+Uxִ>@0ア`ٛ])Po^EK_|tرcH{=g JrʕΝ;=^ 1G0^cB&3gNUʕ+`P:HHHHHHHHHH‡@jլ}HHHH]xM}c_!@= $_{Q[w$NSiӦ,Y25D 2((֭['XxG$K,*=آ D|r .xv^ 믿ᄈGV]VeDn$[l*u޽l؁={pի H|֭|Pp/XZҦM+ŋիW;E|rI*Z.]*nѢEJ*jkb~Wv9iРIF ,(=*G\p6^>HHHHHHHHHH TZ0f @4H:hG ExڵK6oҞΝ[^}UUIѣYfV9*`Dׯ_W|"IzcCYi*WlmfLj;mvUjݷo_0N:!O>E2 D=\1-꣏>!< ۷o'xB&L5 `0>GuӧK6m~RJiYɓ48z-iԨC@B{ԿhѢj%         H xSX1U5kėɬHHHH&@^؄GcM|V/L8nExtrYdR:w<߼yS4YfUW!ucñcT057qݻURoKcX'~{z3LoOgVkI TÇ˯j} mժ?2 D5Ϳ;kx$IۥKcƌQn߾- spٲeOʶmoO!SL'O:dhqrqU/f8}ʋk<&O,sU $OFzf'dSX7 @UΝ;i$@$@$@$@$-L׮]n6 & D*x={bwAiҤzٲepK,{<ŕLR* uʌ3ddL|އJ BsA>dؿ4l/ "T, իk׮* !~ BzWp3نP٬Dg}&<ܸqCuYÆ SB]5 ?㺭=zmZ8[h!D߾}{p:'?+ȑ#`ZU"?Py5|Æ V`%fѡC+hѢJl2qo_A A cƌj@~+رC |)HHHHE`Νŋ 3 3PtEsh GҠAk k&     Ӣ(fD_VR7oެ! 4i`;W!Cɖ-hqEBxu(k3gVw*}0m HB W^NѼysb{Gg@<@kK&tXcP/Mu(Pq*ҥS3Cx*r &   8:iG qu=" $qTЛ7oZ: hK.-- @0׮]~r|S2)=T\YΜ9#s̑={ʉ'7w﮼ <"+0|ҹsxUs)?uoڵk["L2I޼yxa<Ỳ~[U&2o<Że˖<ց2Sʛ9lC(lmqcF'p#X齙(Q8]Β%K0s fцy=;~r ]&d 1>(/V3X5&    x=zī f&  X&{:^FsM$;Y؍xoL#    H'@}A3#q3gVZIJa?SШ{l I$m(= @0K>]QG__#%K*/(oݺee<7]RqK,- m#|̟?[>ȇB;w:Mk.+Lo:fT  z'OtB+W.E`@\ҤIo޼)yZW1BJw! $<k֬K.MF$@$@$@$@$O HZ;Q ̙Smۦ<Ƿ _lYٰa 8oW^oBe˖駟޽{ՠxׂ4a-aX3xO{YEjJ #ȱ'd֭tv`v޼y-Zlٲ fI(̙3G:t:ujywHq|X /q@= c!$@$@$@$@$@$@$@$@$@$@ s=Rvm8q\pA=3s: D*8"ԆhG;Q< ̟?_ Z{CjakOf  uwE6m)8p@֭'D裏Ɖ ɓ+{gynj["=7n QF}-dɒ%2sL'|J7 o۶z6{&$ow 0@^u#چ޽{KL֔)S<Bcǒ1cFw]7*=FD矗dɒ{=2d:gÇ;6T,HHt@IDATH z TXQvdJ4i&e0  Fjٳg;vDc٧0'PjUYvm26gþ+5+|8駟VNc¡-l @dsGFcʠ )C$4!Thŋ9>}o@dmZ$I]qb*Æ Gc1Қyoϗ!C%K. uMzk:қWy67glcag8oV0hoh!Khin#ihY>uzmw赻#X"`-OcK&Mu0j5kZazS1hJnR"|]><ø&p Vbf!L+믿#<ở&MǂHHH;{Ɨf|)2? @, xOoBkif1Lp6pB5+:$1O }X? D)RDVڠ` Bեa46BK#ֱ@xA9v}MV#rR^Y "Y03x=t$ 9 DrX'K:?>Nٳg %p &CUT+bŊؠM6v`m6sקmF$@ ǺTq>~lݺU3gN$yCҥK6fɒEf̘!oߖ={Ⱦ}@ܻ0d #_~Y 6 >6 87xٳܹsGƎ+ݻwwL=    |b5!+"I}D66:p+XZYNXx1, <$7x_)ZZ'G PNiݺÉ#C q9.L          'ЬY3ݻޏ3Fufc HHHHH7z% }1GLKP }ܹsi !   K'N/B($@$@$@$@$@$@$@$@$@$@1F3>sG.$@$@$@$@D{=GQ__,E1Ar h$@$@$@$( 6Q7ydZjvYH#  m͛7m= 7|SΝZQk׮Fsl /ӑ# @,xꩧ$o޼u =h #$+ٳ ҥKoV#   8^|Eʕ+2{l/D 8@#G3f4C$@$@$(#v D#8e)ZرCVX!֭ˇeWѶ-Ze(   >}:Q5i=Ga{ I :{|   2eJ[|WJ|?sLiܸqT          @DCҲeKa2uT23  `)*$    @&M9&LR%}7)IHH",>$@A`2~xٵk!JΜ9tRV-ytdĉw8^~e)Y5J bFq5ǖ-[d…ʕ+KŊUdjI&|I…Ւ6mZ+.:ujU7?8nذA̙' (<+V,N8} >\]nZ0o7oo&wUL+U$uԑĉ۳ȠAҥKHElٲ&MxOoܸ!}Enժ=Zɐ!om>LΜ9ҴmVf6=#I X yxvf$I疳 #h'ШQ#ԩS}*T(eիW6q$@$@$@#h";%p%h$0[@QM/Ӻt"C [n3[nү_?L0i$_ A޽{w([ʕӻzŊұcG߳gOKx|r5j(qܹMk׮-0m ׭[h_jT>g;1>Gx0+LV~}%Ydf|r 0s'݁ݞן6_v~v-dɒ%j`! w!]vTHH \ҺƢx;ZU< jqZI HByڵ؆Ә-5v91Ͷ G.riI}} 쀲;$@$@$@$@$i0pfW#UO>n$@$@$@$@$@$3O {ŋeǎJ OX<㿒+s5sifrmx޼y֠x/Q|2eʨB~!/<͛zϕ+dΜY8]B駟'M6 Ҙ .X"L2 H`Y, ~yU3g(fJ     Hx+V<G^ug.V:(`kx)ǫLxd}̵~xիW%3í%KMk!z I mҤI}<`ߙPJll$O\:t 1 t|@4iҨ<ݻwWtNtMeu$@!W{dٲeo߾8WxS0N-]T0K_ɇAVR0F A]v@ӧAv I$@$@$@$@{ _އaHHHHH LOO#     H"`z8O6mț R6m)כByUi֭[d\rI"ETZG>U>o}VgyժU<כiuuխh̖,8̯ 1sΊb@ӦMլ0gֽ{.]:ɗ/TRE ( [A/ $ uTTI2d Txq5… efΜ^{L*V(}z1D@??eŋ*w,Y\0PuomΜ9V%JX -cǎ .2͚5SiQ_JD|r%m ,ݻw@ O1E4    wz{,FCgʔ)g$@$@$).]䶩xizZ0 pY?r1K׿%@ 2o<Тp‘|HHHHH (P@Zn-t>n8-[6\ԩSGy%`@}:-b)S_ pΗYZC%߿4lЪ' ۱;3}(?gBQAA&N5kT#Ggǟ}Yke$@$@$@$@$?hE &zz: ٳ HE Ex1B~䫯 T!-D?^j/yxuf?|gBߺuKU3١h H A@_~]+)5jdu66m*qb裏hkNý5RJYIDǭXB=>ڬE:7xC Z{CBB%KؠAI X ' |V@ ϯ* Hz \>OyO /%qCxqccRx  $x<X8Ck׮iӦ)+VLĝ3 koo~ke~ݴixo"x2.(^zg6W?^y=!a߯:*`k0hӦM L ?f5kiŋzLOu<vQ@"?j {9"Hvx7^X0S|aΝ;e߾}pL^/JժUbvSSO0HBK\ RtiDy4 HhI&U:t|`6_ yZhKib7o |9w}'@* Q"Ea-UTjg5$yʔ)cyƵcǎqfE*VhFYf8;̙of={Ʌ {nk}b# mzܟh$jAx:ulrƍQ9h'ϯ"3PD!@=cF}}OBy.w.x.G%pmYIc@B#  ֘^ݣ"܆hϓ>IXg.vϗ:S:,Yr6q/^{ui! $  !Ci۶Z [f  P/xM~i1 >fwF{Ѷڵk+eg#n]Z5vj~lR͢uLVQ3Os@Gǣ&LP۷oQ%l"=_>lʕs  [lNfz3q,Y]k["{xJ=qg.܏$$=3}t\ 3aرcT[苍pdb>vE MmLp0sYs\%u fv BD0_E3f { 6] y㞄u3f}7xnG$)=4   gϞ+IHE/k,\Z@9r$a@"x )Lwmg&x3 ^m|Wfg1%Q07'|Rt)81aq}5|^y9y"k>q_/y.<m8?5hWiӦu%X)*vوF@ԴiS/gܹs{x  GQ ~b ,La{.^XO=zHjCHE4g}Ve_ a%fa2mO>}z5ӭ[֢ӛ|g{xm{֡C*x6h ]$@Li*W,YkȐ!. 3&:33Lo5Ә᮶r0K ѻ3kt#@H$|{?܍7N= kذa yy׍?gNȃFVZ9͏g?5m-9ơSA H| x/Ǣ iϘ`(;X$/1.- y}bG f2HHHHHC,]tx&79%_44&^* <2@?<(2gF*QNgmord4 L*YZ ҦMB @ٳG蝹fya!Ҷ6(4gdɒosH 1{^baC?D^?bُ)0H^E0nWJ8y^v8_~׋6)ĊW ?مxWp֭Vr= 06Lu {x'pBd;` aH"~dߩ cFY-~m~ t =^N|M%Lj2=T4 pMξݯ_?#F[o=IŸmլYS9APؕW `wffYZo ,h%{=  Ppa5PMh^J1w3ϑy7egϞ8sw-^uw,.zc|C3}fU@>&i'ϯ#30ۭ罄.'iϘA,i0Ih| ^.16-τ]bFxMF$@$@$ ;vP^+H 1[n- L h"^zشs/Ryǟj!p'愇8]zvi{uUy@ L'pÖ-[|-&Nz{f\ I m3:-ֽzRS \rỵӆj 1я?Ps\҆LÆ SSq0['NcPu5kXx ^|7eE'o0C/p܁gSL1m~۶mۡL8涷?P#Ql M$}X:Q0!@kt/>I:>}gJon.G\f={9j\xݶm[3ڶ?pÃ<5{ꏷ{Jw%j7am K*Q ?weῲ靑[NϪk9xdV}憷eyٶk Ŭ!o>O!3g^l%˖-Y= ̙3I2ϧ@^e=!kU|yvAׯUYF$@"p!5ka <=c|5\4F;u~+,F H0MXAav1cz7onm{ѰaC5# .À@ kiHGի'8]7eȐA0x&f 5p=?~i!pРf͚9k%Bs3?I Ppo y 7ϙ@r"y+C:b7jg7}j S=f5dtG^w s+o3f0&ڎg 4$~>k/ϘA66!ǿ@$@$@$@$@$@!иqcT*3nا NKG 7gyFyFuuY!F0R^*+)ٳ rnWfgk\px2`^|t% ^zɡyU•3^ۅC$`h.$ljpi/~翞Js7oGѽNAʂq.x"]>L..\s?vH 1'Oʻ+yQb_U0 09sf%Brɓ'_rYvV8{zkƉ:w6aV)={C=$h)ٳgW͝0a>|j:Jl/_n{i=aVώ;&{/g{ァ3f]$@ GN:bzw=vY/?ҥK+V0,?իWFI99u2? ė--[l(x-ybӳB|MC{nf d~gDήz΁6'H| ^">2Xydݽ_< = ϘAXH.Wqa>ylՃ HHb@ժU݋6mڨ11<@-VXkeu EB?\ sz"EI#7 Ǎ'=mP%IB@.]d,Ofw+A@ %1c`{L8RӒ@`VQ>gWbÌM= zĵљAxoΤu̚/0}qsTfh6q:`?g@P%tX^ 1{4ϘQs0`ߓ`]]g̠D Sx6hE &Q4   < HT xxM-A0%FFay:4{<=$wm#b? ʱ޾%J .³U5}lL󅥽?('1mxt9xI/xC9);{ОL{Mٷpۆ0ĉJpaWlR {.R,_ݗ+>OK,ߝ`hw,YlIjw[Eԯ^s^!X6. AK,Q}8z ?~ tz3׸׵kN ܀x "AŻff̣ܵͼ涎by>:6l(=zf0hnߌo?i$_]Q.Sa5\.qӧOiӦIǎm Z2Ů'x֌.>{lyb&!f͚r6p!!\JcI$@$@$@$@$@ ЫW/u)€BQCx?ydRJk<`U_^N oaoq[lq3f۽{[V0AOkwܩfq%;{|=^{-$"/둪H6^mJEXW6lcWH1 ;1{yLB)U_;_16%Su)ud=')HHHHHRNp-3=-(ŦtLzKM0hGQۃhW~ʷzV1xo0TAl<(bޔ 0@|eM/97n*3f̈ .F"yGeo:dL% Tqmrĉ7{o:S$*ṯ󺞒Lh޶KVm̛$@$ Ż,6jHR΄:duoH#I&҆3 (Σ}j2 4lP/^\o -Xy[>aN4)V7oiaO* ?)vuemyƯde ½ԫޅ}_ia1԰ӰIhd%|ǜ,yBϹ ' }f֎HHHHHo茅]*pѽhѢ,' Ӷv%A˶;>`0.3Qs;RJg}pnwʕ+#P)dҥqa'HIͼReK/ TvS#cOq5Iz2}/f{3mwrWرce]GSvmҲeKe3E¾{*NO?C4b.]ȵ^nTb+撊E`#J OS`}B$@$^_|  /xJ@&$  yחye]zgHHTy0oy|hB~W~OQRB?-`^f2~6Q JA@:l6A X r\"5,ǜ?V>fu3 m٤} Kd=-gJnTOS X5| dR|k˖-(XPHawBk}|0,|Hl-["|I/4o\^y啈P߻w~->lWn׮]1Iȋ][n[.VHQOch6#:#:l%X v%|W<\rIDX/ p~ٳg+%|];ṗ~n׮ M.LqMuiӦci A[n+/ hSpImJ{4-3O CX?és%  (Wf͚NytYz-G Ll[ J~a_8>A-ޣ_+Lk| @lk>f-qTװasla1İ0IX_1.% dt\f*g`mHHHHH!s :k2u֕9s*(TG(;bwQDLvG 0U]XqUZ5j/,kj sޭ-YU??׻2vEmVlU_|OfDw)p.{RH2`#Η͘(n+pرC^z%GE=0 ^FoQBH>'_59)^>è3w{',ê#;d:E:;ox1 2nӦMQ xH0 B*Q}B$@$@$@a7"b2: f`7cFIa_(#g ,^9^6_dA*އM;S>Y" @+?|YblذAjժ%mڴI"%uH/ؙ cL2rQGŝO8 AfG%Mu]V\щxXK *:y(br1uLYjUD'7lZ6C!NYK#L:_⨶o+Exq0C%EG-ܢ~f0 =a`)fw16CL;2ׇ3dSLji% f7n]6*WW_-v.Afn/_\-[&%~1fx@ЄryK:pׯ_ 8P~wU{L3`Xy4v`ҥK.v=qDWc):ćvTXQ0d E;w٩>h>K/J)} Gr!Ϛ5me]&{O?,wsk׮^QF$&xVvݫ:ouPHHHHHHH&мys {j,1nܹcO]V=oi3d_xK8~K`I싇{/"}Flv_D#QNmJvgA~gScFz}WaK/nA39{N3 ySvu䵴ًRE"8pY-@"F~|T%Yh 'O{^:>]tQu~Ǐya;c}qnںuqKnt.)<묳|שS-יspo鸡w+2zLshWYrHcӍk$SgU[GK,(9b6 7fC3-I #=t> sup.GaF|bW|#qG.x3űk۶9J ]o6p:l"q}Ht31 Ǻc<ss#ݻwtv$gcD>{%m]FW,,XO͚5-o67 8S#;>Kx75`}ǎ#;q̊kL͛HnK/V?ʲ $ƫm* %=:]&3YĖNc,g[}~8hogo J!&xWC,B'ޟY CKe5n(gG\>Ә`Ϛ2r+\sj$5jXw>2KyX7ݒbܹsU9sZoqi2Iv`Oٺu`vüV0 pG5sq`_~e4i`$Zg(6lP~={ M/\ЯB[.0sH3Խ3)$@ONz^:ԭ0,6/\P \rDWw |('o::ExOKSb4믿6$|"2p6 2:a[Wx}ؙ +p]l[ j/$lCI_Dp bzyA|x-[lG5`Y9X­l~kK~ ׾3&Hqp$*52xZjU٤,]0u`XwWqϏH裏J֭#°uQxn3%=׈mͮEf6\'      Oy \E85k_(E11[ǐ` 9]v+HKQ:`rOz>aJ T :ul .3d%Ηdy =&:RG&M +=el |x &O7ߨ<- *UR(Q  Szjyeĉx+~zvum/;xرc8ad Gywqmˉ( TA@)=̾[owyf09&qIenj:N׸NV }T1#jZ$׾N yѢEJJ10a2 U0ԈVG1H_ڿ$P(T\Y^{5e, ,HiaVGax7#uܭ+|||zYK@@qr O.Fq.u^uU*XVŬzǍRem#"E8~舀B-S^;t`@IGO2eB)Yfø$F`2p@u "2[^+1\SƳ esφ>f5ƸD1"YA39񽰯ӈ(F<$dg_Ot3 <] 0LR>(MZϽ?Sй.Jcq$qƔoZ=[W[G',kM B~XVU| Othy$Kn(i2 P `: 7֭[ ,gcyl2GKt%SO=U/^ 5nL`qPa,@Om&^{zɱ{ #x 59(zJT0ݶƃwT &@]s붥 L6LJux;_/YL,μb$(zS|Šg)DlMxwe;&趝w/A۝I` PvmycXj1c bnaKr-(Ư{0f&a쇒[x[Ǔ)@T)``W[fG#f#Ziut3f5d:,k_7Ыq-۴iƷ-Ѻ;BXu^= Y,I cB< Ǐw= >ףi+Vp _\$osW[mNf UTQhʊ5}vۤe˖iA&ຂ"LX3o^~'\e&9mo;(~eieZsF~F{J$&5`s+ Ay{&$> s=׮#w_|˂Gy$oQ;dþcN'D${[/.6x\'7,NW_}LjA{ ou ƌ#=zؓ;A:x,eyRIHHHHH #h(T߈JXxa[ {Vp bYXiVs -KVm"Aݣ9w٠TIWar+o3>>Snj¾N[;43 lRϜ}uUc6M0c)E{eބ׭[B'cÆ ;v>ܛU%~b1 @LP5܏khD}XgՂZbq/%JP50f:rիgοQ?s`ݎ :uau@+a MZPlY5q%Zg;=eEuYrJ P,CQ$Hf7N)<2t|swܡ^VZ)PZ(b,Y&%Y`n,Xn’,iy-[(Ist,`f=ʅ^xA۴i|$@>fv&}ʽ0<[B'(C4.+LI J+?%J/|YeN':.t||U+7"R7k Ƀ>11 ۷oM6E싇aDBk#y ]v9w xs3-aú}&z{%úNQ ~u@ܿR{$Sd; ޱu;ЦmJ~wj u: @n(yī?&x ͚5Fm'C/-(Uƍ2~n6 M`GW 5.K{1# :oQ=AI!o&1ݦ5jD˕.\($quX'^*z0:|1+Kx !nHxb5ġK k⽩h3c'fMaVѡq7s(xBj׮-+ #W1J8=8'g+bZK"맟~=Xl}á|˶Pl{&RgICPC9O>L4IէL2rM7u7p@yUgņ ~ /TVayB$X0rɓgQ:4 RY˝;wvCy 0'Ç+7~UE$>`|7lMO~a֭OS D&x $DkLOXv\d?Sn:⼌+:8ϙq醃-Ύҁv\y8Mnx2uv: <5{y9ny .s,INqIЙ9:8kFr(ͫv8kncmΊIܥw`yd!Qxpt#aQun/9Ws~-Inx6]Nx3Qu9G]\/6p9s 31q7Ks,wqyo<\DȈSü-O3(ގ%{R D ,7oaGH{3bG+m>IuZhQ)y%ϙ0Noxwo *39/s1yxɖoa{üNAݻw܎u?3?>zr <xuYQ"syŋGzȷNevHQ lw EݫЖ >n^kfb@ \veJOB ðj(fGiɍ҉i K.Deu-M^t nK.ә K%cEXnh-MYd^85j'%<hHu^KX6m8ʾ^jժʺނ ygrëȠ\j>H XmР̜9SypQM(}bQcH*U$zef[sEӊ)kwG_vw^Qz}׮]nxځmԣr͚5{n3Hq7o^DX~x)>aaSyWAjjٲeT-K#xׁBo, !> +>j&v8ΤQ3J=]w7έ a9 +ęHa/z7=*k{`ߡs:n{΅la{üNug9Q Qwk׮U߂CU^oZgܧaN7 xg} ?x= -,<2Ii?|;U0?~|תL;B$@$@$@$@$@$>8۾m>GDWzSݿl2^_Q[u^z)}k8(6XJ3QW|I׸K1G0QZXש>z& CRuͅ>fAcQ^PS ^X1qQtx{}\f`ڿ.֘B#%3q סĽuV%G(1J=X7+|&"Gu~ʅl+T\'w;wyGU JgP5jP Nj * 5xtJ1 ko*%z(ժUK ܛ1 k׮-Ap>N2E  puX?{G)cM$OPw(+eО={F8zƍ ST'R4'k9uTunZf3?$@L8qzƚ{ف_,;؝D:t2iҤ|'<4(` &ţx^p Q-Oڃ:nзEu^C)sV(^SXe?#ҸqXQ:Cc33k|G뮻vӝX_1U^4!Ԯ7&ݠ=A|({?${"bb)6|J=SɨqN&8lQFj /8dX* d  rxjq% :{;[zp&"p 8?cƌ|tc-^:Сtv.#A*9w:ؠTJ2L r\"4=g?}/ԮwI]’z3aDZ mWK#|rgxO6WB P>w<sزe!B7M!-Z̦SvXreUH= C==S }mO$=,bB>e/ q >x6+,iذaPTA',b8{ IH I/ ~Lx)4z 饎c-u&X>LƢ $G{Oڶm+ .+x^ {zGLLV2`؜\;ҙu;<Oz3]*裏F=4VŋWbM@zX^n]DVbkK _K_D80GXשˉg /x<.earT9eͿ_~r衇zU9>ߡC~HSVp^|Ep]B$@$@$<PHH0y9޾BX1b{xk <{)cg(Lf;lcÂH3-+'r\Wi$9oac?tc;vիW+O0 00Jf0̮,k+WG1  Akf=CW.d5iz bߡ|ٺA%ᵒk^5rʩ]茈>z cUH =/bY@އ{{< :,[p(`gm tI3 &Adɒr-(%}ƫx^y ؾ}{<Ͳ7oz2]ذaCDd}/ʃy{a?CRhNPR=-~RX10SG8Ib0s|V @a{ևqa5'g&͚5Wu"Xj֬)M6U{/^`z6(ݣZp_י6m'\ =o_ {S  F@bP u((6A4^xk\"qb>f}j >&N,XË̙3iIk $8PuƬA \#G}|jҀ@O>K:lkC {><EsMf #,7:-[M%|iq$:6n6ܹlܸQ]I6&}k_R-Jr':o ?ac\tEquuK608JY~|\ %Ux߇BkPͰ)㥖@*a{:uȑ#{MoUكk|y7L0?<aHx>]wujb&Aa#F G):#g($@$@$@۷7p㏉eT$bovsdv$M [a$I?09Pb,>f0)q p dc3: 󙄺uM:e-ZT%6lPz׬Yln^N}n`fRN=zP`Un۟~锔w꯾ a@5^@1 Qb޽{|7U4XKLe_);V)vz)9묳ϫ>PZhUJ@J^0 ;޽{KuǢFOxQ3fͥ)p(M4nX)oٲE=w'GzYp `9g3~ 4H Ks-p]ȶoX)#𝪽e+xkԨR,$)(ó!&IP&YsHHH 1bxpQ F/G=VU淜5,)Ϥ.bq+R,Y\uU2l0e0.{ZRxjJ=Tc˖7(P?a(_b栟TTIWZ4iD)tZJjժ%pX[EO z)#3= ,֣'L-ZP Px{?B!Hc+R믿.fyx >躉G-N뵍ܻK aRʇ=رR?e׮];H>}V!觐 $FG*VZ[o~X17mݺuSJ(!wqW AX:;e֭ҥKeqDa `߼W&T  Mg>3&8BbΏ HHHHHHHHHH >ZuiݺL4Iy>ە~JR23x6TO%MU F J(IkZA_,СC=BP̵Xyx2:Ow7gʼ4Wz)iӦ(P ??U9+X>}<QBa;(FF! +z_Z3|s`%HH T\Y͛':xbkU_(G/;u}gIHH Fs^W\Z85tR  #>;$ dE*P2d ҿkax}RJ}K$Dzs.  ~IY :c󀂧-P|d3(f8@)xfp:ܗרQC.\aI0DW/0l0p4^a7߰9묳six `7ar ;ӕ2-8{+fcV/xz`ݷo_4|p`/Pт{&_o^qI$@$";w '  VtRipN^,e 1a8 &]~X=PO(;SG㲀 zATϝcɖHO;4x`% ~(?(uBV,X ()+ٳ=ԬYS< 'ܹs RD$Zg$ߴi_ᘙh[@=~Pݰal޼YM8C㎓c9F|A$M%XQ>(#ޖ-[/ParJ̉NHXQH2edɲw^5hݺujB { @Q'* xϿ3ϔƍ|X          !]2CF\aM6Yӆ\(sR>w-[`/i xO~K$<G/ݲ~'~. <viSHH@f{Q|YWM'      #>;l I{?fÓ0X^0esi>,B,:X* ,Z"ұcG:th"IHHHHrQ}g96HH <P_d̜9Sy6lժ; <RHHHHHHH /1cϖ @ x ٻw4o\/^,rJY2] ,2RփH 3ٳG~ ւHHHHHHH2+ƍe˪JΝ;WFfHHHHHHHHHH2a/W۹s4iD.: 8Q?G6ܙ' @:u$Tʕ+'HHHHHHHH8eҨQ#>}HӦM裏.l(^          $ˋ/(jՒO>D֮]+7xL2VLMN{ENP>'#A#p ~        p \veҦM3f޽[:u$oF2w          #Pxq:uTVMo߮y޽{ε5d*ݻ7:$@HHHHHHHHHRM`Ȑ!2}tٺuL6Mf͚%Ou1̏H `v kdtq'Aу>س6mgysXtiҥnh"YlXBJ*%w4nX$׃?ڵK}=V,?-ZT%.so3q}G  `E۱W_}viQ;5jm۶`oxbŊw!Vy(QBN89SNwGmWj"իez~`XժU0H>sy%O?pKva$@$@$@$@$@$0c=V^x-i֭Δ "ؐBx#        uPx2.Bu&~@aB$[{1",YRz1́9߰a~I#¡x* gC 4h oڏ@sU͛7U"Ť޽{xg}vJV(ޟuY1}]U.)7~x7ok夓NUW#+VL׎t饗 n˕+gRۉ(;7ի'HtرpA`kIc +P䧟~={?&!eȎaY+ò~͚5U=6n(~|ײg7_39s|uH4&&~ ~O$`Oތw+O`Va r2rH}?$Zgx87oVʙ={ԩSGMBS~a&M( ;v쐕+W*8 #0c ϤJ*0 ޫ0a0Cev*0rl9v@         "PX®]8,nZ8jkK$,/_܍ c|ӽ{w믿ERzu7ҹs|->zhWJPĆq-k/AJ^8 P} d+"sN m@),Y"qɞ'xB}ݧܼ޽[ڵk'^x fFϏVZY}ҦM5 ;0 Zv% dXSl٢&@B$,KN4)x$     @_ / ժU_~E.W_}ԨQ#0XxNv7ړ @U2@񩧞F$@)RDޡC,X(mHP衇TԢE*erS;`[oU:O(`p j({xet ̜9ӵVQӧn"bÄ \Et,k+lkg+#͑G& '0ydYvmVLo5cn:u仉>c2=+LYhl믿zEa @Xcm۶ù J}APg$@$@$@$@$@$@$@$@$@$`#C,{bpH \r%n`f7C9] @Ptד a.|C&ALˁ(ՓJY,UԩSGN=Tb֬Y^IݰW_}UMB٘z9A$]tQĽM     'pwgrJ5>+#oܖhnW$@$@$@$@$@$@$@$@$@BjժҴiS՜J 8s`.@ҘQ/_oժdE+#lo3̸fl\DZ{Hݺu1g=vA!E*޽{xH4߹kZ^y% @ʕ+'7pr~m`]ϗG}T0QX1bR!/"H 5_}ᇂ{m۶ Ӱo kN7oc!Lw}WN?t Xv^&    ,*o/6mʬJhmh>GӬTn2          )SBo}8x$ $I@_ȦrʾAT#1,kotIz((QB ۷oD2A0+˩ԽW^¢sӧ}σ ߗ;vp`9awq'J`Zy\t^&Rg^XBYF8,ժUSln~ԩӱcG93lM$={ʸqWJC R |Yg c|J .?w'-Ŋ{NJU޽{˘1c=><"-mu'|R)ĉ[nO?)˖-Fd      !PJ'>| /1ՊrܮBx?|)]t.WHHRBnc :sO+=@"~D1 xශ' @'%H(²(JO.M4Ʉ$@)"Kz ։k8i$UB2e䦛n-> ~Gq_2E*o|ʢ2,C`ETڵkASuVy衇rȐ!1{)O6MaA֟q_{(q#X)[+}"uF8C9e[}AؔN8Ah?rHfт+B.rLu +VTJ'OgyFMZol~swz2rB&TPA;y;Ҷm[P%|S0JOp:cr?ʇ`U~Xń?ڤwp 3UVq0l; @#g6}'PGuU=llJT7fMXQ_R^$@$@$@H ȱ$@$@$NxVB}ٺG`Æ BW1 Z+NRb>}8/7.(C)֖Yd޽[#NRHr_^YgZ4D+#mrT?\09j2c x= -msH b˰aJ<:+Z(B|K!N^p /Bc&^zRA-[F=poݺ<#g}&w^T0զMp({ԨQCo޼9b߂ B>QgtoF[djϢExo: 80? d2C9D]Ҿ}{UM*އǶs.  ʉ'(k֬9s%)$@MNSMlB9,(No۶M~qO҂{VǺ }ҥE]NRam@9u!>&G@{6a^u\%pou~'xBnf`[n/*}vְte{=` @438C4h,͏1BwLo2`s9.w G|{G-PҷE{駟"vÒX4'{9' @v$]L_b7uԄeT^Y 㑰fL%^c>U0ȱ\=l 6EըQCyGɓ'W_ۍ.a{2; 웝fIHHHHHHHHH w "vfTysl WHHHHH}VS4Sr,4  d xփHHVXrmg}s,F77VFe$@i&`>ye4U`q$7N&7UVK/*7εbufH#p:݂{*V~5:f뮻V;0e9}Μ9L\pAejӧPW^TU{=WVeѢE*N:I8㌨h׮˖-,Bt׮]b^[LM믗+kcǎUSXYreiڴL2EH1tPO {Qu֍ G'N(=-Z4*~`YK\/: ˓O>YM5pݎIZ0b3Drz!۷W <<Ӫ*k-"x^risH 8޽{Kcz3RJ&L+V-^F0y I0k֬ +mڴ(׭m69蠃H"f0IP CF@N@N^6.$m۶ )Ť@-@37ݛcHO^5 @v5\#? {(RHryXO۔4=zꩨ" ̀-ZD(FOx 믿[nqFu?RlڴI)0@;8RGޗ]vR_~[2]^x1:VTIW.eܹj7ʕ+gGUۘk^xbtq.\g׬Y#WS}/$hcaw˖-ϫIhNH /+FMTZOe@c6aŊN @lp/tRH:uXɢ@: `SNIg,+ .F9J sVhuHc֩1;`5y椎[*e_I t)$@5իW/ī_|QK?}駟BO|<#1-{%O[`hKfKDLr馛"̍RJ IZR 5j]3K|>(ۊzW:;L⽖ A.Vʗ/\UW],H2쥝on:#Lg>h /cD)S$=r֯)$@I36&>_yAF;ޒ%K޽{5fu~~XW^^zIw.~c*~.$@8óH 3P@ ٟ+ xăg3fȺuB Ҽoy}VP*ާ 3#         @JN#F={(W^yeH1[ 0 lڴ)Pf[NYJ+,%ê1VZ%k׮U t%dEI~{RWg Vao$kYM+ڵkG=z~J"uFY_~RD پ}{T}?h%<{0 r$E[% 7Ċx2zh5jS#``SOX >Kd̞HHHHHHHHH!PHW~K&Ӓ @#[¿P+IHHHHHHH"o~ꩧu$GerX7           믿P̞=[>lb! $СCSNBu\rB阈HHHHHHHH 1guTVM>cYd|gRJ2c*c}޽n8W$@$@$@$@$@$@$@$@$@9NK.q[8g۷ $G!       z-ʎ;V{xr(^SV/T㦅#<";w( >h9쪃>8bشi<3z3tҥK8|,ZH-[&+VRJq'7/\vȐ!k.}=Y-*7N>R\9TuFe_K/›4i"f. +OW_}%cƌիWxX!e]&UVHo N؏ ]tEEI$`ܸqvڨ%J+i&*Tڏ|SL G:OSN9%jay7?T9眣'YFew~l۶My7VZr88 ~ 7xFC/^;#T_,GyfjwQJn֬Ynw~Zv-pյkW( # "wT܋(Sxx{iQ|[|rB:M'+zwɨQ]m۶UvC 6jww\ć?*߷/_~Ym=kջ$w9dRdIu%=v+H 97|/z<      E ^7UW_1uPʗ/3r!^ŧ< :* ,P}+ŘI'$Wdk33qDYjj/mڴj&t}Qj.[nU;w,e˖ʓ$/d3$N\s`,pϞ=ga:됋eA9xd\{<簨ynSx?cƌ}zcn޽{गl֬YQoz}' O䙏󁞇ciwҥnfߙǙ ߌk_z3 q3g.|͌+N2$7 lGImMG ѷI~7wNr>wGB@=|HŽؙ^xzgS oIy'ORo3wELA ͙LUꪨ^[v(AE"g/b\}bE-w,(ʔ)[?8ё[kqqtk>q&렌[:VJj8\1Ps,>   ,RXRH dAA0+ e G9Q"ؾ~@lߏˠ6WoTYaweulcv cKw>=wy{̙3= p޼ynZ:cvo&?S~u|?lX3VaKsU`ɻf͚⼲T_]:n$<iR-·5 JbY>Նa5D1xʕ[x◉rg<qz²=,gQܱڹ͛ypXuO?=`:(i$e!(pW((`]Πz7"G=T+"C+"_l'" VI }DtC=T$AE"Ks3 ASLrV\"1RDLgrGrc6$_p ,`W d"T`lc~φ^LC!Qp8Fe˖^E&HL>]Qxq(\BK[Qv-ӣmЫxwř`7Uqq ]*PB{nZX;BIH>dLN]FҸqP)Lgt(Cs,s%P^|.½1B Fg)*U2zhWoP>cݤ؁ %nݺM(vmzW8ZPo߾}D{w%}UPn^ҊVuId*)&78#c˖-jb3QpZweX">pقsUVn0>bαH&tQ(f >=& <ݍ_U/\qCJ`%O#"ŤD :xEVj@g,w5݄\! `5&MO0[&#P `2t<.IHHHHHH RSxږd~0_^>Xݻ /0 _zyøVNtU`O td*A2ш7xCTLD= tM2f+/k"/%""7H ϤxfA)'C/ۺuz.X2&Q'`>υ)3V!և@! :tPQF(hXɄ⊩tBq뭷*]O(p jS^zRZ5sW(֏Am f?'R8Y{o=<#zE sbPʻ@)0JK@Y,jժR+ua*ݣ L{™ dXwDPxpȪU5}q_@d-N̈$@$`Ȅwdh<, >li47Ux!b= .T2fx:/ǥ~ <@VgS!($nڵJ IF;-{9-LhŻ6"o8xBzLnwil+xWD_1T0xh"{ @R TL      4S0896N0ACU*RATv( =v@i;tunjvhרQ#4m8a s/j860P !Cu@RunAGy&J!WD.鴑]Za}BXHxZI Ű T{(M-'MB6l 6MY@(f7C9]5kJ2eT3F= vARJ*yYf<Q MK/EcvADkafKum$'eˤjժksQ?'O=o)f>tKPX8Ô|pɶmkULǐ{_> ' M 6RJ)En.S%uhJ:/ Taѹ" R 0NmRNAm+Cʆʁ+)H"pc  X6lPApg0,w6L,{f4 t ;-Y=vXٲe_Ըa ?2flc^z{m~;}C;x/$*sJ2ϳB(J y_M"BHQ(D4" J%eHB2)Sh0ɐ?w3}^{Yó: NZ3fڽ{},<+ xI x4ڶmke'i!}"1&S32^v8Dq:3q"Κ5ݚTd3sgt6_ʠݎ03R(CaQVgϮnU1ׯ4ofFLx;U8qڳgOŀnݺ;cTLׯ;gf! akݔ9W\*T7@iSb {! ` IJ/wu +òWn}B3oƗ8yHF2؉P}ZS^tqT26~A'Z"#o3C-i PS;%B~PY_*% G[,;{lHgk6^z{Xxҡ|lĜ}Ν;8-6ZJ}C cFbS܏?0%kbTPĜ369w“[C&逕W_}UVȱ=NDG^:Nd8ws0S`A-[6m]((@)$hڡ.P&6x!<_V@~jѢLs[hcvv`I??1(]lׯ %1Ś"oƗ|ܦM!Q&DvK`~f$,jٲ2e7n+PߒOڵ0ӣG # `L*͙3DzX߸qc}T"dݺuo@YQ6CϞ=0X^=dnV+ G }p#aPǸ^ӎ$<+I";T3f>_☋pKCϊp_D ; fE0֒peW\/~ԩN>cl&@4`q1q{o8y'fhGjȑzcUN<+MA_u8%K((㤦!C((.bJ/02vL+bc ,>QHHHSb?T7:$N d7 $2t (DNմ uǞޜ6uL뗑yfs؜K66'Թ^8`>68Uo,`Ipr$bmuرV3jʺ"I u "DWxw1}[*ˇȩx5)Z" ,[~}˗O++Z% 9rpKN=Ep(@!) ȰV́͝ / 6C` `aPp(<^<+,Dc YPxb!gϮ)b(" r/Ws0Bi<7|/btRmI{:[l83>P愉'jkn=tˇ$mPRǻ T"AJo5( =,B)F 9C A.xǶo^[AUxO$@C_ wqF8x\|ZT|6a쳚VʳlE$A+ʢ6\$ډ 8O?֯C( ~d 13Q{cP3`L8EvX@6c,IT&cxۡ߇#1Xnݺ}p/]m3S x7ҽWÆ cDxoI>ldzޱc7GHHHH ct9 @BT0)JkvJx:cs"s51G^0㏦,$YM{Es̙i 1kC;i@$nA$BСC k/ y]DO0<8QXp\4"!+PDEM6~ Pc8/:n3ݑToդI?xDݻkk{V=P{a&Ǘ[@J$|{o9 ,TVM[N0/ٕ$̫kŊ.r-*TH> VFa^vC{zޓ@T\Y5kLcǎsat!W[+anMaf~6[hѢp֧PB lٰa8y% b]AP%fZƒqlv\5S2WRl5&P߿b=6WB6W^|Q:'r%\a9\6br$!. zn5k:F3fd~[qҩχ1#|G)OzV#=nyA$@$@$@$@$@$@q@ 4sNz 4O0ȼcF<3N1e…aR$QQÀ@`c*8fb: "8z &P32oL݂h>%*CMQ# ~`x91U<p.)K@7߼y=8ի7Ktn`)lYR%_+S^8n>f`rWT)kA]^~J%Oy;vA)lXXbVVb;4TP:.y j w*[nI&ĉ9cΝ;+@jf<Ҍow6mԳ>ikQ@VXA4hK4O># $ gϞc=:OS1H]fdr%^F@bW $@$ .ij#Џͨ}\Ӳ-["p$.,t3XGFYJr3n"=~0=~ԩD(7pՕ1@yܹSOn4I%PF e,XٳkyC#f|3S3|߶m.Zi\ߋ>HrcJ3]wA;gd"E3k  H -A?$@$@G :C^׫LM3CwADu1_4}t񶮉:nj 퀱?,)F%pZ$N!@|_37Az-~@ ycs.^G n Ib'lc-: }9x`RvNڧOm Ǒa#F9(`sl!B{|`+W䑴v \b7E_:@`ԩ ۷4a~J%`o4 deƷ s3OXNj=ҥN>,E2olŋ18=M0;œ0j'qNR&N3fS4~$F! v_ wqvaa}6_4x~G:96J3?N_TG?MbEdC00 ,@(އR+ |GxwĸqXީf˭f8gܹiNCsJdM)N<%:ʔ)$SK!  &5 @NAs?< s؜&[3o*3g8Y% C0Yzʚ5#?C͙3GE0cEI^F݂Q_֭ƨYfiYI̔kVk1K/h WX@o1Hk0Ga&b?V-w9pu`JDse˖4aruVqX+R/_^{(VC $!2\&LpmLa㖛HXbݻs x_={vO$@!f_ wqH^Аv4aZ8 Cqɚ5k*PbXG}1Q{b,#VEQ2R.SH  R86TCyܩCvx/{p'#G}>&AI~PEi*'f IHHHHH  DK ع`xWs? CDcFf̘t3CtH=#s.^ n IHɬIbdFHϼ#C#ÕF~iu=Cjkt^'{7T^B V>sq9H&ț7ofM.3-*N3gN˝Ν;#G;vh\X(o!c&sGZ̠v;(s׏M*Uu֩Çn2w.؈K-0Sd#3<\7'tyf|燛ӑ @] m۶ =pXy7qӦMSN̙3>M4IW_|am {=hH(Ŧ5}3~F )|nw^T{U~ڵk1_8Ws = '/I.]Z_^}8`N+Li ND|$HHH <?>eNu2b*)SHO :"¥Kh3\r$AjJַzK/ts-<3$&M? ٳ9a${qX)7xz#d޼y4=' xOݺ*q Ю];5p@Ơt^,f+WNz 2X5j>NԩSz0ըQ#{%(a``*#nlŏW_mopVG؋1oYxr8q8,&`aO>K.Z)gQcǎMF۫V|l2 t"]X0]kjժSEPoTP%% LnnZ ]X[ylݻwu\oY+0;?pr͛Y*TH\ [_ w[cp!gbٽlٲzL?T }_,d"X5)X`Pdh*w}`f_b2=SS;c>+|ѣ֔ͣ3RΐH N _y7 NĂj|ԡC~NC_ ^1FI;vt= @s1LB?B{6>%`m̜/li̝HH@NFᤵ={Xt $x)f"wjW\ <;ѣGݻKQ~8 bXp AmeW_}U9rD}z$O}P _u=P$  HfNv)DԈE,:; a`IS `)S+ޣӏx}^XҴ?V7t6ln3ˊ֘sk]8 E[a9CJ;`SxqXd|G<`JM[l A.bHVܭFnl$~JEG;O8,Y7on)J<+a|+! .%aXZ.jJy)Xs 8Nɓ:*P[6! ES6WVZ)$@$*h+wsNղeKxYn]+믿7 .^:a!ւ7:ٰ;bkS'?td ?P\4bf8a4bŊz!^xdd- |VUPK,&1%tQAS?Sf4iz:Gd3NQ7 e ,uW38  z_@IDAT7_1=z~[oꐴPcNj/hYEķ_pg{3Y8 b>_(wvn,먒6r%S+ D?,4RGLj}zq) R R&LVQ-Ͽf^N Ǥlk 9fB)Z @uww~9=jٳgAH"nժU+7["QG}AXӶ!"EQb D<Ůxoޛ(W-Wyr^I L2ӧ~_H=.ϫVRP8q"JHlF<6]>H YMFiqZ"EN8_8 1q)qx{رc֩46g*b~1& 'q +a>=oЗ-M fqlKй(\zz 聄ś1\8R@DJ݂414hzꩧt1c d@ˋD:ݻw5suשGȤXGN%(IA`-'sd#"EJXtHBQ> ,^J`؜%\*]T5kVkixjŒI ÌO7J.?. $'{[:Qh}P$le˦vb^~h2%|.`0 #T`/1Κ)H ['8aΜ9p R@Tny>VHH hQVנ1" @ P!  @hРɓ'ʕ+qTCF8JylI8u±H)+?f$@$@$@$@qF}8{  @J+ y @tP!:Y @l @ҕXxkb[!N1&@?>հað+W.t*?>͛7LH$@$@$@$'Og˖ @h/֭*Mg;IHHHHHH G D@zR.]jL3JTOħ:'kVC L G{ 1HHHHH 쓇QIHW\a SHHHHHHHG c͒HHbGdɒ_U-[LA8NX_         ',5{޽j߾}g}6lǍVR~EK mjz-[Vծ][֯_ EwX~ ,_| x?\ uG ٣8s=zܹg}6D     ʕ++@xO bȔ)Sp +!P>!+I$@$@$@$@$@$@$@$@$@ -ZT{={V/#ЇH ?Rz_x<|Mm1vM?]?k,eZF馛xbaϛ7jժڴiu"6;M! fΜ-{Q')$@$D"w83t=|ƌLjԨꪠ+PU+gΜIR .~˗WŋOɛ;Zٯ_rX+>"3fXyC! $1N‰'1ɓkU?F)S`^ 0ߵu۷믿^XBAF z]ҹsgպukmȔ)@qJիIyO$@$@$@$@$BWn _(#@{d0 xO p"yfma]t*\S4׿շo_?&ݻ_;XX$ꫯԡCK!7 f\wprUjX|'fTOݱ*F03H=>DkZaaIrƍZ}˖-=~=z4־}믿A_U?tL;Ȱlٲ/JPGND^w( @jh5kRB{ll$o̚$E)XS 'pQ0xZ0 p0R1 8 }I@0l-dH a*OIE=([.[Lϲz eP2|pjСV^`A?X,/0@GUAh wܩ^iYfBLKM6֨eYipĪ\/$gΜZ; Ѧ;C `s @$h͑Q ў(MOUP:Ʌxl^Β%Kp +!O$  8&0uTHXo z/a$@IFPBVdK!HmP4-FO?}Qr.]ZY/V_|QR%C{ =,שS=G|o*Ϛ5˲l*K/*Μ9Suƪ\OH `q,ԛ8' [n־}{K^^pCgQGQׯWu֕`-[6½xbPڵ\>޹,^X+u{3߯ 7q-]&IGl @2@2=M#{(=0'NP9r$ 'A2gΜK&igIHHHHHHHH2/HxU޽.AsӦMK"'OgHoQLJcǎiSe@ݮ#EeEg̘`ڸqc6lCX8$hAՙ $ʕ+f͚cS`ԬY1o7#-ZTAI.g<|pm۶Y]pa TV:9[`%HHHHH % 6nܘmH#i>#7mXoݺ*SL> ֌HH& e5@ٲel_pl̒H &A(Ν;&`$@%/_>uyie(Z`$u릚4i-j<߯:wΝ;^ӴƟnI?^þ բE kP <"Sl.{V7oZ={V4,J/ZH=#I3tU4 ٳgk z\ tgȗ\ryk_E 0O>mYpծo= p,U6ICzR49Ȇ AXybaXZ5R HHH c04hP2aj ! 86`$@!{|($@G SL V?Eԣ (7o\qo߾z ofe*nJp^(7jHAaʞ׊0eMS (xA6~zSܰҟ5kV8̙ XEݙ 2zkF-^X5JuXAD7q8gܹdɒnQ5} HIJFV"&@=~l: @|Vl(S1(CO3y%[B$@$@$@$@$@$@$@$@$.R}`d @9x`ĉꩧ=bŊix$/|H"â|u2Q+,(P ,3…tddW J(qJ^ T.I2NV! 9a )"5 J*eʑ#VoۧpV|:HHHHHRC{xD2 $ʃa=IHH Jo~OjŨ<5VMc1! @0ǍNg5duH 'k\.b=\B"H ;wV#GT;vJ&~꣏>RRӧOM7ݤ͛6oެ6mڤ֭[ c!cƌm۶>w9sI0q=ݻwٳggϪR\5D7 @prG*Um 5'1k׮UE_¹^uUVZխ[׺HN<3H̑Q &mUZM*IUB?h>1Ff|x   S3Ɛ#;wn2cN)Ccyl( $=wp˖-%gIiTwGHIPӧҥV|gرc=a1`x !YFBa~7ݻk/' @Ilf͚-[j׮UʐnA5h@PW_}U9rDpu٣trC$# %Я_?պuk)-//_>iĉjȐ! .Ca78-Ĵ2iE QNg}Vu1MfTrRM7 $@|l4 $5$e"DSN9xs$F`]֎c?Eg`̚HHHHHHHHHH .ٓ $ [Bo~Vwq^:M+[nEa#`z)f3Drʡ? @p:iY) /P=:+NݻWڢE ?{M~]teժUK-]T؁~7}݌I($@$@$@$@$@ML9?C@X7+Ť-HHH?ƍ+⡇ҖL?I TLHS)LH"~zIj6#h]I @B$@vNܳgOիW/kf:t3iӦ;w-[IrtMj۶mV\SVWlUu)O>X(4lP[>s挚9sVw nC$7{OA}ѢEhѢ  *UoyfЁQ,XL֯_7Qe͚Uo߾ $pb($@$H͑Q &m/߿M4KeDɒ%KT@J*<8v82   HJ:~XojR>nԱc~\b kK$T09r`,$B %Y{S>+H%`LP(:T+p=xKc:U6l7nڵkWdٳgPu(ޏ5 }|iK԰F :kbZjns̩V ۷+,u"Q+ w>kN!'i&xZJAĉ(=qw(lB4zBWHO>g>F-[j$N@8?@]+" A %ɰ$@$@$@$@$@$@$@$@$@$XB9r8y%H:uR(:t(]y #SL_~2֭[N: *`AII,QFܹsWܿ{y,X0͟??`mڴQH< Gv' {nQt؅^&L^yPl ^Pm*|8_Y@UD &HHHHH `Gyzm[F$@$@$@$@$@$@$@$@$@OT?rH7-$HIgϞUOcZKIl4 xD"۶m'edɒE&ZO& .+r1qJ$@IEpja)o޼aeB        \uU֭[UժU{:GTϚ5+$*'dSHHHHHHHHHRS$rȡTl:L$@$@$@$@$@$@$@qE??ÊtyTն`$O3 "F=3gVEUJRUTQTƍ3\ Pݻww ?t萚={ZvZfTbTŊw߭J,"|} 7zj*5sLެY3UN׸,]T͙3NJ+Ba>y9~g+X:uJ(a݋PZj[nI,r% @lذA͝;nRKMرcѣD7 $x._\?ݼyʗ/|ͪEJ, >\/|Ibذaĉ*[lj~:էF?+}.]k.5c b ֫ZլYSy`?s:+ݼy@٪>L}:#<ϟ&M0"ԩSW_}ӶlRUT)M>ƍɓW2eԿo3nE]0tx5S<@<2*/Ouc]HHHHHHRuԴi5nڊSVvF:B Yl^}|1Μ9n>i|| ҋo{.s+SL| @:og `% ǫOS@r3#0P%-dHbo8 Dmv 8z&zS>UV7U;]v!=0F! z;,pB>{1կ_?w$sYOop| :eza7Uӧuxڵ-Ks.BհaChac3*VN ӗ+WN;DMKȎ)"EHp}ȼ! O?T_>&eP 7裢߉Fq'K's!w}V""}P7Ϸn4g ۶m9SXWS_{*{D)t%bat 4P>%y}:x^:]Zޯ#.8Y ۄHy*߄rrqM-~ oOos1/9\r:. bŊi=ʕ+ci#[RJ9:=N6 I§n5x`|T޽U۶mIh#Vs8V,ӣm8u…fѣGpӧO}="[Mg*'3d ~֮]?8Bرc,lnYLGʷL=Cɓ:g]aP6~x$xF(_Ar7h}e~(AKyu[Qw(8y:{,.wgR}p/"6<8q >ˤC IW(KL xgZ # x%> (cA|k԰a{ァo߮|֨U…-l o1ĂԢ~x ݧ9>1y-XH`íϺN~Zϋ7 ((Ի)O҉?8{!gc wڰa^C<@4Q5yYfmF󎉦龎3gv`x͛7OUYU#FpԻH9f4xƌЍEeu=hFXG?wܡ`B"9HeBDJѨ'>EDGQyMlTO'1(Sw}ؕxbO[AȞ={tݺuSO?f͚-xJd*/I8ߌ 9#c TQRr*[  +Y4^Ū\/*h= N{.KS5|AZP _|2R~%8M<ٲtw[7A,Y7PǢ )_ PKVt7?3E \r-;+bmJY>G("Q=tX(zW[4p"EcSOwq]NybҥKuS6;ţ_j}j=oHHHHH0߉HA_ F!QJ(?\'3! l\,\ȓO>~wy?'> &3D &QGz'"Id*'cS_oQjBP^ V`^v fz!ص.Ƚ[꧟~r,Vny.ROy)G\,H etAa)wd֬Y*Vrʥ7,լYSɓG-[V-[1X6>P8pB(-4hp1ZyA[O2a3*ҾKғH2B R}T(ơnM*T(jfOXa_zutK Gfʔ)]p< G &~éT/n: SNY :'~(cB6bbРAւƾ}ʅH:}PʕtX&9rDaeCo#?$Am vRn(ի+}6l,AvԂ4|ڵk|#_:r}|ի{baRޟf|S(ԜO- l- @"!ZW0lAa %Kjp3%iӦ޽{ pshOu x #LPZb]hOѠ2x,&`.z GN5j1 PjQ̙3icG6vaCʗ//&_qx?>P8!*7eΕ+W *(E,RC`-_۷C$@^TUE=뮐+H$ L?3'T79x`w;7K3MzY/(?S",3C-i PKN8J~PPTKӧ c(gkMzlzB= 0D۷+CWXǮ6SvAsΪu#cvicJ*9n<% hK-#     H$gND=s^"朱9la%Ns\!3nja^7֭6Np[|3C`w?$)1>-Sa&@{;RY%IJ`ڴiVp䚛@io߾QIxXDꫯ'<%^AbUSmr5yITO*F03H~S=LiZH|(P=#: ,ڂ1Ə7@ G@:)aIދ-O7mڤ- gK.*%>:PL5 +b |!>}v xA P͙3nyW0k^,c)~o09ޞ7KPf=eQdժUbSDᶏB-y`H6)7 f.]HT^I b0vl۶7Hr+^ V|wX%zģGn?+,ݱcGy9}wt|Du||EuFtu}Y%LHHnl @` 'B`~ZYA`mSG>iss~C4 :nu49cs.ٌc%Nsfe99f/EQЇNȉFF}a ''1B]pT%o ;Los-*o*{ip Q Lxt`W_UNScDA) ZA`X0`%&Xr&{eMTtűb"f=, J oV5VzfD)DE-[TSLQƍ8ß LTabk׮V{W[ѣV"Ҝ9s,7G%j=:֭K ʊ2) k={e(#OXׯ_DoVt $%Df˖Mhz(rcaC >G&`ϓ'c2ߌ/Cgb `oQc GYEP˕⊾7~ԩN>cl&@4`:67b6cȝɛ7>]#w:*ȍg5rH1}+:uoeG(? tZUo(ձcZQ`UV=$I1.-a&LR*}po}r=O& [V-[o)Ywjf|= 9E.bq}PܻwV6aQt(DS̶m:Ƞ ŋHSJ#>Sm֮Xe (Ca JP4qND;TvA_MN i \S&Oob]0־}{m \TG= UFM`Pb*6XB`mPiZ BAPe+ 'C`ZĭoZ呓$ 3+,]E({m)f ։D~\pcӮ];}*n:Ex%H-Z6cDNnݺl>{+}8׫u ½b>vjԩz-.^XSF?Uq/raÆEKR^̀%HHHH ct9 @ȟ~i}b9]U'0lMN~ЃW_~Y1 3g͚eh*K/&Ϝ93301|m|p:MaPQDI0X"d`ueJZ{7д)x(,MV$@ʗ/i㺜M6~`X zj}=. : ̣ ?M \3ZXz3= 2ʕ+f͚i9v_ݼNW<$Svkˆcw4/-Q*TH&Nhٰa妃H2B }TXc믿BOP6^*ScӤI|}4)buDVDGϔ(c"쫯EK_/x/+ $g,WI:^IK YsլY1o7#&|͖3|ժUgwh>5;[M$@$@$@$@$@J';xI xpӅσ 3GK¬}#… 1cY1ОDcFaDSE@ I _ ]D^BB 9fTH捩[B"Lz8":y.27 V6ZO$ Po.| {K%zik+4f8/B[ e= zḷ6"X儻QFR*!0Ī0$$@ gϞc.epl?]:JPtaf?F!O?d9J\nO$@B }TS{NP>D_}ɒ%U 0iYq`5e˖::ݱcTt3yqg"=~0ހ=~pZjݺuk n( ܝ;w*e,XٳkQC~o73u!\}fn5 |$w#\# M(+[8p`3b$@$@$[*9^IH@nT&Mԉ'-1۹sgfWb1&ꌍ3_~[|-qsƉ4 yfTZU, #1!a`M^t$i1.2ol%(a-}<(^^ 暛ⱾѬLZ&ȗE3f $Xgo޼k>}%^xA/4H1"ŀ`J -ZP2@IDAT+9Gx7b"oz%bR4̇R6=]s5jݻNHL&W#R&Ƙ1cEaPH @(bG5 76BXGuʕ:C>Eax~G\lzgcM\,1#pG (C{Y\]@wcZ3ƍN4_n6ߌog1f>sUDOLk|'ʔ)0GG!  8D! H P];CW@kdQ"mփ0yfS|_8sƉ4Ǽ`nʈ>InSL3'T9I#G}>&AIM94j      x% SO=YUQœ_paH,9DcFqAJ`d<@s(W͹d{}$v2G)01bЕh>Q O{G/:T[Euk+ǒKK8luyLQҥKuT(U\J6sL}Lo6m81PWl4 _⇫VZVPFx>S(ŦU{3~Fʵ*O !|nk,'Ntُ[v"f| jn~AS4MP>2'a~B$@$@$\2wy:p@x1 xL֔)$@%йsg5rHcm VKID=VZ?S[_~A?Dc3C9i$BOkgVgϞUG7GP1xQ n+{L,yz*'c a$'[ڵkdaRҋ'P 0@+Íc=)P.Jsx㍪{ɑH_^oP2axCwuǵtzz^)Ǫ\]t d&Znԑڵkk 4CQwi }w+ћxGcرc?? * @ʕSz~FѵԩSz% Nu)L֛r<=~F;%],`{,rYeF2eXU脾~&SS;D)[ʓ'H{,TGg\G!x%~A7nԋN&|)l^ .58|ǽlrqHǎӔkMGrLJ x kcs΍|A,HH@Nᤵ={Xt GuEzgZM+ym65zhK#Dc&-!7pjРv@W_UGQ_~{= `Q_Sc] @iޝMdN$0X"`7$b>.*QbEmn;V^=5uTEǏk4.iԌ\yJ,`N>]a'imތ{ɒ%O>ի 6kԨ`-UEaꫯvTG\l,zC)VbUW otʨS>VB&.;Lz쩓AGq",?(>;Vl"1cEXe0 8dQ(Cѣdw}]ڬu#S{2WT)E,>5ſ>JVӠ@ A0)Sp2͛76nIeCJ@Ȕ)S@kb^xB bfʹ|cݢE ?VuU͛W3碋.yȏ(N{C_&۷o0ߴiSFd%@}p6 (2 SEG0pObi%,egɒEk7߿_=ihq"13f̰{7ܛFx%x#3L݂x{rOF ;ASޜwOD!@Xϔ& VSpbUx4Lf͚'M4Ig}T haUtΝe˖p v^ :lذtYBIPXDVd޼yJ~ Q׭[-'؄+*72 3[pe#|aUS8QZwuЁwɓ'u:./Pk>*"??>WU6MR$@$F R}*UӇ`Uѣ^{=J(a"ЋDD_]oxznMw?6B@M{… IT(аaC3X%^/] ִM[e\I `S762b{O+BgѢE>l%w]- :`mzS'N|&H1W@!%5Ƈz(0w  H/^rk #b#;Mqʮ:<HuP@(C^{-kt93% `@'a~ k~P>njuK1&(M9fYNUE[.v̕s3g'ť? `昩[/O-޻}E !@ylI]ruj+wq=#FX;8abt>cEqƩ]v={voZLwQFYޑ&jg˛8v iժoUoDQǀtnRJ5M$ -Kf&J,ԩS *&LZ;̼I͛7kX{ĤXG Z .}T'+WDf`[7ɗ/>V!pH X@jժW^QP=ܰ߯_?)X87}]ک>f(e@*0cvtS̯!00/=S117(zRFY8I'3kԨ^z%LMI9f)Ԣxna|(`DrIo|-_@F\yhi[`'D&`*^?L9TK22:iKA ?FXE'iӦ 0I GBСC;F( N ֓H cj׮VX3.ȑ#!O?7j(FL:J+ŊӛLE3 kPB&e[ ? Yj-[Ԏ;t2D8E `.Ks"[[ +h+ڈ[<~aL6D/_\ժU+aĸTAG}@JE^U#GJx7ǹzUN24ƑvB $N߂`# <b @  BYr[11ۊ h F1nj_!I^,u Od&(tĠ95EK=@ %1~a]~z?~ƽVR|`ͳ>Ȗ/_n*Uڵk\`Xbѣ~p?1S}g?]wlW^y,X 8J.߿߆4k̺ufR6f̘|f޽M??1cOΝ;[Æ x8ێ;hѢ֯_ kذa>rV~}fRڵk_?ЭO e˖nm֭عs5ŕߥK /V୷޲ٳg}ƘS[l=3o~;S25%=Kڵ5o<(OتU-[1kڴթS'Wwx ~;tu僼_=A^zBS51YFkK/5@^H}//G @QG4>@aa= ! @ @HkaӚO>I*Vh pbn/~e%>|ƽhhXT֬YNܱcG?%Dw\XXBtm H^viJx/qںˬq.W_}p^ܸqcOX]s:6>]֓@ @ @iH }x~':/QIm۶]"X&wժUceGح Yun_~f۽{wnoSxTEɍk7++xu%_eo: @)S3\_}U\^kz(M 6l-[:뮳g}$~8"mҥv9<$?MumP:tpSO=՝!!pܗP=I'dNu0Mf-rk4;ΝȠ}\yoҤ/+2ttB&Ƃ{/ܘ_zu_4U'\3d'M8@n{=V @ [a(mB]v(Yd&P /k @ @ @iI@.\]Ǝ,^"qvk++4ޣG9rq{)5iӦ&2 G6mƒv{ѽ6`w}Ayx}=|rysNU!̟??mJ_bx}F"M^wզSfǎn>lYfd5Fmh 5GOui6h*W=.-| V4 9' @ @x\R!H*L9@ @ @ #:ŋ; 7?ۜ9s6m Gړ7vâ{e @Э4֭{go=KܢEPNaAYY4}Vu͟:uZ*Qɳ%\b˖- &Lpp=Ԕ'| Nx{{^|;5!\'2D2_/LAkΞ~`83')Dz_=.21>}z*C ϐNNP<3mI~7o@$Zr @@zy|O7"EjAUXBd  @ @ x~_K. ¹ H]ts1 7=;qCSNM4zY|yמ"ڈ?ѽ"l/ڵkzs58| mRJֻwo׌6Bxqowƌ}Q9ݻW^qU>,W5dȐ@Ȫ+\iݺy j7xUXn_}U*6GhKժU]9HQvm>O m\'~h#L4С.]t[rjtƍϥwow6me˖V\9;sxɃ @ғO۲eKzB2k//UT\ 3y; @ @ ȉTA H?\.\Tꪫp"/WY>\/..ݰ?l07n\Ф/#'jժeW\qkjɶaÆd4k={ YdIVo P3%}yJ=իWCg}XbndlO R"ݻw^#+=y{no'Wd!PX 'QYgeӟL^&cǎu_Aؗbw޽{4Fl%ˣD(7{yq xaVJ|ҒKm&VXa7ntVV-8 !~[$kϞ=;x.2թoK˫? ;[څ@\9i3SN9t#ŋ?sS9׿ڶm=oVR[>䓮ړw|}%_cVmDF4@ @ x}'S=YfY*Ub  G@G3hPN, !J A 5w\A@^HF=~'~A"談Yk֬{̦L)W_sR{1uB: ]vAVXx|GJ(<8^<.L˕+HYp%+W4 %db=(ڵM:ƏoC'ƬꫯLGw/א˗/ut_vVxq"^'=Dy˃m6'goO{W|0۶T^Iv`q1bD|2!rr۳g5 GrG&:u_m>7w>z &NP]/;wtWY͝;7Tb봒Ç;ѿ$ W;mYY ? ~#CP֔^X8zX/=ߨ@"{ij-% ?_| Vߠׯ_l % A"E8Գ֮]#g{@xJ,>2o=0+SL&u$RF exK/Sdksz8oJ'_eNƠv?_wv}nCxC!zaR:TZM!/?M&FS0z}XEZ $mB @ @8T$WM6uh8ڸ{Fˋ&[nu^SNAov W[^ն^8޺uk'^ry{N::v<.;ITO* {}4oˣ2]{fŋbvK誇^xrz=Dgb̘1VnȬXUIEJ>s @ HtPQa܈NX8ǟuf5J<!@N@?<8z&g7.TXE@{P¦twҝ@Xxt7Tb&Mr^|k6{lɽM6N+|L^%v. 1!yb{''\ի&7n4 a;w k<ձJ$שڨ oWv-?hWyqqǹ7jӇOV/V|/+~}\e*M 2&^XxyڊGNuQhT§$)3,i,_uP'Z R iHMgeE@z7MsXx[5BYFݫ61,ȵJx/ @@?C ]#Ԇ p .]CyB@H/yB@Xxae@K.~cg'&o<@$~hiӦl ՓW()kxXH+[X.7=_>Xeb&NK}ôt/ s=T /?LW G):;â ˇ ˄c̘1ô,!Gt" <+KgHc%@꧰𾰬TY$gը@ @ @@{)*P{VZc:Kڵz 2 gΜifͲ}4"I㽸ϝ;״Y@zydw%NseufY&1ĉ3'gQ\bENOy὿j6oPErtA{p ..wy'h6>(ȋ:j+KR@KhNV6Ѵ(ڐ%}Wjmr @@xFS:UQLbx1b2+D @L7p=~s\>wOwJ@Ψy$B @ =/۷|޳C J ^XHpBLSVpykxNbE@ @ } >##bi#Ma 䎀;Ny @ (1/w!RlҤ]x6m4sz(ݻw;瞛i$z駟^eK(|n"^Hv%[dY[n9:@#G_kM'l|rkԨQPd潸7lZj?4ڒ/ ۘXbvqǹpn4h hBdoPNG.TLr`ɒ%noVY/ 7pCpʄ/Ə>LpH侧oJᄈɓ'M^J Pdm-[tK;czi~}lݺʕ+gŋ' @ `aӞHXx/'!XjH}j- @ @  @X޵o&U]bqe#O>dpB3 .!v-ؗ_~͚5;!CvMx;w{SZ^X>8,Wߑe%2 gϞ Qt!kP0"p<,X""'sT"Om ?A}ٲeZװ@ݷ ᨄ{ .&Nhz-^خz]Qz깺J?SW?݇d'.{ͿoM3qZjOСCT{vVvܹN+Z^zSN;tڃ7y VZ>+õjժK&LS|M]@ @ uh;v`^{K-i)wHA yg ,Yot^b y@@ž Lz) @% QQa6y{^ի 66ol&MAekXh߾-Z81=1 0H#"k֬]F&qsxAе^kkڵ gcDȍ #YEݸNOPz8sϹWdB%29)/S;Z}:ۇvXoڞ={\\x${]=z+<㙼#G }O FfͲ5j M۶m A'Ӵ!i̙NX.ڴiN(_ߡҕN&i7 @HrSNVk5̠L2i@Z ﵻFGb '[jHYS3$7qoSD#^8Jb. @ Ȑom)yGyxޱ#d;H~ EaꫯΐTTZje2.;2\&Y?yf}iӦ@vݏ#RLo<'U~ڴ0x`wZʅD'^W} Z~m1cDX>E p9_>7W l?cwRGsשS'2+,a| #zxިKx-ȑ#]qՋ%cW~k"e|O db?ir!@ BBk׮@ґ@XT+O $В R/x bŊv<7%JN:ɽu$}۶m[@ o V  @@ hcǎ0C;^|Լ!@ @ @ >@A@^%Kfگ_B?05kd{mu0M@ @b xo>[%%2x$ @ @ t&+V,Q0wݻw۞={r4Qgi\i9^#a;p@c @ SgCxQxޔ k. @ @ P ۷/ P p ֮]ͣI&9GVM0!{B+T @ @DKv[ڔ @ @HCa SYgeza^{w  @ yv3م8xCxI}eɢElڴiƫoݺuaÆ֨QL>'UVh륗^jM6Zᄈ_.\h}׬YN3fu:w$Hq۱c-Z 6{5WڵH"AX;/ۼy_3=gϞ>+7pk!1)bo\d}"H@2{ uD!@ @yH`Ϟ=A @ @ @ H7 k;] ?ӵk܇w۷ѣG;|dɓ'̙3#O8ᄨŋE]d֭POqk||zڵ+ʕ+ %8qk3{U0}Ĉ&%\~ʔ)6i$M77n _sZf 6 }ߺXXx/~a}^vp@ݽ{w{'Xb._߅/2kܸqz* ޏ;8#c y[zըQ#~ڵX"UVuD|oѦ_K#/%J"g›9J \}Ձ>pۄ![ɸv ԇ @ [a}}C @ @bâXeS==sI9ާjüK$.2yoo׮}Ǧ2^zȑ]<$8[zD.%K\qRy*U2yȗ_c .Zti7p^vª/ U*T`GuT0m>m۶@\]J7/ꫯ:. ]C^`a]{g5m8"MwɚNfy[]]y]y&Y =+ m> .Nkvwݻw[>}2 /}CdEJӉ Hp=c,_|Wf3"ph @@BoY*\dɄP @ @ JrHKn6}UW^t,X`lvቿ%ѽ4(C7]hQСoٲmh޼y:Z*99އEX"G*7nF4ibT9s:I&9Ѷ3.!kf-[TYΝ} ƃH(+)\>T$[A/hJ"}\NӦN6䴾%\b˖- &Lp^js˴1‹x@AgZOYx֭siT}䘏83fWrY FOsNiH.]\xtҐ@n{ڹCzر#G?35k;q%}`N O9@ @{0r@ @ @(L^c^]搬zr*]xd5K; 5k4yϖwAn@IDATw2F : ؇;uQ؋âz5t=G2dH ޼yseӈJ\s+V "e+ZR%w*۷ } .־}`-|Yy/_+~hXMyqj׮^ M86t"?A{6lhg}$ݻGyFnjoMvLJm\R]jFzA @C }+3 @ @ P eo0ITZ޴'m6[fkN'l*UOw%޻wo M6ZjeI$,bիW;AalС&o2p1+pM r\PgϞAxɒ%AX/`T0"MFd[d~a/Vz7Ε_㏷E5޾{,޴!_Y\!6rs{g30I^|mIa۵k{iS6X鴓=sv7/k֬T-wM7dW^yeP @ 8Rs  @ @ ߫ k,^Sl~|MW8qʕpŊZj1+4 uwfJ" x/?}J/^$nr ВĖ2pNz;pOSbJZJug۷>=00/Jm2fkM9sfЄt$ իW&M6#ԭ[yWE$p F!@N{m҆1cƘ6mݳnV[4k,k׮t '䭷2?a6mPUʾ+H}}c쩧^zɅ@ & 3<ާ3+@ @ @_VFz!GK"!W)77`y}m.Mc1=:^1" > =@Νr~mUܛ%j׮mX,Cb򫯾:WZwզNjǏ7:u@nMp@ J,|>r7nh;v8Ԁ_eկ:( :IG)S#:묳p"h}-[ϜaO;>cMe3Wc]D}OG~?!hkug:}G OB hoJ:v^u\hQ ^jr-A 6tb{#z @ " 2%N1cFvB  Oo5m;5@vNq6 @R@RxG1AB˕+F3O"O.3իit=8yD$p֯_D< hy& 6,ߺu =7_4ྲྀ_tE6m4B|/$ʔ)n֕XS{y3=jK\.a}^qCpjO%VN]O>q$\;|/E^|E[vKZtiJݻew@4ήy{%M>=%&Ov>I얦 %^v_ktƒ0*7rEٳg ym۶ADxg]T$4mT+mܸquVY)q@ @Í?;m  @ w$H0@ @(št94x½=zv+Yْ%K1r/[lP?  t&L` ,pm%1w\ׂˑZLp %|Ůmy%$?餓cǎ;Avs 7t>y"qs)A!A{m\Iu|ڡ~駦WȬ,8J/ )Ryڵ N[Pn_&Y|'@ ٽ R褉HA>FQ<})ܞ<{ߴiըQm8|$ֽV @R }-,Ӂ @ @ PB0qǎA^$H Sb $nfk߾iKu]ă&Qݛ9Ν;;D׿y9S~2 0%$XR_Hj,1^-Z{I%'{\Moq!RJ.zO: ԫW/(Mx/o޷j*( 9 H 5k暒ؾVZvq9O/ovYa7tM|n#2I/NʭxK4A dG2{DNl9ꨣ2Uq _ߗ{N"Y' @(<!yf7] @Hq.v-> @ 7^]gчd>g z-}R||vͲ{6`kٲmݺg\p'CXSD{wy a@&u¬_k{N4D38 %&S,!k,O6m3ϴ9sC=d}(xTQ,.+VbŊپ}zիW7:8L']օE.!{֔ h#]z6|cqV3gt^qfZ7x nsGDE{n>|z˄b}׉,'fOԩcÆ s СCs͚58^ Ξ=$ϮIݶm[W UT&Bzy\Y/Wy$߼yB"Sޟe>qzo/wI矻d;OGbG~g1gjt@ @pGo @ @ d;~Kv=<ԕI޸x<$]w=j*'|/hM_|w}g/Rxw|M[|-[-Z䆥d[Xꫯ^eO|Ā]Z5{駣ꫯu믿nx6@"R@=}OόN\rb 4߸e}Nx>+ @ Ftlwr>^'A1":e@@;ʚW\a[lI3B@?c @@eҚ>W}qn~]N=rH{Ǔ2 ՘>3MHQM8:ud}qj?TzM^q,'|F%w6wq.hݺus/Tޯ9\~k@^_3 'LիWV RL7)(O$Y֧ڠA;c۷̇~eYﯿ CvgGӏ=m߾ݝq9D-G"R@"VZ=ogSO EJTd\_}馛b613 @ @3o=_uٌ30-B҄@NtްaC̜iB @H}x{b~bG}iJ̨GN/!IL0jժin2-Z4SOSOQ;7G~g֦M{L2e'|hRӣ ֭+Wt^xN If^zpB)x3Wuyt$SgϞ m޼yVd ޥKXbЩ<7*ty}}{N Pf߱cG' @T {v.*UE'RLOPvXxdYԮZ7%\6 H9!3l.g_>i-ӦM[n lٲַoߤ W}O]nVw"6N/w>˺?I A @C  @ @@Zkx߷Br=Gx+[Uxq'Rƍ4+yGg7pC>&ak֬]k"j^ΝM{o(I(q ˽>|vUWEOTo1;G@@!# s:O?O򊀞-X ]@ ]r<ާ[}qaC}89PGa۶ms|0^6$4#_xlKpK/OL{)W&"x/Vaf_~6x`IY}(YO5>7oao>۝8 ˝fKS $ڗH;kڴwi3N ;wlNNhܸxKtYÑ#'YGdx3[B̜9mЩ>~,M'R׏|otH&,3ƣ/ԩcW_}?>;clĉmVVgM2WJ!s"|+8_[h#@ &1`yO@mqLps@(='ߩ b=(sa @({iWvL=_  z  $2{73e7AXhI )aY=@ ݾ[^wYVh֬Y)qx4xbŊٺuIa/k2KJXbVK{Μ916C? }-:[;YC-[P9Jg8($绑^ǯÔިQ#Q/:*T:(:ui?_|RfMw @R][f@ @ @0Л+jxOGxk /:J+$8bQn]*,cf@ xd۴aÆ} @ p ?t @ @Yx4I)2Cz3sںux*/9]~- @ @@A$s`X:E @ @ '~߾}ukxʗ/ <ާZ2F@ٓQ8p u8ݻwxr @ @ >uזA @ @i@ ,},8S@Eٴi"Rt?[5l5j)'<j*{KiӦQ|w… >2ݛj֬i'xԩ)^r:X6m]~ǎu1&~z?~|vժU4h`-ZҥKg*yf3fLh {6'،3";wvk$?رÊ-j gYs_o*U0!@ _$s/@ @yH v۷owDx_)7Cxzԅ @ @ p ? @8$r>|xQoFD'Ol3gΌL? /^l]t[.C=+n||lvwʕqO8ѵ ѽZvm"UVC:!6nܘe]_K.Nx?w\߿OYf no],O? /-l][oYv?v^cW{HZbLU%˜^7VZ9K,1 Rk{qu'/Ϸ~Ցy?&Vb&x8`|wݻw[>}n5m>m۶@(_J ˔)e&.͚5ːUD,.b_e538=թ:@-[>+C sây@ @yJ Nz3vHGxH9 @ @ }QD@ﯺ`JK.={ڂ L"޽{lv?:o D>hР ַo_+QK/ZuLb[lq7o"V @r")7#&@ @ @  Of&&M /̙4imذ3!/l2hsA{GKf#1cد~+׬<µ5uT ц}Y'Wy#EJ|._u0@ ds9y\f͚5˾ w:Hdڬ{6UiOMHs'iڵ+j @Ҝ=Ի"O5eF @ @@5rʥ̙* ykoР+*1_~HʄBx_Q:u gy / XlYmkbŊ9l]V},iժUM: r9C۷ovm&og}խ[ʗ/o7tٳp}t־}{QUVVR%k׮5nتVj3fP'2ϻRM6nÔmSG/q@ @ h3q:cާ:3K@ @ @ E xn%KLY2-@ 7${E2l۶m:Ӭ~ 7[J;]yy߻wow}ץ5mjժ!?#{}0W+pL<98- ^btRWaÆvꩧ+N p s,guO2m 7vX>2O~'S?ܝڡ:4uV!i贌nݺ8wUS͛7 DV%@ @ {3!Szy @ @ o9#|rX+V#AlQ_wyg[.p A8рb/|ŋsi\y9sfCFp2wq/AĵYMdܐUCyG s?qƙSN9m>s蕮?`Tӽy׿մAo={j+Z'|ҕW!yǟ={K1ɓںQI @Қ@Xx {\&5)dlf͚eA @V#~V\d-[_ @HaSxqI@ލb-}8p`Xbx6zx6bĈ ?,?裃D|]wom67/G)S]t2M]ԩSm Y]6jժA Pp dsٳF&UB{w#pqoZ:u믿|k6]^ޫW/WW$]]/;wtY͝;ԿlٲNla>|ս{w@ @aa~JG ґC9-T_\@k/A @#бg4ZŖ~|%K{nVڰaC ?$ *Zh8j#͛7իƍtذaA]/֭[w-/l׃ѥKZxCA޽˼6CH*o>{Ü: ?CGqd +|5+V S _y啁^qYRk#GWK,38㿙%JkNl„ `}lСE A?S+Ҋ/nKhvI'Yǎc:|{x<[n~:Z0@\ oiٲeԁU>FNـ?1c۶mV\a#PX(Td @ D#?DXl}wm&@r~=Miw5j3a  CK@?<!?7 @Қv/Di C |־}{M^_~eo3=5YvMmڴ)g'йsg'޳_&o˔V^=k֬BbZjqgc4hsc=fwqGnؼys2z۵kW۪U2-D?eXxGGx8=\>\8d 7U8p'kXxgϞ}BHp?E @HsrH">VװRJi5tlZ % @ F @ @I!>}R 5O>ٺtн{w0`C<˓\`afn&TxZ%Lbwy a@]z&ڴicgy͙3z!ӧOa97T^ݞy&ޛ! ph $9(X!Y˄c̘1ԩK/UT|2!@ % }~s[I'3 @ @҈?̶|A rذa:4i`j֬jpN<˖-km۶uռ_aJ*mPX^&Aĉ]ޫK.>C۵kWr$B@"s<&fpz|nf?)S}o#֫Zj8W@ @7-Z4C^DuR!#א\Ff@{oO?uGz@;̺ % @ {<ާ"3-u]g>Zʉ?bŊ_7>!jժԩǥ=M`nݺٺubNWe&Olz=|p;s裏Y @`Hs~ 'XJHCw}K*LDsN iڴi@֭~^ٳg~moݺʕ+gŋ' @ tIwԘ @ @ &ؘIp" #s_~Yşz){'c,Xމ'ho\g}fmڴ_|6md;vqe˖bŊ u}nݺ&L^eիWN:Ʌ s|fϞ o޼ym Ԁheի&(YۻwOV4@Hs^ti[@lb;v7m.?*TIUXtrL~]Ν;M+ݛu2 @ @ H&{CR'-m<އLǕG[  ;<|q7aOzԨQ쒾 @ P` =ޗ/_Ar-vm^ǍiP\sMp 7`zj8ɉ%6mYƺv!?HΝmʕAQ N ^ڮꪨC{'L/o~p㱮z=`ˊ_Wmʔ)_E]<\o_"}< (tM$n5kըQ$og 5;2sL:u-Ym)V{v @ '^M̕+W( ?~]6C%K:1ĢLz(V<,*^z^YYٲe-З7}0Wy][/h"۽{s1v 'D;;sy8=/­[q_͚5v]mx+ɳu Z/qy߾}֠A;cMAO ҥKĉ_:7Fٟg+]veז-[۷[*Uvڜ&y @#Ϳ&^y @ @Haa}SxL (,`+,-Xi&%JI'^=C۶m @ P 8p J G})3 @ @҄@Xx_B45ӄґ5kaÆ9ƍr9OE@ @ -`>E6ʴGB @ @ @`0x  ۞={r<׵7BE@ @ ۍO?i2{Mww)3 @ @҄@=4Yt 4%PZ50aBgϩ 9FGE@ @ %}e+%>]V }53 @ @Rx_xq+UT͎@@2ek% @ @@!w`,(ߺuk0ʕ+aG})3*dx {&)b5j԰zY-#:E&VRĵ_ G}d;w5kډ'h=z:u긲饗\C֦Mm.cǎֺu"َ?jժLʖ-k׷Mc,3زe"3W\q۱c WXzꕩ>1c;3e˖Qˉ9sKN]y@~SΝaÆQ;EZ~! @@~{<9'u @ @ 0{9I7۲eK0e OeeR>h_u!K=`' vZ>|x̺?>~vEٺuUL鯼>pb]v}\2^&NL^ M,?#h)Ldy&Q={l۶mvw8Dz[ժUce[ڵIXeƍL,Yb?{woռӤ9iEixрT)E"(M$2^?"RɔrRDí4o}g9uޯߵw}Zϵ>?W?u.*VX1S|+z4}<}t[d;l*Ur+sc\]+j :ԦMis:? kJd DPf-/3N/Qnݓ2   E@ٽ{kA(PlB@@@@Rdx%̙3)2%qO{˕ř/^쟵ǎ0+8\۶mk{&Xڵ>>Z]Ǹ{!CX~R?X-o޼nlҔ=^[@b]PPA/|69対rsul] 3xUY֮]ke˖UViAAլY3RTeWX>C^Nw6`8Æ ss',8:   ]@A ѭ؊     ud/^|OI\n[,N9ٳu]2-X SjҤI~z}ݗ*^ wߵFnӦ_+ۇee.Ets[T4hA zmZ @6:u@S%Ǟ={2ʕ+m޼ynX;g>3_~u7!  @ xɠ7F@@@@@[],QDM.!t؆@6Xl_όʈ#nnVEQY~[nzӦMTR~n߾_wYco̙YUR%nʆOA+СC˓'=zԂ_mճ… KtꩧZڵ> @'L2nff͚FjG*۶mnɊ)LhN?topH@@S`ǎާ     p9m޽Ndɒ'XÝhO8C ܹssڵk];/U{iTVƍ]eJeyשS*ULߦY޽]#Gȑ#cw~nͯSA)ϫ[nŝɓYAb97x?|[tGYWXa]tiТϪǠAG͛7h[o=ܓb_ZݺuMYSTon{z^s@@@ dO˥     q&sV2|[7۽: }fGVq*0}t>lZQ>}D|x~֭VZ5kb?+3gN;zi R<Spa{G3YJ9s@h_lGs~gSL;vCHxY=~qzRzܹs۝wޙI_~n`zB~~н-8țo>ZN=T[mܸq/mfŋm2  ĩ@0}ѢE*5[  ^~ {#  t`\eD!@IDATp :2ޟ lrɍ4$PN5kߥKq.\hQmr5׸:8 ]i@2gU9K.q gϞ%˗[lq5>]Ug̘(~Νn|0yw/.@>Gͮ^TTE+Ӯsƍj ـ  q!?~b$wr dO,[ٵk3   @ x1դx>xo\~%?q.Ppa+Uw֣G{ꩧ\FA٨Q2*3#^y浃 +̙QY=5[oeLÉ#~Gm67•͛Siv"O!Р /,X`GnݺE Tp4f̘HM˗T@@@ dYV-(  p~   8/>Ⱥ %!p f*Ur;vy3<*VgWf}ϧ(E]vF,3^_|ŦkTy'"U\ٵ?sT@ >4FEg&NA6f7=Zti+R۬[b-_ܖ,Yi}^uUa|8* 0/޽{mժUnAUf_ V) @@Qx+W.`n<^GfD(  1YF-b^d￟9   I,+e޼yJb˖-(Q¯SILrU $p7]0G 0` ɾ \rԩ ʮZZnmݺus߱c\]o>ۖ-[n]gi?W^իWO?{k:~0sGuI&6sLS/hzJq!۷ϭS*gƍ矷{7bכ6meF@@?/}ѢE3ef8gfϞ}b@H ;W3o<[~L@@@ . ٲ7o쮽H"?~W >q-W sxS*alܸqN(}0rz\v\.5j5m ,h}M4Ν;7l}ժUMT*˗ D;m)gwcϞ=)4ȠYfiF) W#e]ݻۯj7tխ[vi/Bن'Y@T^Xtn{ "TL]ӭgϞnB >2(_?uV7G_܀{}V  #+V,q.+A@@@@;/}2{K*wN7cN22:tvnwҥ'xNrr=;70֭t3eO~<Z,:m4>|?eM4uY) =zNYUkֵ(5=7}N^{W}zµKgپ}{]ygcǎs9g8Al l1p@A^;N:Y*U} -[&Nh& w7oVX>^(+ҲeK7[3  ĿfS '~of6 t35![F H  @rx!=04l.û&믿t,e#X6moק}(_d)`TʐhEA> ];wӦMizU8 K+Wښ5kڵk[Bڝ EG'O[n]&nnƍl2VZVBjhE]kSڑ#G~ppK+68"6@@H  +{<#     /Aeo޼&ާH }{8//j5"%EzP@ 14='Νj֬'@@N'֛!    D-9$_D\L`ڵa+^x6*N@@@89ޟw     Rѣva22oٲ(U_'VGfÙ    _m۶$+)     `G$OA%AOe!ʕ+g&Li-Z4#    hdO;     )o> ,דyf2K.ש${o2~v)['   īq     @b xI}b#] dX    dS2gi%%Kl *dUV5kZZRmV˶fo1 7`u F-^ؾkۻwUXիgvUR3fp-[\?ꫯުU+kڴiĶݰzj{mժUO?TPׯomڴqgF U6ok֭[5k;?5jdWǏo'Nt}fVa}ѣGÇSNjaÆviݟ1W3*~Æ 1qWO?zʼy?+=mݺ- ꫯv}ڐ!ClҤIk mo׮-[, ͛8b; $@fWɍkE@@ ,o@sWHGa=     MϦ7BOe/Y)\vZouYl鬳β9rZ8ӼokeڵI&K.5:tȔ]E۔\st9s} (-??顒'Oꪫz..\;HJP`Qv/^-Ÿ}"; ʎ;@%J6+׿ܽ[n]{.#W\.p2"@R ({Eov[h)K.HeŊ;w_({_~){.;6e˖6eSԯ_?>ZPA/|jw6ehWO7nQF ZTbR+W7ްnɭ4hu5U8}WZ+mСC;sK'{k9z{mٳһwo1bD5w. x>|{xm4aƌSOyxF?^@@gd ]w592J@@@@@ qZEY#eNJ>ۦM/X S/jҤI~}ݗ*^Sfw}5jM6~j\l.=˺Ç]yTAP\9{'NO vԩn0DoU\tʀB?#mvBiF5\c +j(]ֽ4Dl-k'|b`XGi͆Xw  $@+cܝ/SL O"    @x/W% +V5jUP/i NO2߯ oݺupSʾSO=իEC'O<Qvqm5+Bz v>iuNR dAIahѢvgZfͬjժn{<5M X-`&MXbŬyVvmyq) ]x - .pl'3+,#  @ $kMw >n)    ,p۵kDNsm(ey׵Ν;S.qǎ.+:;z1[D kܸk,J2v͝;׭SUT).|뭷2MR'[n]ɓ!~.[5Y{њݧUVҥKSmg{E׿O}}?֭[/WVͯZ+h?O7|cg.E .4lϠ>c ԩ-^8C*CF;=M Mt{9xUꪫ_;w @xW^ƍ浬(}ʕ.s駟V5lτ-[ /`yf][nW^yŵW#eǟ? WIWΝϔg%  $@oܸѿ _ɜt*q4o38q k+{uXWv߮뮻ΦNjǏ7 ˆ}?_Rҥz{yӗ}. N4keLH)>x1uThQ裏H"nY}VJ۴i=ֽ{w+\>;vV{U&`ٻwu+VO?t|B `]п>ڶm   D=N{o*Ŀ\! Y+/   8`TO;GB = x =z˗}QUak֬i9r-W\)+WJ,Uc~_/_6l=l/^6mΔ秞zw5?.\V۔a9ZIU~epG3(su~^CQTp^Rkn̘1nFm8m…֮];[tk%_}{X,XNu]6|p7xL u#   LVФ O!     G2%q$3\} \~hެ;vHir=R Ѭ-^Ѡog@@@@{!W&hi\VlMx|[ZT9G@p?pl}\Ԯ];y.+E@@O`=yY =>kѢ3gδ[wa dsfe%2gi+O>+e:W𽊶gU)Vu=_ʧL9b9xYu.o~\Ν;瞳|0Ͷlْ믻:Nk֬I=t /4=TZ>} 4eL,?7.t7HjX߫B ޗ)S&[p}}q0`G[0~ MT@@@  N />gΜ xNO M{S@@x/(   'GQH2_qnmZ>}LUFo LOߡm K,o޼ˏ>k8C%:VӦMC;sR[o5K^p.^YGmݺu {͛S)_n b{%KڝwiM4u뺦~a]؆@R ^79rS\lll\gVJHMGF@@HN͠H3y ̞-2Zr&q=     @" (WxI@P c=Nr߾}#d WXǫC+`=ES_tEn7/{ր%JnM7}~,'weȿҷ@nfؿH[Sy*ÇCF by것e" ?:߽`.^?"=ʕ+緧  x;S2jVlddOx?dS  dLw;~.3[za/2W@S?s;7@@@0<V;'|֬Y?3'c^{^}v1c)~zK6m>+Vmɒ% ?E.z%Y7gBаaCwF1]I&ٮ]l#cn׋f g yxUJ.#իWwmL@@Uxɒ]x+%1%M~k '/z|y4EY  @ xwO&ܹs[޽;t_ :ԞL!0` Wg 2 T믿6e/]tnںu֫?Rh}feG6mu]~FcL<_}믿,=j/ʔ)yƍs9=Rls᧟~ u)HzXޫժUbŊP=k};snY2siӦq f~{'p¼׃(@@@ x!YƍK%ާHJ'"@@@@@ ~7 ) v sBY*U_}ըjԨa{_z쪫3gʕ+ .QF*isSܹsWZzj5_/_4h'*Ç[ݭyVfMS0fxꩧA %KƍG+N;_TLVjժHM쬳r3 릙,F&M14Û2tbZ2ؠ@38efGׯݻvW2){@sQ?=^{59:دzڵ-Z4S|Y^߰aYFL (&LS%?2b@@N={ܱ)yM|o}$eསI)  ]K/EElt=Q8VZ' @@l%Kvw.efL, _tc*(˖-y(B@@ lY.+@Rk:dYƳ@Xr,gjT"6f7EYtM  ąmy(Q".ΗD YG C_A.@JeW]WD'q}1m4E~?h WfѣGEY ,^?ıcB. LO#=o_YNJ7l_~ER[ϟ/1e ӣG۷o k;wtmHAzwB *YU+Sɓȑ#g\жm[`- -9D]z-{7{znpX0^ܯY/(   @P` Jm"xHw3}ג#5     =$}vw2 @رV)T>+gŒ%K鮫U旟\rqEL7⡠qp/W TPwV^7p鑑}֭n[ #ZQVuEkoSl=4CÇ[5Ow~?+z=vȡ{}rVbEf^ Ec9)2Z@8q$YkN10&Z򣕧zVnFCʺ7;Gc  -LL;5h+<'ϽJ@@@@@ e&}LN,(V)k|v/,ӣaÆT4Akh%@ 6yZ #=2>/됞@@@ __2eW0XٓHg>s     @= @D ]j֬CKIf0;"   J 3ʕJ. 'g/#    &m6/W} * p9b=}@@@@ { ${e˚)#@}k@@@@\q~9}@\r6a„ _IѢE3/;"   d/dx[lq7|p6Y.@}s@@@@@ sGzA ,X:u@@@@ av_˩qF;v옻 *$rmaª5jڵ+̙xYgYÆ H"){ ?[\D ֭[6-\оk[b+V*Wl+j֬JѣG6D@@R x_x<}#     U x,3nذ7!O4Vsi <䓶iӦ8ݧOh{g_ ={e{`EA^ɬݻw>hSkƍMJ,ňeŊ;wEevVF [jiju=G*dz Ͷ 4B7x>ӧOwj֬\L^+׆8xEI:0`o{{cH֡@@ng;     + '}s&rdDSNq;wv`tvÇۈ#ܶyڼyRk}ꫯ}({ժU'|g}Y2ޗ)S6l9C˺~#<*^˕+))fz >'k׮b֒`5@T4 ͚5s3zhG*۶mnɊ)b9Enp4k @@G @@@@@%˗/9I $ssΝixbvX*^zdl^y뭷*Qzf.8r䈍92J|mvm!($ FRJv--'Oׇi~oa-]pR+VE]d&MV~4h=裶yf*{RK[{u5[{v뭷eA@@K(     ĵx+W.+TP\_K'eWB|źD\F L>?gC+s̱>}D|̝;7.֭UcX鸡[g~YaÆ3?>f̘a:u`xzӯ_VOOWٺgi7x;_|џ I_իW4ն̼G:g .ϸCO<*p{}37lU2櫼ꫦk   ķclǎ"{#     SO=5.'kPN騐>MlyiJF}0*8REk׮{ΦL)}e#Rɟ? ˔)㭎9o޼v%̙3? (U08U.B+\g?UV.]س>:O8X^{]yD;fZ߇ mڦ U0ѣmĈQ.]گR{h@" hu]gSNǛ hQ;/Kk׮>')}=\̘1cl`E!X饗C=s}ɒ%ֺuk^-?ֳgO[͚5]ܷo׮j;@@?j{~O3^r͞=;NE@$gfLMmY%eU  @x-uV;x *$5s)O`geW7nl/)R$fXb.=R_5U@~#q}6m\>?S\ۯj婧25jDѶΝ;G=CsF'RL ̡@N;-%z 5(Ydv,;vWe=;@ (H]eOc=꽁Ns;3U:fЀ.xA^']tW5o*ośo٢Тķz7׶mL\Q@@@ >~7 )NJE  7_~u   'M 1}+V|؆ fƍKux@hm۶J<`y1ٳiT֭k 4hU\9lཎզMxO?ֺ(Ç[ݭyVfMSf5kSO=@u%KZƍ#Qsq{5sύDm?~]vCٳ'X5k,ʑ#`(믿Znɽ6vi/B3=+H"k֪Wgww}=㦑L/Sx㍦V]Ez/gVQIv[nutq_3 .l#F0}f?\;{uNN[ ̬7eWF~}F=xᅴwl)   ^~OIi{:ts=8/@>k>-R)W:v#U^z-Z(_@@B 2+i77tB@O/Fݺus 3f5*jpТ㎂6K0lSV-k߾}pUlmҤ}n}zB )dւ2?QNJ*Z8m2M/5qDkժΫ wk֑+Ve׬, ~vipP@@@ {%9Wg/_>+RH|JSڑ#G~p3iK+   @ x9Vp     'C`a0& ~c>cs'T@ #}ѫGÆ &)xpb'AHz;wnY{cs<@@Znk.w֚@@@@@ضmߨx~=Q+dOԻux-H(kW@2'Ʉ\    Ľ@ vr     @ x>SPBq=i]@0}Ŋj >Ao,@$#G#mNsѣGlC@@@@غu!>@@@@@$'K"`=Oҋ.lp8N@rl„ >dѢE3/;"   dL~w$ާ     p5`, NK+[l}{892_@:u@@@@ 2Z:F@@@@Hw{%KbŊԢy" xHwkA@@@@ޗ,Y2!B ,YbӧOOu UZ͚5VZ{+^~e[fn:um}v{l_޽{M_֫Wn6ROg̘-[ . lZW_?OUVִiӈmczUzuw}޹<^-[3<2bK.YdCa3gδ ڗ_~iǎFY&Mk9sbF]vXv*T:6lhEI[9w*U't?q @@@@Ȑ@0Dꃝ@ kVs-lȑ.>l&OlqժU x75\c֭KϚ5˝ի+{ĉWG\E^uްa),\q=j LS |m+byI'M6X\8ӬO>.7tߌN<~YsΝh\~&~]uׯo<򈿍 "駟Z^˝7o?X_g塇5%t_@@@$l?_reN%O{#    @ xg7Mzeʌie,Wyߺ,=G6CoFS@Jڵ]ve_t)0СCL*ήlʐkcΙ3S@wn!iР;5h`Νw :p3kر&x`^VPK/K*e@}Xoڑ#G VZ(8^_<|AZQv`9+x_3lףхH7o^{s{m]vYL;lOd׿>֭ 5"  @ $[ڵk;}gu*'@}s@@@@L`֭ާ@Pvl2mѢE.K.HeŊ;w_({ bK?`ݻw7U(e˖6e Pвf?_l mr_}UUuy)(]cǦ:NFj*/e޿СC;V4BUt>ݲ+P}6m4PMExbMǎ3eWs=os.\\ëvM7AY׮]M)˔)c۷w;4iu1E_ݿ^b; $ak2p   xSyDr>L@@@@@ }+pg} ,XY)(Z*w_{Wk5Ң+mڴeWY m˚^T ~,%*klٲT{K9SgϞֹsg\Y3ykL?~3e߿[VF#Gۨ ԩSM2ZYlͳ1gOLϮX۽{-\ .fQe?   @r fnFD }ь_cO@@@@@x_bɓN=rL+PbEQTAK`Ĉ~_w}_O9s`}p֭[7eiiӦ.xYo ҢE 36]._C)]=CT6nhO<ZcƌgBxM0Сk t~6jϺx-jgy5k̪Vw+L }^ښ4ibŊ3 d]<{p~m7HKǾ @-͞N2g@*   0Kk0g?>Ϗ@@@@@, ,D`xܹ3Lv";ϪWsLiܸk,Jc6_NTRYUuܬp1׭[LZV-FAXkɪsi͖͛ml*ի[ff#F׿A.,^?vXPM5PIy ;r߅b4k}Vqv׻,ZϨ9r9P~}[hQ,#  @ xA2xAϥJJ;ϥxk@@@@ޗF6XbBN;4+W\ľg} ߿`pVZm,xY矧oqAZK VZe6lpGU}9=,;wtDrۦWZO7=ɮr)6zhw{c=[5O#4 f`Liq\ڝs9/9ʕ.s駟V5lτ-[ /`2~k+jwA 9)D}u4   H`֭>Dɒ%zV+WNKbȜt*1,47o^R.ޜ @ ڵ+iMO6"/(   q)e0xNB]롬 zϬo߾~aeF+#Gن oޗ)S_kE ϙ3."W-{ENT駟o<'V9WZuz% 6ŋ{g&t*Nli=M2ŭS~]={o?Z͚52flԩ6~xӀ=#Fp-Z>#+R[V|UR6mdO>u .\?C:voS{U&`р RL~* r?x`kj۶?   ~w)GQ!>R{?=  AA@@:D#+`Уw|٣>j*s͚5-Gaʕ+__Hv[]vyz*W{eoڴ:ӟ۵kC+,YR+H낁^0l^2{zVv4DlСnƉK矟yiҤ[7m. _:g/ۮˆ -\ u@@X~D"(qW8 s $e}k.@@@@P 2H3ZliK;/{h:u̪V)rQ; X@͡CzJP}Zg͚e<2k[5K.6fץ^uͬhРje;v+U0}𢃳4j(ɯ׫} *CKҥݪ;vشzjG)hx3u@@wdHD ^!'ϱ6|zUV\  xrO#@ڵ@@@ Ad#o(whT.һTQJQ`#H*?1CQ#(HQA DhHl@" (M)RT?Ϲ;;3fwgf?s==w |pڞJ%?{x≀o߾rv.R9rvSOD '0l0袋fѤITSNcZٲeFݻצL5KIV}yY8䓃j>}dn[n *XҥÛYF@@"(OڵkݫL"fQ @@@@@ I ^gRSOSO_Eggy&>pH6m[nn۲eSOu7negW&xel_|ycQGe TQ|uڱSxJ*;wnеyeطm۶`:,]ۦhwٺul̘1裏}|_!h7j*V<#@ hVpfh-9Cnr4Rt/?F]wU\Yy.UT1Ͳi /dϞ=gfD   E)~gqXx~5MXLA@;w/rG\{l R@_hѢ /ɵ@@(T2*?G ztڋ@Pr=*˗1Sٳggږ 6l{-]vYڵI&-X3|N:չuyc۶m/۷… )3uwڕa.h?_=Lܔ. @F #^Q5kīiɓ/ipڵk]>4*VQxeĉG?ʺ{~lذ!ǃc  EP x /o,L}@F@@@@ S@ժUsΩہhyʕM( @ʔ)c{{$YO:tȪ@@@ A (X("n"    @ Ow^p2ާGHGUVYsݵuYjr}<"   xٽXL}ŋGr >_>    ,u֠{, @! ۷vޝ߿?r     @ 5j~c|Bt|5N ާ«D@@@@@H lٲ%7 @ԩcO?MUO믿6악aÆֹsg;ӭbŊw٤I2lb /f͚Tڵ5o=)˗/oGuG-2 )Smʕ/]իgsɣM6!o͛7/Xoݺun,dq<^zaZZeÆ %׷o_lςF#ꚾtN8<Ϝ9ӽڠA}, jZi/  S絢     @ A=~/x_.r/3tN* /Sڵ+իWرc3lrG?T3g) 9ZO5*UdǏϗA ,Ȳ]tqemA@B{0     YŞ: ҨQ#s(^OLwq=S{C/ 9??m4Svʕ+ؒ%KLO<^:/-[^zɔ_>prwd v<]s5Z-m9QhoFz5Q 3gƽD~͸^w7TN=TgN ;w.?gٲegl]6Q@@W2@@@@@ lܸ1rQ W+fh x__+\*T`ŋۻw.]"pV\ xql~L*WR%=%}I6sN3ܩ4nmc]{.þl޼US0;.֡lG ez/_`i9Ԯ];}裏GuѬ!z{nǤyvi_|)?V%\~oܸu?pw?0#  @ x/MD@@@@X x_Vݻw#}ھ̹XF&窉@e]ex 4.̝iԩM7ӧOpj,Y2hwֆ_|1؞ XΉԹ^SNnp駟D믿hԬY?,>}= юc,{ /`rQy_tRС=~s~=FeG0-*^{DŽ>kݺUtil_3|   B>^3+W.ZNS@@@@@M~W\i>%g6H+?>On駟۷۲C|{QOu-L{?jnԨ0eBVYfMNu}~*UX8pm۶]qp\_ L6st>|x#"ue?gqwegώzߨ,* (ӧuݭi&{oFDCَ;܌!O<o>馛ܶXds̱;ڒ%KL?ois=gQڦ/֯_ﮫ{Mܱ(cʳ>k_S@@@ l]zk<-F@@@@H+5jUoU -p cƌ_~viW^zL V2ҷj*˞*{Jٲe]`dMڅ^hӦMI& 񥨂WZ+dYTKi]zhF͟?߆  B :ʮj{G1'O6=4}ֽ{w;c k9ڜSHqEnʰ~wfXʌ3m>^+^;?: \p]uU)Sa۴iYuF 7rޑ#Gu]xhp28жmf>zBݺu74svm/Z>ARw 4(׼yslssQx?,   @R ժUKv,[f͚U? Y 33^Q>S /<  9,^<}sxFQ9J~~6oAн?>|Yn_tϚBEK ,*U={c=fK;D*  @ K FSwz4[  M@yy; G#  OL/">qS;$_{e]nenݺuU xr=AlD rz/_fqÆ MD7kmu#hI&6ϧkSzN:vڦ_E@@@ |{5xh"     [ٳgauqiҵ >bOۛ* .>}56l`ʞq !e5~7l裏-ܒQb"nICp ֥K۹sꫯ:+_֯_c>GǬ@@H eqG'Ua,  ",eРAc3   @ (1/D~[:=XubŊ-'J_r&HGmRJF֯_?;餓\|5ʷ>z.> &؀r}-Y/Y+x]3(c:ڵk;p@;sHOvݻw/lz;w3ޡ ۜ(b*~yxM PTrr/#hӀX׉?_S>lsmnݺ6 @@TMH#}HJF@Ȼ   O Vg'0z*O٤I`  G$ЪU+4tcܻwou_Ua3y\_su l\Fl̘1nqU\K:~W!I ͉pE ,;e˖Yxj ;YƎk]vm@vկ_?n~q5rXcT )Y=4{@@RGyh)     >ELo֔0Y{?!2އ0X,ճ%K`xYqgZ۶mmѢE6nܸ\+Ӹ/b?+o P|XٗŤ~.69̙3Ϳ8ܥKLU`P|͙.{׿hWDf_l3'Ҭ˽,]ߗ.]:C؏  )$@}rX;LF@RH`Ĉnh5.-[Pij: =  @6lvr- xnnC} 9C } 4ȝTI7Uի}y6`q_^] xGW   @x:-E@@@@]dޓ>997x7L8p C XEY}XutkW]:t;kaժUvfڭ'r)`ћo9zY|Q}fSOY*U|BN6gѲz)d{nwg|gfV @F+T`{pϞ=v嗻Cxojy̘1VzZٲegfWQ@ίGj_ K<@s(  $TZ/kM@[G\:u쫯JNкܹ}gi7:  @~ {2׻)uK}v<l۷{+; 7` vx1%^z9eV1Z5^ѶmXmNP9 !QХdɒּys(k@IDATs=@@HOdL/gD@@@@Ȟ]lrady_'!>`!$P<"kj<"o3WZzgd @@@H~7jժ%ci!     @ l`:g_bExP }ERE@vޝ\],A۷/Uߟp@@@@`@@@@(r'[M2Ŗ/_n+W4%Ws1ֵkWkӦMV?7dmC=UV?TR}6k,}֮];n޼:tN83gt?[ڠ 4(&?=0Z%JUa   ;H~v!k7W"    !@}~rN'pA:tM0ݛiӦو#vNjnxSeMUo6mS`q>VGϝ;7n`g4hO Ľ.ҥK7n\A q?a=P߫W/ܾ P୊j˔)cvr;wUfU<`rU5`CY*U*իWg+ WK/5|5kSmWkb:W~lƍv]WRQ?3gipIrm9">@@@ Y֭[4nݺr:-lݺ5V Mh*lC@@@@ QBE^3=TĬL_}˸,z+D)cKG+wuKveMYUV%e˖#XϞ=eǏU4AZbvc裏`a_3 WfϞ~+(9tx!lxbkݺu*66#  QB{^EN"a@@@@Hv}*O?(@Y#dӗ nVytR+Y2_L>7og뫯:C:6,͚5˗u=Wof{2diWp+b'N ˖- /`\r[ ]wY,\0ؿg{]meWf/N8ᄠNxAkꫯÊ/u=m*^F=/;tЬ(?|w!  @5 ^ŊӲM E6@@@@@BG˂\(> wd A:u\5\pe8WR]y {2+ 2+k.p)lp[r;z{C3\pQJ.m iv̘1Ýs9ny̙2׾}{-ج@|?élgt6mi&˽2-Z(wf}Ѐ͛7zomݺ5jdw\cف@ J*5@'ES4Fʕ#t3uQϤ믿4*Z93C.]_m'tUZ:vhG}e֬Y wtm i׮~7{xp    Pd~wT֭&}ھ  d     @ @3vsU Ⲩ۷ƍړEb^|:2TQ/%KnR9}/^8[XΉ2^=|yWb5k]eY}=z2R\Ave^L:վlHv>k|Ǧ{/ҵkW=oʦWE]k]l⡟{ώ9!<#  @'rIGx_\9W^:v>%@ r @@@@@ ۶m N3UX@|h۶mW^+.\ >܆1bĈTv?nߔ)SlƍQt˚5kb>+_YUt )H|Dɏ?`Kn駟۷ ka[l,G.(|+6Zh *3f̈vHP2uAEH#[n}ٳgk= W}o4 *?[6m3>?X>}\U+ڱ<󌫯Jʎ?w\įItہ]m   Ηtxí\uS8j02hM/mon3gU^=M{G@H;Ljzڸ'`'زeK.@@RKzP0W_m<)ɓ[sAY:wygS(瞳]vل {Z/'kժTϏ{eUCf ? 6,ȶ pIs+(rɒ%Q>h;8|pcv~+Cߟg <؊uTKڕ}ܹ.ؼuY;8۴iSvN:ʲ?c I> 5CGL *z ;w^K.}`gBdnzDuVH c=:, RlJx6vE\^=S~d31/N:vڦ̶Wp2@@@ B{-)2."kѢEbrr@pE>&G   $XE}| NYOY8p}.wG{.'wN:;2%4(O7puvioֿyf+9h@Ba:G4%G۷7=TӧۨQ\-[n=XΙUիۓO>-]e/N=T[p!dw]lٮTX1UVme@=va*Uznݺf?4Eebc ho2k[n%f/ÁfЁ֬Y3,lB8~A B+w&@@@|A/B{dIA @ W=@&{}HA@@eV ǘ"Se>C?/9UsϞ=szlWnj&M2:wག53:ԔYmWs=7Ch~sd{5_~.]Uz뭜"[u5[w!Cĉ]f7~l+;}]7Bu?3+UTko{UP>h V>"1؄ l1^+V/fxoW o>ϬYQFѲ=   >^LYX+׭%JQG]O N>ບAO>4 [n *ؽ-|m@@@4U5~ٲep̓e&P+S@UjԨa'x[ϳ>kV9묳]c, u™壑h>Tlbl'*gwyw߹뮻*WO*UL3ez\,)~ e|Ԡ={Zݺu݌y&#  @j (/A:* bLZ/K.u(s]@REsKk} *!/Zh  DP`_ EAؼy\xq;p_u,gwGqGn\W]Loє=YY}РApk0g|~7Lh x>|xA6kcƌM6A~ 2_7= 8lƌ*;vtٯ?sL.(9:teps=̙2Is&<(qA~<53ɻkӦM3͔rꩧZRg)@@(~Ndསc= PJ(@_ O?Y9%  #JT6-A Xfp {!Nv~!zzV fg19dS/XG^dɒvGDm?Wn /GOV6e۔^yuܟu V ^ JM%H{ v1b{lٲHEשS={v6lؐ1FG|= (úYf㏙9dK,ܔ/:u2=zj{CJ*YÆ ~.Ktv.ޣG#;N5e?2'lJ99w ThQ5kDەaۡj'O/Y׮][>h;C2 (C~2qD#^hzOU 0^խ[7ޡC@@4O5kZժUդk >@@@@HϢ M8 Pm۶Q͉HEg6n=a9@H2eر{]:e8?  @ׯwFfRU)1-pm@@@@@@ ^ٷ) @VZ2'+{rn[nMt|Οꘁ{    t K(d%@؏    @8ϥ(Bݻwu]rXV.    x_jU+[l"NTXdI x]     @A ر#$ @ uԱ'x"gL{Scǎs˖-su!   ,pA[nBS+1xߢE؁ K    $]+=tI"&P\9+ҭ[q    dO~={ 4A)V)%As O&$N`3/^իg7mZŊ^ᄈI&Ez6`G}dͳ FDi ڹkw*U7nOnop=Ν;L2v뭷Fm-ӧg:|vQGY-;#k2e-_V\iFsuڴi\7t.l.֭[lκZA9O?}7Yw5zaZZwÆ %׷o_ 6gaͦkҡC;j[oe;v?"?8>CEiӦeԮ]Y[Ӡh֭yH ͹qwT6+V,)ò*3fȰK3TٳM JG:.&/֭[zWh?  FTx/ MF@@@@D .]R-ZY@ tؗ 4 ߳g=.u+3_l'pBP'puekyAн~?n)~РAn]_}/|_#^/r /O>g뫯:C~ɔYEΝ)`^#4A(kYf|rV{Kr29Α}}ɒ9mر,AO?uvXe2x"fxӶt @@W@Pr%      Pxdɒ Yb?H ҥK> a}SpWLekg Gu[A, n۶ml^z%S_T">qN:n %ۜsxҠ ̜93%ڷoo u{CSO @ L6;\wKh>SeNOl2y?fPlV(   zM2{ @@@@@ Zz @}*J1a~zp.euOTQVdxXڵ}j^Yɕa>7nt>l+VXd|Y_D+ӚWX'WR%Z973)ehݭD{.þ~l޼P0֭[QFvqE9M@޽I,X`mڴ *XvCI x>f 9CCFihռys;l E~./Xi֕.]YW4f|   @oD]|{yF@@@@HxźuO2ާKZ "@H,jOɒ%֬ ˃,{Džr,/e_ImP[U:u1/SfMfbY}=z d РAܙNj} /)b/vJ~ҥ֡C{'Y?{5Fm?C_ ^{O>Znm/6ke˿gϞn@@@ dO׋"    *ǢS_ϣRzuQF:u˩O`AZl,G.( yС1^C֬Y7i$X{+_FTR.qZׇ_N_J m֊W^yŮ >ȯ6xΑ>|x#"ueSԟqn޵k͞=;q~l(~v_gI[nq={ߟ)po4SD {衇L21'p^g7ts̱;Fg2 QyP ׀׻^i&w/ʘϚ@@H~p=     @: (eÆ kJdnE1uQ9ӭ{';ɩȩ Ư`UV٣>j?ۦ ^zh({Jٲe]`?l=)Se"W>r=Pw*Ҿ}{P[N?Cnʲ<|6lX` p9ꨣꫯGy3ydC}W;wnw~-dhsN#ƍ)wޙa]+3f{e?zD.\pvUWL6mjmڴ:i#^hӦMI&55^Q=~ȑvu58Ih۶m|n`xAr(Ν;m3aѢEvg(lРA͛`{sΝ=8@@(T?^ P__l͚5+nv" >3% 35K <5y@@Heuف\ׯ]v%{/svώuRN`.pxSOYŊv۪VcU S( \rk׮{eM*~nYu,r=eh7qDtǏw7@U*?B[/69 ZG+ʰ{GjZY ^{5 @_ݮlJ^믿ڟg3fLnAR%K~eۻwoӬ t/S.BEK , ٳ=c [Zj"  I$">^h@ț-[3I8@@@ k׮ I}@V@V\oe3W]#b="dgϞ`WG g/~ .LʃhA .;vnE9Ӏ_Yҕ9YJ9sn1ߓYMPT|{Z߼yioh!{uY?!^' 6Zje`f͚nJФILSp5^zVNQvmcԩ!_|E  $O?4@@@@@Ƿ~x傹ҥK h"XfxSRzOls5z.ӷODA9ݺuc_ˍ5 d:p ֥K۹sW^y۽tT]wUSN E.t4{mٲF* om߾}Q[bvg#rF~Fm5kq4>g|}Zme~1sd~̊@@@Bg7cc5_X 'S"Ru@g/ =~;   !caԚdK23HA * j22h'N4e5j?>a= (pNeW[n2e'|ژ;K̇jڵs۹k>`42|{n{MгgxھlskH*tKN:X؎@ hV> &؀bQT>*NڦSsU@/   $Q2] yO@@@(*5j0=(dWxv+RTA`k6l⭷ sڜ9sl޽~_NΗʰ?fw e;r|K.$8fŊr2/tS,Xkw˖-sR2lXcǎuD"v@Z (?`'OW?Kb~qc]|={)Y=4{@@[ RJXZ     J.Ub 6>]^Ղ Κ+ GmzrYN4iRBZգG)S7ߜ*|j\~ʕ+Ρ:|y=@<}7.TYsZ^ ˗y0ڜWX3g4U[]tTU(}n޷NL3ϴmڢElܸqnKry/|r)'9-7i Yt)tѪ @@RH MuS5#HA@ 12/2۲eKNQ$X7L9  //.n:Xfx%ꤍ^j#GtO=|lٲ6}tꫯl„ m]vټySNL/n _j{-SLdɒ6dׯ 4뮻wՇK/dW]uzQ2u`{VZH6s΋}߿0ۃߦ͛( '>,2 f]tQܙRN:${W]` <8I}Y "*r{r{_[vف  !@}rZf͚m@@ } ji>Xg@@@ ֮]ԠAjXZOtS@BzݻmRgy&C[o5ϫ 4/Xa~@-Z͊յkWwʕ+6ӟduqW}'Kƛn6lh 裏lo>[l Gq5j԰O<[rXΑPng}Qfwy-7k,jнv֪Uˎ=XWodq@fݻ[ӦM3mkjժn>M>SoБy[T*/~.5F|A7F(   >lٲeQ@@@@@(HM6o.\f.NXon, e3fAÇ믛J.] me WV;vĉ# ]gq(Q>쳃^(] `* yf7kߠY3 TR%ö\I6gz>+ '`g϶ݻw:zO+eaѢE=G:( : VP^ϡf]~nƐbŊѲ>W0G(þ2oݺ՝__kpm]I& .'B@@+V̿p< d^{m @HwGy}J٤)@Ν'*ks=@@]@}I{/_i+@}v ZW qG*<>}x4 O\cx2+)ò%tImڴzeQx9˝wi۶mscǎӧ… CAck.ػxnJw){JJD!J.Dt.H\r!qEK)RtOotQڳgf={3_c5k}w}sfִg>7҂w|>Rϫ>)z.8m6פr{P#BB($ZV#4jРA}֭ծ]]5CMVR%0au_- wkΖ,Y>LJ)+ӵ[nVq   ,@}?9+Va@̌V'фؖSᾏϩc.  &ʁ})Y,Y2ٞ+nݺL5,K֭M얺u̙3]KMkԨajʰٳggX'_>Xoߞ[@׻ke&RV/^8]^QlY_;7]`}fM4+Apfhi&>ѣGn]@_tV)b?*"UmذO]ED}t]}9lҤIv!駟lŊnAj`S@@@ 9{}DA@@@@@ 12~ժUw^GLR/yO玞'$hT|[_=K [n… [ -@@@ 9KjUϾ'-     d] ;iӦ2 dV`f+RG@Y55g,^z%Ήd'e˹zl۶-G    w{NO     @. {2*Ez29#gc/i'ezN>     sҥK܁h@@@@@^QGe*UP+9W3xa^~8>1tڵkÞf7iܩr܅eƼ/;"   % '}ns@@@@@x_jU+X`pS/{Ŋu&p/@}sD-pYgn(Qºu_ND@@@|*@}>}9m@@@@@ Avm;wt9WƁt5h *i%_ xnN@@@@U`޽~J,/'`TVN:$vڮmmwogyfcΝ;צMwZnnf6d;~|lٲerJS"eSk֬uɝW߷9sx3}ߢE K2]?6=ןV?Fk5jعkw.]5t Qa4ʨQl׮]i(ۜyTuCW}\|yٳgmZ+ҥK5kZ׮]ݲe6mZl=ZssݻM@?ۺv"\ygL-ѫWpUX  䩀^H%KQiڴ*@}VŨ    9JdQ@AIoF& ;ĉm̙è x7إ^j9ՐO:/VZپ}*=Zག'Lݠ{5]?gcƌ+ϤIlCz˞x`L-w%nzzۛ\AE!4}Q۸qc=9g "EzLVZ9₄X(\s;ӧJ?ZP[rmڴ_,$g}u?k,S潏1  $@;T sЇ >z    D@OB{O{N@+T` _~m޼u?v… ]H=T& Dl - ꪫ\@5jN?th"SpMYU\r W_#>r/^=?X=#ŕ~n*~eyzz*U2 X-+V𳕅^J]bzuVv^v{tK:7s,ʒヲ=X-(?XYTЯzkǎv?R)SUX1f?F UG>cСC]ӧ_ JGm$M$|2  IA=/ xބ5     @ 3+1V@+p޵kW7o $[e^SW.aPAÇ~.?˸?|{LA ЬY4聂½leӟXbdgEVvm@O?4]@ LAnOe˖uTQ{~4Y\;رc.ztRW_"3ƍϞ=;}y;3]н,j?vNe/ 8#+) [Ht+Wvv&D1c6bĈ4Aڠ.RSF(Guۺwx.l *qiӦ66mڸ7x_]#3<_&0i$7)yժUz4BgLMO>q>]\ 3g͝; 革  I/5fV      g_oD2  8ժU3eWWQ`ڵk9r{%+xe!{m> .nʱhV2ex [Y=DywC33Ļho&eܯ_,Xp]vAl鵸m6]r)e*p7Z"ELzfGS4FٲeVZvg[:uL;8)}/^ڷoo?~V\9k׮5j.[ ұ50FtӀx~y@@S w~'U *M6M<@<@     @@0:|'L`۴ic]v]|.3'kC~t^zue@>eɌiz-z{ժUSOkNIէH嫯2">ڵkfk_%C.~NHK//.sY5?p{Bܧ^_~M4Əolo2bQlY1c.]=V{ӧOڵkƍGJ*O?7tMWE?5FZjgl?۰a\пΉ3@@HI}נTj֬RY(*/bEc?@~hԍ   }oH S@AEbŊِ!CVoР(P B Yn:q .Be#_~ TW{eoݺ:X;w5eBW6mUةOmSgϙ3Ǯz'W ܹsGq&NhիW{_Hvi /*+W nM xw {-755m4ѣGf;LvmAaXbkf"Qu9ܩ.[*yuץ{/k`̍7h>iCנ38#]SE3{u8wٳg|S` y]yuXF@@ xxJ /\+΍s]{8     N@Y^!'='OX>}`?((rao^жwv 22R.ۼy\Vq=^@Ѐ!f9AyÆ z^x)0+¬`Ay^ڕO?uM6MZЬ˧rm޼9,SN5eŎV4@פև0eפ^{߼2uQW8:H O>:vETv3j*l``UCKŊݪ;v?{e+Wo*U2Zh϶  @0>2?O4 Z @xWXÆ cub?@O}Ko2hknv2eʄmK.17nuaX {eꩧ{x@pOh``w\𡿬N*i!x?}JM,"  @ \?T (t禤 #|OA@ (^?"R@@@+eWpbF{dZCp 4Vveׯ)mLY/4A`Pys֥3f{ P5CNJlݺ<~mӽ˯,+vPr-.]U>øTRkR;}رc]𬾳5jT܎;sL7D j&"Em[Y}> WA?)PXhٳm̘1ֳgψG^)P>>X?X)X'>r>j׮[Шj˗/wʂGye?۾};G;N:Mg/^,Xk}nZiEhPA["x5Kʐ!CK.n~?~|O6͵@W^y%l:{vСuX@~l#͛7w#GF,?_:6J.)3  O B @0NJDF kMGA@ ڵw4U9@@Tܩ}ѩrJ)'Ppa۷r-.xgy&.y}{56x``pkS+;\`={t՞U>K4+j[" 68qeeOO[--\V\isq6mjGuTjq_w5ؠA\ /d7(W7vg^[O=ܹ4[Մebe>߿]qQgW+W O3DO4{9'H.n?fڵkm۶YRr<6   J ZjsVwm*T#sT('9!    &eY%9_ 7?vڰ/K/6o޼4)%\-]|vaooXAskZ W-kR!麨uV{k_|[=ѣ-[-gc94Sy3X蚦A5]w<ь@@HM/۽ήf͚)s[J T5k2ʼn@x$ =\ 8~ c@ 6>  *1#eq0(,{v rV2o1tUݻwwA |Vc_ܜN:ُ? F+si!#-[^w ,g)C{J>+8nɆj7o6 5-|[M:U;H]v.Ms#e=U@~YF wqꫦYfYժUO{Rn]?@[{2sL4i-Z *R;)@@+xD^Q ȗ.a@ PPOLJؽ{wJ  䭀^ }>=  .(h^ g-{m6Z[oe??V^Jb\0/#ޏ3߬9Q\=V8+e~6l`0|#G VeϨx3ve;wf}>}؝wѣ'goow]}v dP?nFkR_ʮw߹ôhscj]ɒ%]v5X_X@-,"\kY>klРA,)}gܹsM'NtY罠{۹sg7KB^GۮmouݾR*e!@@jJ B{llx+     w/۽V`-F@Yu˨(؛:Xw1-+c,X͈QR%W s1͢%VtA[nuN^reؙ,E) U"gŖ)SjԨaժU3eL+MM,[n!+3f^f=zFA 4HhE׆5kDi &7,k׮u5jʐ;tV*Me]W5|l؆  @jx)g3+"    ޓ>lTD ʕ+gEA5oy8zαWq@@@@9r֬YvYfVvM躋-?NJҹ >y+z    )*@}b9-TrܻeƼo^ؽ{wk׮]LoܸqL    6lR… }f͚, ﳣǾ     @ٔ-i,PD ֭[ )嬳2(    iV\Ho?/} )@}6=uFevJsB UZݺuyVt4۽֭{ޗ/_z_|as̱ږ,Ybʕ5jE]d_|)R;rH۽{{׿5b{ۯjZ7_|E[|y%K[&Mv/X&OnS5h6ln_ŋ{#ޫ^{mW)Sؗ_~O{~     Ukժ/'Tڴid? 'A7^G7F1cs^WYÆ FS{KƌnYf;vh׿vΘ1-_qD5(ީ'̙35K/5 k@AFV۷wtIkfSNM>tEϛ79n۶eѢEoڐ!Clڴi֦Mzx4̃.]y>2 Tzaz}[;I't-W~۲eD}8!!  @*~     ާJݔVEy/"E ާ`(, ;v{6olʎ)S*Vi^Q+òH[vXv̮+ZMm>9QN>d+P˴f۹s;2kԘPZ5P~zg?Ck׮-\T'XWnW)#G53WT/OݻmR)b~ >׌[nٲeqnRJi̊+UT;ee4iipFhv/sα., ȗ?u@@3#    Z`ʕJŋ7o dW  (`{y;n8 Yʌ߹sg ^q &L+x\'p?3D߻woXwq-|Tܹsp]N>cڵ@8C޽za^nVSlf @e˖[~'{ x:2Y۷{1{mf)f*_t{l=z?jK.:oСCn`cX@z4@@-/7|n     OTx^!ޓ>m Sݻwwgώ)kJ#F-2Aѷv[`pe;SO>񳠻տ+~/Ҹqc{뭷L*tV@D ϟ5@}P̔sf^zr%o[~p4AAA hͨkь)۞={bjfҥ3a_Q]i   $#      9-WXъ/Ӈ˕ |yI"py}rv G^z.s{f2+H\YCi& . Vɱǭ[;εO?YhUP޽۷Of}~0}Zxmԩiɩ>g*84BeСsNw^G:Vf+쯌Çw>#/es1mz@ku9qD3}ίqh"Syhyɒ%ֶm[{C7 `=Uz7oꫯiӦk`S;î4@@O~T,      +W\jժG&>l .t])i&x x/IIyɓ'ظqc9tᣏ>~E}iv x׫W/ͶuYVdIWM -:XǹY-[fׯw\r??}QA^&vC>Ω>'7plO_|aGv{-, {,X_2:au]nB oD3w<.Cv"7k,k׮-^4Ƈ~ꫯx+h_4XL7ovڤ*/;n@@@ 1 O^!    &b ԩ/'bD͛7OS ( xrt XX* \j=Sku ҥ[2}. ?ՙ/Zs96ePŋ}c8U]sh5\NY9&sֿ_*@H#؂}>벦yǭu֦it{zGԯ_.r4i?/_>*y׍AY=ݺus{e;vp\R~s=~^uMu(,zokР W  % fJқҥK>b@33ZQ>S -<  f˗/R%^5^!ޓ>^KvRF`.3q:^ҥK֕+W΢Їn[nO%Jn :ur sUΝk{q˪EٖZSh >2$o&-+V*Hϟܹ[Ls}Nsl裏{-{%y2S6欎>6e(W<}3;b{뭷\Я92]؎@8䓭cǎ{ٸqO>Q]yԨQ*VN'x}7nR ]Q^t)c~x7mdUVu3x۽kݻUw1`@@~_A}b=7@@@@HUTx ZdifrʕL V2=GzQ@ 2+^׌zވ;xw]] (얏;tY}fg6l6E ܏X    du,Pw 4( G@^ݻs   ^RJYMDTV~K8}\xnY}^zرcMlFV0Z#|G;2Bm۶YѢErt{7ߴ``hr)uΝ_~֪U+w2袋\xpX }e} jӦ͞=ƌc={ X.e:ucj:=㑪5X  )?~BW 6t sN@w    @ (ի]'7x͛7OSL r*(A /z!^¸q\xF~S~/^3gδYf%ۖ>,<@ܺ _tiv-[WY>9@ ^_~ &D<7J"oFf%>R{N.]m>xzѭXbc=  @p+     @>XvgT( ,O{8 >4 T2du8`Ç儯J6l)h瞳{'*K2GVD ׆۶mro}Q[| rU|/5;W4 >8N nS}zP6"@tp|ȑuJY]uM{7'4z_mK,1uQ&@@@ O'L3{A  &0p@7˨km֭5^Yߏs4  @r(F+u~'D'AkA^x`<'7nlm?ؘ1c,9s9眓`W^ył[htyE…o߾v-|ОylwI&v)?wA++W3f 4O?۔}N9SrEvWDD׌)Sw ӧO˦=B@ In&   {2?GLNyy jeWPn==z/R;wNsG޽{pQӦMmݺu.~VFjSN.^^Ѻd,7p|HϻAիWw駟 ~ݵk[gϞ4ժU>;w++U'L`-[o{AՒS}j?ˬ~~pGG۷]uUV@7Jv%K]w)_իWwm[l={YP4>O4 ੧2e2@@S@ yPB"     +vS%bU*Vh+WϏ%@}$i'_(СCm.q{oezu7onSNu $;vy۽{G*G`v . R^QGAz r=z =_jx߭[7iBvނ{=}N9"䘀2Mnƈ(U1ºwz;xo>R|duGmʰ۶ms{oծ)   tO뙾۽# @'|{Z MA =\7o^n!  Px[nuƊɤ *m&w$Lt?5i]•^_(h󫯾r6lh]t J\\9;>sO:$Zj:|9\L0|p۱ceF'F8cǿ֫W/{˖4Yx 7zVX1+]tMC@>3}gj4!@sX  @ x-jUTInf_xSgѥqnH&ueudjh֭k3gtY.]jQt_VhmgΰN*L>=4kn%KU{ӭ }cAEƲ`pkͼs//>rpbv2).A3E+E5kD)^6l`[KP'gHٲenA;84i:t~'FѠZjn0)   G;;       dC@*^R{鯿iѢ >@,٨Q#wS4", Ս[@#E3v4hr@@'wTF@@@@ȏ7n}S]vJ[lI$#rT`ժU \~{9GG@@@@@@@@@X|p:ud^+VhUTIS ,@}?9t 8t8p >         y+b ~ʕ}vwNdZr@@IYrŲeƼ/;"         @ Z{/۽T[h=O駗C @%[n7@@@@@@@@@R^ x/<=A󔟃#     ?=sl2JQjUk֬uN:t}-#] W^y5iĞy۳gr1M7>M6֪U+СCc=ׯn5j԰ rrW^KCԬYӺvpGxt_N"68p =}߾}TRn:?~|-_ӯ;j(۵kX nݺּys+]tMiРA:PP!ի:}f}3gN3Z,h\rŋ3Ž֮ZWo;?<̈ϝ;צMwZncy/E}zNx``ؿʔ)c ?@`-[+hkE/>|؆ }ٙ _c+~ՙnVZi}Q۸q 8׎ >T֬Y~y)>+׿'=Lt޿k6u Сy-^ &L RD~K Th@Imȑi97Qe]tlH @IDAT -zkU6O\x_L  LCA:z~~CUUf+VLSI @}hk׮/VZef9aFxٽ%9@@H m۶֮];IvC3RIsR@@@@@L,XЯO %u\Eٟ~ic߰a heɒ%Vpv벳g0 L:խU^薧M.;}]~QGe{ݻssR2i$ ^,^{`}o{n?6ǹ =mIJk#ܮ߬Yk>u|c9@v{buU~:ӬzղgOLyK ʙ3g͝;ۗR@@@ =M*dsIL.xO G@@@@ >d=~z2eZҥ;ԫrʹ,jX<;F:'2{\7r^#tjL(xڵ~ռt֬ ^_.R7 1@v{ܺ{L4gO3Z38p ŋۏ?h~]v֨Q#7|v_o?L:giZ2ͼfk߫=  $@;%SNIӡ .@}?At@@@@R_ +ok}u:d#Gqv귵h"9^ l;)Sx)͖-\p^]{nĉNW'ڊdr._vitiNȑ#uM41uK]e d级gu= : ƍsZ~7^3_>[m6 ʞZMo+NǺ(P ҵYf @@@ 4`+^3|}7ArR 9y4F@@@@H'@}:V@]n;֭[7->P 3~v_Çv|*{W瞳ߎ?tbŊ.׬Y3WR7nשS,N:Ն ayQA׃}eGlN6geM/ڶm럛~޾}{QXKH]]dحsh]VVJZxrX{O? W/[ha/5hL>) Mmڴ..bĞCFޫ~٫j SP#2:T+~ժUaS"Edj*RW3we#^p ?2j*׷W[`pzmx,Wfk;κtI&m&Ms WT/Zpוnz/ a/v3z X߇#u_ٲemƌVtiwRjoVvm۸q=v]wYRž!7tMWe޽sXUu|%K`{V2l0kyΝvA@@_}uQG%ٹ4@N {oZӜƥ}@R]6(   fU6R )0vXSݨQL*6m2;mShEYy (JppIheJWp+[rRB l W kjS%xqƹӦM=zDGSmG m.vi.+ |Hג2+СCUK.5kfa.h6x^^ۭ[Nsb}/yWpp0@sbw}ʿ`&֭[jjJ%2WjӷĚDuoٲenso|vi-38-ZԺv?ւ~|]e. _g/>X/=n@̜9sⰌ  @ hݻ]ϳ3[f 9)/s@@@@@  Ϫ+Ppaɶw.fSF۷ WAw ^"NAj+2`xg~L}HYY 9s])^<%5ǫ4iĦNj|ֱcGqY.4tdu gu#$h6>̝hy/k/ںDxO}kSNqA^0 +Ym׮]VLx6(_=K,1eOᄈ3<ϟuT+{=Y3{'sN\^|AuN*ڞ%wyo~WӬpeMAWY>;k2@V{H;C:3pYo6nn!4p?\!  @b O~֭/'ゾK_pz3LHO _+ P{#  Pl([6P&֭[~mӽg̘2J?kQ`2Ss̙3]ڝ7ohWo;wV%f 9o߾cǎ5m껢QFE=GifϞmcƌ={F@׮/z=_|.\'U"wlx-_g^c]t=p^K6mDdpQ += x4+:hƛڵkGև˦u6"  @ &{{ʥ`TZhpt(5 iqV     @x|2 Du/YJp}~]nYD xa[ʕ34@@@ A&HFW_}o.rC d>|ˢ@TP6~eJs䜒O@|  xÄw^QkN(^r%~z8qḃz}*9; M65W^y%ls]tqA:t N͟b+fC 12wT({m6rH%;udӧO%Kŋ<>Jn=o}Q[|,ႌs+aÆ^=s=^G @f{9?_6+޺Xׯg?f@@RSxE^I͝;?/@N 淽a.\h صk#d8 .]:  y' w=ȩ.f{뭷//^<4iNV^tEָqcMY- twu6jȮ暬6_m7nt?|;ֻ 쩧;wڧ~j䟪E r ^xL ߿]q3䧂^={tO}ϾThJ߾}[nq3~g}n;?&O쒓3&lۜ9ssB'zYrlny}>*֭[L&]vMs\^ضm*Uʂo ng@@_@5]E3],X0;^{ҬY(5ل@M}h @@@@@0m"i&ڵkg 4pA}nر~k N/l O-[Fܮ  0(f6X^Ao[4M'|2-p x8e5#;{m>7l`/R&zUC f踝;wtP;p>餓e]fʰlٲ` {EI(TٓƮZj_ԩS*;R|n9^ڞh`oLƒ躧Nk>5֭[M%YEWoFS=zXٲer1ǸKnV7ی>YV܌-{uv<6i$/2}-vh@@.4`\nݺqo?7w6K-{nc?|x=%@ {6o޼nvE.b6 ׯ @4  @  >|-[V`u2+@/RQP`ҽ{ ﵿ׿ڊ+5維Z.t9X8tb]1uTlI zO}~7o^58IТH%'އR^}U7l֬YVjUc Cl0hٳ{DOA˃ rU;f=V@1c.f!ծ;LaW_ kp9z>tZ}s4cS?~Ku%ҥKu3M>vpY+s~Þ;wEdĉv!WizCGۮmo֧O݀`н_fC@@H WN=To{r\ _*@@@@@  ޷o_*([ 8pmݺBk1W\Er?},w`ƍ컺E*k2{23U+\>|8XV\y啦[fJ֭`~<3e[f2)Y&]x8k+/^nuuovY]y9d=RVZ?/M%Al߾=j:` {zҥ|r LjJ5Ɗ ݢH׽}/n&LoY׮]27j(2eȏV"窫2]7wi˗7M>(2  +^߶\4+x۸G [@@@@@, (cW$mּy>4C< ֍@<-j'|ų̴A۶m3S:   d^ICԩdMfg@@@@@@$ >ɟ@ʰ%b+)ΑNUVZ^۶m?X)   8/fTRҪhvM6znΤ=:tdO#    @ xj(瓈ԵX`@&:Y>|8G    K@~u&i͝;)ͱ@@@@@0{S@ ݻwvpƍcڏ)ʕ+۳>se˖y_vD@@U(DD,dP1K],`L Pq 3Pt]$+d1}֪{gj{+:S50 @{SJFׁ@gΜ:eCs     YwؑŞlBTtbzP( t]{+@@@A`ٲeYxS@1Y3gu[Æ I&ִiL۽/-_{^h-Zφ 죏>ٳg۬Yl۶mVn]kժ]qvG}رnSNN:ŭO+5ȸqN;:tpT6/SO^s5V~}un&Lp{iՋ%?ئNi}v+ڶmkg}-7͛7g8]ŭN:n6mXŊ3l??_?ٽg}ֶnj%J}d\|lɒ%nGaW_}uJS5'o *ؚ5klȑb{6eRy衇l˖-VT){<~[2e쮻rZFqjժM7L˳dڴitR۴i't|əsnڜ}'7x.\[ƍK/M_,|:x@^[Z  a >Wv!    P\W^rCSQ,bսn@x/ywgܣGX 2zhS@y2E7x_{?fF}׾ӧP.gx@ՙ{U[omk}ywh1np̜L'+\G}4 QR 0+\eʔ)vmL4cﶵk׺WӠK.S0OfYY}xz83{ 4U 4P~{x?$} 5^/,XP Gh@ist|_uw_SOMx{Wn>^,4J%ڵk=E*H)#7Btt 7nLʎ|Zl2liЅt5fP`t(_Yeoˇr[XJSέLzyEzEY{4SDm:&^TըQ#&.Y`úu쬳β~!?/fPkYܴ9't|5%xO }$8R19gsKs.օS pV!  @x \     @-[WWFda̙~K @~ xyx>e Wk(W_m_} ݻ)0QYh,[B_t?tLY|~vsr) `֭[gji 'p-[6>YyfS&w|ٳǾK_f͚:ñʎeHn8ouAzNy*ٛ^Et|I^_*3E]dڵo]|nnnΰ󠧲_qnVгg {/D߯_?R7x)ó7D+ޫ}fp$^ht뭷 P b;v=cުϹisN;92C4+L\>NHT?b]xrs oh  ]@,lg {{i     @4J|L`TWxI3r|h޼~ɓz_|ӧO{L#>C , , '7} W :WQqraQtihޫW/U=ǘ1cL!R)@qg*>u27lU7qD6ѦMkOZt( 2ɏfw ~`ۂIe9{V* 澧kvC_[H$Yb-~ʕ+=@@@ $ }d     @!ؾ}X(/㽒L!/ʖ=5SsQu5eWWQt)+߼l~ \7e \)F^o}ZNJN>d!!\uUnF}ٽVr/ 2{YW^ms|xk6[TTP{Ao} M:Vz )m?f͚eZ2}.5LJ*Yflڴiq;_XC f_iҤu͎YI̟_RbE7Gvᇻc5 @@!*Y?=     aP (׋' Kr|ѢE-ZXrrr8"J7P|Q6nh+VpUiƍ']mjw+ݻ3~0a[cz2l y(ʉ'˽tktWQ)ٽ7d饗:ѣGޒ k={yx/|au}2ݫFgyD﭂枕eGXrs{7cǎgE@Z?vjy!c#z~.PP"۽2 oڴɝ +b;wO>99z5J[B_v$y1bDps^p}ڵͫaÆ|r . KҥmjƝwޙi, J2eNT޽{mvwp{N6m/^9MzL9)nsvL0X7H徧o+;/͎43o;MI&RG]r%f?iÇwcU?;`馛L\,YΫ,;oXy@@._A*veeʔ)$@@@@@ !JN,{DŽY^?{yF /|8}Pf]eU` `fUz衬6' Yfۨwuۤ_eyY\^XbNkQzOx lO?nC=ԮJCh$:f5j HW@gveݺu=5\czĖe˺ʲUQe UV/Su.pg+Ci{zz+Ϟ=>ۿikH WP2+K/%̾c{?W:?tZkYUƍ!8խ, W2M24 C/4oTZ5C66;X-L:e7oۤ@xWjPѣzxo97mNS޳<+=9 rrzhu]W]ui ~Ҿj?ߛl*(?TT.2{g\!@@@ $އB$ փ P"'%m   䝀7(Zq- 4Ȼq^5jgz xߥPU6\eͮ(pW7d T駟n=}W.XTV <(@;6?Q ^+~ڵ.yǎ~akL ]eKթSpml'*ʒ1<#  @d ׵5     @?ŗy o}Y5laZ}EYnBӻ>}X=7 +YA={txzNWQm(/f+Cĉrٻ|]s*O<ѝ۫GxR1kkNUf/;lѢE.٩S'?~ejVM駟ͭ5OܲJ2eLDV@jJڵMؿ7VsΦ> <~S{eNwS?tQ_rrﳚ۶rJ{9,3۷χg]db;@@ DryWP͚5Ah89 QR}G@@@ oVZe۷ow+idT2 -SgpEـ㎳[߾}34//HGk.\,y1d0^{m * Gnvxh6h?YK Vf#FM7ݔp? ѠTRqݳg}ǦkXx>;zΜ95//E5u]8lҝO?͋Slw{VRirrۿK`z6/>\h;k'x"Ѯz 0   @xQ˚6m@hK    @ ,Y?IX baƌV2,@8''eٔ{M֭ۙk WQt(z׮]a^Ҟ΢LfJJWI4l0WkO>i^欺*= wl ɖl W`(+xrS~ۢE z6${:YyFH joޏ9 OSF 7޽QlDձ@@B PJXS     @00dW!{205}Q[| V|/807 W;z-۰a;6 dOlѢEpB3gkV^87μ, ѣG&'[oʹOaY!CؕW^N :Fe4 A6muz衇rX*jղ^{-n:?#ۻw,ۑ}r!.۽tAzPHW֩S}{uS?] $sSU3e辦2t m۶ٷ~VWwFܠ2U}ҥM<#  @EL@R;:K/u֥VG!fMA@@ x*_TonsHh+TPX/@8"]#&*o뮻I?Ϧ;wu Wev(SulQyeUfrM7V>h}ҫW/?ۻNM4q P.%\b r/ٕ\0C/9S[nq5~mӦMnքN8!~R#hO<ʔ)|ܩS'{ᇭC.K8a„ 64e]t˚k׮mst,(g}R?_58@ViӦLժUei_reފbŊ_oNsz[@={ذau8t_px'*v v͛79 o+˿W8 ~׳2+^^Ive~W>_tEi [޽M2ߢE ;#l˖-n& 9-ZmN澓_TŽku ;#,+ݟCI @v=owhG͚5/ks]bƮZ LgIew~el͚5.x{e0`%j7;餓ս{w|ƍ OTwrG2 [qJ^m9+Ma fxcq-~o@W2ʕs5rT 4[޹U)   nXp7! Y~Gٴ/^҄&1ꫢm  PSzjfWチ|t7lއ= j8tP۸q ֲ:&6|p5j˸GQGWgXV#ufHbA^I&^_8 ,Pɉ+yu%Sg2xƞ;{ >+hnr3!(XtĉD]r%6h ?w^MTڶmc~e1 Y>s7hcٲeq'^:2eۤLuԉ꠬WĂsM6#Al}ɔa?7m\mrNp~:_DƩ޳=ڐ.5Kt=k#+wo>w3T+Xm@Ee `ݧ@@uy/#  ^{裏S\Jx( H+ F+[9oذ!nL\ Ρl 6T*5r'ځ%۔?^xw9n{ bz,\0jrsVZy =豕*U~.{Ng}^xLiٲeḵL<9vU:tHy$}vP?F'jpMJ@IDAT~Vn]ӵWrww r*|Sj$嫀UItߋ=FA?϶`iӦY1Y;+WvC1c޽{M;7XI P=@@/P|yw^PB@@@@@ +Voh^_ R/VpMGAP@fjfkM=+Z+Jzw)Y5i=ܜ@@#PZ5S2kצBjA@@@@(K,LӧO{ -PHF@4e2%>)񩾟훟M\    JEY͎MT     }ٌ3vo_f }As ݻvڕc;۷/e \`Ν)sY(@@@RFndʀOA@@@@@ ~;tvGPe/^wqh(תU˞{[r唏@BW^ֽ{n޼yJq   _xY_2Z    N`l2׮ Z%Bc;wۭI&Vba;y.@}sttAvצ*@ ]t1=(    @P xoYӦMYF@@@@@ [v;裳?;̞=־}066AE     N;o//@^ ̙3}L|LX$_~ٖ/_x+.BkѢEMa裏L_͚5˶mfuֵVZW\aGyC=d[lRJ=㯏0|p߭L2v]w%W^{5[dCu_} S{,[+k.-o*T`VQF'vej즛nW?öyf4w:u쨣6md46|?~̟g>W}Yۺu˸ַo:6uԌ'm۶vg=x [paG5n.R޷cǎu˧ru)_~7m?ӬCn9]'fҥK^0MAߛ":nt Y-9N:S^k{tZhUZׯogyuY훛ϡWȋ^x{K@@@ *߬^#E -@}A_Ώ    !@=oPhv=z0 =z}I5QFqk;sMYE}>}vqǹ \0[t{iW׮]Ρ \r w+b~۷φ v-{ ĜYdx?$]G 2?裖 *U؀BL2n6&M,}ݾ_8#Gƞ&W^yx믻]vz~ས=س UE:>Kٵ9k8b?\p1c؝wiÆ sT;pNe}Yl]4BGssx} oOi  DI xՌӦM )X(` pz@@@@@ ޓ az@իWۚ5k\3>S޽͝;eO6e@/VXͦ آ/Zf͚DSy\ݻM߽^󟄁>:NǤh0t„ t+#Ilڴɿ>r[?TTjԨlJ% b]7Z][?^ܵlٲeٮˉ[;,׮]?^zь {[qh?=l皹AQt}U)_\yuS,wCE7e{Nŋ`SmsN;pN+=bŊn LZr͘1VXa;w a9aJxjB9  Ьv^z>x׀#@}Ṗ@@@@".PV-?!ݗ_~ W_m_} ݻ)0QYh, Cwܑe˖7ߜ!^Sp7ޘyx{S/^=+8[xdDo_^~ʌEYv} ʖL㩔8koŬl}،@ Ot&r)֭sTZnU?+ߛNeۂ 9,-[Lh@_|aЁwUhPNV%6侓Toߚԣt(>k|?Rp :@@{EVwA/1'Jr~ =@@@@@"/ Wq )мys{ɓ'9/O>}d ~vqV 'N3;֬Yڴi9ׯ_Egq[7n\nC!Qti7W^gc̘1TJT;>}'?uNyf ^oҴ;Agq,|%&M!^48@Vj*B$t_ՠ4kG'Pmݺ{Rc4($٢A9SN/  T{;xcǎ"~ h     ?˛UYjV[?V\x0A^0͛]FF)[V~iψ^sek̜9sbSh_|~d[*+U ^2{} 2y%L_gu)Hg=\7 3@n{q뭷ZʕM3nt 6gT3ڵ;Ug}6=zҥKM oݻ[fܬǏpL싷z xӹ;ui 0@@)~zӬ|*M4 g#i/0zN    dS[Tf5NˈZJ,8zƍ.^{챖鮽{eײWzs^Q^yB{^zv饗:ѣG3$ %jժﺦLwۄ ܺ-Zl gYy7 9ΟUγgx, }oǎ֥K{GL݂E|IPMm߾e׀ 1cݻׯBA7}Eٳ]pnvbŊSwn:@غx  XpߐMQZԡ]vQj:m- y!G{     @~ (y\5k\:7A V@SR+sJ*UԱx?㷷{.Q :{i?ܨQ#9&|m6S;3á^fq}1.^p}ڵy ߆ S>1c+eGN⏅/i &1bD. _GYYM`On]v_ۆ  6mڸϬ;֮ZݻOqmlsvt9紓oyKЫz{g\zҶm[{饗\fJ9eӽ;n>-W;p@{\}'2+R~isN{׬_~szYf%]R^   @ ,^?3o(K,q}/ a(&M2eĠ  @=?g7=mVdz TR9c@@イrJ= \@z(oj+0Ce9a}͚5<.2e؉'h V2/_L@sVBUO=Txܹn`S3gČx>PF+V_Uu衇ڕW^Zf1cبQ dIu]A{o06f7 CN>Kqѓ\" ?>?Ϥ>;wuYg+jSms*t9g՟xۂܷ:Sz~T{v|urn6+תO>#<~{GoNMkƇR@G}U&`U7u~ pSO?d ׽.r  РvD1ާGt BH{Ӛ @",;@@@ ԯ_߯~`]_P^0P;_ٲe][n[Yٳ+w2˪UիWs[+XQ'|;/[sr>o?Д!\%x'|ҭ7np n9L?Vꂪ)Q0E= ^9]Vf/@4>`M P/nEѹu֦YV^f5sD25EN>Kc=l~aY^f 6fURms*t9g՟xۼtAvIj]ä*gߺAoe]fT﮺*{lӦMnvx'vWgp}o?ɓ]@֩^}p6|p7kԩqXF@@ Qx{x%}m<#PE2 9'     @l}2ǰy)0rHk=żydvP0WA=r) 1/Rxq;餓ܲ~(S|ҥmn@@\YUZhae7xcN;e\n-SPils=g_}mٲsΝnpQbR9}ϬnvK)U [A?{ Ow9agl}k37R9L 9gT860^ >S)H?ԨQíڸqcMK._7(/vf=g  2r! V%0Zho xi\pEqʌB@O@ p?hРB+Uf͚E@@'aC za)x]k׮={rU)v*Eŕoq2g>eVO{Nroql]vu5z޳h(/oeZHSq~i^Po!H;#CpZpx&wտ?QV-@@@ /Ō9+{ BgϞְaCwjJii2şwy 6رcSẆr;V0A/٭H7դ &}x}ݻ7 gge˖!CiСCmiC$goЇ2-\ДM[oؗ5W%_^xy_x@ ٳϴcV4n[P@@@ QxO}߃+L@@@@@ r^2wZ*rGdɒvswu__f͚2yʚF{ON?tϦM\6<\r%~K/hbKapw wA5xGm O?zh[-\H͛9㺮#F˰sNPXY QFVjUgݎ;28w7C`yС^d{`#֯_owb@@B(ӦMs+Wf͚P&uE#    aծe˖YDS _|E;^z^}U+QDފ>ڵk罴VZgm-Y:ud?)Pϟo: ]Fe~W{iXP;DN~m1'pB]5W^ɴ>BA[gwދ.J.Թ }뭷ڍ7+hS5ao[: _|E7ovGlݺ5]ݺux ڥK9Ԯ]ێ9xgZR \믿-bÇoٺwn^A˗/{̞}YW[OXsۜ}'^_=+Wl SV>/{[t㝃u֖/_};vݺu%ݦ{>W]u?n0TRXһwo[z?Set߶m瞳1cӓ}ԁ  92WP(}ORi߾?\@[ @ G.   @طo_8F@(t S{|Pk/3< ̪+CUl}][bYUw?a0v܃RXﻣeNJXeƍ<Ӿ Ⱦ3P@t?C#M͚5%ök>[f(q=dB~ pA:n#Kok׺56]#/KN3(@7QIw9׷M6`{ =bKVs{~^K Z b?i .I&Y:unƍ.vQG}E:]`y@RJsNA@@h~5XI0V4+;vyF T*^7 =(     @ +B{yF 7 :4?tPSkC2}l <-ʼoۣF+[ WaRjUkʔ)ne\Wb:2m)J۶m]կlޯ F &Ьjb,^@szAˬSm=\rvM7m 68q_eZ`p3+*gva+     Pp rRo!+@Q^M( G6m?+@W (Ss1zK]&+   @4+QxҺuk#޻ׯ_p4   N`~4i/GaaԩFթS(46Qg/׍n#    @!h޼M2R~:tP{L[;wڮ]R:Iǥt2B {~VK,   Q2k} t@@@@ ||rװFY,Z '}Pl*p @@@@@ @0w޼yw` HK. pAٵ^[B@@@@ ˖-={6m T9k,wƍۡ'LP ZCZr9vG@@@@*вeKsY@@@@@@ (xbe&M(,̜9vڹs(46aŧ     ^UZݺu]xD@@@@@Xh߄eݚ4i!lc ?~|@@vw_H`͑l7F@@ @T.]jk֬q]ر/N.xחu >\׃     x_}K H`ԨQ@r'n:;SsW G#  E\`NtְahLar     @Zʕ+gmڴ3gڒ%KlڵVzM% 4k  +͛7{/yF@@HQ`ٲe{R._˖-km۶ss2R >U9C@@@@Ik׮.^ӗw^>xM6{/yF@\7Gs(   '`o1R?}w.] YxG@@@@@̺t3L4_f@@@@@ ,\|/xΝ;_{@@@@@ :u%J}gl$B@@@@W`}fܹ9؂ 97     @Jm۶nO}믿&q     f +W4hzJ8Ӿ}ȴ"@=@@@@@ 'tJ,     ER`׮]|r&MX ްa͟?ߵuVB"yt4JFٴ@@@@(Z :tl\rIȇ?1.@A@(۶m+  om߾}͚5Lە]vLi(      ;?[nǻ/&+Gj˖-i0-E@@@@"+`Q 4in} ""@}D.D@@@@-PT);mرvZ5kk׮h%JM&@@(L|pa}A@( .{ռys9 ^t9ͥ}d >/@@@@@ ~.^-7niTtJCT    @QxGΝlZliUTs'N@:2B@@@@;?Ϧ,@*^ޝ@@@@@B-`>tᇇ^Lbs/vxKEC@@@@@ ԪUˎ=X0o<[bEQ'     @رcM [1i$,DH],    s9>;/     P4/^lwm֬Yd:kf.]D4O{Og@@@@@ {1c,      Jmlٮ_Z5, rh'     _ƍ̙3@@@@@ ,XmTMf{uڵ~QZ@@@@E];2      _ yIvxS1#vh.      WA@@@@(B^}JN:y0K.h3D VX^#    !hРuɵR_|!o1C@@@@H֭[tU5k,Uy;v찯ʝqVfvڵkHF"Ox*C@@@@B.pZr\+_}U۹sg[L@@@@@r+0|O4o3>  >&#    +W .Alܸz-P@@@@@ @tRȯ+K@@@@@P \wu~z)@@@@@)]v̙3hРթSp^zU$/N"    @aر5oum6{M     x_vmRJ]tsNή]4Jm     @pȑ2      K 6Nh"4iN} "*@}D/F@@@@$p饗ZժU믿nW@@@@@ x5 K >"    ʕ+g_w{,lA@@@@@7ӧ;zY#kO@@@@@ ʖ-zƍ##     +3g]7w^#9#wh0     QFvW[nG}4B@@@@x_dIkҤI3a,DX_<    xҥKO<Y=@@@@@B o>[hQGeeʔ }%9 >`    Q^zvUWmٲņ f&@@@@@.]jvrGh"uƌ 40 @     wy-[ֽ9rZ @@@@@B 0|Q6mܹӵ{~Y@ Gv@@@@@ Pn]ӧ[/4OA@@@@@0e˖ĉ6xSq#~i>     8pUZխzWm,#    DP x&Lu/@գ     @@ʕsk8`7x߿?f/^"    DI ?~n;l̙Guծ];q$+@}R    DDW^֪U+ٳgȑ##r     +ۊ+͛[bbw Sݻ]wr#@}n8@@@@@%쩧|뮻lʕ!l)MB@@@@N`NUZh}„ ~)X(H@@@@@X:X޽m۶UW]1/@@@@@+0|qQ ֭vQ@@@@H 0l0WO<`OV#    U J͚5Q6ij֬VVڅ@1     XKVX17|J@@@@@'ɓ'۞={\wDP x_.'A@@@@2 苍o٭ܵk]xᅶu֌; @@@@@ ^afrHh۩M8o> DBr!     H`֮];yٲevہz@@@@@믶n:ך-ZU1aQ3v5lA Gd@@@@@ 'K_VJwرcm9}@@@@@ @vS=~˖-6{lԬY3^zqJNf@@@@@ 4GqVD צ!C/@@@@@sWl_ɓm߾}iݻwci >W|    DGOzopϞ=?_     .`}VոL0_COB! ]L    d'зo_ӧmϞ=vyĉ;      0o]ԃ    I@S/^j;裭ti9lڴɾW2WZ5'F X@@@@oŋkum۶if~~7!    $Xh)^Ea.߿5{an*mC eS@@@@@@ x̘1~Ν;Ϸz*     @!7oߛޏ?o'/@a 0]M    @L2;إ^ڻw]e      @ ̝;?y˖-0.|'Ys׮]Dڄ@5!  ٰy@IDAT   (Y= wBYO?c@@@@@ axtRN.]\r '     a(V 6+ʴiӬuٴ @@@@(s;CFr)2 6 ?     @]v oРavgZϞ=m۶m)a     9_m͚50gW'|rNDF\*    @6mlΜ9v'ػ{d%v E j/VDKZj5WTZV*j/jUHQPdQP =B !~3$3L2L>zz?= 5˒+ ,p     <5k8OrYhkNdqA G'      hٲ[2sLIKK3g۲e{2i$ٷo_      K~ɒ%RZZjnj}l)r     @z%oG?Keee)@@@@@֮]D7:v;tDrO     @v* ܷiƜrmɐ!C8      %`W5ywآ[SCv "@@@@@"]뮓EV\;v\|7D:    4@yy}^LCqqqr]/a8:,@X "    M'4ydŊ2j(@eɲuVz:      _^N8atܹsW0aOH x,    I`Ȑ!gɜ9s$;;\R^}UݻL:U tuN    D5k7EOBu"x `r^@@@@@ ~K~~<Ү];s*~^L!    ]dٲeာ"p6BP}~( @@@@8~&6mddd?~u]'֭ [b     @ ]y\g?:͓*3 & A x4ZN    4d{e˖-#H6mWVVʀd`"    +wz&̝;y~N :.@>?`n@@@@hLTd۶m?A:us}𫯾*ǎsn     sNٷoߥt!YpZeРA8LƄ@"    $%%/~ SW^;Q5ɓ'OL-۷own    4g=jߗ 3L۟ @9|#     D&d_1sqdOH=K.1O?a@@@@(?~,X@֭['?O%99ٌR}] %++K~a:6C@@@@@U5x>0&;w:Q}M)@)6     /3f̐;v{ݻSaH׮]Mޒrv:     @$ {}h߾}CV~mlJ&r @T5@@@@@.\(/;RQQvDFF\{2i$:t6@@@@@H8v오%tРAjժqlƵb 6lXȍ!$| 7`~OJRTT$={ʦMBix` ~`s~@@@@@ڵk'w}_^.]*7t90}'YYY2zhye޽t@@@@@pppCm3g 븮PA N@@@@@#0rHyE(2~x1ŋ˭*:uG2sL)..ϥ8@@@@hrիW;{==%7'(U醹W@@@@@ؽ{ Ϛ5KVXQFeܸqr˄ UV5a     gy|%-[0l"=z08p>$2d W      h߾y睲|rٴi@UɇR>S~@@@@@f(}v7o|rĉ b\ z]cV     ?~̟?ߜP233}zѣxÇ%--Mv%III:!yd      | :tIz)?яL3f$''{܏     @C͜EEEҦMٻwoCNcx 4i9M7$/b@#aa1T@@@@@ TTTŋߗ_RPP*Z ?&?`@@@@G`ҡCsȸq䣏>;vXYh.gqFPa!04@@@@@&ؼy k_t1?=\3ԩX    &0|?~zmT ZUU%}F6B CpP @@@@@&ѣg?>@8`?ϥO>nc>믿^:w,;S{=9|۾,     V^4h g;3g4{ 74@JU      [n?мy…rAC9#?3ϔD@@@@UW]%g6|ׯAN<)YYY}vwJǎ|\ &#x߄\@@@@@ |*++eʕ&GҥK %$$Ȉ#d̘1qҢE @@@@msƍxGII 7 я~dqE7}6>M,@?.     !xbM[fhU(Okϖ#GJRR]Y    ,WLKK3K>|,_<$v„ 2o<3s%\b4&     ,p# .4|w'CѣGvgJzzـ    !o5joY^x&B}gfflݺ5$79 hy]G@@@@@ [.4=ݻeѢEVPPlEE|=- :\L     YVrРA&tcЇbbbr8\ A@@@@@ɧ~l֭~eߵkWg_+vi&LM@@@@"R@/?\8&O-_ۥcǎM:&.@Oa     4oŋM_Zĉ^QRSSeȑq*jll@@@@@8eŊÇ%99I] 3/\t {@@@@@ERYl,YĴKʑ#G5**J'v_}*W16     д"ǎ>}HAAAȺرceѢEf .4M>(@hρQ      Pn͚5& 湶)--Mb1BڴiS!lC@@@@FoN3W+o[#]e4c6jQ|;)<F@@@@@ bbbdȐ!qf;v mRQQ1}5 LWÄ5Mϙhof    $ϳA&?kO:٧*k@@@@@_@_I__|lίmeذaҿL     <{GOn.0|9w:|Qԩ:tHᅲ:b3J }Y@@@@@& [t,[L/_n2h|euާO86"    s,\PTT$۷oVsoQ^~_!#@@@@@CRg_ׯ]_۔*C:[޽%::؆    ^Zn-4浀FSMUUU#6l0CXz 8uU0.@@@@@K@+WrJYbi~mOIIq b:e@@@@-[Gࢋ.{8} ǎd@^lhQ!     @c $''~kj/҄5m۶ٛȑ#xb 2`:億{    4{UV9 whM9=p {w@@@@@@hժ74d߾}&!|U㗕M} 髴@@@@hJ{judf(zrVN DUYөEz      \Bmoŗ??t0~nndggKTT`O@@@@P .>|+kiʔ)+KOo)5<11F@@@@@H@ի%??_***꼋0` 8u˩u    @ǎH222D[4Ŵw^ڵ;vLeǎC@^l81"     @hH~Ѧ٣.//}mi(ڵra{3?r,]4{V2|A|Sbbbݘ#    ;w4{!Cl3f0{V'td*އ0@@@@@4*ټyYƭmݺէ[MLL~9vhjaL    /袋^6mZU et<-tZ  P+ @@@@@@ Z>;;۴K/yCjv 믿6KKKhLK\7VǷ-[tݍ>    M"W_9Tg͚嬺ew~"t.@{6lA@@@@@}hڵΦN<(333Φ|    @ &N(s5ڴi36=Y~~9fҥ2rHgG@fs     DѣGo1u9EEE>ݞVWhہ| kɑTN    #Э[7پ}Iqqs7oL0\r'4*@>\?9ƍ     'A|_!Q[tbBw 䧧    > ߿_ڴicnQDK.@VZ7@@@@@C1cLso*k_+k@~IIn_XX(>Cm;v4*kL    &j*!C8O\Bu"B}D|     "йsgvy9w2{;A|>|عٵkh[p[l W֣GO2nX,    T૯rySx ^g-e2@@@@@h~;vp5o)..Nz ہ>}@@@@UW]%g67oe߿ڵkezݻwM6Q0PO[@@@@@@ػw A|{A}:𫷬,T    {6D)))i]{2k,smb  x2A@@@@@?nذA ܚV+//*?ƺ|vD@@@ݑJF!_|E n֭ҫW/9qℴmVm&gBb}ޕ@@@@@@jHMMaÆceel޼pݴz~B*շPT1!   UL^G7dȐFM^/zwoT}.)QS3Ur3      ntVɷ:o54߳gOIJJ 7Ƌ   D3<#wy^zIL({nʒ2III۷KV\}}      sȑ_+7nh:[aa:1GTmK,q]-QQQҩS'un7Bn\,    Aꫯm̊O= ŧNJ)A?*      @ hu2o7md:߳gP·Cf]jj@@@@ uI\\9rDk5{5KKK%11Qlbޚp:ç="     @d IڪO v껛;wO?mۚw6&@@@@9 ^ZE+اyB f{%t/o&to$'@q      vJ׹k~ߏ1Ga|m]JLL@@@@ ^{5O~"QQQo6l :,-[&#G46ydyWu ,m۶k}OMu-Zw}'C&A      @ nZN?tӪ_+ف|#yQQQͲVתnڪOҭ[7PV[b@@@U-FSUUlܸѴYfuݻ ?~ܬ>3˓ӧc=&'Nz~ڄu)S*|oN     4[}wkP*++p0γK.}&@@@@ `Aǎ+=z2A$99٧s\uU2{lZEڴirg;iڽN7tۇK _^      *PQQa^o!|m޼u}'  ۷   M %%^-999 СCEIII.ι_fs?^q8pYC=dSNޕ9O}8 @@@@@@ݻw;Cwm;w4a<wnȷUVG@@@*akZ~ݺuҫW/yLe2:NTT\s5r=Ș1cXdӦMU@A      8~lٲƷ:צBϔfBv_箭e˖9-    .2y=nʟ2c ÷nj~BLLTVV-SL^z^B?b<@@@@@@@BB4O'

K|E^pB˂Wh tO9c<=䓦{ jӦ MKZ 9 NA^Ǐ~m=h@@M6-UTt4g     1-~j:zh;vl)bZr]tyb&]܊+o߾5^'f3.7 UV/ )9-=ի]eS^{oގ=Xo 8m+C aÇ*@(pȑ#M͛g/S5ZΉhy8O@@@@@@4 kzVc4X/@ }4͛ί S @5jڳgO7ܹs]oy4 ]XD&M* -j5r;[(&O? Qď?JWQJ _U"P"   @ h@.]HxwСCM!> 4(b UIJ~u"^zo{' }1Cs3x^:t^zYݺuyȭe˖v'躇T"0Ss{l.>8ZZ^#L@ }nnbC^@@ lٲoSt,|     ĺw}~5ڵk]n]XK,aAl'kl|joVJꪫlǎ)UdCx SNui'|L}ۢE ˓'O   $G@|WaÆ<`m۶5'G/uM؅    I_~ݻ7a@ j֬yz)_u \XXt> ڴiS2ekF D^`ҤI6rH;^x="@ V \߿ڵiӦxb?@a ӧOwO>v1\k֬U\9CϝMPBκ? ^d pe˖NP4U7R[     .cp6 nS\rըQ>#ǁz.#? `ݻw7{>C.4%A|lif9G91~,Xq.O<@atꫯvU?#{7]R>ss9r$~g*V?ڣ+ft] #WQ@]wܹ30KgU;_vy[ooa ߰a=s֯_?FNAt@Q[-C˖-X@Ȫ$"     @F (r̘1.7jK*S(/Urꩧ6ٱ\a4(h|Μ9ʕ+}]t/_N:ƍwߵwy-Z6 V]    IٵkW{lǎƍCd}^n.@@@/йsg[n]?QR$۷ws":VF|jAJ:v~QF6NFؾ}zsC%KA(\) -ٲeիWυ?U-,U mڴ|D:֭[Uo }^p 'W1M%W\VJ?WUaies@: "~=       j.Y$ޡc͚53t[ѢEÂX{ )X2[r6o5\c   ix'\_}S?fU4g6c+@@@@@@Om۶n^رcСCw1 >۰a;-ZY9=@%\Ju[j UJNs 9bSN1 ߽{w?.G o޼VvmSK/:ܹ>믻 x*8#X7B|M? Ngu+b~)L   Oꫯknk֬<58O?dC Ip{iӦ%\Μ9/v)WUiӦ'Dz_8p}QrS]R@+իWf3mU9)`)+r]pjn,GnvL'JÆ >|&4ϐ,{wq=%u8R+̙3yof G4-Vu1Ы7z\[ yb]M6vꩧ˜1c}w~\  G )      @z(駟6XǂAjwۤISa]N<ٮZ~[M}U/] YM@mwLbj}ZJt5j׻>(P__mF~+W[oٮ]A@@@ 5{lv޽;5    @(R3K'3g}gy4<j9{l13i8cL|m޼4ۦ DF@+SE:sÇ]Nϊ`_~T yh 4 fOj7HA3- _MYW˽y{AZ03<ժUAA@@@n].Xyx˃ :t1x4؇~BVmڵpa݃Ѐc_=9v饗^jZ_eU:wο)E뮻;7nl+W… ۊ+lС=%JXz2j zΉ9'̈#,W\gqNKPi-kP)YpBo?Hh5%!'x]uUGޣBru[ p O?/ϒB0X k~ZՏ<,lÆ _uz=kرc];]J͚5]4N>dSCLOuΎ+9~5`֭M?s U0`Iqg~.]~uŽ @c=\ՖC ~;e;am@@ t+zL@@@@@@ j9n8=zk6uvO7[o޵ >|5j ;Օ)SԶ@VP_٭VkvOU6 B-g;vpj˦76ӧOw{ֶm[ܹw#R풓:?CA`˖-T4+  /6aZoˊP?~h똱_F:WkB@@@ -ʗg1:r [@&y~p <;w<Ʊ UyM+# ۷Z \Ѐ@@1ub;w NР߿Ro'|҅,{~o:uwT.ܪp`(U=kl9UVؒ%K՘F@|\X: 6̅UرþkZw((|&Xks̱ rVX1ݻwoYxMG@@@,&Mo=o`'/zgMB u9|kܸ ߮J*֥Kcݯ_XtIHP@oƪT)TK0Wגb4Hg9)8~] 9k ߇TدW뭫}hYp['84x6N+V])WEɿ{tMGxZճ… Y߳0 <רQ~3˗yȑKjqY6m<9x|p=i#96Ҿ;BA_++Wa /i9np_zmHW<1SH>v6ߓ d`د      )P߷~۵ jK5}8A Q[+V؂ &71~Ϟ=m˖-*Jkݺu_1KM4s UbE7FpYJ˖-k}e˖sxnO?^=Sayf@@@HJSO~UԧV<|pR\@ba(c{wTE[@ܹsgk۶.\84 @ huqA dw7ZjvgȐRgu뗪[vfȱc Wk@@@@@@H: h b">VF?ֵkW1OG8B<@ /^Fxx{ڴi.Ww9rZXB?qƦJYÆ ]JAIUϟoׯvM6ĉ]{ T (=@@@@\\X{fjՊW99jp*ZUgQF):uf Lj|gw7aH@ٲeM6ؖ-[_}  @4 lܸѝv%sF@@@@@ 駟ߏ>vjѾ}{رcTEw!,0Gz DЯL s1.{!Cynjm67Fw83uTWuUofL"( @ (  z 6XS="@9/УG-}Y#7v )pa۴i;ҥKGEp      taG>oxJvڹz>VbԾPqb@Μ9駟-[HrǺlfZ;b7@mUP=SN.XcmP@@@6mjm۶Ǜ0`=L 7 B@@@@@M ƲhЯ?.ؼX HG_ԱFE^u˛7o:]#YʪՁTAӦMsIgϞmwLsuРA'O_[n]i pV\nqسg{/}ꫯ Zj`_T3ÝR    @ݻۗIv:X6}C"t&2RX  ~.\ꫯOͮ@ ?8Ui(      /m̘16n8ۺuk}Yf nUS \9sLWՁp®siӦMyVjUˑ#GVd/jLکS'N,Y͛BG x'RdIW Uo:uH"L@@@@t?q >wd'Jҥ^Ki+V,۲!d?gϑ@ =z뮻m|:D@(ظqք      ->lsqc;ւ#x s]~ֱcGk֬7 /7~B !@P:t jRlskj,z2(m۶C@@@ ; +W0`߿dk.ij@@@@@@ Zhܹ>%c޼y@ ʔ)p'|=cuh$*P`A ]J}~mwÒ '` U&MQbW@k֬7.T .jժ8}ᇮꉜ9sZ*U_q\l@@@ 64R *d]v.u"V@hСbͮNS@@ /]tg@@@@@~=z3֮]e˖./|[F੧EM:,ٳgjv6 pvm۶{g믿v[?niӦYnݬuv5E]DQly@@E^zmݺu6yd7㥗^k"7b@@@2C`РA}8VܩXժUˊ-yn"$#ufϞ3,X.]jw QVZYI'n„ V-\UP*WB(_~aÆٲe\Ѕ[WF O?o/Lg$cdVzVXj߾U^=u}]˗n!޺[l1+5:uxG}^s- |f@X o5ߔ}|ŗĩ#&Ky^z%/) @V}+U WZj@QFuuLῪ76#Ķ¢4hw[nus̱syur:-Y7x-D[)WRJy0E@@@@@$ H{7/L: o+>3     ļO?~ozWch^ve")~a\r믿Nh${v-zj;bw={(QP9眓Y   k|:KӸ͛7yڥFz%;B@@@D"WA(i $z>|YZ8-cǎx{1u?s:ɝҥKD~3oӓEu' UFj5k{[I&yTҠV6m+Z()0~x3L2y!uhҤi06mڸY9! U3-[L`-! qC;/AAAO6{RUYt}ر-?+VpW^9r{f͚53U*T_(^밬*税^-Z]lƌz2zk׮m f      Az=.W_}kcAa@@t$7]9     .qnjc ❏a8k#8@IDAT/E[DB@}5n޽{zijՊĮ@|֯_?W5&;~On/TcŪVXJO;U@@@Q}/^ԘzC{7/%CΙ a      jwmjpo>۶mw}yf4hPq1Xɒ%}\rfڹcڵ.a~C# ԩS mi\`%J` 68R&7vN<䓦{[J*_e?}\.^ /+W4%$|G3SR$VfX={u0__&n)SMpߺ Mr< e[l;W1dT8'Rrx^x|P'-o޼L@lȑ >3 "@ :Tb=zp͛ޝ\{]T߻~ִiSW9˝X,uN4UZ3_oMܼf͚8Zn7-zV^=SBJ      iP[m{[kڹs4  YM [tvz     Q@;Fmw.̙.ر]qvqDžc".0l0+41!LnݺnL7}6b7ڞ={܎ԿW5q(   )ZZt}+B/MX   Q(p)0=c <:t`uV3L7RRx ?W -[ پ+7۳gOX~\pFa"^6.V/B^dp 6|ڭ[74iX=V(̙3O(QA' J޽M5q.hT7u8+sJïyҥRE?Zv؄ mG8) Ī@|UVM]r%z\ f5޽~N813 @4 ʕ*tO>ϼ{y =/]ׯ)R5j5kfժUf =;UoM6 ֽם;wzOs^ruTz*Dp6      DF@~Fƕ  @P?0'@@@@@?m6j(1c9xUzUWO<1͛{/[ @ Ν.2W5qk'?WG֢E ۲eKӘ @@@83o6#>6lذع^ adW    uBuWXn>|s$3W O<6S@=;+DHO?*T`:/5hP / QQZj? yMsV(D׬C ҥKPeghΑt8q]&M`}⋖#Gu~̘1~د^w7T4h`fJp[fnk֬|ɦP. ?Rh*Utq/^cիWOVCL}^_6l>*W>#s `) eWBvSjU󂱓|r[n/_դ+o޽q~+W.=nRsde+589;߬bqn ?Uy4nخL?'NH/u ]1u{wSNucڤI\ղ%KߦMQo}/nU].]ϙ3==lݺ>cWLu T)      iPi Jh"7o-X>픭@@,&qFwFK@Yt@@@NgZKB@BZ;%UD$QQA AQDS{X^g wfua<9w7  @0߿/ .3gʲe1w[oI&MCǚ ݺu3}TX121@ :nd˖-Cw>}MӢH08m)S&LpXVA@@p"koߖdhŷB@@@qXdg̘!Ν3WWFf ʕ+fv#F ͙39ڷoo/\ke{ㄆZh?뱓$I"uaÆ9nfOϝ;ׄ'JȄGkF/ v̱7߄6o܄ %K4q%Kfڢ~uԩtҢ7h@_%Jڴ֥nݺģ==z0?KaOYd1_@m_wnB3RJi{)ͯ.X q+PK.]O:|]Vf|"]@?HvlЛL) /Ç7 bŊ%ƍs@(,{رc2>믿Jf yUәUV~/k׮̙3\kL4-OOO0a8^ǯYF{U㸹^Oػw9>^Ԯ]lvZy&L#     Qcǎcƌ@@obĈUE;@@@@@p WkҨQ#3v,_XV}Ç}@4VX!ӦM3~$NWQ*ҦM+={4c4jدN<8&M2Mf̘Q   z O>:n}޽]AT{~ "   s8ސ=z0Ԯ]}iBph8q]ҤIcn3O8ss+ŋۻB}XE +"2o<ڬY̳ئ̏@GsH||RviBx5ECU|[>>>b_:Zɓ˗/ǰk;W֭wߕ'NzgSZ ɟ?-2Hn2mbǎm5Z4L:^=o߾m͖c9S._~ԩSv]tbr{^hԲN:2by٧ƢA|Z'j>;ִrp&///;ZVV^Lգ. SmڴwE!C;~Q@wH>lt:QF Ǐ7j5`ҫW/Ylp SlYәM\vIҾ}{s #Zh,nܸ!z/0&LhΧ:z͆      z͛KD̊3g^o  kX}mRN     c}ᇒ2eJ3ל9sOoѣѣү_?ə3g"E@ӾV6lhz @޼yeȐ!r93^8~e/_>uu@@@5:v(3f4l  ׷@@@@ ,XnQnݺ%nܸf2 ۶m3e\dI{y`]tׯK-Ǐ7?#B3e8q՛o)ׯ77߽{ׄƉѶmV4Do  2IbK.'|bVݻwv:I$n:i}| _ KYbyo꧃Þ={d߾}2i$ɜ9CJ]hѢyfs^ Yq[_珆kiРz^YM1yF6lhWI;9P@| 7NnjfʕKz{^!~OE@L7)SFbƌi ||7:tTZUZ꺺no[ u_~gsx{{5kJd|y<ܬvvS @@@@@@޿jyf@@ pm7LBoTxGi     @T1/5jժ.:>Ut\:Ȇ D@>:g~:7pm|澺+W̙3x:NUtEHNJ,WgΝ;b@@@\@ VX2`z+@&B@@@\W@/X!=ӧOرceƌQz5O@԰K}Vbǎmn;JʚghUBzeiy RJIu2̋ZCݮ^jBD>sohDMcƌ1h@>ZKڵjGW8;t:o3fW [nܸaO_J{nj=Z_sPWkV͞9r䐷z+ՙ VZ…cǎv 4V?[P 8~$MZ˂8`OεkLOk6痒%KJ%sڴi2A@@@ 7o.7d }UeȐ!W2@)8#?{Ǎ'zߪAA@\]ҥKv)@@@@@@it,7k֬YrEqtLMELAaLtMQK@ykڴi:ڵkCǬQh_}    s wÇwi5iĹ+#79   3g$FXb2ydI Au*ϛ}Mܢ7,\P,r ^u\ q}3fTDC;w7l g:nӃ 26mXLw1a\cpY8Ox{{;V)̧_A߿Z9t1^uW>9 p!N={T+UB- @ }w59J g@ web]u떬^j'ZhakV֭[E1<^K |˗Ohg@@@B"pl6 z>( o!+V+Vɓ'ex# X}yT_=h9     s EǐUhFj"m|15 hg6mٳgfgNǧ @H4T*"#GFX7waÆ&L2uh   :!Cq _>'Gدk@@@B(7o^Yh$O{h߾ 08.`ۛ7o`/^N;0jV ϰ_~'6Gnu&ӧOe˖͛Јv^tI>"zUΎFmCpHksRJrEQ Cu:vh-k~- x.^r5ɝ;ytRpWuԩ J׮]o^ޤi Ѣ8q AҰupZ Hm?~⿆wZŚv #Yuֺax] [gϞ&G+Y`tJh> MeܹI@ L4lR?H܀`g $ItJA;w+W2%[l&W5 Eqoہ*\q=µ5Ez-A3$H,@@@+ࢱ>N*מ#F ~- @ x'l@ 蠃&7} DaQ@@@@@+f298w3jժҴiS\E`?7gΜap̙3˗_~iv23g4cE;w:dtYff|-E@@\DRJ&/eriǪK..RfB·.@@@@d~3:t_^/5 Jƌٳs~L2XN6ϟ_+t֬Y%GgpVܹ M=j;Znm9A$ :޺u=k(^P( U"EO>&ٳg& -'իgB۵>%u@Çe揊ѢEsfQ@ C#Gĉۯ@; 2H˖-CuWZez=ݻN8!Ώz=@3jo TRAj()^_LJ~hڨZ^km۶_o$z]ӧOo3   8p胂QK@( D5Zj?Cg.eڃ ~9-F@@@@p/4p*ٔ/_ތV~}I(u ߣ>3SM:>*W6ϗ{^p8dɛ7 ՠ{k   1%?2`3.b`YQ㈩g    +?~|Yy˄vTC 0c+WB5j4WC,5LAX̋pGoPƍ/"[lI#uU& |(QL>]fA-AZ"aTK رcĈCah?n$H ? 4hP r42uT;vlS/_eiIor 706Ey,[̄YD=/]ZݜVЯޜܪU+~iOKDXY?{m۶~ y_`A:.DqJjLs_.7n*M @+Ν3V\Y5k @#~,Z\;poVʔ)㫓~޳gPjU^lYsl%#ziڵ\lҤz^3fX>_s3fĢQ      Vzj֭M?.&LpX@FV!    84~x~\ح[7_AZdI=z\tI/_.}ARh_xoooV˖-M?lbpRJ2ydzh}Z̸Vu,I ϔ)?oݺe-@@@ /͛77G2*"   .ߛ@zcٳgzSUVXaM @ i V ab- Cr֬YMȃBbiU?nM:sD9,_pW-uU碯J"P Bs̑իkǏ17dϞ^MC4U4i/^ĉM(>ݻgavu7n9sGRJeVxOKh#_;QDAvK͛gO3GٱcǖcǺEF zRxq/eڵZ?#={ ^'ӧOuƯl4iRS t=t萵WztIf̘!Νϛr;v vs,ĉk54ݣGWg@@@@@p?D+ZL(  G_? D@@@@@ ޽++uҮ];ŋѴ/!CxP:fX$Er&pEی}uO< :A@ t̢ƍˢED?{::Vbڵe֬YCk@@@"X@)bŊec^p!k|oG5B@@@B%%7xh@XF믿hE вrJYj02eʘG]ef9iҤ`#Kήnxig:90OQEQhX5k|d̘ѬtR1zѻaÆdTiޠtĉ@a.V raJkOeȑ#jL=watXx ?8۷ay\"1/\L@cƌij`  nqL;=4o߾%Kwc ĉGTb:ڵK]f:Cgu}Ϫv֎O~/'O6z<#zT;O{n,|r*T zڱl2D]lYI((QBzmU޺uqu@@@@@@w֭kwYp֕! A 7(J     @tLCF"L2hB3gNׯ=zT/pϞ=%C ?[ :Xǎ획9R$IbfH@m߾hSsW}I&>@L@@@"F@cvLeKĴ Bo؛G@@@p"͛ngϞ ɓâ7T?~l])UV55WZ44A;#h@c^aFή1B^ ͛מ gCcsNaа Qzus;wCsH$7Rti{V3,<X7a~؛7oӧOh@U:_gΜ)ֺ+m΍… {nֹ1F $H +V4pB k+QW`„ }v@ ޽{m,-Cvjjذ;V?.gΜ'JӦMM'&&SJ˖-M9rHd&q]?TTt(ޢ!ywMx^ٲe ]$KLZQO6-̮;i@@@@@@ oV?~53  V? Jر] T@@@@@gxXB>#I"ԯ__̙#:ΠU2e${{Էo_y7<#e  O6)_x@ 83g>}eϞ=ңG0ܿ_L"ժUiӚ[    ?\tn-&Mr㢇’M@@@@`U}NDl5hrܸq7_U7n,1cƴW/e…ݺusΙ'ϟM67|#zTjԨaBN:e/yUZha|% 2d+WpAI.]\r+W./8qBF%րFɓ'bŊEV:ss+'4x%Zh~gۯs)EEho`EoX-تwBHTLXOV@sICr5pez3V`y|gYC0X }չ~8qb8po^.^h>~g)ZgL{n_Ғ?~{Æ ӋѱcG{yT__Zj ЩS t&6 ln p:K?6o,2~t=Ґ  РAMU͛'EqjSG@ L]&zc?\?Ĉ#LN@"F cƌ e溁~g\~ܻwϮȱcD]S ,(+V43yZn-׋ *d;w6zm{ƍa|H=i;}X׏zsR5}@@@Xv5kO@@Ynܸ,U>-[6smɓ5kVd@@~ӤI     Df̘!goI24jȌ Vxqy@~:SS@x2d[NO.sΕ۷oG6,YHf̃q Bζ   4@Ho][8q7K o.MC@@@P [ @DzdǫJJLȦ_,Zz{{[ [47V^5zӔk@#w‘_niI:ɓ'G:Kq:ٲkٲ5s۶m_={, ?}T/^Lo`PN<_q5W7zcU ʰ^ yLȹD7d\4l%J6md&w߾}aAlL2| c &Aĉc>3Je ޶m?jg>&Lhܹc-6:|ښq˜Wh@(@ڵϟ/vjSG@ Lw.-Z ä@ y}tU|||hѶnjgN:Ν;cРA+V,)Y!z-vӇuACwm;ksɴiC%KWv}i5Ç&(}2w\sӳ,4ϱִzBl:FPۄJ!~Z z+OÕ5Wfq%4uܗ;JT$zbÞN,aSK65#'i=nܸv ,0azmSMWZUhB<      %вeKuz+@p5kd~- @@@@@\ɓ_oi4WЯeذaC7o\zSPre{Yf vӧOi-A{ԩcdw'O,~ݳgS2d`_֭[N*  @D߿+7'Tux=1    D mt"#G6mZ_!Vt!?~|ɔ)HQh¹sŋ&#M4& vb1u5j f͚%52pzYWoK sM Ѡ\WT՟Ƀk~^4r!3hg;Xݽ{W;f|ЁYf*Ǒ7f t]Fa6ڼy~es4Lh7|cO>5ά &H֭jsi @ ׯ_7+W4OdM15bŊ&] ‚ v 6M6Ӝ+VLJ.-eʔ1q ұX @@@ n޼);w G@@ҥ0@d 4i={]% K`> ݨG2t`m     ˗}ӧO۷krMڦMJz؂Vbn"cȑC]fZtRZf"hk:mڴ#lj֬Ԯ][Y9  *ck[$Zhraɞ=6'&7tl   J!Ue}W_}oa^iȸ y}E^e82 }x{pd Xfhp`%W\&W˖-+ & lU#` w_+XV]…ߒ%KA>0,#     @V^m߾VX  Y:q&M.ݺup\@@@@@J2o<1c]V^x~:Ƃ[Ԑw}W%Kk9/pW˸qL6l(sqW ڍN"p >}y=z_ƍ+uԑMJ*UD)   _ᅲ/lؼys:ujw[xx>    ͛7]RoE \@ҤI#Ŋ3[߿_?  {ЀLeGn:D[ sҺuk@^*{aÆIժUE;79Çѣnݺ4iRkH'OWe[@ȓ'|'sŋɓoɇ~(YdՉgϞ͛eРARZ5I8 ѣ,^Xܹk}^      (WdϞlj*A)  + \|ٮnԩi&@@@@@pG̙3M_TLիW -P 2DΞ=+6l 6%e„ fQeԨQ<@ Be&}#GȮ]DH.] Zjݼ]vn:y   ԩ$Oܬ8c ݭn8E@@@1]^zs,QXϞ(4B(P~}{ L QM@oxiVΝ%_|Q@ 45ҽ{wYtܾ}tfP%J ^ܶm|wR|yZreO>)x ;$pҳgOI> ~i ׯM@ ,(CsΙ10ڶmk*yM?~-[V2d`)   /ˬ׈u0{n    9[nŋwEF"o_opႿ:2cƌ7>1cxѾuQFI׮]f͚%52G;q+gOpX?"4DkĈP7o߯uyS$k֬fbŊɖ-[@\`ҠAStÇEo  \{OV+WʁE$I\rRBXdϞ=uY_k׮7]O_{zzJ|Lǻ2eHҥE?       *7n> :oMWUmc D}K8eP/4gΜQѴ@@@@@4hBN>]͛'ngc*Xh͚5B [ -?ʧ~jf[k.-x8gd 3ȑC6mj~/` :F@@xdɒE^*o>ɓ'+D)~L@@@p&LuA tΏ@ 7\HxN:+E @0ʕ H;wF`7 n,7i{ܹ@5ҧOoB5WR t] W@;[k׮5S~@EiMC%JЪC@@@@@7R@IDATAfΜiqn.B@@U*W,+V0սs$LUN=@@@@@;dƌ2k,t钿&M* 64a~ڧPR@cܽ{l޼Y+ Yp2 Zh ]l<}_ ~m'6mZ˙  cD b.       Wnݺf/_… 9#N-Я_?;z:E@H24kL&M$gϞǏرcM$Ij~{ORN-y.]ŋMP_+?z>w#Gʞ={ƍ[׮]`miN: *$=z%Kp%     ,жm[Ǐ@@]˦c&,     "ÇK߾}%{RHӿ17^xҼys믿D7Nʔ)Co]wnmݺ5Az"n@8qI&&ʕ+2a)[qv)!C)W=7oތ    @kNҤIcv6|9rH(v.PY      @D ԫW>܂ i&@Wk?iO$ ٲeQoΜ9ruٵk )RHÆ e޼y9` 1  &жm[I$iܹsnA@د[4@@@@@@ u5K, npYf:j6  )+V,)[ 0@lbvIrj-hK6 Z_Kg@@@@@gx,^X6mj{=}ɓG(N-[HΝ%UT4ꇀK \tIo)cƌjEB+?~}Z6m$;v)SڻwL2Ō3kN֭[X   4WCL4It^0C@@@@@8%KcҥɓP폍@N5VZRfȬF@ HiҤ1A{O?I:uDvҞ0a4jt.XS-[&>t\i 4ѣGs2m4iժ v{% ɓǎ+ǎs\i@@@@@pQm5?~=  zU$xF@@@@pF/^ڵkE.Aykז3gʣGfʔI>sٿy|9sf{9 ݻw Ԣ?O(QBtl iŊGIDl7oWXlYI>tMva/g@@jI&6mژf~?CTk도      '-Z4!DhpIA\Q2j(Su///)' z\rIǎ?uV0`+WNbŊe˗g6lTZU'Nl:I麺.&4kL&N('O3gȯ*hcư7O>ɑ#ʔ)SҥK2     ."PT)ѿOiYn9rEjN5@@uw6#    %>{)2d0B'L o߶iJܹSN󞷷uy     +жm[rǏ@@M_g{G     8qB  r2}? &?*œ͛˒%KD;#*<#@8 H# 4H'Nlf@? ]L>]]&3f0VXAWSᅲzˌ1Я_?9z;a @@paO7-s玌;օ[{_yj   ^`֭&@AԥK9rfȐAΟ?/ѣG7xrf ܼyS^j*\zaVhQٲe aCQ@ he̙fϟk q9sf˙  %gΜ㮥JJΜ9#br@@@@ 4A B@CsE(jI@ 7ߟ ʼyLE4wމJQ@ 77A\xѬxbYfd@ٳg ]z\z5Fȑ-W$J(uY@@O>55W۷oVqJ2e߼y3@@@@@@ rZh!9>S Bvڢj)Sbm!     ޲`}8yzzJRL+' 7K̘$ݱc,X0a@_.s57n4W-) WoҤDiӦ   4jH̙c9vXi׮9$$7$jl   !Joܹ  AR`R^=S7~Ν-R +V"EiP~/B%0uT{=zСCC?6F"JW^gZE9 *K9p nhѤPBRBZdI+V2g_ϹlbŊRR%H&M@@@@@_`͢#Ң:@p6… Ν;EuyH}@@@@@'Odɒ%&}(P6mڔ0;8F 5k&3f0h߾ϑ\#D- U={ ݶmyxxHRLoÆ %ya   {쑂 eɒE;favƺNFm@@@@ X@@ kt[n%ɞ=b! pɗ/<{LLAA@vUViPWyzg@2@._lMy+y1+WҥKK8q[      NzYS@@gH>\pARN@@@@@?.k֬1oooȖ- k޼̙rf @ ]Vʕ+g*,Y23Rĉ#bgΜYf߽{kehѤ|wz   N&PjUYlܹsANVW@@@atAb5@@ ~D0\Mo&Z:$r ý+@ T"˗/7;o G@ev˗V;I XdϞ={C;H߻w/cŊ%%K ( L@@@@@;1cHǎ~ '@@ z_S3)Xڵ+{ds@@@@@| رCMfB\{^JJ5j$͚5E[ p 78qjy*HM@(.pQ;Z3fL\ݪN: A0@@lUVq:.ƍ#Ja~|~Ü"   @`&|@@ d~2l5j(ڵŠAwޡ"*pB[9FLDo cs@kDo* V}>{l͐!)S t] ˗ˊ+DAЎdɒ*U{Sh5!     @(%M4CI0\tIĉʽ9  67nܐɓU^],Y6;f/     n-p1cL>]N8B~^^=[|y-u'0zhԩX…e۶m|F ۷=uꔿNJKUfkժ%3@@@ț78p^J{#*r\~Å"   @@<@@ ~rnyiɒ%ټxy@pxΝ[͛'cs@M@;[k֬7oJ'OX d-]4bA`wܑիWy/_>K*%y     a#ЪU+_e˖ac R` hY&N=9     \xQfΜi~wAըQ곗u+}g.o6[lE:o F5k,={?_cǎm~kԨy'u  DI?6l޼L:5""7܉9   XY<# a#WaܽH:\tIRL]> }|&0@pc/^޽{eʕqFyQ"1b0^5B fZQɓ'eŊ&WC\;)SƄjpΜ9\      4HH"feT   |rsE!0`3T:     ~Ν;_^ߤc-+W֯__&L踘ip!˸qL[h!'OvSU@=^|)7o6;wčWj֬)7jժUx  Ǐ%C ruΜ9#iҤ F(i   fŋbŊǡA@ dҤIf.]ȑ#C# W_}e|/Yo/J9=ztϟ?[  ~`ZF-:tg@@@@@(!#Yh ӧUH!rR Z*T{?;vmz -qF5k̛7O^OA?k׮mT"1c3@@@۷|f_| 80%79    +uV~W# #@oW M*\YTfMYxq@14f͚Ɍ3;w,?CՅ# x{{ի =zh4)R0VR[Lȴ{7#(Q}뭷P     0aml׮; B@"A`g#ϝ;W4h      .sqڴi2|*̙S6mjB~eo93@uʔ)#ׯ7 2duC@7֭[gw7nSH0ԭ[VXQt\    W\3ӧO%iҤry;vx2MoQs @@@ s@?~_|)ӧ K7oJ8qk@ R6n(J2N,?~\%J)u  ~Xryh˗]9{b+WN$I,@ ?~j*U*;RJk*1@@@@@1IFݻ'ǗK.IxA@"Uk׮2j(SM6I%">@@@@@v!;sLzʥMV4ib~ ,o93@_~37 n*#W6 ,۷o)4QFf܊ѣ[   @X|2eK6mb~#-   h/@@ 2e$9rڷo/ƍ3GD/ߖ={D"ۖ# ׭['w 𐞞R@Xy,YRbǎD Gڵk1cǎDM-*ժUի#u     ; kN -ܣgmF@4a֬Yb'O,Y8_%     @ h3fǏ;vĉaÆ&tҢ}) 5>|hƧpi%KLѨZZgdŊ澁 hozLo_BF@@޽[ *dv;wn9xc>࣪C B%twH B=b[]Yˊq]ˮ@@zoBk 5!e)S^d=yI9s:9_y+      h(3ɓeX~T!;wd2ߔ IIIczjٲe$$$,G4WCBBMʆ ?~f}C+&aaafv۶m@6ш     ??C7})@@u֙!brpm@@@@@x y6ml߾jҩS'4hyC8;#~)Lxb+@{dŊ3E֭[V2 2}xh@@@' כ{IvLsa^0@@@@@@Р-Q1..N… j:{0pVׯKʕʕ+ 6H-\B@tUqqժUΏwT4W G7ne˖m)M6:ߧzf?@@@@@pvƍ[F޶m4jK>@c@9zWʆ     :6|р_xwww 6{ pn'NH%>>^4{߾}Av@2sL߾}J֭E`C@@D`޼yҳgOshXXYIcOkOcA@@@@@p2g3M6Iff Oॗ^6p@3 "@P+W_ I:6tҖ_ .VXF]iGJF٥Kso߶ J2:uɓ'~4"     l'Og}֔'Nt@H@tQ*UȡCh @@@@@IMp[dd,X@޽kuu뚀H%Ӏ!+ۨQdرQ8U"e˖ɬYdѢEn(\C4788_+!@@@a)))RR%6900a>~-b      (0eygx Oq \@SOIRR V;|,Y*D@PǏ V ]f HVZ&544TZj%˨+HHH׋14W*THw^      Lw1h\~]r-ϟ???g*Z@@AsI}uaT!   yL>; ~c      v!p)ZHev1.'СCY|)>z@Nߵkhիeƍ<==I&ƍ!`%p d@ݻwh.۲eKwl     8K/$_)T  ?~\*VhFۿ>}a"    G-q#  =zon|\ CG@@@@PgMݻP#ݺu3ڵ#pJ?~9T @Z`Μ9f]-O?]G@@@@\U2{ln:IMMMG)m۶5l -7oJʕҥKfƍy涺҆ Mߙ3gl(P@u&}1SmF@@p-]{,wQrԍ_G}7      @ hf8ڴi#W11poF^|ESmڴuR@sΙUVɚ5kW'j识 fؗ \vMVX!/e˖Illlڮt*T0$^^^@@@@@{4 )h]26@p>oV^xSؔ)SdȐ!W$!    N*oӦMf*mҤt~$ j?  o;4W~@G˗ˬYnݲ:Ov*{ۋU@@@uj׮-{5s͚5x~mc      "PR%1AD/_ِ j MWl۶M6l՗  [Nn޼ibwww_ f͚;4"&,7oE |LەYWwL @@@@@M޽{RT)rYٳRpa{&A@'xw?4XBڵkR     )))-;w\qUQUV *XHĉRZ5{Zt,W\FiG@EM={,\.]_]3(  8~+/eȑ78d]:Ơ@@@@@@E|Wf83f̐~84 *s[je+VÒ/_G=~ <@bbYB,X`s]/Kga6@@p^#FȄ LǏÇ;\:[ƀ@@@@@@I ))IR`Atxzz 8@׮]eѢE{O}]'r@@իd+}>uT.[G6mXP6C)v@rrlܸL[p؄)^tEza¥m@@@@@h׮DEE˭\Rڶm]:   4_~~= \#    @ \zU4,""B6ol5 ձcG۹sgC 7_͡2lذ= @6C1{l?\r>>>>K 5Ѐ  -7t;v8\A:[ƀ@@@@@@M`2c 3kJPP ZʲlRÒ;wn'2@@;fJtt,Mjժe mժɓf_P.X@o.)))V0:_}l     dygϞ=zsf Sz9)QyvQF@@@@rT >>^-Z$ӦMKJbbb:O7h ݻ,X0~^ WCԩSG4L@]k^x|ҦMݻK"EЀ  )аaCٹs>ׯ_ߡ !ס.      `f2/7ɘ@nݺw^SIDD;xU @Q@Xwe ݸqB6///iڴ FNbCN[x wZu6t_nݤXbV}h@@@@@@ +tAe;N:eZ@HHMM[~WY=m     Y+s4L~5͛V]YdRti4 !pm\ot d~~'yٳV֠-[J޽GRdI>4   L8QnǏww:`@@@@@@Qڵk YjU9x=1! ϛ*4o֭U1|@p ݴi^/lm3CCCMpmu b ? z~^nҤh>Ѐ     @f 2fs{O5  /_"EKtQ,Y     سg ՐsY*UJ4wRV-4 -0zhi5qܹ} · @ ʶmdΜ9q ЫW/GrЀ  -pm)YܸqC+.\yK,V}h@BfM;w8ps"d]d&6U^=kTZf@@@?o6e2d 2       |Xw'Na.1F@@@@@@PcK]rEf `#F &AW_  m6Kd sVZYk׮mnٙFx ;wDGGzp+TtL @@@@@ J``;vȑ#RRN@@Iƍ'F2Ϛ5Kz8@@@@@e;6m23gΔk׮YYhẠ|Vi@rB ,,LVXa.7_ dӧE Ї~~OIInѢE-iFЀ  /'[oe.syW_}Ugԕv@@w k_slذAZh     +        `K !!A *dB)":VW@)au:OeÇG@@:dWZ%k׮ekswwu[Eڂr{̙# ,ׯ[);w6:t J@@@@@xgdʔ)cҤI2tP`@@L 5k֘޺uKol     d޼y2uTy:xzzfңG 06@~G˽( 4۷Α=a @ ޽+;w\lk/// 6u&%Jȶq!@@\Y`2p@C0l00askoD@@@@@p$={ >:[JƍiD 55Uׯ/v2#I 1 @@1t;wZ7o, 6+͛7֫WO4͵%**JfϞmccc@#:u2+W.>4     .v`C@2[Frѿ_kX     $%%ʕ+M Ν;V4 6 ߿)Rj?  = ha``={ oڵdCeL 䨀f .^h5777iԨ ޽TRŪ    9{bŊ͛7%_|rɝ;wׄj]?<;Do fC@xr]aÆ ݻwKjjK֭-῕*UُFH7k,?\zժx]8k׮ү_? >4     . uVKk)P- d@B$66V*V(ǎKqn@@@@@!on~g̘!/_>u&W2@G69^Ȇ HII͛7˼yzǏy@jDC{! 4`/J4"  =?ޜ ""ϖG\@@@@@@.\ %J0Quԑ]vP!/:)̙3t   B k֬>>r͛77fץ     `WǎiӦѣGVpa۷ hڴ~@GйZ~-{JժUe@ؽ{ g[[R[n&7((V?@@@6o,z߳n۪UIosI@@@@@@hԨرyY)YsLu ~朝;wEe9  mK&k׶jJrm//,k׮YΝ+W^*`f_uL@@@@p^x)]\rERhQ-@@ [Μ9#eʔ1ի̞=;[@@@@@y<3f̐S֭[+W.ҥ ///>4 & /ȷ~k?Q;G+" `w'NnڴIRRRƨkz`=zvIS[6zh.@@ v!529r|7vm.    {dѢE!˖-t`֭[_Ó/_ty8@LLYDۗ7o^Eq; v'peYp̛7ϬA|}}ݺu.]HѢEk@@xG}$LcʨQ;gw\@@@@@@ v)[ {NX&%!@ ƍ3g6lL0! )@@W@~7md _Emm~~~l Zn9@BBXB4W'ݺu˪RJIMozӀ     gΜ *HRR/^\N:%^^^QU  @ hE׮]>ˢW9:(.    d@jjlذΚ5Knܸau:uȠAdRD 4  0`1c)ޓw}ʢ@V ..N-[&ϗ%K..M4 G*U  8q̵ԭ[WtM7{wq!     8NE/^(y敫W@ {Ν;'*U G! ؟@llDGG[; 3]hhyHb2K.5/;wXt>Ӏ     }ٳg""##"F  0~xyPÇð     )SǩSΩ4wRfM4 $k._Frq3H- س@bbYF,X .]/VjUKF  ./иqcپ}q8|ݮEدS@@@@@@ +*?9ʕ+m۶YqΉN$ M8Tg}DQ   XĪUcr օ#Ls}7}tY|褾7p OJ,n^#    8E.[ӦMeXCF@{dfX-Ν;     X.]3fHDDܹ|I^Lopp[pF0Yb)KX&5! c߾}6]hQڵ ___hD@@KyWMh{ ƃ      f͒}Z^y? ! :tH4-99Y ( 111Qw@@X@'fٳ߹s戽I&&W'g5nX<==mbcceΜ9)$%%%]HVdРAһwo]!]^     8SO=eEׯPg  `#G lҰaC$#B@@@@ݻwe…&W,ڶmk~w.rJ DGGK6mLʕÇM} 8e&wӦMf'Oi߾w;JBk@@\JܹsRti5۪W. ˷A!     87pfQʕȑ#^G,ի̝;\?7|3 Ʃ@@S !!A6ol m!_|lCCC 6;tϟ3fMÃH.]$<<\:tDx    8 dĈfC )S8" س@޽eΜ9fO6 ^x     &]9o޼\~};`)R@Whܸl߾ݔa" (W^ŋߕ+Wʝ;w!͚5]G``U@@p Y~)uϞ=RV-+_{K      nL.z=**UrҨ2Q@'݊/.ǎܹsg8  = ܸqC-ῇpxPC%JȰ/;G@b߇Lo޼N%     ܽ{WJ*%-WhQ'@@ +Zh!6m2w     ؿL:UM&gΜ:]2edРA&ZjVi@\M`ܹҫW/Svڵe׮]j ԋ C }V ȢEҥK6Rtj!  }9Ҕ[oG}dwekwo B@@@@@pqɨQL9_}Ru @& iƄ)?gT  .pYKNԺxbC*҂%esܹ,`2c 6ʗ/o0 dž     `'|b9zhy{@ZRJ# X+C@@@@pL>]"""LH~~~һwo۪U+qss{ @HNN5kʡCL/N:E# )))eYpy *d۷|=؅  8KDX;vj#      ,5jrڶm++WtҨ2I`ŊfVrenxzzf9   # ݻ~zY~nlذM nҤxyyK QQQ&wrmO?-dž     `ΝrIRR)RDN>->>>7PF ! }ժU3:Ġ$    ;wDhΉѹ1o:JهK׮] _ &Ȉ#E˖-E眲! s=zT-Zd7nhI֭[L[ti(*@@O]vڴ}v}sG~s-`      ,P|y9yYի'Og.@1RSS~k.s̙3O>q" 8@bblݺ7yJPP ߚ5kFhyLU&餽Ν;:9%     s 8POn4i :Թ @۱+.f͚l.A@@@@2HII1Ԁ߹sJ\\UFRpa4 @||TTIΝ;g6o,M6@P 66V.]j/_.7o޴Ye:uDC;v(f?@@p$[5l03W_}U      8ȑ#3e͟?_ul%R<3d =8 @@nݺ%k׮8p ò+&!!!RJeؗ+p1uT_ 0;~iW~@@@@@_@iܸSO=%\@^ &&,_     c ٳGtn˴iVE/_^ dB~Ӏ `-믿nvzEn 8@bbYSb…&ԩS6vI}RhQhD@@]&^ZBB:iOy A@@@@@@.]*:u251B~#@$''Kȑ#QQQ&-sY@@\E@Xjy^biUT19۶m+痶g'طoL2,oYUUfMpssU@@@@@MYfes5kH֭\@C`ҼysS+"_~sF     :)22R"""D~ ,(}1L77@ [nI ʕ+.{5kdНf@pbعsZU߷իg5qaՏ@@UK.xb3 6H-f[@@@@@@@QݻRP!RJə3gLjB>>@>=zʔ)a_v8cLO?$Ox gHӀ     ƍK?Q4 @xTw}Wƌc/[LT6@@@@@ #:%22R~7j !V<4 O,ol1bO|.D@x%wʕrڵ Z%7((Ht} 6@@rZC3_u A      8T\ٔ,\.!CRJr9kǎZl  d ,V|F5Nۮ];k 8m)))潟8RRBt钸jժ吵0h@@E9onWZ%[lpVܹUV&744$wO@oniӦիWif1b>!    ~SNIŊ͂E}O@@t1m۶$$$w\)@@@@HII1!O_Y\C4_~R`A4 dRJa|rǏKb2" @i&K/"IIIJMޯK(av   Ys֭pXTvaFɉ@@@@@@X`Ŋ& G{ >\Əqg S |o/ӧOw:) @@tڵk-˰"EHHH%L2e} " . &HTT.oJg}<ʖ-{.~F@@@@x6Gf g@p5]ɓ .]r@@@@@O?ɴiٳVgPMU@L`ȑwߙgeٵ81  p[dƍaٲeرuFIݺu-bŊ=؍  <رc70|?ϊ΄f*D@@@@@@xwJɒ%mN|z^" ܼyStQXDR   + \pAV^m`i+W6m۶֭[KvN'ʤIܹsF.ڵ#FH׮]3~^     <. Vzuٷo=B@ȕ+=jՒ={#    ._,ӧO7!Ugӷo_ۢE 4 d5H$_|rq)\p_+  6e޽&Wn*G3}?WP{b3 @@!UZu=w"7{       ҩS'Ytؽ{Ԯ]p{O}S3<#'Ov)@@:$V2kʍ7l!7ῡҬY3ٗF y˖-˒%KD_߿/^\ f˔)s.~F@@@@x]bÆ cǎp]@@Un޼)~~~|{TTRP7    w,\._\:.]0'/@йy&M2~wd̘1? }'UV5_u *X̆  ۷oƍBtbֶɪ I}      rUT#G\rE26p^ׯ\ݸqCرc9Me   pEYz ՠXh mݺ(P e„ {߅z!%888G@@@@@eСfݻwy` ٳO>f }9:.    +sgΜ)?lܸy^zɐ!C\www>4 伀ZDIIIR`A9yϟ?@@LݻwˁoXWɓ'%`lٲ+W:@@S 55UJ*%Y[? FoNs]@@@@@@xW]Y Rl {N{-@@xÇߕ+WʺuDyxxH ,͚5ooo[]iAdYd+VHJJJԨQC^x ]8 @@@@@HLL˹s,f !  |7/f \&Nh6fywo@"ׯ[>yhnRdɇ> .l}s@@ {?ɿ/sѹs#6~sJ"     o>l00aK:P4 !eʕK9b^BԈ  hPMoTTlݺU4֦ j[vm&Uق6DˤIҥKF'O?9R     /!2W@ <\@zM' h׮`/    82eDFFZТj֬i~ $%Jp:8 j:N ywl  ܹsG;&111rq9qy֟3ӽ{|w.^h>,??ئ_@?S#!!<礤t]D)))ǃ<<<<,?{zzuMߔygC@/|rС9шj>~%!Co "%t *(REч"**B( H"&%CB %^}2OBlv̽3gNnnbfg?ɓ'GG4@@@@@@Eƍ+W.~.\X"""At 0rH:tioM  8իWeŊVݻ\|I&VoѢE-ˁ~/e͚5 wss ӧh<䔠o@@@@@|5/N1!0\@@G}Qr8"     ^N:%?L>]vڕMMȯ@p| >\   @ h'_ رcfɓ'Ezբ;wn߸Gr!ٳglٲI֬Y%K,VoooѹaѠ\ {3}qk{_oxvWް޴t֟߸ϊ ?Sq:GuaA@tno0}5V<"     5߹sTXe-8*-ŋ(8 %Jp2.@@RE̙3&744ԼFDD$n2eF\-́TI547RoXݻt<     + G!0@FJg  Cy^y:uSA!  -[&IvG^^ :u>ĒvQQQI&ɡCtDRӉgIr      gΜŋˍ7D'j:zʕ@@jժ%7n4xd8     @IDAT? Yj 3gNԭ[n\ッ2ez㶓{sůj^.t՟(U-gϚUuߣg{-[V\rf~˛3h@8p4ibsq_{R'      "7Xz̅ $k֬r@ 5J bۥK I/]  8>b +w׮]ɎM'?֛y5WW__dr~2a 6(oIz7sΒ%KF@@@@R@[nI\ѣc攟4B@ƍRR%ٱcǣUY     4{l6mY&Qضm[ի'nnnʰ@ k2i$3{OF@@R$ ߼y ߹szհkRzAWwwwUrƭ2dVC#s'O'NHDDy>|}s~[resԨQC||| ! j=:t&sOj7 !      }'ϗgyVʕ+RD 9q޽Rtt;:  >} 5$76}(%((6lPrȑ\QA@':u /pPMo"Eb@@@@p:W^yEBBB̸>S8pӍ! w9s4'wW     *Ȳd>}7nHЮuΝ;KV;q 8ri@ILLd˖M9"rrA2@@HU `C׃ʾ}dzTr5f͚fL2%W k&&M2m-X@~Ti7~#`@@@@@@Tߥe˖W_}0رceN:/"  @ k._\M'MQZNL,;m+ ƍ+V$#(B@@Џ=j#zJWs͛έ 40kݺu%{= Z`…VoZMد?UC@@@@@@^*s疘)Q:t΢8dɒrIqwwlٲe  ܾ}[6n(K.56l[n%i%K  'Yرc|?k)koҤ m޼?6     ^x={ĉw~L @R&j*3y[oɘ1cRV!g#    MΞ=k{А۷'3_|K/I.]?qv 8Xbr5ɜ9 ʓ's!  C *cӦMfݶm\~=zxxH*U̜+UaA@07a@@@@@@M*aaaRL8ɓgϞ?ώe  I\rE/_nCCCeϞ=I (`Bo|] .lY\@'/eҤIr…VPA/:t//x    Wsl& `~ץwޒ3gF@@@@ҥ@˖-7}}Le !!,     6l0f͒DתUKt"/$:@|+VLS:$Eq-F  NٳrJX„߽{7q8O=nZ7n,3fL;@xXcʀiƍ}>l)*Oo8@@@@@@Gؽ{TXT7M5r&̙3}Mʒ%KҪ+  v믿DCCCEFZ2d k6῁> ʂ Do^zu5hgϞү_?)TPcA@@@@ғƍ5fs%<< X`С2rHSŋYf6n@@@@@ )1c ݿ"ҩS'ܹ%:@=z 4tUL@@ҭ@TTgE[ӹ9Xg.-Z0O>d͚5rD@At *zߴJͅԦ-@@@@@@(R8qB2g,uO "@z\ܹtuٲeҰam  )ulذj.ܾ};Z5|VVߠ )W\h9hܹsΝ;V%3f4 8Pʔ)cg@@@@HOO=,ZtY'|Չ_Y@@5z)'O6߶mTR5!5     p57o fɒE{9ҥ4jH  111Rxq9}=w^s@@B`&WCWX!z-%SL:t-[Ex -ZT?n~h|jM~<@@@@@@@~ݻw|Q?Äد5jF{,\P~iSuڵeݺuh:@@@ DGGECCCe߾}pVo&M@ɖ ?tєg-ZtB@@O 66GzҥKY~}ѣiF2eʔ8;@___ѠA%TM-iA@@@@@@  Yn9_.\8FGЇi,Yb7oѺH@@@An޼iąn޼YܹdourFIӦM%00PJ.d9v&/c&=z V^]{=yg-1     $$K/;R  @,YڵkRBٽ{w*H    8,[LBBBdܹz[~/ZooF@4@RJ9+V "aA@@\U@ElW}N:IϞ=| sK򒨨T_~@@@@@@Hc#FM/L"]vM<<-Y8p@<<<T   .^h&ѐ OT&nGѢE1:yLƍ%o޼qx T5k|GgϞuw}Wڴi#:9      hk֬zn(QB/M vrd˖Ԯ٩%E@@@@9iӦɌ3رcX\9" Jt <… 駟6ԭ[WV^0S@@pjHsoM4\Sׯ4o\ܜڂ!<@=Dost5iNLa)fJ! #      Rf͚YU,Yf[`رVHЯ  <@Μ9u2qD9p=zT;y2SL1/UVAׯ?J.so^v%[c߹s RB%66:     :kf`G}@@T8{Ւ~Ŵ    6׫WOʔ)#~a\rk&7nK~m~OQ@3fUr6   "z]o߾{nYftE2gl,]Tz))_|r5 )ШQ#k˖-vލP?      $/p%>>>ryqwwO @ DDDHɒ%֭['OPw   s ۷o7azjI.Kt@ 2a\g.|_>AeСCM0 hx    i(i&Y遯^fA@Xn<f:qЌ@@@@}"$$D~D_dȐA7onDyɘ1C@q@/yfQ)T\9ٳg$"  ..p%>}?^ܫW/ׯ1A ӧ`fz?ŧ ᩡL      GÄh Y@ ݻ؟C@@ 2h ?xߖjժI ژ wyGW.yvɓ.oѢK.}IbŊ2{le@@@@@ t2Xt\Ǐi'G@8sPm6@@@@@@dYEJfd̙ ~ـcJDDoҦM~A[Oo   }r!7|iԨU:22R>#)V[r) !P@)[}T?N1TP       L2Ewn 1B|a @ \|Y|}}ҥK)S&9z˗/MD   .\?ӄjB}K,)AAA(7\r6^_| 6LV\?.Ç{ @@@@R[`RjU" ,(oo! @* LWc@*T`mٲEp'YnJ+|@@@@@@H<䓦=zR^+5 -U&[n5UXB4h` @@HugJXX,]TBCC6lPgϞuWydϞ= ϛ~ԉ@@@@H #GܼySd"RC6@HYri)S"    `GXCpp̛7O4#)O=hb-D߳  nݒ%JPzwwwٿ*U*E   S DFF,_~=uqS?rH֭h, #oȄ ̀t.f͚upڕ@@@@@@xp9$W\abŊNȂ#|riԨPeӦM9z  H@'_]$kΐ!ԬYjpڵEʢ2l09|5lܹRHk?     +Ǐ7ǚ^Q/ @ٲeٳgK.]Gh@@@@;KHHL>]"""PreۡCɛ7o@@ -f̘a+>nZΝݡm@@@N<)#FS۷WRE iР @-0k,y j.u#      M65a:zھ}!k8K駟 'y"  !lܸ\ 6ȭ[[l٤aÆAAAR\$9No>SNY7|S,:6      `/gc=&W\3J(a@PG.^(KaOh@@@@DGGٳM5kU'Opߗ_~Y4@G۷^Z֭]_   {g9d۶meRXFHǏE\WK.(+/#      pcƌƏ/U@iL2knviJ@@@G|X79ݻ7ٮ.\ mҤ(P ٲpڵk2aO$**N,4tPիxzzZ@@@@@l)!GiԩL>ݖS 8͛7D'IY@@@@Hwޕe˖Ipp̝;W~K 䩧2-[^8l#8ʕ+% VZ~z'B@@\E@{7e˖-֐3edz2d6  @(R8qBe&/^www _R1      /k.T9Q<@ _>sS7 4mP!   P&ONv+VMJPPԯ__2gΜl|@~?C/%&&JRdԨQҦMk     dɒr3A֭[rʶz@@"""瞓_~zE@@@@xpCIHHL>]=D}_;J|g *жm[M~Gy饗 @@pXs=R}Ϝ9c[ꫯ$00 @h׮̙3tzǎ\aPN@@@@@@R PP!9ud͚U"##3q*TիRpatx{{N+WV   ڵ ]rSI-3fu_}Zj&|"uߑ#Gwߕ3gݻwaԩSGƎ+ʂ    R?*?eԅ i,uVݪvW_I&qh@@@@ 4088X9vMȯ>[ @z9HJ(!oߖ @{ Jo"E@@g||2n8y5:g}& >~j{^qwL       H:Ѣ.W\k>R>} ,~mgKM   \+V47AHY| Yf0_}eٲe2dcy䑶m7|#r ŋ? 6mƍZn<Ǐ[@@@@@R*kIɒ%M5K.ŋJG@8s&(@@@@pPUVInݤ@&wŊVЯhB̙#N &AA-@4i Ղ={~   @ d˖M>ٱcXm e˖κvid@tEsvŞ P7      <ѱcGs;#}U@i@e޽NIRJ6@@@W?S4`B(QB̪ArJDD^z饸]"    ,Pvmٰa9ʔ)ҵkG@@qF- 2w@@@@I͛g~9r_|Q^yUVcA@ hӥCߧ!@@@%Ν;'o̘1old̘1ңGk +P~}Yz7o^t_R)      )Zl۶MD0̓'O*lx$g}V,X`ebG"$@@@_t2[_g͚5y3g:((Ȭ+V4O,;/^(|r-uԑKխ}l     +UuT] *$VY@@ } 0@ƎkrJ}G@@@H6m`9s=wwwiܸ ?lݺx{{?6 N#7?hÆ RfMA@@\A ,,Lw.G۬Y3H">6@OߖO?tl3إvJ@@@@@@@ EM65߽{W4R_òpBӰj*;A   D>p;>%/r |]&K,(P@:t !!!rĉt3gNdҢE ֭ZjI^$22     0ճs9y0S@SٳVgm    @j 5*7a_}U{LF)ҥK}ևC; .fٶmiWC~ M@@@ 4iDv)=z9MiӬ}l 8@:uN]ڶ?ߵuԇ      )`@SI׮]eʔ))@4TjرQFN@@@HNJtP9~x+WN ٲeK?_~_Y]ʝ;|ҭ[aV6@@@@@8p@*T o6I}s@@7o.:.QQQ3gNG2C@@@p`/Ydm+" 4m@Z^ٳg1Θ1C:vep   yݻwkڵɓ'K9}l 8I?~әʕ+1~J      L &&F|||RHؤ%F{ /JLMWĂ   3|rNS2dڵk[5k$˦Nh2|p|IZj>6@@@@@ӧL8ڵL2AN  8l߾]2f(z9     سg B,ޥ^z&W.fza# 'ObŊ>"ǎ38   .]}ʴiӬ/^\~GS @(UL4I/nc@@@@HJ֭[>}3gΔ_|1C@ܹs6o8pw    @:8r䈄ѣz\jUڵo^|||g *h"yꩧU 7  ;w>#Gn/_>5k4lм@N`ʕ`:ꫯ9l~m-J}      PPBr)ɒ%DEE k*HJO>2qDsH_{T1!  3wʎ;LZJ_(4W5Xb9qℼ2o<̙3ˈ#_~ag@@@@W $E @@wrL;w,ӦMs5@@@@GΝ+cɓ'tVT)!@@Zj%7,X O?46   N.zjsرcf:ǨQdN>r8˗%G;Zjma~mNJ      NK.2}tS% vS$vhKLɓ'%{ʱ@@@ Ĉ>PtRn۶-dEq̛7_};j: D>}$""j_&O,իW    @IDAT+ТE kv1Bzo#  \Һ|2zh-]C@@@p47ԩS姟~2PR4kjXaƌf@ $E;wH"Eȑ#KY@@@_ 22R:v(-sIpp0UZ"l /'L2fȐpimT      6 YT_|En/7#  i*%M4?Xl"Ν{RX}c3g4 ʕ7xC,X ͳ>+iŵkז     I |gi}'T1! ={Y|m6@@@@HN@ϥbŊRV-og2eȨQرc?OorG@Lb~mn'@@p!\r… eذafF>w\QٳDž$* XUV5qݻ#T      %5! 'Of@@@r-ڵoV9"'ȑ#}d„ 昞W^=1b]Vn߾-d˖M Y~TRT}pٰa-.@@@@p???ӧ͵kפN22 k3D@@@R*.\|'{nڬYJ׮]eժU~39sHhhh: ]G@uϛ"   +aJ˖-eܹr-~ԩri2e{@x8EɱcIO>)R*4   ߅(YjU3Ws='Fr12@ [ݺuͻMدI@@@@@@  ccc%,,̶SX|ݳgOk @@@<<<' Xjh _e&K>}̱EJn䧟~s%(72d!Ck֬is玌3FT"k׮MI    N&3gNOQ5̛7oZ@@ q?z   GKO>c9u՝ eW^yEdbg@N` IbQ  @%d͚5ұcGcp]3qY@_ b?wm])!      ,Y"͛77CڮjBnܸ! K.Ualٲ6 G@@x`Yt5d+qss3AAAAkz$SL<Ҷ;V &7.2h y$@@@@p.^B'|It5jݹFh@p>6m/bv1uA2"@@@@XnL2Ef͚%W\Ip7޲eK֭#q  $>å~>%g!  (Yvm7o˘@GxСCf>h3Hد$@@@@@@; \~]|||$&&FJ(adʕ7n//qz    `3gȌ3KTg Dԩ͛7qv  @F- 2 :TF 9@@@~Wر\zՌW~7yDX@+Ю];3gi䯿r٬AwDE       `oooWrACiӬwf@@@а^}fdPyM­qk NKppDDDD2fh߶miwA,     z^3:P~\# Ξ=kz={v~E@@@@[ܹsAnZ)"A9r䐞={ʆ dҿ~mO $!NΝ;'Q]   .ЪU+Yf-ZP?~\4h`quƏ[jժV[lmτMd I@@@@@@@2x`W_}%zckTk 0iݺ)v-ܹ5~q @ ۷omvQ      O 66V .?^ 5#B˗{ࣃJ%\h @@@4wÆ NޝԢa5 .]:bfߟ):DDDU70a3f    % +W4 ?C` SNIBLO[j%K    "qF2eOػ0saR (Ůȱ*%6Q1~+J )Q46HG.ҋtDEg2g^5-soY{ꫯV[EnON:Eٲe; V\~OSR;wnla+ @ @@HM۳\=ܸ[]D4 j׮^K/7Ċn2J @ @ @ؼ'pB<"I-ZlNKZ^zd-E @(.˖-_|1+'h k.V^%KęgO=OMӦM '5jԈ͛X+r+ΨXb;IG}4 @ @E,{Z*q(#@~D`޼yٙ{@ @ @@ϏaÆu֍.(-7~gī~◵  @@XwOSO='$ @(r.,~(_|3<]te˖y,$@@Ig}.{)L4)kolCߍ4 @ @ @@ t!]-yoرEHOf͚o @ԩS}39ׯGF|M\W^pժUc$,;oF @ @ @(6mdUFY4Z@ xBIj|U LUJ @ @ kϏ{.cǎ::([-Zjժv{"y`A @ @@q㦛nʒ;sbɒ%k  @`̛7/[zY[ @ @` ?>-=묳bB*U=zċ/~iB[2(Aq'tR @ @BA{g:ݴiӢUV5M19 PZg4 Ɨ_~I$3 @ @ @"􁿼3gNԬYHֵ$йs6lXҫ6*IɅ @l@Rcё}c?:|]w;ڴiou @ @'еkx{w_KB @ r!;r(W\ N* @ @#0x衇bG}/?\{(>7I&$viH  @ @̛7/ڵk'NLcUV^{Ulr(rIK.oiH#GLl @ @ @ P۷O\vm5h -KRĜ'@ @ ԨQ#ƌ:ܹsm۶'vJ Pg,I&ei(1z @ @ @:tV1bD @ <YO< ҋ @"^zń bwϲ.[lQ|콤oRK7H&Eow9:v:tCF @ @@q`>뮻G$@%H obŊiF-[cǖB @-UVs= aÆE~~z֪U+N=ӧOn(9{L<9ʖ-s̉իdB @9+xh߾};iuԉ^z)vuלY`5e˖ou衇/!*ф& @ @ @ P;wNLVc=( H ,X i׬Y>H駟,L @N`qߞ-zI'˗Yfe(SL4k,-=CB v&@ @ @ M7:"׶mP( @ ̜93vi4c=6x≒  @ @E, 4i.٦M=ztQ.o- @(-J N0!W^7.4hPeO_.P~>}zT\9B{ '@ @ @ @ڷo-l @ <3iߤw陃 @idCn-H6JG}4t_}Uԭ[7zsFPӢ+V&Ϗz+nƴ Ȏ;-&N @ @ @ 7-k}ɱvӧO,[,7(%2^z @ @8˗?[=#?WaÆq 7Ĵi矏ݻ+qF @b!Ofqړ$ @ @"H1bD~3gΌvٳ( @ iK,otBn4  @ @ @bEonŒ!9ʂ @^sύgy&ztѣGG˖-{((///6m^zi ></^Ƿ~CK.$wߨSN+4+) @ @ @` s9qaL:5.- @@)Xw)~K/U @ @` {.wSNcfk/_>N8ᄴW]uUԭ[7;A|'x"M2yc) ː @rNjժ1r{ؾH]~œ Z@!w=fY9 ;8 @ @ @@5_͚5.*W ,en`J,Y$jԨVG @07x# 7|{c gqF+"  @t |'{z/NY @ @@N̙3'k?Oiڴi⋑? @H w_;3e~A] @ @ @1h۶mURʱC {oٱ{ @-Zc]vI>}zj*~ퟍzqI'Ž3f̈?0Ńvƿ׿5:uUTGc„ vzA @ @_~|gyf̟??{Al>uέQ[ @ @(G>}vqgWw뭷N7~WbҤIqE)[HlSO=u'IFA @[H =jԨi}8#b[(" @xY'Oڅm([X9 @ @ @laI1rȂ>9裳 @ akZL.\0ڵk!3^qs=-^z)H )ou_bE_͚5d#h}3gܐ%%@ @ @vZuQybC @ Xo7p @ @'x[I&qAŽ|MqĝwsIE>Cs @@'IeO @\_~${֬Y3 oqqիs1\1 @ 'vm,O?4k?GaG @ @ @:uj4l0 M61z- ʕ+Zjlٲܹslٲ9 @ @@n $ڵkZ7tm76dQFň#_SL)sرct!;vm @ @N )۸q((:D^ 7Q @/83ci?w_4N' @ @@i;vls=Ow}^;C#8; @ H]v$8 @ @@{ѺuXtiRϞ=\ Q5kDJbժU~ŻᄏQ٨ @ @ @ 4hKc[, u1cƤ~8?p~s @ . ;wNo#~RJwqqw_|'O;#wɆ[qr-iw1}H_~Gr @ @QF&:ck  @` ̟??zY[ @ @ "v%c~xBzh1gΜQYortG9A @@Rg+'/-5  e˖Fq~gvڍYߍ3 @ @ @h׮]+bܸq[6a{.΃5 @hJ*裏Ncu-ыg]w5=xc…1~۷o$p+W.[bժU1vظ㠃dhpRdʔ)Y?  @ @6\{qꩧ.]={5klDF @Ho^^^TVщ @ P͸G|ԭ[7.OV]tQ|/k$;; @?%sP]v @ @-"ЪUx")b7|sbQn햆7Ĝ9s6*ܼ|Aq7jy  @ @ @_ÈÈnMcK@ bڴiQ| жn[ӕ @(rիWG޽c*Tgy&:wcꫯb̘11|tu7Ow1:tmڴv5 @ @?!\obԩi믿> PXw=&OUTEv @ @^ لĔ)S'////3ό>: @_*wEj")QV={v$ @ @(\+?В&{|tI .?nܸկ~UXz @ @ @lqmf5j#(0iҤo[RG\D @]\rFϞ=TVXn5z͞oݺun->:=|TZu?쳸;ؒszh\wu1~H ; @ @iz\!PٲeӎIW_}9KJ`իjA @ @,C c9&vy+++bɑ8qOqI`b_|FFL @ @ @` o> "???^|-(cp @ @ -[6> $Go5Ыy<\;[hQ . {bJ <8;} :x'qu @ @@)+e˖ԩS͂J9  @&X`A6b @ PB֬Y=\t54h^{mL>=˶nݺqWG!Ccre5 @:th:4y&]v8 @ Pv[zM=Ytҥqǜ9s4 @ W5j6eʔ]Fh  @ @ @!2-(`zg]wݕ@,_veJ~֬Y1bĈȑ#c޼y?_A:Dǎz @ @@iH6obɒ%i<@ի/O Yd3<3lLN @3f̈?H]H u%6rGDAؔ${$!ʦ\ @ @` |ѦMx7u8;vll֛u] @ vm0[j/RC.S @ @ @ -[˧5*'b\HPO &GNr%,q @ @/\z'uiI?VLwKԭ[7zsƄ OSo>*V>?!iw#<2n㏳~ @ @J@ɓK\  @fX{իouLL @(j5kij>ދ۠A+|зoߘ:uj  @ @ @ly>8 >iӦmD@ GEB @@ b}qG_]$o"yyyѴiӸbĈhѢH6KI&/8\{W$'{X`AA7?  @ @x_q駧y.[,}][ @`s SfS{M @ @6kQGދ[Pp\r{/B$n'ի917 @ ݓSND @ @@QF<;?3q<LM-PP}֬YrBOo $@ @ @ ;۷ς5jT P^|ŔL2Ѷm! @ PAC I&[qqի< ]RJѱc_^̙3'zիWԮ]{f̘{ox≑< ռyɵE @ @ rKitɵ . G#(>ςVZ @ @'ᤰɆ7pC$jIiӦt3 @Xvm3&]r@{M @ @!ODr=2ͱ9  Pl5jƚӧO/tܾ,4 @ @ @rG]vY0f\`ѢE M6 @ Pu֍CƎ;.>lذ⋋>\f͚ѳgxb;uIa#ߎo1ڶmUTI7(cҤI$@ @ Pbf׿[ou?xGJL~!@[B`ٲիW @ @ l}5DR裏!CDvr$ /⪫:uH j*ʔQ}R!@ @@h߾}~Yw^;6{A&|OYp([ ' @ @ @R*pvmfo)M $7<ۦM @ Pt{W <8ʗ/.z뭷?Ϣ `3ԸqKBƋ/#Ge]e+~e]tQ$cǧvZZd޼yY?  @ @Y`;#KώO>${Al@ɨjժm`  @ @[@`͚5G 6n!fϞEҠAׯ_$i?SѹsgE2  @^|lI{d @ P:문 VZ{lL:g$t^`vϘ1#koh̆П @ @ @(W\n: /'^""P>Xsa#@ @__Wqwfo7W^y%{]*Tvşxw"F7pݻwZwܒMѣGԪU+-|嗧łuj @ @(Vzjvii_u׿˗KrE`Y(իW @ @\H6Ǿk~qQG /i3G}t :4>+vڹx @R(0f̘,k~3  @(Ν;Y$!v-{(mO\ @ @ @YN@IDAT~F}YQFem UeFVJ+  @ @@N ~q1\29昘>}zNŸ)I6\?3gƤI⦛n?%tq @?~b @ #k֬{.v 4믿>f͚Eׯ_>᧞z*?L2y  @Hy饗gy4i%ñ6 @dޛ =33SN&MU7?4Α+ @ @ @@8qbi~Ƀ>lUb~N`ҥQJ8 z뭟< @ PD^]t#F+h"ƍ˗/2I_&L ^zfIۧ;~7  @ @͛7o&SO=5" }:;5! @ P?{3gnr#>;:v C~a>iDGuT<39P @ @ L<9+/^Nַo߸k6~b3 @,X WFs /*2e @ @ @9'иqYfK/WιD^o!RTZ @e˖{,veo^z/Y2$E;oV̛7/ }vi$MВ ю?:Gkכ  @ @[@`=;[sύ> {ANL= @ @G ???ݻwǵ^^ߝw96mZ<ѹsg~7GaV @` L$(4 @ @ nɑS\w @TV-*V;cƌBo $@ @ @ {m۶Mꫯ7̽EDƏB @@*U'n[⩧ʙ2U ' ӧG}7tSYJP֬Yf"]w]||x\|ű>dVIcG>}^zѤI+bܸqFj  @ @@ $8tO?4U!XK%KիثW^,s4 @ P<֮]#G_ױ;ǕW^SN͒IYk⿇~x)S&;A(ǏOjy!d1 @ @B \~ѽ{tl'l?BID@q((tXlYRk 5  @ @ @rN yXaÆi\mڴ s#PG*U⫯:u(T @ @#p'c=NѮ]1bDm̔%vYbذa1tt#+WN:G;w @ @B`ʔ)ѬYH&GR .(A~{GϞ=㡇* @( ,? :)ܗz9-[v^ @@,NժU#)ѢEx׋Sb%@ @,˹_|ꪫny @@q8SN㏳7$2Y_ @ @ @r[AѨQ4s;` g EqAmLI @lJ+vitQF>6%iu駟?x̟??^}ոk FjGR8%)ܫWUVz>yN7#)' @ @-аax#///]K/^{ms/k~ P:G ~ @ @6qgϞQ^H[7+L7[n&LHؓ-G @[D`G}4jt?1v-E  PkΖ3gNސgCFK @ @ @@ k.mŊ+l#yl8 kk @ @)PrGAګ*,7͝ҒMEڴ_~=PxQJ,xk͛G:uO>OƲe˲~ @ @6@׮].K_jUn͵y  @@q?~zjղ @ @`S,]4nhܸqj*sɑ:t'x"f̘oeA {  @(b-Z 7ܐAѻw믋8  @h-;wB-o "@ @ @ ~GfXf͚mULK @lJ;,~ߥS~qgoK\F={G}4 ǍW\qE4id8"ӹs;  @ @M(?!-LHe%9 @ ,X {SߌB @H7|3uԉ??&M͘\KO?ÇDZʕk @J=IJ') @P{VZæL~/sO$n9s*t~ f @ @ @hӦM*6 (4 @ @@ $>ׯ9rxr>\ lٲ_*nx)w}wt-f,+Wưa΋w9k)]w]qIY @ @F$׬ 5kLgIKo#f4\~Kg+3 @ P|Ms=qD-{o6 e˖1p9sf?vu @$ <3SRkJbr"@ @?(PLcmMu] @@IP췤~"@ @ @ 5jԈƍ3$,]t#f3@(xnݺ @ @@R6yc޼y/zYg ~E ֛u„ ѷotCdo~:thXb~^ @ @(@IFR7)ɵ(F(OX~ @ @` L4){EԩCZmrʕsIc'*TAY -[}YE&MpX'@ @E&аaw9˳(Ijҙ3gNސF / @ @ @C]vik֬1cEI`̘1#,YԴiM0) @ @ܹs#]rѢEqbd3;-SL{/n8#///35kVyѥKVZwqF8 @ @VKG%끅01Gr]@\G @rS`ʕ#DVqqmW_}+zFrhr{ @'ڵkTIR>q9 @ @ }Ѻu}n#@@]vCa]R7# @ @ @ Pr &5$&?#Ge=dm  @ PGTP!MkL84ȕR"gߍΝ;PY+[(6 @ @ @@V\riG`EG` `bT @ @U7tSE]W^kl>ڵkYg?|,\0~H6u^zhY5*~N;tP?&O @ @ S@>`z})K/ŵ^SC#@JowfժUKU%@ @~5kg.]Į9lpR[oٳg=͚5i @JG}nOB @JW^yeyD%Qf͚iZ+TzyksjA @ @ @Z9sVZ9l MqrѢEM19 @ @- ЪU7n\rXR\ֱek@7nG}ts1ѴiM @ @j$́bC N:Zv-cT-*'@ @/0w?w}w̘1c˗c=6=hٲz @8{ٳgGڵ @ @R+bŊ{/H }ڵk8%S ٗ7ߌeʕ+L2ޠu&@ @ @ @`K k.[_JG}^{em  @ @ oK |$_wudɒD 8yPCɓߏ}~^'Nn!hذa\r%+ڵk @ @DI1kH={Yf!@^`AjJ @ @ƌ'pBqUWWQF3g#<Я4 @3+WVGM @GB ?9K8bժUk իiY&/^))d @ @ @(m۶5jT P>4ڵkvmWS @(͛7O{$.\0Ws.. q5Ļy/C=4ԩS#)_*ի\pA I @ $u-m' O @ \2f̘mݾ; @ @ s1qa'7r-PAduC?w @ @ @ rHTX1 qѹl˗Ǘ_~հaM2I @ @-+?1*UlVu@F")Ȓ5kVu]ѱcj@gϞ>ղe˴ƍ @ @@~)@r骫*2'@R/pXvmo @J 3ό:uDrG}IԬY3ʘ2eJ<ѥKH : @~Z`s,$i+g  @ @t tMw 7pCf-I` obӧ-V @ @ @ M &GfA$ L:5̃5% @&z?'Myʕq嗗]jՊ>; ͋z(u*TrI &[jocǎ6L:j @ @*U?[mUsw_ @`] d/\*{S @(+VHiK.kd.MJ@ճ4׽O;{g  @ @ @@vG5Do ?  @ @@H ֮];M'z'U 2\r3}㨣+fϙ3'nH6[nwy1f3!  @ @@hѢEN^vmzi# S n"د @ @ |+[^իWkY;CwI&Wp V[e5 @~~6lI @J@~bO30`@$_8 P-; NI &3 @ @ @@h۶mQ(n D @J6l^{m5\5@PW=gI 80w^߹swmڴI7 _/  @ @`\pqGs-\0N:Xz&$ @$HI @J@~~~ @ @@{aÆiJ\}%7Y @XoժU @ @*ӟKt5^xH &G G\w㬳Ίm٦*n @@ ؓ$> @ @@ \tEQp?αC (s-x 0 @ @ @b#P\hժUo~Xlb( X5knp  @ @j⪫"볶Fvm㤓Nz*͛>ht=ݰ )Sč7_>q 7ɓ NI @ P*W `r$E V²qOQZ @ @@1xףW^Q^+bԩY6 43f?rHvN @` |dj @ @ lvqe/֬Y @ $)HI @ @ @@&жm۬=jԨA x}!@ @ zѰa!CĻᄏ~@RO~:,P|y'NHy@@@@ Iҥȑ#fv2e8T8u˜9sdÆ ɖ-1]֭qƢ$@@@@ ?~\nv9pш7xC Qs@|hڴ,ZXS,XЇX@@@Sիd7n,]T=׬YSu&O=dϞ==ʾ@@ +!RjU3 G@@@ %SNI%Ƙ 7ƴMi;#*\xO?U0fe@@@@@@p@L~FcbbdӦMkF3gEFF:    t={5ׁFVP +VL#ׯݻw˿oXY܅ dҬY3[瞓UV%4܀     @P (P@̙#3g6[ow}ur ܨmϟFc{@@@Q2tP)[4mTkE}}n: kA  @2/_6*sNfM!   @\8 |mVre~ywrr=z\N@@@@ / 64*yaiӦw p-P@*K`3@@@C… 2sL뮻;ӧgʔIz!Yh޽[^|Ev|  N=/cΐ@@@2@bŤyF;&sXBJ o޼F{N:%:~?`h.      (_V^-.]rhK6Ο?o.0d@@@@ 4z):0 &#4f[. 43f={4nX2glyf۷{iӦM>    [P(\QɥKСC @T \rEbbboTf    HȀxҶm[YvY||O>F%KH&M$,M 2  @;wάIΜ9<@@@HZW^Ǜy2 cT9>>^Ξ=W_X@@@@@@ DEEI"ju̕4 @@@B[B k׮] u~ DDDH˖-eʘ1cvf9/_EI͍ 1ݺuu֙    7,|$a\_AA4(P %R   V@M}ǥt2d9vYTeʔ)r!6l)S\F@@ ^jV*,&@@@UԨQXcO?%6@4+w3K_}Qb@@@@@@B@~f+VXa  t o6    @.] &L` `(X f %JǏ7WXQ}]c>s2    A!%QK.I˖-AQ7* @ ?nC_    i&pY}*U&`r励,YKi&رȑ#Ǝ@@R/>&Ixxx bK@@@2@׮]O8̓A$+W.$ź      8X@;~]|kB囤   .K *dl_ʉ'|ߘ53@rd˷~+mڴ9s;wW^yܰaC={ƚ    o!u1*o>yҷB@ 7   v풞={JѢE[nm6s"Ețo)7){ed@@!>&IX9QK@@@`hٲDFFU;w.c/×B@oM      d<%JH2eY$2!@@@@@Ȓ%UuEюA$|Ȕ)DEE,GiӦIzDkҁ\-[&O?r-ҹsgYvų    MF0|{7o|G6b@H[7{C@@dy衇[oѣGӧMu믿nKh.$  (}#!   9s͛| @: k5Μ9WmZ@@@@@@@BӅ tt[<ٳg7'ccc<@@@mvڙ 1c'?rKttݻW|M)SYv:4iu]Rreѣr2    i+PD 2e=zȎ;i2 8U`N7   N<)#FrI&M믿W𷈈ԩlٲEVZ%-Z̙3;y@@cxAa   > X ĸ. >@I:+={֕`>1      ! YbEh4V #Gf    @*UFF#׭['{ :J*%q,}ұcG4}vy饗Xb裏ʗ_~)/_6A@@@Hf͚I׮]BO>ť  6 &XE@@@ A`۶m_>}~3]| I&Ijed@@/3gNf    ,p_˗˱cRވ5@  o}T@@@@@@`_Y=dB@ ,,Lgn`!@@@hٲ~j plʔ)ra>}4W/^\/w6A@@@_`RjUcG[n}ڿS 'N0Kϟ?'   r|%UT &ȹs2e$ 6 oKݎ @@ """1&IA@@@TZha6d%@ H"##͚9s e%A@@@@@@(TT\h̆ ` Zr2q0B@@@@7d@Μ9]vrJc@Hb9"/_^ի'3gΔXs9@@@@{g.sנ~Q*  ?~I<@@@Oĉ2tP)S4kLt ^xAv!K.~X"  q%$qI   `zƚ ?ޯJ?~q2      2qeYjD   @@@@%Kڵk-޼yݻ7@ٲeeW_}%OJO}Z@@@@@@@ dׯotBXB4i2m![PBc9{?^"""dFgB@@@ 5j${NV͚5k-\Pz6Ƀ>h9v̜9S>#پ}QSdƟ;C:u$Z-"   xxgeٲe2|cР֭[o8$@$@_'}[@@@ X\"eʔ)4nXz! 4&! dL[nE#N ۦM*$@@@Bnݺ2`dwK &3_l2Y{߸8E_X@@@@@@ ԫWOtëWJttD XJڹtҮɠƟ;o<߁4mܸӷo_ÚUVvO9     'Nk!+Wwy'C@ \~u@`A@@@ bbbd W.O<ҡCylٲ# dPB ~9ŋ5k֠w8ur   #bct\ I odA"p#~ T@@@@@@H _|Rzuco[l'Nў  .\<@@@}J*IҥZJΞ=A)p=~>,&M5kSLڵkю7NN:e.'    zyʬY$<<(7ސ5k֤@D@ \~ ({g   8C`۶mҥK)V~oV;vwl@"##SNƟ͛7ɓ`3[l^xA'O=1{`@Ճr@@@@$PNyD^|YZj%Lܹ3mEp'ϟ   ^@C/^XF-˗/AXX;=z HL<3  X$)S#`4H;QW*   ,?S*Vs3g,QQQ`9~ իWy{VDK { kRA@@@@@@aÆWXAߤ(˛`NHYda0Q'|Q@@@ Mrʕo^Wӷ~KT)Amܸq2tP7oԩS?~tY~iIy`G)@@@p@W}I׮]e֬YNjuEȠ4(P *l@@@<N>-ӦM1co0wҡCylٲ˘@@@*`䡇ә2eb\f@IDAT   |3g݈~uh- 77,=*>@@@@@@@ }֭+3g6*~I{ǚ_5D@@@@z`I;6c`Qn*ݻwyܴitE)b|4 @@@@?pO]fϞ-3gF@ N8a5f    Q`ңG)V#ordrA9r$~3B@@TIk׮T&    e"|wf  ~ccc*~be@@@@@@BC 22RN1۷oGFhENy1 ~ mA@@@Ȉ *UM߲er}F4'Ǫ6x!:uԪUˬ̙3gdĉRF 뮻dƌg.'    @ɒ%W\k= \D@ LuA@@H/e˖?,*T1cƈO)SLҰaCYxҽ{wѾ$@@|T\oܸX@@@7]m Y@ x܃^p/.VF@@@@@@ tDGGy28U@;k׬YӨI?$@@@XU˗x#c}mmDDtA#ۦMK.KѢE_ݻw;T@@@HK-Z3)[Y4h,YRZh!}     5;ClL\zUڴi#N@ o}%T@@@ Wwܹs@YfmƍE=滠E!  40,Yb    *U2W޾}'^       `@TTUb 3{e';wnSd׮]oI2eۡ%ǛwYj֬iNA@@@111K/ٲerΝ;eǎ; D /}>}? ʕ+WҥK駟*W,ݺu3DFFu5    /|W;E]ٳT @ ?~l|<@@@,pI4i;V8єoYtbf{-x,c@@;ϑAc|r cV{L@@@k˖-yCm={v@ڀJ      doa45::`Kmlܸ106uңGG:SLf50w-i2   8]СCU~cccȑ#RHsQLͨAƟĉeʔ)Ʊ+m۶My߿{+VhnO@@@Ȉaaa2sLVȜ9sD1jݺuF A*p f7d@@@pݻeԨQ2}t9wGW.={-[Jl<1  1cҥKA5kf.m/iӦrw۾v   ,3gW/]رCgP[ȐzZ~6+#      @H u]#GM+Vј+ФI|'   CdɒfCo jŊߢܹsnݺfݸqRJr˂ ʕ+r2    @FR&L`6矗ݜ& @z 7   *T` '?#-6m7  ?ln3k,3O@@@|(^_PLL& N3g6Lt-      NȚ5ԩSǨػwA&wq1om6L    @h (Ql ~M 2!,%Ky'eժU?KΝ%gΜfu\J.-C cǎ    IEҮ];ɧO֭[˕+W2mEbC@@@pL6Mn6eѢEol+W.޽_Jz-  -ϬE1vpB%#   rz8p G@ z)-B@@@@@@ Mׯo'::̓A:t0I    q\nh9qNKHZL0A:$F *.InRxqi۶[\F@@@(cƌFs2dHFi:DrYf -C@@@@hdɒ3?lCѣlٲ22  @xxiƨ¥Kd֬YY   # *dرcf  ja ڃ       DEEX̓AZlٲM`gϞurs;   !7o^sӧOy2d$,;wVG 8^y Ç7;gm   J GfQϟ7d%K{;uTQIr1yt@V2A@@@BQ`A5ٳGzͤM gΜ1j?~Ԛj"  d/n W_}%Fs-}~MΝ+k$@@ D `dȐ!s9    $)5kVsY\\'~C=      B~Vf NP<F9"Gvrs;   (DNWq+VC dϞ]:t 7n~AZl)Yd14g}&wT^]L""   @gΜ)r2@J(a.#  St{Ǩ֭[eΜ9N:D@@@ \b5V9  BC-4@@@@@@R)` ۵kTf?@ojJ+\6X?S>,tҢ(d˖-{ Lq.\0vΞ=+˗2eHXXX`vPիWegzPxqc ׀!@Z)T A<F2ȁf493̻,DL.'N4o l":u_~Y}Y֭1pr   8Q@O9rۇ_|of'6:#8X=o   t|O.ϟhw-}{L=1   $52/JӦM%22҉M,>(eC+}#8\r;y~]crc֟}i{ݝ'د%`@(R      %o޼rI2erx>"UV ^=vX9w[> C%N2۫YZhaN'yw>3WVMMfNYz3j+Vp@^R%ygm۶rM7%Z5nw~VZ%'O6rƺf9rʕ+q+0rJ=zܹS~7uB I&MGx@tI% G7ڴi蘶5رvTի'[G׶iiVxۯlٲ9RF iذaFjժ%Ǐs^O7n,zpO5k֔ &Jkɒ%K}37,L X1< x~,- ljk\u3؟xM,:bz{4mrgϞ5w={v3O[DyW߅ƌ# N8! 6LyѣԫW/X   8HcǎpB/寿2uP * @(o/_>WO@@@L~0J5p+iPf͚I߾}vڮ|"  ]/ˈ#Bm4ڷ1-!j<macz<=l=Ou_Z{ý|\՝y Xܯ{s~@߯WeƆ t)@< @@@@@@HHƟ[b@$Oi ~ӵm۷o7_uId7o޼$Kj]7|ԩm=4Q~}]Sc!C<)\XnGz0XA|BJOd6e˖~#[l7oNrv'ҥOuN ߿K.%Y_;vx|>)b-ʜN">w>9M4,S3s !v'ҽIB?ܧo>u.UTuJu[=J^In{.׿Ңr#Ѷ>ȡ9&hW?do|L}E穖1=R{ۏS<]__~~mW;vܯW}5u)\61{uZTS*#OY&՘@ٍt}:>ϷV :|tAАZ4}6=$ v'ezn$8 F8s$ǻ-!La~c x;ޭ!o,M%y,yz_'mI gm[׿Α@< \5ws[n̓A>}迉{֭[瞓bŊI~?pF@@@H`G5ݻ@H+'Nʗ/'   ΝѣGKٲeEvZs7LF)J2A@@ J,)Ѵ+WH˖-T6yhw?@G!~ qZy}V@_Ǘ0aWdݏ]4XmNKdzYŽ vw/_N>ZδsH7K}˅k:~m׽Z=:/:9h~9*ikqbi"!')<<ܯ*fkmVF@@@@@@޽{ȶe<֭[W_}%gϖSNɖ-[bX_*^tM)wrYy 7}B;mgӦMeϞ] *1/?UlY/>ry3edSԪU.ׯ_o \Dd5 vl۸qGsm5edh=z${Ο?_ﱝNhQQQRL{۶m/b܋VuVGRXX}k8Z8@R_徺SNtRs^ZgٓZuw~yDn\hϰz޻ǧoI;hy[$ޮM>5q"E5Sԗݓv.M.eɒţv'+`>yHm&8Y@[cvK@_{tⳀΑ@< \5sNsՔ @f/3fok"CÇ#<"=ߚ,    @ 4iD:w,'N t^A4 yj:&3e# ̜ٿkmX@@@@@@'PZ5)P?~\V\)&$!*: d׮]FVZɧ~ǹE:9}IV+V$+l+-8y۷mx 鱂֗ڴi#&M򳔴_}ݺu^֮][>#\rJyƎŋ=Vn]ύkA.]dԨQҫW/,#3L:tp#RByw>A_}Uټy1 2XQ[|kذ|fY\V 4et钹L; N>]ڷooKˌDϟߣ<|r`zŋY'L}kso~l"3gt_%UT1]@ʕUϷzK d.)mcO ̭`:[y< hKzY qsJ s)VuY@%\/;׎vޞүfg hQ`2w\p\r7;_ϻ=zO?-n4G@@@ %0l05kȐ!CP4@ ]N8a    ؾ}f2rY>F5O@@2իWK,Yb~}H;?oCIdU=2XDu;#X@CN첷5tTX>)૮!\}^|9Q@ܾodi׮?ޣ-Z7o)GFZZnmc]cwqh}4м5u>ҥ~äDFj=iF ?G=𖷖k}>{F?и/[$G4sz$Bͽ 2e˖IRy/sl<X< \^yn^/ƍݗ-[ӦW}/NM>]7x`)Z sIbŤ_~    ,3gN9s9[o%6l*S7@\)_|,   ܐw}gRL: 5kVi߾ѿN@@ D .lu;v{}}o[k?@G߉]alGuo2D]R{>%kNjW>\O']M>mݹ_{C̮k;~stZ6kVv/oék;SMZ|YF4&qg J\)}7%!#      ׯo6::̓A Tn6#ȯvF4ydٳgNocnj#P}}ᅲ+VԎL/9}dbJ۷o8|mFi2Ozyz,y;],aog0;N}У۹9Lc%k %Ͼ]]N*WsM?魩C ,XP  ̛7Oԩcn:t)SF5k&lҐA@@@ ]{VQϰm۶<qթ 7uWʛ7+'   ~ \rEϟ/5k3xb^ӦMʕ+]>   Ze;u<}|ꇜ}Ŏη`ꃬ&v\>\rUo'|:}5v~}~} 1*j5vrVk_۩k;SwEEEٽ;GnX\ ʒ%_/.VF@@@@@@ /&РAEj=zzZU,XhҤ' o+} qFi߾d˖ة矋vԫZL4IΟ?oo(@@@0;v+r) ) ͗/_   X7n/_^|IٰaFɒ%eĈFߓwyG .l.#  mڴaÆ3/=z{*?PkR붾- tda\Mֲ0>l|=ntۤmk빦J| >ZWMs)؏kNsɵ/]]v§ Qco_#)]?tN;-sr|^.sMtqV%ɟq7U@_/_g}fTE?|ZHR2}v'-E@@@@@@ *U$ 2Zߋa !Y}ԩOKF Cn&)^xMPǏX/ue^hW]t1& ,-Ik5WpXK=6O1k-_~fϞ=scNJK"Z#GJѢEV-K gΜݻwO 9-deiР@& 6/GZo9r$Z'= k/&jJ(ygLsr:Yjj)zDsݬ%cm.;q/ZFu}8)9cvȐ!Fpʆ ʧ~*/^tD3mV#'< h+~Xs%Scuv)Z_Sxpm;Z}_߳gzץY@~'PDD4h)H}6m10vw_~Ν;vׯiR'v   #}ǢOiԨQO _'O4w0I   *8 / {57;dΜ9gr2A@@z-˜1cyrs3־vCc<!a]ߩl dq_}Uڿ3P4XCA~8xq8誻>>f[ܯ=<k>V@=#9~m׽yqh8~myI+VȮ]]իWOϟe  !      A MNJ2v… %gΜFV\)v,]-k'K ˶oYnDcjҗ]ٳ> kS_0 K}Y]k?<}UfjD@%5{A"nY^Z..\pe<ܹ3Jٲec~NX,UǞ\/垷ziu Os˲eˤEqcd>}kD-*eygߡ| ZSR{gǜϾ׷Ym3G}dBO?4y*L!z=0`w޼yRN1112tP)Sq^hQyGzH#֩/Z+]˗/YիWur!={4݃˒lٲE^ח=6JbB}@^n3gLtL>*(w }vznc: :{˚8uOW^rE٩[ϋ@+-XΦuݗ`rz̙3ǣv#,Qd͚صvp3f߿ߘ_pa㾰yfu\B fxǻkOk|c-#;-M7yc>5k8}zLXY D/yg/ E -;Yڱós(-!;Kv$(E#mܸ-[6r/B~RL8QΟ?    z!QQQ;1@ YLIn HJ|Vy5_yv\2Q4ȶ/)&&c5 "-m=Ӊc7|c ۲eK\}auɟ?O瓫HvvB+RJii&}Twm"knAvuPRݵ3wH)=wa,CbdȐ!z˙3g/WnVʒzr}8֭p+"?L>]>c9tPww.mڴN:3]cx,-yz- 3XZ\,ߧs5{n)x=Xiq_s⿭篵nH J}9}7   7˗{'鞴>+{CB@@ 4jH6o,Z~A.]$xȑҸqҼm(/\ úHi2JV@v:ȱ}HÆ Yf#lk:zq-p___Se{;O} v믿<ʲg;@IDATXhӄJZqM JTo ԋNv~mTd˖*WG_K*Vh1׼,-w5%ĺksWNb}xl2cnָVGmv\}vYSz>`~*>z;W\ 9}g?z;&x2uT^So%̎-P`AyW_~ӫW6*&6l1B4i"ݻwx C@@@`۷7s=# @@9s(*_|(2@@@BDիx/rƍ*TTOz0  @ roȻkţAσE2p@SNkG6ٮHĎ.kkIOk:v=F㑨]N|h-svܫ|vޯWNjvzLڝڵk'ޝT ̡̄i6Dh6!"S)S4("i25"& !T2ggko{{ν眻YqZ=cYڔ ܡC7K oǰgF3X@@@@@@RJYfV}wޝ&dJAPٔݻ񪫮r__,jʔ)Vgfz5bf=Yo^4;nذ=;Y2t&hY r Լys/æ`͝4n,.د.w>l`ޝ:u *X[EHi:23' [X1Zj ,V眹ld;m4+rϞ=o rǏ[nݣF]&\ |PiƌVw{\[ʕ5Cno{}6pc=u}9sJV^M6Yל:+dݹsg)Wzi\~OH xyd#u,vw<,pYฅe峀54vXX=7$@ܹm۶2o|XnyMMAm|@@dibg;      'дiSyWϞ=;lԓƩ Pre| 0@~GLQٖ.]Z:t ډg|+3L%/BfΜd<.gP/w(دf_ܫX=29Yxs禩63vZ1^N/[=IY=37ϟ/ÇG}Tmf.bK6'O>z=B.3{h3_3P*[.x5jVXa}ΘШQ#y衇䢋.2xGMLwns5gg\pݛt)W"EZjb鎛ypy|zjqwv5駟n6b}=ҥK矗^z ^qΝVP`mנA޽tսH`~Op]yS룙4ǦfyOR, ³@e?=zmI: S@&M#FȄ gjާ~VzSAurRj@@@C瞓 }w^H?`@󾛾BB@@H];vرce̘1x m߻kD@@@ k֭+}L2E^YjUy~*U$;v!լY3k VͶ,p퐃j = צԽ n =^2D]2{h3diєK<Υd>ۻK!=@%3:Qkoڥ5&k $ڏs)b:>KAݯ:OA-[XN>ڌѥ~]u$oH wGUiF      @f͜j{gThٲ>CW_}eU];|ǭO:uK//X;<ɓ'O/^xI`X}ʮV|RL'D{V3{DgU_{ذy$:,ԼM:?\29~0ϟptOYv8g_w.>IgnG>SCjw$H~%Kw- w}Wz)ߩ5ڵi-ZnMw)]   )PT)рK7J}B An@R@`N-$9@@@7o+7NvE]dm޼g:#   ^{i ;l0N֭['?iР\r%V$5Jf !V^6dp7ꖂ!HW? fYM4%t{~I룖D!Ekkq|~mK~ݫ̛u|d_uDҾ^{5ƍMh_@dػwS|9Ñ 7%A@@@@@@ 4OJ_|p1n /reڴibG%KD?PBrșg|Țɞ={ w.ڵsO 9/x d̙|4KdݰaCŜi  WZfl۶͓IOy5ȴ)wZHָvzz.FZ՗gz[o%/lS结SNΰb6 :OD颁IO8ᄈk!X$UVInDŋpl2gzXr*Νk@GfT;$>}W[JK?X5krңGҥh`    W\!7pfڵ|GAm|@RD`)&   B`VDmߴo>g }wJ۶y睒^;?g@@@ KٽCruYL0A>C9xUk v$ 6O<1նvAGXf{:?;6ȶD ܳRm3C5۫fE$꒬NjyLݞ?_NzgHhPǭ_pqkN ?Aܫ y:>NjyL&:TI?7'<(QSu~n@ ?>`fĆ@@@@@@H.f͚Y*@rG ֭+ƍ=zԨQ)o&sw7x7g!@@@@ƌcB&M)gAHU;v8U/V3   @`5k֔gy 7o^˗/"f_j  @r ȑC.Ryv?hen'm}'Z Trei޼tMF!SNsʒ%K<<2kFݮ5+AAU?ڮfu}Ltd-i{V˴Cf#h[?8ϐТ^47~8+}1juJuPju<~zS}}.y< -Ty_fiѢՇ~#weIH<wGUG #      @vhڴ V55h矟ݫLHH"V.]e̙GYҝ6m$4?o5Fy[Œ4(i=V^Y,܋ ,O>ijyL2it' !YppͰ','xb4Y}-[xK[O!FL?/&#u޿4;^zVZm筝~Wwn~^֏XuVZ&~O>]v 7xƃN%WZLÆ =5ؚ~9BI_f:KA$:,YbU:H=E4eUǻvd85K8,Y 殸⊨ۻwVg͚43)^tM@g̦Q2< h-~0]\ZɌdյ1\Y@gz'Ǐ.ɪ=;> 4h@6o,;wtojjҷo_)P, -*}޽{6|駭9"‹/h}[oUڷo/6@@@2#O?W)/"Xbfe]@w*J{>   -6L-bި@@@ y?m Dh$l+n:g}7nS$%Ypaӛamrh:mҫF̼i|\̴=eh A`Z'K8^k$ѽϐu~}t^9Ǣ_uܯx/|6gM9Uw?#ڏ;N8|С{y #&gAB_@@@@@@p 4k3g 4g hjm۶>:eÆ 7XoV-[f=zhX2 ~w$$E(-ZH2{ lȐ!!?CN5q!:tH4X;+{h0?D$)ڗC]Sj0%\*a= {AcJ*|I tIeb1՗s̙aV'N,sy HY ŋG|͏;V>g~}w–|8& m퐃D+T{X6ȶ;(jh#ѵɯ~| -Kh_?3$y~~бw2߯sɯ{ysVd_yӏ_ KK.Lnf9s-t@ v唹pp$De@@@@@@HAʕ+[5P‚ DjP@ꫝ4UdŊoҥKe|}I?1;\j8/%VXѕ/җI5(i& /ӹD=/a~K[G }9N=wP H"p#O?gVٲe=1_ɕ+6d+ĚD2y믿ZAskx'D͚5k-F%+^{YW_*دf=,Yb]Ju^VSVfښ;wtya.z! UV5F c< b8,A,j"< < >C+Vz5h@n5"ofY)PJ1bho & cɨQ䢋.[oj`@@@@=ZfΜ)'|"=t-3Y. @ -Z4E6   4 om<:JH #  dkU~ڷoShedݺuV@5 m;&O JKmnl[rh9jyk2mrAAU2CGyNj_4r&Bd5Y ϥp}o2'K!ju@3KܯU%1RaP^;9׽Z]b9O_\isAKA߯ڗڧ~jmg̘!~A^`N!MghrfY@@@@@@HzM՗+iҤI׉ o}YQ/m~/28qb"N$m?{VH_JJzn޼+eEc<B,X|~0_`Yumhd峀-s5Qx8vtFfnY;볺&}{- H@^馛7|#cǎ)SXoTG]v߷H    @,q„ λ3UVA:H D#[XhVeY@@@ж,G}ҝj׮-w}t 0  6kf5waRL`Mmic3˪Yaïw2G n#(ju "m.4y(m.~A/AK~}m2~'[!ju7ږ 1Z;suռ6MޯM?ZXSr4}y.}6G?\xᅞw\ՙdG]v9IFe@@@@@@H1f͚ɓZϞ=`)nr h0˃z [/z)Q~ $=zgZ۶meԩ4mP*NB__ UWW>5k/eǎ/L+T);gkdذa`snݺ$1h%Pw|rc:OCm߽c=&sOL31ʮٵhB ,(B *kO)ʾ}qYT)g<3azg񮖿 A{ #)w߾}QlYԩ jժPטHHo+Cn(s, ֹijPj{@HXɨZ{;g_!@FD?z߸yYj؆ |PZo=Ƈ"    ڵ?^㏛o?q~gH n}N%F@@O`2i$1b]S 4~a@@$m_Y6~ N .)6ZܳU$hA<8L6ȶm2/AKhdN>C8uϼ蜌ڡ 1vL?~ԽZCܯ5wnq.~yV) N #R,      ))~4g{oH@EytQ˗/,{z&)SgT :*G"f_\9z$zҗ i۶m裏'`fͅ~tIMi'vPόG4`ޞ~Wn:߇δHF&huÆ Ӭh"9rgz/{V2FLk=O֭k,ulҿ0`g.?|pϴxݻW-[T$NJv?Oh|'{$w<2屿##.~wh<C7u#~}t^u ~ԽZMLoתr,uwޯ0 @x]v93 . G2@HX@@@@@@ЗfUf}F N;4ɝ;w_xqK`zk0w۷K$3دG4ѣG f9b6?2ENN,@[i KZK.Y ׯ)}衇<۷G,X`uXaw"Ei62d`;۞[j3SOΝ;{?VP!QgZ,#17֭[>lIϹW_}U~I%iwjݺ{5裏D=3nmf=n:N޶{mgޣ~W~ԽZMKA/v 6 #/{ngo1qƲ       5k&Vc ]A|0Ҁz`mhPUw*Vr-I~7lؐf+VȮ]<nj#}gZF# 4\̬k[vmݻ֮؞={M6rM7[N6M-[f-p)Hw /F 5gO*Ud2yd0ah@^;̙S^~e)]=mKu9r]vRN9S DWhCѣGHW;۝:u(P3&*UJƍtju&ڹZG;u[@9駟nOG#If_… 3nn;k]_U/g~Of x7e^z6v÷PKk׮)?#=xH̽}У,՝b}QWsw4_Zz)ѼI_Fݠh6l"ׯJu~yWdӦM:h\ׯvvwyVo'裏_v&j .Iʕ: uj'Ǐ ]jU+0qu،2149D*G4xխ|A~u̸=zT-Zdo7~Pǻsr|yh1w/5WEdH1q@ ,kYdxPPj<< wV$6$y< F.sMZ}ZU"w}rUWI.]yβC@@@F)ӧOkZ=SrGK"hѢ)k@@@@d?qYA|2ʕKڷo/:uؓF@@F THۣjfIH,N=lGAA|thi6\263y,mDi:O5 ם:mlgp>~q݇X^A\r}6zd^y:O_rA]Y@MBUDyYJY @ TVMyٰa)SE]$C=${6     *$&M:}ݢoMB@ #f$|@@@ k6mduR9 { '7,˗/_~@Y:  #mczmYPū , jk&Z66Z 5 eYT? S^z)Q eL.׹]K2~'[!j:qmLgL;џs(ϥh}y|g !~ hm۶~wXbu]Rtig3k֬AIʕ.wyǗ 0   I-ЬY3ٳU}ϮSNrȑGVѣsNk#lI@@@ذa~RjUyǝv~\jL0AUf8   PfF?!dz?4+pfI  ފ퐃le /ӫL$ߡS{=;_wfgۅsלu>ƫXz^oꐞ7k:>^|tNq)ӌg> ۶mhS}4ڕX@@@@@@RK@F>VgΜ)-ZH-jK.:uX9vY&N2w@_X4ei׮]嘘Ǻudɒ%͛\rV@J*I%O< ׮^Z~'9r䰂j&MK˗/m젝h˶'xU,C;Pܹsǒ= @P{La%ȶ<Եgl{'uł:ޓ%DNiF|MgHvvV`P[sΘ1#M2eHǎ=~H=믔/E@ƍgRC^z>4=Z  !v;g{$@@@Nׇ &'O8)Ph[Hٲe   Ah ڇB ~mq2j(k s1a< e9A/\ U!@b $5&/<>(UKr%AM˨?Ld@|dV??CTE oT\,      @j ruY{塇JMj,(B   d@z~"9 φ@ eI&Yyjf:묳sҾ}{'8  9UdK  /0ei׮]"0w\iڴhQŋK5|ɛL@ bŊV:uj A@@H`2tPyN *$z_J*Lg@@R~`A*7   22~? CTػw(P={vT,      ))ihS^o@@@@@Y@.<{N>]ڶm+yu_KݥlٲұcGOȑ#|@@@@ 57n,z*tMFZ"Q رYhѢ0   w:w,jՒ':~)"{]VN       /۶ms)^3@Hd9@@@@@@H] Lp)ȲeoG , %Kk ̢_~ҵk'%'Aڛ)UJ*{z"$@Μ9UVg֭+ȤIdѢEV5/l}4@_/7x!hԁr ,˗K&Kq)'  c=H 6L>#Yb,X@F-wqGPS@v,G_@@@ .V~X^z%9t萳bŊI޽O>$@@@bg,jcP,1^+;cۧ@ qo`       @fͬ`/BZl&H*;vXŠ bHD*! pϒ2/yCr@@ VO"   7@IDAT    w_}? tǐhdy@@@@@@H)w9sTݩ, JDriÇC4͟@J ^,)7$@ȓ'\s5?W_}U^xYh;c}+&m۶믿^.ɑ#E!/@@@bzH}]Yf{w=t=K@EH"R,ʁ  d+~Mw:w_vۯ_?ի7YT@@H}&n p_~YM&v^n >Ԯ] [zrgRK믿9*Mm@@ZoNQh޼12qDѠ=z?k @B` (  d37СCervŊ}J>}H"t@@@@@@@@ { ,Y2J7j2V@@@@@@@ u6m*O?0{l@@@@@@bș3h;V}]+'|"r]t3ϔkV9c*!x 5jTA@Hj&K}QE|ꫯJm6 M}C@@@ O6l<3o>طwү_?р$@@@@@@@H wRJE]Q        M49rX3gN:Pq@@@@@(P\wu͛eܸqҸqcxƷ~+*UHFdĈzj?6O    ' "2vXgk\a3@ oJn*   lݺUZ)#F[:k͛Ww.2e8@@@@@@@@/^\r5BΨ`@@@@@@Hif͚93g3     /PzuᄈH >\6lТE{ZjIzdȐ!H    XK1c8[dǎ8 %k.9r… V-   駟jժY؁~O8֭\@Q²8       T[TjHߘX @@@@@@hҤhR5G@@@@@ժU;oV֬Y##G:SQx#+WnM>OI    '\rU]  Y"sNk 9 *KvE@@8r䈼RV-=͛7[eΕ+p l2yg夓NJP@@@@@@@@}~_t1m7cbc%@@@@@@RWDriY󟖩+B@@@@@',J~75js9#G0֭~ZZj%%Kv/,[nua@@@/3H… O0AfϞBE@,صkU   @ V{oQ֮]kNߍiӦ /HժU@@@@@@@Z`Nʕ+ G3@hX@@@@@@,MZ߇y桂     Y(PR%۷,X@֯_/cǎ֭[K޼yRiЈ7|S:v(K_\Y@@@@ŊeĈƎ=*]t={gl@ a0   @ |ҨQ#eɒ%NZj% .ށ9S        nM69e˖u o4Z,      WGfϞ      $@ [n?Xl"op RdI?\QԩSG'3f̐}91    t]4ibm`2hР6F  )@߄- @@Pᅲ-[J-ouJryYL>]8 g:        @(wrʅZ$i͐@@@@@@@saM3g9q@@@@@HB W_-/l޼YΝ+5kzJtR=znZ/n}%K<1    ;xǏ[>_rBHh}ɡC2.\8J@@@V\)۷ ̙3կ__>?4nؙ        ~s!      N͛7'W)-   +PF \wu#Gg:   ikٹsgLA@@Hie˖t< @_@@@@@@2MZ~s_eeadGw'C@@@@@jժ% >۷oO? n:g3ׯ &X ܨQ#'|ȡbD`˖-qFG*U',yM߿_6l`}4P͚5Zj3gNʪ߫+WZ5{J CQ8#, !r07xC.\(K:?sٻwUÇ˗_~i}R@9siӦGj<C /;v8Yu]Ү];g3)Zh&̛7O㙭#۷O.+_fӀe6ӷ~+曢A͔#GStYn)Y5ѹs孷rKݺu塇ӣkO 7c /8`fͲ>:QwyVf͚YAp1@̞=Sŋ{Í|;5o4onݺyi`w9ʕ+[_-O?$ .ӷ,+_|L_eW~ѣ׷;C(_ԫW/:A5o߾Go.b >Ν;MYCMྺ{jg!&M> Nܹ3숧#ͲUs!СCo*hx}ShIjRk׮=ʹuVsRq H`45Ppg:tr˙9 #}û+ox=C hﶞ4on/ z 5w  Y'x=Ȋ+BɓGndɒt@@@hժ.\8   (qFnB%b"wLY      dg\;\hپ}+V,;W!W>[CB@@@@R _|ҲeKcɆ s̱jR;iߙ3gZV`A+mܸ4h@k/7Y&* sȑ4$8 ׳tsNsOJwجC4H7gG)"7'm\۶m+wTܿTP!:G}]m5#<"'x 0f|VهJ3/ E ȪU2W3ua M6INdر2uTTRF2_&]窫g} A{ׯ1cƄ,ns]˶dɒDw0lX_^O^4瘥KW_}%ƍ={kl@ 38C@@,//2ȑCڵk'CU:@@@L~?Y @@@@ʗ//B,`      XM6:)Ί͛'_~92      N:$馛Vs͚5bo gG>#4sϕs9ֆQ$-`X,Y2bXBvY3#CL=6}]5ìC4pev~eʔLhy-| xe!w'mYvm+yFߊbljpCP]w]@Ej ܝ;wZԧM殒=Zz6.owYOG4 /PUfy/Y>T ^{i͙3g`f5qF[nw--Sʕ͢yO8O0l,` x >4iD=**{]<ȶ@OT`A{o@@@ ZʩSzRG) 6Lg@@@@@@@C@ۘVVڗ@`ʱ      6~- `'o[w#9! ӧO*l2ӧOBPs@T .{7AKG@2RSN֢ P@'(Q™ޣG3f7. z /XA]zh{rZdذaV8{[-Z$zmcE}pG5L0A<`?ޙD79|9=[נf ǭ~W_'6ᇻ{-bM|!      vbk$O@;1c XYr  x NBQ"@V*ܹǪU_|,X@~W9zuD?5-rg9c}kS &LBO3`cr`2@,ҝnc{=-ܷ_uG\u{Ck3޿x㍲gOڵW^y%l0q<V]vyֵGr_~1ތݠA>}(P3]Gnv7n,_ܙyuw<mK2e܋⋥u2uԐ[b=66s˗ @;vX˥aÆOZd^+ kg}8|֬Y~sYʕ+ofmZߡ4)R Hh/WNɛ7=j}}{6ˏ<\Eb0Ao7Hޓ?C~mk/4 L`lR@@i߭[:"e˖!CXʕ˙   @)mccM@pE>|#d;KB @h{V;UX;gk       @ŭNutV4p@9r     Y(PZ5eҤIl2ٲe|rJfJݻw̝; lԦM+pHlѢyVP+V tUdI&_q Jz7o|gNʕ8:`31QD `~%KȾ}<Hԓa@#TY5ԪU+yWu/W$g8(AysLJ z}tpu?j`wzw3 k/_նm[+=6u:W˻vr}ym۶4ǃgFc%kɽ[=fj~k M69ɗ_~3^3͜9(0wֱ^& xwov桶,8 >;$޽}#k޽1c8={]v9 dǩHa@@@d[ [@kڵ7,eF@@@@@@@ m37wU#      g\ச?Hn." )QiE4H]IFT*]}h\0E!颡AJSK{Qkfg^߽붿{gZϯ8hӦsj}v|sũ{%o}ܸqvgq O]v3aFg <8q@ [|MRܶN P$۩S'۶m9s̙3mƌndɒ.Jv?PjU'*!-[71>!X2'+'d A".^%XkgCo_"͛7X͟?߆ӧիۘ1c급P$"g}6&swL֫W/LN?T@-Z)IdٲeN=\G6|=/O՝M=~m]IhY,ܣ[P}֣GM0}1!@X~}*Ua @Jݻw̜޽^{UNB @(&MdvX; $#Zdr :|n喲( د' @ @ @(t1bkwʔ)o_,.bժUQ @`wLB _  @ ֭[J ~0[bf2 Ξ=!lL:m>RJv!8_6mm D-k֬i,[|㏾OE,ߏqj,ٞ={j X4HRGzEgŊe/6G[gȑYs O?t>_{1/RFo#a}'5k,&i$*j[]vR,<$4-~Vdʕ1ݬ_~\p֩>pAbKn͎9 \CP*$TElp;%%,qٻl'x]~vi㾱ոo}Ϣ# J|mܸխ[7;CC @Y%oVqR @ P~߿3ƶmכh"H#@ @%PreL1C@He-2"84 @%@IXZ"@I@Dooyؕѣ!@ @ @ CcrMb @ @ @Ȅ@:usnH JRۿo%~4sL>Nҋj߸q"ᲄKhEy1%j%^tRw\.?I 8I`1*^LV>cQFٮ?>4ڵkg)& /0&-H;6K-[#<2&-^D ӷlْGqlpBh[aѱҰa`|gZTa b~LR~VDLn4o6G]bTi\qn$h"r!A\\B(/ ׫W/#`l0ϿՒ~I&Ml+F}Тo~@" 0o5?+?0DI M J*Ż @ 6j(ӻp=oСC3I!@ @ @ @@Ȗo"=B @ @ @{'~^Ԝ'@ @ @@ ;:q_~ Zz-69atX׭[7kѢU\?SO>6f>}OyʓPDSw}FIL6&O_%pz8q ["2ª[m-f駟6 &ꫯG3 炻Dh?쳘~3*[fML6]7iMb7p/ltqʕ+e~",qχmmڴ#6=^׷ *%|~[lK[>So7vZ/ۊ~h`k֬? 6t5}Y'7s'r`Q7|?C ^z߱ʣ{#e  gz^A @(&Nh͚5s,ojlȐ!'B ?@ @ @ @@ tRw}.IA@ @ @ @% 's,[Νa@ @ @rJ@ڵk6ߐ0%~4w\7o^\di{7|q0l 6 UVKd85[*UlΜ9ᤸa -%\bapXk9P$dlٗ_~G4W°fJ n'L43=31%Wn L{/Ok:tȓ/a1܊'j+q= KxsW:Z>rmRu35*HcWSh" `4?`wLճ+ȫ9-t)Y=T$_"Fudkm$r-vgڸq쩧+V鵮k.˭iӦyU ~}=q?ϻ;쬳Ί=*Y= G`Æ A P @!EY^_zwI]v 80=x @ @ @ @(yx ҥL^@ @ @ @HwĈлヒo}M<9V} D~5N󳨐\wa|<*h7tSwnO>dQ8}QLUOTRLZ&\p:ujL$J{Ƥ%,^8{ ~ꫯ$/ꫯ޽{[K.LSξ曘=iK>l{dSlb}̡LTB$?b۶mNo!C.\p6tA;8_}X&M"^S?2$&A4̃KpQFNyРA6i$'Ϛ͛7ǜG#<҉f3:"7̸ogF C,pZj>۸q]uU6a@@ 'to|d@ @ Sׯ7 _~%uٿWc @ @ @ @8gete  @ @ @J(c=ʕ+g۷o)Sг @ @ V{キiرc)X‰.XJX"J BOxvrmH~nS }ʕ}U싀@T2.D,u 0 &ilVZ}1x9׏xu$K֟,oc+n̙3m֭1O8ᄘx(lpb%Tm޼y1Y6*w[b(VbE;s뮳TrG]h_^蹅2O\Iȧ"'t$ Κ5+Oyn? FJB9HྑXWo4JdDUBy&Nh?کbEA6!@ T ֻw_ճ!C\*U @ @ @ @ |WA_N'o:(@ @ @ se9|9sիF1y@ @ @ F`2mQaM6٢EApxʕy$u^-YmSO${&$ڹ;& dC7Lu6i$$y7q]}~bf?~Ll$f(ؘBdԩyj9c󤥛 K.u"m>%S|60y‚t2m4{lذa]n47ocǺM+DXQKTet0~ӱHafk׮]Hl4&hj(hückʔ)A[Ν;10{Uf4[x2O-N"lYyIܑ={mN駟6}w ڵkDe[li=zp¿< s0 oGYshEBņ@*Ulvi>:t֬YxURso1q>c'4 @K ,P~  @ @ @@bmڴqb۷o79FN m۶ٓO>i3f̰/9ܟx־}{s󨩌DLRs9ǚ5kf<[pɥ^ܹs7twa`L81(#5nmkp,p^x5l0O˗/G}ԥm֎? O:¡?A%"Y *>˩+4Vܚ4ibtONOw\& @ @ veKϼ&AL JDO [2aիW;M-dNdʕwԩc>Uˣ|zf&1Y,QF=KEV,?=_5Id 9t)XӦMcd27oIU 6\&Y8*yۑGH̱#8"&^>(97Hv}b2w=#Z1ͣnK̡;.&H@[o޽{_W{;~-Ger>_OҥK%&/ѺSQ$kīS5/]w>KƍgI@=lg6 _~䜆oq~>}#K-Ν;>_z%o߾c v7ntPViҜ @J۝wi#Gy/w[S2΄^B @6aÆ9Ѹ0͍Wi^/a5kִ믿>!6sLO ٓn|gzꩦ90;˧9k׮un-a}:pwۆ lw'͛%fψ|<nNT\ٍMԩr!y;B  @Kl֬Yn~)SJY8ЭS:ŋa@(-ח @ @ @@$ Çkb%2i@ݻKW Y$PzyhrxF|A-hٲen&;_ 4g˳С_~c$ەCxb&ڰo:W" Y*>k1Un׮iQU4x@@ 7|cgq <8 P# @(*Vhhfٲeэᰜ߬X"]۷?pzD<%jԨ%oHqOY0H$5l=z09ϟ#Œ1cM4)&cLGb_?wC)f TakN'DvAs=gu2Uӷ~;$\h [nngDXbQ88_=QU`+nEx"Gl;_"ѱJrfqW{gϲ}ӦMp Y'O (_E5-ձ_l3ם3mCM }Oر~'OEi0O%@IDAT1}#ྑ G PF~s1c .H`Q!@ //gt @ $/gwr._b @ rʄ|UoիWyK.חX|1g /O'l?\oi~gp~br-a߰)x?2JoƝůǏ~̉_!@ @@7?B @ @ @ @֭3x9/@EO`ժUֹsg67nl۷jժ٢Eb 9߲eK3w9xOdu]N, Qd[2~ĉ<&+_Tek1V7o$psTU?yb^ؗx'C. ~F4ϫ|N; LM_j dkխ[ײ.k"@@ &^-?XL S @ @ @'PzukѢi9sD {@--l};FA_}U9rdϜG#^yI&#G~0GN,Ybwysn:˭M6yd59ef͚@HAS$pӾ[C2˔U}4hu=ڼyK.?}+c 12h @ @(av}w֬Y=_~} +g:L^"u ۪U\X bzF69TMM+WΔG2QFN$X,QJXdEΘ1zpV{:9_b:=wgsHԏxeSI0n-<aKG6\>ri(*h{qE\hvI'٤IgձlFyK\'Z30:3ŋTӪUvӦ"~=I,\r=;:{ۗ_~uyYÆ cW2V :NN1 )RfM{ښ6mdzO(_9۾}{WrE=D74ru߸ؗL} KKgugY{V#. Q={t'fΜl ,7ntFd]7z @ @@Ucg$): @ @ԯ_fϞt@sGm7t7|p7C \sɟDAl̘1Яo5/y} мGy4ޛGE%{C1{E2Q]?K&QéSu"k5$z^6CoŭK PjYJ+vuFUQ @ @ @(X΀Uj 쵬!d8^L8lr~g-;lȰykr^#WV"Z]&M8ATʅ,\ЉS6@YXk׶ۉMֽUq.]jraXQ9΅6 @'cRUmrO?9_}gN)1&Y7W?6 L>E}z~e-R'tBY3 4jOW [~$vKy8|ZRMJS?]x{7 ;vz GYa_gʣO#W^8Kh"߈W裏#J>~g~_뫯j~®Ed{>nT`:A= [{VA,ZG6tx(lڴiĬ3{YgOv: 3Uo`sяc}~uoݺuݦw v GLDѣ>j~,;Ͻ/g͙A(]4ZdK׵l @ P L>ݮ 7K.>= @ @@ \EC=D"߂ȯLF{=7)\a\uUnZܰaCS4gU/jOQGFxY3q!0`@_kn`@"P׃8 \jجYƍ'dl3Ӻ ~_(YlIj 6(Γ6!@lz+V8azpʹ6C @ @ @e~%s "UVM~{sE*{9'jQjܸq&gɥ^{5w*uѣթS}zAϳXIp;e˖teLg@O?9=#">}8!.-0=l?]`׍7s]vֺukWp/sID^w)=z$;lذh%~꼴vی3bԩScڽ۝qmt-te{ jʕS'tIVZn1&=\Vc$^@PGNT,s&?HzgbuL @(Gk\B:ur‘zVԯ_?:t=c6~x{뭷l̙6o<%,< 3.Y iako SO? 4o7t]wu g;q-[t)G-^Ι==&}Y:LOq~E4*'~ݺu+T_}C UԪUr};r^yv'AZ^z 2 joi$дiS;)݇A@!gpved@ @ g֬Y-Yջ޽{; =C @Zl?>3&kGdz~ɪ~~.cǎ@&x"ψ1"ZAe@&82q?D믿nӦMs~Dm۶οHݺu@dlBF:Ü/;Ӵ2'F>^S,if"zLѼdvG|_'{.6cƌ i bA`ѢEnM: ߂J- @ @ @ P\ hKPJ0@(Z{["'s̱͛jyoݺՉDE&JPb"WFt%~WiL~ij_|q۽;GL&'Z':0[*UlpGQ0yZȂ᧟~k֔GlZQ9r&QC4='@ P HO$|r'mAQGD 6*8`.9X*"|t(wJQLBH@O -?䓠対*gw Mo3994iRL .>[:!PKAb7U=;_9-}TC\& ʱ7X3xmzϒg_O>7jG8FUiYK/i~>/79i(\7~M{cǎ59ԳXm_v{Ng 뙵OMBrRrJW{6='kD[li}i U6>l{7:@kԧ+V|AEOOoOdZ(57}|ɿȢ3鳄%+FH~| &5jiM!@ @ @ (ի;1*9jԨF @Vl5 JXO{}^nքN5IUe~E>ӟdɫU79Ͷ3`{衇#twѣIV ~hkĈ9%%A^9$pQGy5 po޴`np":/hyUW]D}oF;3Zjh޳mѣ]E)rHw0x`'F$4{キCТ%тisR?_D.\,1#ɖu Yc[n NI&VԢ, @@*$fvJ2)ՕУ~O1 7C=9uf͚5K3CM/د HPO}r",!BMtԩT^$f/NJtXkAS^}Nl,p=l^0(~<=Ϣʥnݺ( uߥÆ 3=T@xF$ʗ_;ՋI3ŋ;G1ywmر1$aÆ1iʓ90|<խZ OPzˆQ_`<۶m{"߰)6E/i&[paLTƊ_*O7ܣSsR#=oiHA/}J^B~St)\o^߈A[~w9R\MoXSO=UQGe[vb4|9ŗ@ΝMH Z\FY|;L @oIoz!@ l޽{y^9e @ I@> ꫯ졇2/Wvm$Ϛ5˴%2L$[y3ul̙qFTkZ~ k~raK5+mќw깔HXYƉi.]'@4H7S?zGnqY6g7C'M e:6LGdu1ժUջښ۽{w𖩟գuD -{_ƍٳ^0a|n7,>kWGy$h .1Z @/2E6~ @ @ @ mʔ)>&vN>ݚ7o?݄Ss{ٲeDip-`pӦMݢ ի?YjժT| ❧&bb*[~}׌;sxB*}IU:}V^zNn"Hrɒ%N(PoߖQcTbXJP}3OGaQ_=suLR|[uqΉULGr=ZgAE5n9xn;%}'{.Q>뾍Ҳ;"}&駟}ΟF,y߈ً陴>Vbz>gDOUW]ezh?; YuY)S55eQGsV;@#oXR @ K@kJz?~iJkcbk%@ @@I# 6զLJr<ܩSEovw yFku&w޲eM6-*(֭sq'8~Fb$w&/fڷ~Yi_Exi (fRǡ.g'ߋ " ffx]wudf:6&L`~V~L=?|믿Dq[&}VYV*ڻ /0O] &ɖh @ @ @(]Znmʕs-]זJ&-uM|݂ykٲɉsڵ9sv}뭷7FNeX8۸qcPjժA8[-GB+(+B)I'g϶~fΜiG}?>UVs~ 2T6[2~p@QҥK͆'JjA y 96-&au#t}QF;Ir@ `i!Andxn1ͣw,sG:-bc=։hq"^z1b9ڵkiӦM$P}Ns&KY@ gQT-c9UzvWÿQ_yMi{z^ϢO3^֤I`J.r|zf/… ]mb1\rs=M|ɠMe}5;v=&A^oz3$|ﯥ :9:sin 9Zh{70b'^׿qc~~zSתUz<0uW\q鷻xhhoO4ƌc͛7Iª/rdE~u}{.e ~.7]W=Z.{-DŊ:d7Otݸo^)?ֹor)M1ݗ$M_}'>}s$瘺ys^zmJSN9N=T;}9EG`}qs1$ؼm6D7wFEsZ Pv x" g @ lz-8{w @ @D\_{5Ӽd9 J%X*Ut|o^y;v ɕ?0kO;4qy♎ /5?:U*:~bRm'^?/1yQ`I-[櫱VZaQI9p  @%~cURwʅ̚5&LW_RcDF/6LR}!3=#^|y̡$>7t%3یg޷o_{ꩧg~XTϧEÆ sB{t[%[S~dzh#Xݺu󼓈f{zsĩo[a3D S1 7lЉ/zbʛ w=O|n_Xp1'DI:c#Zτy{%>(!>}KqߕucSCO钶믿ޝ띾ng駟:q?Nβ>-g_4nFr6sL{}g_4=U@oŊ@ @ #z|饗[oԳ{DjN>  @ @e;֝g}foM:Νks͞=$Л-C֜`Γϯְkm]U?#]s5n(|`G6/Tx=%\bLqw EM U(D2qDIe'ޠA|+*TP5dڍmۺHǏw>Ek^xW7}_ [&}eT_<%Jb"A@q"uRFҵrYJ @ @ @ i4V1@(^4a+7|3ؤIp.zG}4&r-`Q(^sꩧ:9W&_o|>-}YlN9ڵ\wuW^xQˠqD hME%ݢQ*;h Š=z,X@Dp$pmrjAw2X_<>^ pϟo<}Ѷ.bjGs=׆S;v옔thV}Ns @" @(%$tOi% vT.ZnVR@,-@H)GD]F;Ue\ LdZM29*h "[к?:^sTrNM^YؙB|o>#'͛Mξ2xL׎KNՙ_lC1]or]k׮ ѳTϦd睫r'Qʰ%[8点4%h]~u oo$rs'#xS }8)>A!#Gtuί8<6|,Ka2S!(?_NgLy1c-[̅p9'BpC *{;}0}|/mUIa@ @ @ @b  Or}ɉ xAYaA}"?Ab |7N8!./\Љ:)lVr-ϲ 6XT+پ0e~p @:‹?gm=  4~ؖ.]=eYby‰O.Χ^zA9MTN1#h zhɴiӜ㝈/b&jժ/m'%Ϟ{@ Qwњ7oVb˗/ &e]fjՊI/UuCD]F3t#gY5j5vuפԨQz~cn:n\sW,Nd첋]pNVW^ɓ';5k݉ D˖-#9o,& 6tΜN?tӧ! 6̪WO= VrTwΜ918r=>뼢uĻx}^\0c_|pϵQ|dqꉞ볳ʕ+mر&;sU 2 jʽXzup@мnݺGZ1@([z@ Gz'riE]dk֬q]Լ߷z/@ @lwIGvsq3 kͳI&`^W"-Zdcƌ?!t3nRa˸ @ 4n8hO>>:"A9[_al^xa,L*T\$?ğ¶~z]RA?:m۷7-ݸq4m4B>#$\ 'THg-mڴ  @rC@N}3?',"qt W[ /`rez4;\{v5زe 8uur6ТE|#暻}QG9%Kܹs]u8;LbO8=ĩ%Ƨ;o?̯ ƸN&+49R;\p?3Ǐ/ig{3`=f7~Ԯ] H4dڵֺL0!p9{lv79c={#8$^a_77n]zYyU@qB͛  @ H7p}nȑ뮻X @ @(k$ww@l>hV0hΐ9kO<_p~[5̓'OvBz:.A=ͩ.-WR>FURCe@D!a'Pyoo^1-;SW^yFʧ5BLX˿@(nAeT @ @ @i9ȖI\jqr@&;qDH8 6o<_aDɢ^|ϋZVtOoZD/SrG֦M<ەW^ir4. 틒I߾}]~W뮻bXeL@($5lIT U"aDv衇ʶoߞ(Kg-@X~iёcq{#tAG m3؆ \͓n<9{As7|cN @@q&g쳏|ֻwo2d:,;r7ԩv9O՜[1j 'wiWFA@ @ظq{x) 5;v,Bef$p @ nj7nNPI9]֥1"tAk~ i=$Mv 'DK?#cÇ7=JdgYf>(2Ř?E8/84M)Xc}&?}W1o3 Z'[ftM߻OwПL,3;Ms%O PX>쳠X}p~  @ @ @@j$V(ԩS]? P\W;vW^y-Zd۶ms"/k֯_:$~ۇ~h.'ٷrK/0m4mf]vu2w\WL΂9(㩲{wsf̘aVʓ/SV9O .Bs=QM]lY32 FF+VGaӧOzQ\p^63߿s裏kvEm۶)螢,ٗҥK͋ ybA $.ǏwI[J|Y]q6k֬@@BNs6j׮ jJ \ҍ7h^r29QF&ӥgOIsD }y>?[.8 @ @ 1ᄏ]}ٽ%݀ ݱu]nBCTdwZrk}Wd}a@O@&C @'m *ܹwl @ @(_[3Z#wVTˤ}ٮI&Km^{5wow@(f,XzTZ5-+J @ @ @@~LbvZ4 q@($&L0m2-фɰI[o ' _|y =zpbxaJdO q3Mz/ 2GK[oe[lqpI'%=:ؿ/7)7p2ejm& WP-0xq?S$2B"J ׾;N$wΜ9v1N;V|vm]wuE-l&ݻh;h'O=ձf͚ {'>jժv=6WЖ.]:lYlUD= @ @ @Zn%&_  VzAa5j8w}M 27ˋǵB݇(:%6_ӄN zꩦѤU im6-| '}Z-_חYPVx{g $>1&/ ,2@(fdhUFyW;,oƍ[n}783Y ^ kLH8ꫮBZ!g]vv7o֭[-ܽt dէ; ~7~5V,9,k۶I笳rʪC%/P~SbEdub߼ykq][ @@~g.\0gO?n0`<&A@@V U>pl޿Xns=G^bމdTj*x!u߀ Rt @ #;w믿C=>fC @ @e\jA/بQ\8Y!'ZN:ه~hZS:.HMnvG rH;HR |Ë́cu(Y3ʃ #Xs'9g%A9kq@ /͛36%]?z&"8*=~+ :Ԟx 3'9º馛Lӱ<.H6aСCF@(0ۭʽkvꩧ @ @ӭk׮n-TNb-P @ G @`۶m&EYժUݚۯ4&_l{]{ix5Ҭb@Ȭ+*W>'"_(\ytSV;E^lH>$]trJOVZ񮪰/\左!ѽ6&) @<֭[7!Czlt|6*@ @ @ @iƉn߾ݦNjvZlA@ Nv-MQ=R&L!2B@w\V"SSuرh2-lذm|֤I[GAʕ> @ @ wݚ5kfrД SR%xL @!РA{6l0{mƍa4h=C֯_?kpKPzu .p5ybŊYn @~嗠H 0@ @"0|pMek׶'|:t @ @%;h|JBc h=o RE ? (C)=t}'&vasݺuM@(^ƛGdI @ @ @د˦LoB$@@6|W Xƕ@@ p饗ڳ>\y6bĈR @@i"ШQ#3gNi:%Υ` x/g  dggˆ LFzM`^j      hܸ {!3!e]cV  @bŤm۶d  /P+jժvGІ @@@@@@ڵk̙3eرҹsgY~ݻWz%#G#FyE2={{g&/Oeĉr饗fxi Mdž!  HÇK>}_~˚lRbDV@@@@Zz, 6ǑCgpF Xl]h5e/Ȅ<@@@@@@@PJ3f̰E@@H@ɒ%N:pIE"     9jYbtE (`vAf&.PX1|8 ʌ" & 48p[.3F+@4 o=`T@@[[,ZZdI4itR @@@@@@@V|I=mt       DqfCd֬YA`         deeI.]믿6Ot[nҼysߠAjժ##=P p @W@@HOAaӀ+ܹsE j       $Q@^|I'$ŋ6@@@@@@@ @F3gδY@@@@@@@@@@ Հ'>h`M_|ԪUK48 )z޽{K ́}L2%L8@ .gǕ#  @z7N7o.۷o7W,\PW         @ ZJvejy(!      @ -Θ1#vV          L@ҿ6mwqf͛7KfdȐ!a]%JȠA=xٿ}@ljҥKyץ@I#       /w_Fxs       g1u1cn:-M%H5tR9#UE@ -{2eʔ@زe3 ) Ȏ;Ti,  @jv>*5jʒ~Iݺu妛n;wʢE &Hڵ3Frʰadҹsg5jǥ @0g_+x}X  +~;ud7W^ҷo_>    x%xj$@ "T{Ԩ @* \2C]@_,Yb=c|A_I@@@@@@ 4lPtC%!@xmO< @?~ @@@[ࡇJP{@@YK/yޮ[N6n(5q\sy@ 0~=zo^4ih+ Çj  d#uaޏ s"7L@@@@@@@@@ @e…ry癍;wK.DFsgq}wAo>  :tΘ`6   dѣ}v[q,        |vF~-`       @ƍeɒ%T͞=[Znsd@ {һwm5G@ ?x>_SqJ TV @@ *.HJ(1  +pG˴ioˁo-[< emڴÇ˂ モaÆC=Qd LV@@\`ƌr-')<#[E@@@RQԩP'@?"94y#d4SH@ 7=@@@@@@`LB@@Xj\uUrz'ҿa@@@ %O BH @@R\`ѢEv ԩc/{ef      hذdesR@@@@@@@@@B@ǦKһwo;Gy$྽Ԥm۶fݎ;@@@@ mۤe˖uV_.C [@@@@@@@@b8|X~+T |LvPv`;       @Rf͚dYtdgg#!@N+sk@@ j>rJرcs +РAyG-@@ .ƍ˨6țv<쳦̛Z#`ʜwK#EnݺW:$K\\ƌ#歷ޒ{G֭sdMݻw +`}@@RS٧5VcoVYjg-dee%JiWW^)W՛ # SNzVZ#`<E@ @"9h}C;#A@[`~RX@@@@@@@ ~4c k[p 0I       d3i I`Æ ٳhRh{GWnvXp[wf     -Z$=z0  QF1Uh>        ீ^b%? @@@@@@H@Æ %++K:$M8eÇrWY@@.Bqsqʀܫ  شiTZ5AQ  dԩS 2َ!@<s~0 +@|T7 T{JΝMtrw蚙?~:t4mؽ{w+dɒe agooӦ<}@@RK X~jՐ$KIo5_IRUT { @9s$  @^8p ד'A<@  Dr-2y B@rxGu?v@QcPeuY5`ђ1      (UԬYS,Y"K.lu$pNVH&   $RB| 6@|عs%= bŊ?<ش `?42R Q4mTNLߞ={kNʕ+'ZJ[&MW_-cǎ͛7K߾}駟PrG@VV ҿek  @h˗ ׯ__t>Oњo%Kh  @: q\}@Ε@T kLj#$Dp )B@D 8p@Slʕ}JC@@@@@@<+иqcCɬY G@@@@@@@@_GztAke%hp"E:T~4m FRSéYIj  !֯_/?ٮ}(8<         q ,]Tg[n\yv0~sb;      x.`Ռg̘yd         S`r7U{֭[ڵk+V]{;b ࡀ3ءC<̙@@@ }'֭T\9R        ,X`צ`@@@@@@2EAbMRELyTi         7|S.BS-[HVd[$Lh_M}|'I E#%P@A)X@@@ -V\)k siQo*       dܹsf{ G      (]ԬYS,Y"K.l)UT=Y         7 cNJNb kO?T)-s)R 4HZӐ~X7o.jHBO v5Jvm  Փի[gСC-={bŊeDRL0!իI@@RDiӦrI'Hm     3 D_?u@@@@@@B 4n f͚%[/@@@@@@@@@Bdɒ2i$ >$dԩҵkW2dgTaÆfߏ?(̦SNF$C` 殇~6mذ  > <`>fRvw}4TRrmeRR-k֬mۦt  @=`pP@@@@@3M6M~ul qdXf@@@@@@HҌ3En@@@@@@@@@UओNKBL937oƝ)b ?\2--[fsISi@7o}yg/P@@@@@@'РA3NPEpRlCR[[oz%;;[=X9 .͛Kɒ%a>|xPwʖ-+>|2e{-[JժU΅W^yL?~y衇M˔)#UT1Z_kbZ{,޳wqGZ۷Oc}$+v*%Jȱk$8 yF.]ZΠmw~ozݏ    |&0{ŋ˩jOO?tf^ھnk38#.[nɓ'ŋ嫯]v ' 5k֔nMN9sn裏E]$~t… eĉf_,^\hijڵkl$_|ҧO8>we4}VӎO?l߾*j/*U3<3G˹wG@!P~}6lo׶m[VԨQ#ŧMjѱ;v=zȈ#ҦTHEg߿;lK*%{  ཀz嗽Ϙ3V@'ҕW^i-r`^Op  SNѣGz5 _g,HƠ3ψ[ @hk׊^ߖ[n%l:ׂ QFi9'~;v|ɲf͚ݽ:ʕ+ }W\q_>8]?aS{? ^{5WYZguV`_~)gϞRP!Kv߉ժsrӎC _5Xf޽v&܁u<$JiӦi&>6`DW9ƍ35iӦqW~ @vd…;_%W]usyK۷o7xC^93: Gb4ͧXbrw݇   9fW/L:HeUx]zu~'ȱ  @ ܹ`,H ƯG83YRcЙgĩ2 |'1  3˗/{7`S      hԨ 5ӥ^jW#-[uֲqFS*UHͥdɒzj u֬Y# [s|!9n4i,[LjԨt{jժM:]we.|lٲᲈi[jP +ЯV`׮]'ZhP Çgggہ˔)#NZGw\qGȻO<|y#   8裏6}8uTiҤ,]TtPRJ4J՝4_/WSjŋ7}s̑}zQG%[n5A2TE5wikcko9:ϟ?ia߶mt<Ϟ~逇ësr~:S1f[޽{=͛@. /ﱋ-2cڷo/#G,{~Xt߃>h@cG@@Hz-O#!   yQ?t :D' 'Bٻ2t *Hr˔@@}ɒ%&oO45^L_E@@@@@@"hܸi> yC`ߋ%!  /}z];0{I& +V"Pw}v\zUcǎbщ/"ӧa5qZ;WכM6… '+ӎ5޾XK/^lsK.]Lp!Cu]'g}W Y@@$[?]Gch۶mT(F[>܌I3g=|'LSK@ >~S뱡6  Xfr2     @^`zxc#<#?& [u> !zS;/!gτE!       @@Æ X~I #0m4Sc=V|ɀ@!_|rW̙3}kԘ1cLx (U\}w '`zWeݺud뱱;aN(ܪU+W]v˖-/^v.8;w^ҷWBۛ, j/#Onjr3_e޽?5h&U?o޼?}7ȟgq!޳gC޻v n׼>68aunܾ}hSʲed߾}a58ٴi|嗢Lw6j_c,iʕs֭1^y+^;ˎ\1,#8eĈ*e ,(C Wtڕ)  @t 7}    p탵RѢEEn@@@@4S 駟o5 7 %K4>N+V4?o\rkڤB8 5k8Eֱ~gbn ٰaCSּy;;ٕ-[VyPn+SOi3j%m$P{6>Fǩ뮻N4_)׃c=6־`ޱk-*~1P/Ӥ }~=@`EW#  @J;a    XpǠGZdiT^0c{BǶ:F>Tu,|cc-7T;]kk;JsI'd SK/?Xuq:OJzm^7PzPsO_cIO: _yׂJ@2Uy]~&&"se|"J @@@@@@@ ҤϞ=,@ =XSIHcٲe /Molܸѓ;D)r'NhM'_?+}֢*! @v*74(r%<;x` TδsN!lƽM믿D׀B4D/qNlR֬Y,EOwu\s5zj:[|L`/Rjժ%zq @@H7gc۶mO?,֭+UT8; ̨h8V0MR3%I߲~W=h%5_*cs}c\vj9zЪf+VFo#wcѧOx}:iߴѼvrk_p): @ :g_wIt97  $J@X}Z-    3%SǯG2܏1<*7 @Izݒ=*:>ޱѮቸ߄ Zj2~,I7ߴvoc@ Eu!Vzsi4ߙsu|3g4Rhz}!ڵu$! ;˼yLS?x9餓쬄B!       @+دn1cFX jgu]%ޒl{] _|PV`w~ݺu3NuCh׋T|y)Zj^dQk=zr'˩jsmʍ@RR@?zS7 oETϗ_~՝{R+W?dyB槟zA͈#D/ՀŮzUcyf͚5\8AN@j߾}K @@H! J?.]Z أG}>h!ξʕ+l%\bv@8DYhXh+\1iI߲%:r 4չg,'V@j *>}]j^{-DžhiWzΝ&ȫ8p`,Xׯ+_rLW]uff20`xذa?YuzK…*Vy_<'X[ T[رn @j*3aFV nVQi`zhP>:̾c4ɓM} w9~7no^[NBӤv,d:jZE _}UZܩS'.TY:yN&MD'N:Uȑ##/ {}w>z?׿h/*?rcE }?7 D'0oErl^N{4Wwl @t}J$E@@ O3oD'e'!   # Ƴ2HtA 2G}L>݌ :{׮]ab X ې7&M6fβ|Vk[TRV{fجY3kW38#G9k}fs߹޹ngo_LWq)~m)Pl .xbkX45j(a-(@@@@@@"аaCСC *@ UtBqƙ/:ho7?JiӦIɒ%!)" 2(QD,;ަ#4aYϟp 2g5/^Հ" l;:;o@@@TIo޼'>#fֱ[najM`j {1#]hٲ-S}+~~$Aƚb5\߲XIW4KbM<+܀3yu'ˉ8M?󼋞s?YYYB8i{19s} OLW'4Ѥ碎:(|6}rh?NlOL21[z!+[9S= k% vkAꩧ6IժUM_Y冫@htiIt'|bnu{XxSnvĻk~:^ǠjuDp qk3دsyĉW5Yz2DH@ͅ3Z?`ЋI@1pM6f\l)#;#`^d_͞=֕ IX_ @@HE;ӉN8LC j]t [m V|:ӆ V"ZjiC&VPmu N,}~ZA>XM wo5k/l49ыbݿ:w g1 U$~gP++l$MHk4}~k:i<t?5:&=Wl#Y冫@hKsmڴi:&[o XXxw~OV%ꚃqƙZ] s_kќ)kyE|M7C6n(s 8|ɒ%<3_y4m6 _smεBB@ /8s^w ]#       h0H 頢K/4C؎ :ҥK{|`& n\S|wR\5{A嶲vrɓ7+܁rý][9ίp~Ǧج, *4iL>-Dr&#@=Ν;t^BTX^zbs_~zG}X7˗/o;h~هV.| dڏ[@@@  "~w=ӽ}x={,\r%ꫯʢEdǎ&`޽{I."ɟ?4YFo5L < =muiojC,u v'L R}8wΓ+s-0~ m% H>|׾T\Ygm܀|sϕO?T~wt\'yiذ}9gY.,X~3n2kYíߊpŋ W ,0oϺ|:8ˎv<OtO;4 x}ۭe}3?w{h[Uf$PuXיs}`ܟe#F0\mkgU4dw}K&Ȣ~92e~چ#"~رcfcN=T9S3ϔ͛M,;Ì! -urKAu,СCeʕ&hݻe˖r嗛qv`~Ϙ1C:ud7jժ#Y4i;`!C{3l-Bjժ;N hD:y e֭[|s^IpMڇ/wϚ5~>ZB%_'^'5=$]@C5Jƌc~O?]z<[sرc_1;^B穖k)?7B>strG}TvmB{^BJKnL_nw'oFn:>cӧ&;uMX4rחod'>|󞟯Sg,ǫג3Ok9]r|:ݯwqM7hՕ[@<1jrՉm @4ǩX5WMs繥xw*YD\sc6olJ tV!5>kf_o8;x9VzE[+:hV6fL}J.-*U @& <=I WR%a-(@@@@@@!>fNFDPFRT@ZO?~G~Wٲes IGqzQ h'Ud>GH?Yf2m4ygc9&~;+Wy^V3 F'.ᒗ8•6@@@ Zx@.B3_|!:u]֫TbE;+!AW4دu֭[ܹs=S}Ӡ+VO>DtX yN .3u~ڿIxUH'ꩧ~&}]q&'r#~O vZ;0U߾}M!:y?rlsKެi&k1䭳L/`]1jx=PBv:z}x>Gg?;_kN&~r?g5R}.!FzyXX!@͚5M`'|R\~"3gyֽ{w9J2ɛ @f 8yiIf~׹fcϬAV5 -b cǎv ]LJJWN0!.z'y߱+͹wpIhlRD C{׫W/Xl/rqnP<rm.?S~[Ξ*KontY͛7/ǶP{ND.ꫯ/6i}>:/[M81V^[wq&ܝe\ҠɔH }ݧc,X ;НtHOEҏ'}/_Kr<2z-۟'pGK׮]f}h+V,a- G\@F*qz3ΰFtglKf{@>=qשN_Kμtym~>ԏv~&w0)u> ?xB3,"@^koO?XpcCn} VD\sj*Hʳv~xuV7iD1cƘTt=zVr)E39> Z> @@ XtkSְaÄ0+Q       D@OfesR'C$!rn׮L2nԩSe4hX'ՋVbM:5 3`EEz\rOnth^- Y-D}YE_͵b V:&|>|xȺ;z߹޹3S>wիWFk>fO^yzѿs#T#=YPViehCkҭYfɈ#9ǭ~{rWN;w.ЯM=p@Zb{'uݓʒI jժu;νwSAb%w~}j9~6熻n\Ν;KʕM5h~wsw%P' vH? 3x37:FnC$swޑNρ%>葨{גS?7:}x-9tztםίS}wn ~&v@ ucn,csZՓeFUg_ke`  ƍ3P<ҡC sՅ㟵^xv0 [os=/ȰaUv ^ Ttω'o!~ו;ؒՌ1._,Yڿfo/3iQGЄkO;zY0G^O"=ٷky]X!hW .0uUZn-~IG@c$m۶wPB@B wղk׮B5~Yi˖-i&mnI͚59kAhNw{&0E/C\mɒ%|r{p_U}h%Jm:S2ev2~ٸ>us *xE䮻23rT6A+zLmzk"X~]}ݨԫW/ٻwoM9j^7p,^8`Sh׮yرCNj;ix oY'=cX޺uy;7Q.뗻^,'G@[j%W@σKݺugy+Т~:?~xג~~j9nӟ(Z|3F/֧o/J=}g6ljS6DZ:6Ch@5k1|{@G":{ǯג ]NGwݹ8:m;}7^^C$Zы}1jrՉm @s*THtpxe r05α֭˭8{{űpW=cWҼys[M :m󫹯r=u; @L>} KDDjS      hܸ gϞ-^zi}ـ HO>[[ha&Ӌ> d RСCîz{P媙NI'0{Vo <"u Js~%K.YlY@ݼ,:GPJүj󧓻h իWzUgX8VV\Y+iH'<$yA^S&MN$`HJ>}zM'uWΤfμc]k=iȾh H'SΖG}TFl.\h﮿{99rν.ZjߺwjӦMqwrWwskժWw޺ ww_WFW!z4jւ^>Vz_J駟DKwXL~bHnw^[~.]*.H/L|I 4~ұcG{_ [oJm_ݻuh܎wv,}rwbs,Xz$8 vM}7G9~-YT6N?yC@?uk5|Gۣ>:o Y+/k׎㲲f͚A坓 λׇg}[n\p|=$|kY.O_t}e_@ Y_N>XpǠe U# hZneڵ쳀@:tĵ~ʔ)o*+Ύ hm^{&@w@H"{7IǼzZTz-MύO Vd@֭?g|ӱH߭*U$:99{λm_??~PH}JD{( Z% 6:sX?:=I<3y/5AW=vk znKVՋ @,522o޼,+,y9>^]~>Z2W#FXnuÚ5k[n@f1ޱ&۾}tEq[l1/o&:NPI?͊8d:&-sΑs^(I̚5Kn93  Nlǚ?sЪkpz3լYS.2jʕhӋ%u"Kի':1FtꩧG[lHi{m߲+: v_'ܹ٤h^;6uW :A: ŋo{7i$!rvi+szf?þ۹<˻weJvdb׷WKʕ+'v}6M=zO?iOyt+З=cդM4зB`Lw}w@9iڵ&~>h駟9D5Otځ}cƌ ,I'رcJTCDr2_@P~n=C(Z$u&' ۷}¾}i$wРAf_={Yb{UV^z%sc&BͳN:ǡ;v*ze0a=W@Pf͚%@Kx(@@@@@@DQdr"C@T}Hb ʺMR*Q< sOk:ɓV]V *ػx)M@ RL *@A"шƆ5(*(VT` FbAP" 6TIP?6swr^{wʙ3g޳Sy2=dsyru/8ȼJ_Ωug;6s[!)x>u\'c@w}Tt34j(j:}XiѢEP)@YiݺSc^R: a۫X D^J晆#F iԨe]F}e4LK/Ԯ暨k/2S`Nv[ <\Jh>~u$^ҽ_nݻwGSƓn)_//_qa7|{Q<{s55\IϛwVPQF%זLܖ>.m)ռ鸡ʦN':~~'Nʝ@K헴 O:]w͓PX$3XvŊݻenY-Q+#-%)"}>lӋ$J^_M׿f̘3WV[sϙUU,p 8`tA@@R'wTtVIAYQ)4.w]dS.g}\=ۯ8o@0He˗ooyXezF/yý啉{rO;8m2uxzpׯ T3o;Oރ+}_C֬Yc^J* z[A${>sq쫑x%tK~? ZƄto߾FX|Il&^SY ;w\իi(8վओN . ڵg}ׯjI^uqB_;^}\%FpUA<]SzK[eWt,ә$=tM7%pذab `7o?OYU 7|lb)8w˜Lpun읻GoO0H$3`93gF jѢETI{ªK\׽vZ9ruݳ.D z² Pco1ụ`MNaӰ̃jߧ >c޶k65\o ,G.@?bWw˨{44\.~'XN_rҷ j߯ RݱcG{磂oIυ#.K!25]ےM{T况- y]v{0a=cg]ׯ_oCuϟ> F Q [ŋ*@{WRի~GdFIt}x׃I,=<`Yfܖ2yU?mɛO!7xɭBN޷u}5/)@|?c֙ %,x&Ay; |Fr%p}z:]qE7,|@_G*gr*$ݙ"Vasuꩧ6T.VX {_/{$3)0AGzoΟqql^c\vi'{{gn E@M6-NÆ mﴇ\(@@@@@@HBQ ɓ' 'TdAȅGm(… wQ^va˃}%ヒ_~;.Wd!xI˜o1@tTw k7lwQFك>肈Tm޼yL[י޵f x)^]p5L5o G@@8sLAZH~ȰTQG8Qǜ}De7.j|;VJ瞶IebMαaYӪdҠAL*Н}c5=*'xs,Xߪ?XDҙoLԈ>a&Ks_v5jpwߤ +p)!r!)ӪUyQc0 /PJb%3s?(5,+yAt*pߩ{taFHjGoT0fo͚5s)OĪ_D|%.P?iӽ;_oz(W{ ޢ-w}]}%-L/c9PW#F"@ (S)A&3xI&q۸qb-7BiL5DVU݃~'?U~֬YDl&Hker: dj; ;Wޣʹ]{ FtW_EMV">h[[mF գFfI͛b z)P+J5ɔ{ȷw{oϷO>l?j`='+nanKaOlamKr·FqeG@.]7l#GtuٝwiÇ;~ԩSwnʎV4II [iXqxI^xazIw;XJ %0IK'U< sj9˰0_׿Ƌ u; {<佒`ɞcp7P@ x~=γaA;#7r#@;OW\q &,t]=t%o7,xuҵg<޵p/CI޹Ey>N 2k,S;omڴqoKgφn@IDAT@J|5\rE͘'      9=`mf엄 j|s-5D@B\kưXFє  jڵk^z!YAT*c:U)IJg%_IUt58O%iڴ$[wS_} -կ_)THۃlsy/-?߶njC?jժQ<=x-YgeG@ ̛7/($sܹOGͩ}Q< /#V'5y饗hj)z^356,[,믿=5\AF ?S4rʟAS^4kLې~jhV|E9Z~h8i\]Ÿ>L:WT`dS+犂d=ȧ|ї/_nÆ s=G={*US]]F%+vE{Kԭ[Lfޖ>#m)rЍ:0`z5P}o>uqW5m.wҚ _=N}lSN'Fhuӯ_Hŋ 1IuRS&w< 95ii6ޖ^ kTnaۃ;<Hl=@w_痀 oI睅\= &cY\t9IAIC6u?'M|G9l֛y! mwy'2ˣ:*ҝfSy!      @BFcfΜ>WNe儅2@s96f̘Jnw}wZ2     ܧ嗀`K]oM)prP7 !@<@;_)ha)-w-ZϞ_o<<  aׯ_?jqUf]7xB vW{1ðoo_qG/g}ά}N25Oѹ6jȼ_~ ^2d ?˔)SΝ;GuQ<9Up1=r2*fy9z.c=fO?Owu=/'J͚5-Q ^jԨa7;aoKaOALlK~H@β${{"7x5z![p#Xr=:u;tl,erYc_U5S?9??[,Yw3uLҼtn~G ף\f90uNyY.}}ިz-iJkUnaۃ.ڈuVHE@ s}| E8^5a >=CT\9;s%;'f       PZڷon۶{=֭[i]T @6md7oNN̘@@@@(ܧ-+B@*u n%_֭[PCʀu]bi{1b]z.BXn2TK< (`O̙3m /+]AكcZjYO?DS2}M'|=sE+pI'd/rԸ E]d;Z=3 ޾-Q9a'gMAof0a)O ֬}ڶm*P;ϖ 6ӣ:~+,i {[ xek[*FIL_++1c O=/_Zjeڵ#<}bKV.eO)9ί&N)bŊnG#./^;cf<Ӱ+tg?TLe"Y^s*Uةj\rIRna;7n i4M\]$ :UNk5|f {mYXQ0h?zi6m4׆j*Tp˘2eJdu(vI)V`2xwae;lrOf|ϣ:ur~g\ߏ?H?CK/N;NLAtG{K$(fc[ x $<`t.sqFw^K/ m6P{x6mu[5jq)^ )~9 5)R<6%K\DWF7I&F6iSsOhDLla7fc[Y|5^5T۩$aۃ&Ru}es*y@AK7 ]Wfn  }~;$@@@@@p67~`B\G;{K @X}GLY|A-BJq.Fi-7|&L`{l)^b (ĉ/.Q!@* [\||A+7:(`7LoaÆE'شi=[R`HΆ{cʕuHVoAN}wݚ5k5,Md!7u .o2``4Fn,u^;{e,\ٟ ^r;55`9 3=N֌ oLx3*Vh-[[\p3o<w?FMvZS!}|R I7*O=^3̷Q𶇨)dk[ x k[ w>7R'PjUݻNx u%駟vʕ+g 6͛s=0&E /cSw{_^iZGW]ue]"H&oX$"%xԜvư%B?kdn0}{ITx& "P%-DȜǫYR ##o@@@@@@(jղVZg͚%ыd$@@@@@@@@@E@A.B>| {mو#z9NsuQ03gZs^7*@:uL[}Æ %  r*`O>izh2ًS=z$5yUP d^xyS۷{ED}jKAb`pL;uu7x۶m+VخYO>A\5kMxтϢܡAQ {m2{ 7 Z %9 _O\ "o[OTN'S晉q={tљ(Ke4nOMz>cꫯ$ӌ3L׳w*X&MQ#3gy\or6 K;RS-oXRd8n; ?AmGq^ʺu\p)S޳_"믿vIt㸾{m==ÝS娣dĿ[GEׯX3dȐH>ut5R0ŋ1ɛW\뤓Nmz.yhΩ9HUIN8^ޖTB?NӲp}5o&{~gc;3}{<)Je't+@@@@(;z6BV+UV;찜-|Ŝ͙#      qڷo^BW#Dj[nqr2@@@@@@@@@\uU6rH[~=vW)MSO{|Ps5*O!EMƌcw^LI PHf2 <HVZN  %.vt2TR>;֞x SP`R^ ByYgG0 w6m lٲeQƆ ;wdha߳owy'jVT)jX=a07nhϏ7^W^v!xY~~H>#@Su%`ϛOp}$[p[ےe2OJ8:gժU֯_?(>28A7٬Y ^4mժU]`$XoƶT Ȥ@Mr(mݺΝk ʨ_vm㏦ԩS1x]wuW|Vuֵ5kz9w.nxڴiW_} dɒzB:&i^~Q裏o=)m29&4;W}3}GB?fᕕ/wxf8!fz;U}{wosd#`М~@@@@@ ̚5˖.]f|QGe9R@@@@@@Jzi^'         @zK.qټy}yS|u]\wu.0rd ּyHT7|^:m`p.~7_Ms'Md]vr-Qb(ASAӤӽ{c͜9?)fEi@[(c'6^kceFΟGٲe_ϒ0iXڎ52 )@nzw0@(;5}GR)G'XL{O7։L>8pСv<Я`Q 52вeK+&նU$SֶT ϗoP@-ZYge<}ᇶf[h7Ά y.ozl߾5s_~z!2d]x֫W/pթS*Vhj2Si:vh:/۷߮z76f{Wmĉ،3\0b];]]lڴ)\%^3=<<;?tW1I .eOJ7q`9y'ඔ4aoK}n\i+5^6~%ٷu}:{/sg<     @ovd&:ut碣b.f<@@@@@@@Dڵ۶mۊ4֓h:!         MRTߍ7?l h[flV!``'|=ov馛TȦ@jϷ/^lgq jK_IAK7}ڷou=sިHv)2, ժU+XwM0!R e0 wo뮻)ťlR[oe֭ʦm")u-`0r!b_~_j7 _F0Mڵ׳y" oٳgG/Np-'^=^n]wO<Ĥ5K/d? w|b%<3c m؊+N6tD z1`bGj[UT*#m)7|cݻw7E>]y.j`TZ7YhРӹsy/@ ӷ> u֨i= d2۶k׮uꫯ9R[ͥիŕ6OӦM3ۮ4믿Fձ~zg^bpb#ze>y^ xVR98ඔ4anKL\_ߩf\ovߕ=;4_5G^x;[{7L4}^ZߙP#     @P`A;vtObb@@@@@@!B^5kEY         @gm< ڠArV|СCW^14>| j`H$@nV{wl޼y$=s\(hW)_~e;EDu4~?*o悗Yw6ܽ S,_}Q/kNk+.5**Fe'uv + ɓiϢ!St|jpxÏ?xW*UiӦN,'SdI&OԩS]_/ƪCvo߾֫W/ӺVڴi R_&nٲhڟۃxݹږ3k[ ł;ȷ{ojmѢ|֬Y@ C;+i?sXe˖٪UGt[5Xt͢C^^(Hq0{A3gLo NlRxVaT9dw.{:8]-sxΜēImxXiaoKLW\\]ߩv\sv/+:W*uX&5]{%Rf&Mrp+87o>vyX     auֹo؆ f97(B?      @۶m{N<ļ@@@@@@@@@@/`?]#F_n+Wg)j` qFSL _z :(HL:)@A EթS=OGIhΝvKA +VL`9rOXwO<>_}U+M= smnذ!2>]Ҏ盂S۔Zw%O5]XR>7^IGu^%Yp[ժU6mXݱYta@ C*pnsWC XQ_S~LR](sڵknWaaZt/Qp_ 㣆ӳd9ִa4rfxkY25s׽S'< NrN>o s[* ~~P-Aj]ۃW9XXu[j5^2駟_׊ ܶm[S;(;v4c'!    d^`„ 믿? Sb1@@@@@@HG@ u]nR5^Et@@@@@@@@@ lի=O?@w^س-Z{GmժU6zhׯBB P첋=i/C0BVL>}?ĉMA.V ~|̙QTn0 woybU@`0kƛ0lڜ9s]\q;s]WRzUN6z^a+eA`LIҗ_~ijtϟN?t?,Qw^w2UN8;v=c.輶X\rvG'tRc0g3qoM/ 0y̛\mKwTxS ڤM,/qCAT븻l2Si}S [fX[J 7` ~'l]vuA&<~W_}J5ktos΍9>(xٿxews#2d}ׯ_ߒ ?CdZG`=2yLRtӟb-|>ts`9uy@"ƅ}T|~/z)4?4}{%w]:`a<ꨣLPt]Femҥxb[hVagضmNԭo_r>`S Ե$ @@@@@ 3oF.]DsQ1W3f       @"#<ҽ_Ԩ @@@@@@@@@|0` >+.b.KRЖۥ^jj/I&1+Dʤ@:9d h@ ٽ{" V@P:1ȇ] a@>X"2e˖v 'Due[Ԭ s?j;vya se>o<۴iSg=zE93Oun͝y*VhZ&>wrX<#ve nYgm6l/[N+?ч~Dfb(+f"b[*OUFXR7Ҏ;hz-^R()>}}'`Q^k׺ ]jUSc}upI\"x,)*|u\5,V~ Q ,/cRl!$N]ܺ<8Lm8o c[* z~/z)4R̾=;*9Xqٺ7ҽ?Oq!7nhѵ;̞=۶lQ(jO=Tӧ~ @@@@@ =k2n87СCzep==B) @@@@@@(;蠃L/PŗjժUbC^5kVN7 (z4pF" @F Ng` C@2'&!. } R(?,enݺ};؂ W^,,;]x`'OW_}պuVIXv@ # <0 \F^ȴW &ح7t뮻G뮻<ӦM"êf w^SU9?.M0Jʕyٻ[UW]e Oe;u-d hps=&Yp}֨Q^ϤI\0j_ ۸qc \ͯP+`SSNn}uNysٯdw )ᱺRxⶇXe&;,m)㩖/m)]HǍzW@'}:ȨEل lĉ{ʕn9 iՑӁ@Q҆ /?uUo wΘ1?ݻw԰D=azhVZe=5ʦOf{ꩧJ*Qó: j9ږz!7Yڞ9oPПy{ P7߸s 7P^zխ[7Ƀ G$^E:'࣏>rB .^_T;cRǿJi+\?j-udz[*-GQ!ws+4}{XwRckvXBÇw}t/3}gy}ڴicN8w'ԽxVUEȸR   9x7"ҥK;ͥ>F@@@@@@:tpm(3 oB.F2@HB@@@@@@!zf)@J@NI&6|ۼyiӦSXݻۑGi}6rHSpG @^ j֬כ[~iҥ.'"A֯_ozS\Oz졇 $_;󟦀p 0W_\}Fͪz /؎;5\=^ވL[eݫweP)P`tW[c9,,`Zww]GPI]nٲepTV^ALN5 Lu=u7z#{1[nw_n}Q{G֯~O> G&N#t@ɔ{YP "׎;!^86lX*:tgI'd͛7-[ٳ]@kWյWK{w*u6hР"ږyXS-7o2--g췎^`^z%wMw?5k-b~嗧K>C /ɞ#Q5j(u7FQfM5,QO0%Kbf\B y@O[Dd/4FKҲZ7xEXna۽=L]ߩ`٥o+}?OgժUv֭[7=!C{09     ~?ؙ<`Ygv       S.۶mɓ''?!9(m۶믿,  @B>  W%! (xx@BhРAd`@ ^@=tJ) 0|p;C\0nc;sgCy @PhѢ V5ntKWy41`iuWPDH%)J'V9p| ª`:״%Q b'.׿aÆ.hsAbRAL`nIr̙QKj`x_yOs8ocǎ5}%c=e9.o#XfVR. 47jjYаnK~ܐARJֻwoQC߳T+ֵ^뎟~ٳga:ʬ@K+WmܸqQ]tQJ/$7X4SǤ+Vŋ#9`T<<+#[<6aw5Lm*+FOږJoSh\/4=X~%S ޠ!ݤwq)O?mwu͙37c ڵ{ǚ4il" ,\0ZODe(د?͞=}I<꥗^'ygu֍7idxŊ#t!^_MfU~G0An@EF$M@$5j԰ƍaf't]q6m4pذaE%~h\a k[Du(KTjUwƌiU˖-+8:} ]eC`{FaKjժe\p cIh?+a#Mm)ֶȻdg}lԨQ>W͛믿QZ P Bύsŋ۸q㢊8sS ׭[UzP$CbXNk,1q< w0So2}.T~s#PcօoN5^rW^6k,=zկ_<7;Lh~i'K?     P^yp \woؿ uM?       C7ް]1\rQ?,0o5ky"ȑ#cb ([o)ϟo^ziS@P\sMd6^;G&@JUC{챇-Y=/@4ibs6,G}@hQǫvg}zMw)Pt[ʖ-[K"xW]ukZ5vVALG}dm۶uֳ,w}w%(Y J-[_| 꾠OԮ]vakԨ5lR_V`۶m7g}fs50Y ?@ԤEoRϞ,]$]u\5)ؖ8_x;DÇ)@8C9t㏻W^fz!CXU @Vtfkڴۏǚi2QcXV\U^dT@/!@@@@@@@lYJ@%pFxȑn:';-0`F҅   @_6dS0qYle\G@@ KUV駟#*^ukӦ)X @@@@(JdO:Hw>tṪJP@@@@@@@  >}1)SX=egB@w/=cֽ{wo@HBcO>$nN5}m@W~M;JG@2!0a;IJ J@IDATPz.`P~@ T/5 [W^֯_?[r;~uv= .>/mҤIvզ~  esZϞ=Cko߾O +P\9Z 2       K}vwQ'O&o,$:5ᥪUZ5^@@ *$̥9&$b$  I  vډkL@R\|P@ erLP*Wlv16nhO?)-)ZRJ6tH+Ҏ;8cv@.f?~h V l F@ ;w)Sk~,X`sV^L̂2@ p^">&ΰ R @tb3f̰nݺn+Wt,^xwݗR`yRY@@ $.22`@RJȂV`ڴi|rWN:ɧT>*C]@@@@@@@XGydI&0@@@@@@@@@Jώwh=zΛ7y !   >k/k;ڵkA@@(0 oGq/bݻw~"     +O:HwtT̗P@@@@@@@ @խu'n+Vup@@@@@@@@@r.ЪU+hg~͝;ך5kzc fm۶uUNjժcU @N:֢E ۺuk(sW$@ AQF6qDk׮-]fΜizkV|BXTsRb t=芣 @UM0N9S@͛7Y֡C2("#    @Yx"WXѺtwO߼[%T@@@@@@b oݾ}M2z+@@@@@@@@@3<UFmv[-*r衇'l?Ovwڐ!C@r(ٳsXf @~oW7|h~{T @̭^`~yz @@J*jC^7ډ'hSN-[rӋ    9sW_}]vVV[yW#*      СCdI"t          rUTU'm۶kUs^/Ba\=n?cD@@@G-Z3u7uA@@@@@@GqUXэ䔦'3 [?nӦM ի݃!쳏s1ֱcGQFԬ/^l?p԰x=uֵ~g}fǏdҥ5m49r[*T`]vYdM7dkN:v[|ȸLt_nvW!i0&Q&L{eKMu|gL݋KZ>}lzjժesNGyJ|[i*Vh 6xΑq:.\h}G6w\kҤGnݬqƑI3e)0YO6m)AV=޳gO;蠃"y |W~ZjάE֨Q#opw&jy}7fD7oo9\yVzuKgNvCJ@Iåe@@@Jal͚5Q{~?}p/s&}ڵkmp {*Ur1cˮSNvGx)'kwq?K2uoYuTG{ٚoIu?8op:@@Ry;^|E{衇lvH2[ώ 4?{=7|,=   @F2=ÿl27n{wީ   9P@ zG7ңG׍ Phg$>Kɕh \(mٲņ ⲴlҵZw_"6^mhd:mdYpIH}=kWE&ݏ=Z OOk  @,^x!2W^| o      qڷooCu'MD߸R@gas̉^Q+WM6E׋UY:u 0 R{"u]g˗/w}`?د:Us=?D p-Mtڵ~i{G][BOqsΑ`v x(0m֭q"~p8:Ҽ~kHY+W={k(otO2eQ{`3gΌQ@ 'x}݄s޽yEfwm6+iA6lYd}td' PZJz.-,   PZ.NU]}p˛{ij Knȷ݋}mܸ1rp >æΕJWed޲QK}[WZ8S?im?ݙg3oE7Aਣ~n I!Pwޱ=أ M%@~R;WvwN!N:?O)"?n(UJ/j; .?Hk-I&3*?˖-sԩcLnrGJ@IåمeC@@ MB ֪U+W 6?lW]u6lذν4ߥKRޢGnڴ)2_5`Wvm[j^'J'NtuC=,{^S?B{? ݧU5>^Pd͇oJ_|z+ZrJ`!ԝ:".pꩧTҳ%_[n>} 3fbg   e]@wq6n8Eշv[Yga@@@ ݳ/{w[zwՖwq~mxnz^}XgŽN;yQ%iE,8팔sϯH:~^m{GAUt#y)@; yZ eVo?n>|+@@@@@@@du6m\yO?CJ,^cW\q}6bg/\v/vp!Xǝ>݆VZhf,z矷vG LuDex{]zo6rȸEeE+I7nh ,4n: YU{n|otU޽ 2"Nϛ.NO\ lߗixARN`dI[˛>J0T^ϟȿ.n"NdC7 PJr..,   Ph{ZǶvZ>|x~]we~iJ^ڨQ"~ ٳ]Cz݋G櫠ĝ:urjPk֬YqtR騣*UG;{L׬YcSLq*UrߺtR/K{1g6nSNF02# .p1ǘ URz_tԈ˓O>?3c@@@@Rre']x   P׿l]vq /6 {='@;#ů3^U_["rxި"ɢyvFfX팤T}3ܹs~ߤvUo@ oh$oW C@L իW;;k:!      @\:DM<9M ;f~)x?+Wκwi?.S ҫ`%I5k4=Т` 4pEE ȴ4jf͑:on^\oXRiT?$i+ѣ;pEi^j|駟v2 tZӦMcǚ^ Q9V"c1c"N4)#嫯SPŗ^{ͭxa8 @88ߺ󪯿:}uL׌zyr֭I/W}J44@@@ֿ;o Q^X$W.]"&Nwd;{y7δJ $_ 3ja.egV/w}ݫ)tlڴ5~mtԩa[l)nv7R@:!z]#g+WA-=4u_~}:hSj=K8Gbs̱ &_8~0gx :zҽtݱlժUL4RMvL ;l TXzf}͛o*,V=s   hܸ]pn/b BB@@(\ڵkۈ#" Я_?I =)k7C9_q Kf|&dIYp^#3.<נHMv@R"7 /۳ggX9xL      h;x?AhRBR$DT$*%]zZ{w1A @H*WlK /ʖ-$4 }_~+J^6ٲ4r|Ur۷o O?NX}dWݻb^y啔Ury#qoF |;t`r6i;vtQr:Ej}Ud;S~GخoNjTW~ܹsשS'Qxɒ%6}t1@("ɜuM"7;l={!qg;<ʇ_Ϋ A @()x+T٫܃zꩶn] }X7\@8NoJ[8p~XSֽLJӦ2/zSJ SN9ōh\e֭nAg۷wc5/6NիW^VzuoQGh[nm۶,h~Ƒz^~֥K&AcT͛7ڵk'w5kj֬iv YRJA=iܸq4yp }}}1N:hp?'7ѱ`DYB qA&=;wvt-2hР3 @ P |nR @ @ { hމϴl2K%B!P3?o<;Yx  ʕs!ɢZ %Q?#yq0  F? Ej@K`…wer{55&WzzM @ @ @ `Gy 9I :u긪$2W_Vu/-^8%_tEA9UEMSN3goJ8ۘ 7`;찃mٲx$J+teHʝ={vѿL9fx>gϢYEkk$P-=b9.G'gx6l " yX%x衇~k:DnSBg_/MK4O?uk_I~>*XJxK/3<ϟoZ/S*U >8d$@ @И7CʦMux}lٲK*P7oΑMID'5^ز_ A˹[> P?Uv+z6xGs=۷:^bEts#2+j[(7=ʓXp2,! $^+!pDǙоLlUkg? @ @ ԪUˮ qӦM6x  @ !#v|4EH?#3 2d1"?#1*~|j*]>Y Ua"V}zJ|xu%0p"u@6H<u%+u_\̙c[v_| 4ȅ}O?O?m9׋K%Zޗ^zɥWyM4;A MVRY=zp"% @@I#o]\,+XZx51N85E"'O,SJRHƕXc˾J݋ wK I3VT/:anLۑ3V/^lwC=4^(~2cA=UUǚ5kLr8(1jW^..V5ƍ3xΚ5>0+){nO)\ ^%2@2e"1QFeB2 zYu  @ j'tcS @2@ +p<;3ӛL Plg$]}g}x#*ͧIdx^IOk.4~a yaVvťL%g$gƢ~-9 L'LC PkåJ:+;8L@ @ @ @/r;qD!Q̰s׿R Zr[oMNƻwr!ΙoM6ͷRT_B t6!go=S5jԈLVu ~wɶvQu2V^=+Ws_b//HPY4v򊕷Fbچ}La… k׮AqG}t7q?;* ^(ܩS'{/t{SnS   z޴iSpe]죏>*UHFrHl28pݨ\rT<]|6 GH@Dy#?@_m>S*U~%(ү_?>l/@ @%۝*pK3W_}u_·4 :w]vbcwn6]™I{S´Xc˾ Ç`̳cǎT]"7C.]UJx;VZi+!ݰ9гjժEVu;̮ʠ|Co}PjժZxLz [cl^{mPnÆ N zyo]wd7vᄏ{vz7˗8YzOX.]LO=S5^B +KngKx^>}rK.ĉqٯj>hpPmʎ=XۭgϞN@y)Onߧ\Ɠ7cxiYB h3<$O>9mjѼKߪs@$8Kž 3fEis=SO={xbvTPlBNU @ K̙3'KZX35矷իW /`Z;q ^dۺu]6t/9zWEo%Tkws-Oħ3&W8S{k3 ddn Ooq{JЈ&eA @ @ @Bm۶NlI![(ȩ&|'vDlbGN%/Zݺuc2D &GA^ Jj֬m;*H79%9Xb]ɑN:Ɇ '48 =G8Wۏ?O?a/LD@%JYJt߄+s9)nu].:rȑUUXb#Fp"So8EM@OsBݺu ~}Gu {u4Y#e. &[6a'8]gyp 0[Zgwa:!@ N`ѢE*Z?[lUqW&2f|;aH}G9нدƉ8h]J[\e_ݕx<rM6y7&EV}dEUo& 7Hj ';KPNPZ[Aϛ7ovR Lc3*W"vi ~С.gaa`@47x`\pժU&boahGu"?燲SS$Ԭs̲el͚5..ٯqƹ"Te]8Or-aSZ/.P㓑6,>9F =xj,8܆x ' L! w=OcS=v!bmݬW^n3@1"N:@ гgO{., QXn> @JԼgw_^uI@_!P3q/+,K.u on 4psgΜi~7W_ JO_{x#~FRg$S}J9ʁ@ $wM  Zs9'grt&7A @ @ @F@BMq;- P: /mNHt"n9v>Csm~y۬Yb~zZ6k̎?x/QSKp79Mj$櫗q W_#l/ӧpr-s\/^p,Var"79 ^Ԭ|{Y4yjɁoӦMS XUe8c]X_m۶ 4 @ <,xo-Zp|8}8>$ijrQkM&:u9קyzFt A @$+ȼci*Uriu۶mys :uj0qF8qsqZ^㝺הLm __r{ oK6\T&nN;-ߊW`޽{;g}$~erby29wO>N< ҟO>9Azqhcg&G|&K/="9bGa4|~4gr>>Ucz̏'%qE>u-EQ4j|3vƓ7.<.3NNSo8=ad  kW 8j ?]7x!7x>3 @ PB uQ{ޏ=VXQBIm@ @ŇW_m~33##<҅LQD8Kӈd!|ya@ $ ^W~$<̬_C4 @ @ @9&9ŋsY@(,rzLN~m۷-[̽wwM}lOڍ7ޘT=a^VZRe#r-gz~pB>}z"Ojy[흣Au]Tў k_ٚ5kpzf NSO=5QsԤI8zآL x -k]4eƷ^tU @Q՛DZH4v>dU4vt뭷oߣgd՟ˆ8p{F6g[`u]RJď*;sg?Zti~Y,n^O?m7tSq*}@FHݲ>#~+VH7<}mSHO5/<<<=<2 i9y~@sj@@q!_>>eZʹ=B{ @ @ @ m9W1c8Gqe$ Y]ve<Е^҇~خ60$gҫVr/\5j~G 72 $F _%Y^Qz磏>r|ꩧ,\ b^ ~&\vpb3h;!L+?ymLz^lׯwEL:ʖ-89vώH@(Â2p|8}'4Xp9F J+Tv6B @(n*Wl]tqn0<#eJla\,ov} DЯ|faw+(y1mghMi"ӱ۬S1ϱ 9p|8}7Z^ ?x[ϷG᮳3]]? 4Ⱦ8q&d @q$q  @8دb$oQدQc @(J8pi^{%@aHNҕ*U2#\d#g/"_C,ZȅT6ATdQcc ψۭI}BZ2CE? @@!xׂ9 ҙ@@ @ @ @ z;v Pd6mjM4q4aVy晄XwQH{|ȑ.֋q짟~rۼmF߮];kѢC9h≓h0K8sIr,Νv)h͛p8IG8rذaqWYqJB@(xĜY8>>Zx㼠eaSNE @@%п[?n^3W^P| >e"~5j5tRCc͋+m~ ̫EW^'M8o÷{,G3RUoB qEN5v W{7Lb~ƍ~5-xeɑLϋ3vqǠ? |1i$˭UVLt.A?^O!>śs 3K8>>27Z^ _].\hg΄fe|$}馛|A @ ~g~,Qp]6F @S9GfgGh5 #'a#,wsC%Nm(U>YԪXs~C3řɳ@Iu@ ͋-[N?¨6%uII)@ @ @ @ l,Vn% A{챇͚5 jBISNv!HXXG x9dkyW=#Ãj"'lr /&TX'.۬Y/&\_ _9[j]vMup ;75ojĈn-ڎݻ;{9-S)RQA @s 6L6;\SpzȲQFA3fN " @ @@.z>w]w6mds=S%qYgY~Lc>]c;wѣG;4k|W¶Ɩ5%C7vX;]e. pHǸ G~櫯+6lQGa/_8 ر{ fmTtaI\“-W\\m۶;[m۶VZ\L+#41B9@]jU^=Glܹ..U9*H`%O(K]a'X2AxtR]I(Y"Es$W\qEvwCB[nr([J .N;4k־曒u @HwiK.^=C&giBBYJ@9\sMfCNF/&Lpp$ J@sڴiSlY^G{zw^~ Pt3?w(PI~5J.6[oeÆ sa?sɒ\pnřLIA 0~x\Uz2hCu2Qr @ @ @߶jMհS"mCŒy . `<^G++orK›, @IDAT6m'ԓ&MrNxul|G.{ƍ˗UTo?<[o ^ L5*HND8q)˖-swqv1DmD|I[zibWv# @`' gr-q;-SiOPD˕+UO˖-m jZ|0ڵks/z'^8q;>3g~uY/}ji2&*Kyo.\@2$\zu;3\9Z?sM}TgϞm^xn^&2Q-qߠ7)p 2@~I6@ս~UVI&7673 $;!bO=aLϭMfݻwwB z o\Di_OrJ3TըQ.20g%zCvuWkҤI̪so{wݸڬ]$v[^=WLIT￷G}$J:.\}5'3U14+ZjY:>R8sRJv5׸pQPX})@ w׷駟9(ShttJ" @ @ȗDUA @@D%Piɰ, ?믻Od *?蔬DŽű b/gDz!jĈN:f6]v@$ygϞ+8Aq{[/>(pHI`?v_}nʖ-cx  @vZ=[nĉISc]v59mzG'Gxx޹sg7o_?>+PѣGۦM\S;<ӧ;O1MhQ՛g٘W/G;/WxHD6\oH^_ 7ٔv>}K92d&1e˖9\_Ci[,kw3/ׅM:pTa=#s3<Ӊ?_իn6lʎ|w]wgezs}+"zjdr HzƤcOǚ*,nK0STcG@A ZUBm쬳*h%6V[s .r}K,:_uԱovA9w Pc(O @ y&_KіC=&Ol_/VZmC IW\q?R@dɒ {3 @x'o.14=`~o޽{;@QHs EA&qM>pZGG9 /²O?4G],]6x/ 9_xyvROo MM{B;W/UsYͦE[!@ @ @ ?pi#Ls@ł_Wˑw4Zۮ*'4t^N|X/-V~~4G䐥QFs;gz!&zE|ve>엑iU oᴑu)Sׯ:3|GCkֽ($ or}cʍ00 EȺDKӱ[o*B Ay^bXPq>/4r6sLyG.+U%(Ao$iyȴm.;r#痑}h^a>3 =⋶eBʯEvmk/^l|i{XB @(_F^[ou>=ƥ {p&NsLi|M/R'dزyGW"f2%◾2'o1'wɌn&N~6 ?W)[!b%i.Kc>59ݘxɄs+VpbK. wu~㏻KD[v %+6l07nj*_{^mlڴi㞛<~ڵk|N^rz/^]u_O4,{z.sz*ovgy&x|vݧKdKe"y e L$ _/:/ǰƿ+o݉_)!dϪRJv4VBIY17zո~ojv):@k!A@^O* UX;ŢC< |v^ߛީްaC։d-Aj@|3'ͥM6>'BsGeb毧R_P,W2C~ߑ'^y=4>xq,!5䗑~@"@@:}BoݺuYsi-  @ @ @ AC IX@FoLNe]ts< 6 3ۢElɒ%NNիg{8Mo}|IϙBKbs5Nz<H,[Nd~ܧ~jZrq\sv+|AE`ӦMNDDoҤ̚5V^m5jpy{F1(.tO߸3ΰ7x#ZA ;uֵt=x\իs҆I&$:g7*q@l' &Y˖-ql>ȸofsz"AU.qDꍻ'X5'9g 3Y}rgWe=j׮m|sl+}&KXb2=chmɦ߃_c%yTlopl޼٪Ufׯw 髵/XÆ Og̘@gK~cdŕ @I'oڙg0OvfNsu))jժNP %Q @ I˗f͚OE8~># @ %4i>驁R!THd\Eb͛7O ԛTId3$mVL`_N5IWl:u>f{ۢ ζ}K{7rYvL/_n_~eVw^P-b{m۶ 7`r΍A @ <0X1cF&@ @Ms΁;#ovNZ3;( 4J(~g<  d_$+;NW./  @ @ @@د7b vqDŽ?VJΗ(_D$ @ @ /ZED@O_|qͮZlG d?>h1B={z}q%! @ @$hРUXuߒ# @ PRJ \w?m @6K.y{h @  K/[u)P&K[!@ @ @ D8ìRJn:;vlf!@lb6m*`oݺBi!>J V  @ @JZKHƍ~v3["e>T"U: < t).ڛo9X'?=c]vu{mӧORJ埙 @ @t֤Il…>vas@ @xo˖-m̘1˭vŻH l\(3x4@ @J`ܹ6ydMFM鑈f} @ @ @@ʔ)c[699\d͛7w<bS 2$v|.`sG$? @ @ 3Z9 xڶmO\i8\qD@6#A?(N`vs4ML֭[g*Unj=\8pM6f̘a/u֭P@e @ L&аaC'o6@ @QG~|vYgřd"j}1dgz @ @8xt=g[lc @ @ @E@u%+3f b@ ~+VK.$ ,tBGN @ @@1$Xk1ܩt i ЦM\ٸ8eD P:t`θqsEٜTRnV;3mw̺`@ @@:4h (v4@ @6liYfVVBASTJ稤PHۄ 0XB" by`'@ @%֭[_t=.[u5k{o:@ @ @ xAǎk=zXB @ @ @ @2k?]?C~[s6rHmРAv7&PY @ H}͚59Qtic=l}C9ĪTc_9੧y.kԨaW_}u4'OO>>s={UVիg'xtI&cx~7~w,O `ׯmݖgx6}ݶy iխQF[̙vEʺi&ׯ_x"n\rԛ+ @< .  >}۹ T5l7nl>$ߙ3gڨQ<276(_]vak$ -@@_x4i͛7V^muq3رcpdKuqβMFMl2{'m_|saÆٷ~ʕ+gW]uUd[j=sA|֭e˖:@!?eAn =EUo &chժ ޶mM6-G @ @ G`ѶtR.]X͚5bYh8 @ @ @ xMr4f @ @ @ @ $T+ ;HKoؿKL dbYժUnrM^pק]hQb&q޽q9!&~.^R} yN+ Hov1~xJ~% Ug;SI8YL"ZrK*]:Qp^ '*vD[o !(v9灧zZ1,ۜ \i#J*=3z^ZA"@R>|;t`<tA*i6wĉڈ#j~SuO8W 믿ΑC"2 /_6nSq?q)ˏ?ص'}7oQB[r9d9rdGX̓u8AdpO =BIbŊs9s/tJ @ @ PT{ /0gclk @ @ @A@/iy[b͞=iX @ @ @ @ d"]vʼnL2ʼn;h\Z2&袋L"k֬y䑌n3 4G܋^IHO6m_nF駟m$v^zΝ;UT1 ?}wbK* ?)}\'!ƍŋv%\x饗:W_}jԨɓ'WJn:3fu)G+7jȶoߞ#~n(z#+jc[od>!s:_NŲ–vB$_-_$"(2ۮY^dIpX۶m [X;%F}Oʧ+;Z K@Xm'tS^gut:|( =/;c쳏*U7/ײjժ|}-M7G?W$M72HREr ЬY3'ᅴRԩ @ @F_~1LPU?hɲ&tִB @ @ @ȃ^j&B @ @ @ @ @ [o>hjX 0$;*V>N#$ #Pn]6m̙3~7{衇t8pM:5fJ'j ahQF3B.P{g W^yž[?iu J[^p { q,6mj_|oakvE>}Yav|}\8cʕ`D$AoOπ#zyC ~F.@~}mŊ6sL;\Ѻ~$D"Z&{OULB_͚5}Qӱk{ϷzڴidٳgG]t Yƍ$`,,!_݉fL~I<{„ ~% @Dد3f K@ @ @N@m7m֭)Sې M%Mʂ @ @ @bE!@ @ @ @ @ I{lPBX 0$vzv7ǕD ʕ+g]w5v)yse/_މ^9vW/ְaC>vXۺuk-B=C›Re]3pbQ{+{Ȑ!hѢ >mk׮yA#FQ9 EUoM.Y7l`:%nݺ8R>}\7n6 ۦ=v$O&nzKǒ)}ĹI&Nڷ/2zWJ.@ PsO5LXDZYmapZٲeݵ}O|{OoAQHQs3y\>>u ֣G`tĐuX/I͜9tB @ @ @ @@V(_IJۢE\TyAF xa P|H[2e|0iӂ2. O*G}+K8.6WG\tEArFDK|UoÆ /ޔw$ ܲemذ},X`v=b֭w}7G$*U ji\rn/8qT Ftgfm߾$:qhYl"?Z-Ɇnj'| 8~wWt/_MJTIbv=CppUg~K~1cU\l8)O \X <$?cz-W8y1rReWb)zvZ'^6GnS:y}VXid~?2y!agtySx]{GZ&\aW9=mR֭k+_ŋxN:.ܹs922ҕ']ǥګ{=;;?0vv_^7ߴm۶w}iwqGwN{̿'!Md7t]y=}o~vYM^ zs!-C @ @"Ew=gsl{ @ @ @Am۶ @ @ @ @ @214QbZX.bo\xa "o9pd@BAш<~Ao' H/z#ICӶ^V-i\+􂾻ᄏgaÆ.~xG֢E 4i뫄-Zd ;Wn̙3v͞~i/3<^zɥQ4i/A[JdW%ѣWl^{_;6UW\Θ1õ%2֫Ufƍ3K#5kU2_ӧ~j޼w3gnŋנANֻLfrk@^|y 1Cz'Wǐټy͚52d!o^ +G֝L#*7oI=w&5aZyhm,i6gv7Zҥy硇I-㹧J]x;^իW"[丼[bo~!sIrƍ6zh\\˖-MκƜ0a :wɪT3J&~we|OޓF͚5}t{u$d 6@ 4+@ @ @ lڴ4MVB;s iLZJP@ @ @ @E@ ,+KrA [ l߾=h_~i;sN x RyQbm& 4\C PRL2%.%wr@yT%Cϓ!7vX )D-SXLB]t1c t,@;{'W_uqS޽ Gء>Lްnڵce_|yk߾I0tNPŋJD#:*WtEJJ$Hp؛JTX?n,.LUCq*kv]س{%M^뮻oƍ;_ F_nf'$3EU;0+MoGhL @%.NUwqj*N' ihD^Ԟ5j5m?|'HzY{ĉm]vqG]x vgP%6 dԩk9p>hhLLj^]}.Ns.\Э'%A}Q רQ#'2נA[lwbw븗Pvr\y{~ֳgO;}t;ܶd=Ī;2yz)[b+O>9~\r;#!G}nXɴ9(د1@FQf;Ѯ ­+i6g駟nV9Hk ˼ ZOkz]?/ZzCqV5[:-ҋej=ܓkÃ8ڱcG+U}h) 欳β| {ui8=M{L'SRuS{2il۶Խȑ#P0;6'SoD3X@իgsεk׺yUT3=]GoūS 'xE<ȡ@M`Μ97@ /R8`Z)xБS! @ @ @ .M45kʕ+meHg!骛r!jz۽k` om` @ d7AvC%K@!@#pᇛ%Ea8N:ɉi>[2. $' * iÕlҞ@1͇%晗hoehŊ}1q/;w~%")L >3'i~~%d"߰pDLZR@lĈ9]d_EUo.%vUWEơC4Dy睭[n6x`UV9V_~S7ovZzaT=2zcDS%HU.&LmUo6`'J'K5ŋ/huM<%{\6n؉Fdvm^Wy}W"ӦMwy'%+'|ҕ{O<1ΎZ)%dL'SRuS{1c88m׮_ ^Pfɴ9z8"OјDG|mG @ gD @ z*&\`cͲFs!@ @ @ 1^ƕC/= &} nM @ @ @RI烩IY % ~N~DWEr?ht%?*W\v@H@ӦM@2 /$9UT JRKα=~*(~%r-8l0I}=c}2k۶ +mUh{q+OXB\JV|rc=ܵǵ~7e3gtvVZٻk?ֵkWkӦvay$[ֻwo蠃/ &믿nǏݏqƹg͚ekAO8}ǥ ˔)w=Jh"ˑO]rvuռyskР-X=D]׬Y,AFUDZX•+VժU ѣݺK y/_4Vk}$$ATXQ՛2$z ҥKp@m…&~뮻\V H骫s9'Gq7G"q[ot86 vꩧ:1thn,^H7mzcU|OUErʹ`8& ֮];j1paX.Z#ˈg=x~o^.3L~pB|xY&x͝@ tӡC[~W6lKzo/[nʼn'o1ެQź8ȣ:o[߾}5?lwq <8RÃo>T^]b*zҞ}n" pOIh(ť,7'[|m޼Y_PBXɴ9zCM#ԩS'H^@`>u:@ y0Ad M |.- < C M3" [D @ @ @Hm3z@6"}0@RG@brzA @ :vh`I_ @hӦMP  h$PD2]Bs_~]'^29!@ *Wl]tqUhy 7ص^kc'6ԩSlٲ 2 *7WLjpDN8}Qs)Iz֬Yꫯ:ӧۆ ɓM17܆.0` yS ɱk/ZjښUa֣F2e*T6KOv5޽q^'xپ}{ LJG9.r[*mHwٞx|Z7ow^xxfG֚bN@IDAT(zhponZhΟ9͋EkroS.[v[}ꫯ.Hiʑ0E+ˬUVvR?>.b:cw}6_t]A ɲ,mcLJƺu}mTVAۜL,!/7/鲓sj@H ΃H) @HM6 /q .HESb+h @ @ @ r#'|K.5e+SG`K @ @;7?Jd߷%e+[HJK$Ed ɚТI.Kf߳N̼3̽μ3w={{{#           9p4+ptM>c  'Я_?:u۷O &[SNceҽkmo>})DmoVuOGp.Xt4}t%Ho1uIFΞ=+W\W[9iԨ̙3eܸqJy i89U*,Lp]9r}ǎʡ'|";x :T6 U9@VRJ1q1ek߾U;wN#ۼXx23L)mBąS vNR缧rYΝ[+7` Xg4 ~@ȗ/[^~e?gϞ2b6y뭷Fr`3UehѢRpaټyݻW=Wb8WZWn*۷ocz"4idx|Ȗ-$KLmX|=Nn@|ҥKg%9yfHHHHHHHHHBIz{:u$C .˦GG IHHHHHHHHHHHHBMr2i$9\Rʕ+*Y> 8N`ڴi2j(e$@$@$~m8h۶m,"`IHH TPAtmdHHH"ѣGd! }2h $@$IHjےx LRJ*%˗/<~dʔ)v(BZ޵kW%&wiwEֱ$@$@h^iӦPb _ ~;V:tpeʔ3*esf]bŀ˳aȐ!V 6#:a9rPsﭝF!,5{l8]Qpkt @h \[lQ8DZcɓ'uOj.\;wFs^}^xNӃ A]=cR|yUΆ |Pm.XՎuY"}̢  XIf^Z}8C63 Ƿ ~9{ zi}m۶MEE g}h;,ԂȎ}" 2p@b:ul(իK%d͚5ҿ%hH*͓+W.%{5oPx}sժUtg…J;f̘3yBA>0" $Iw{7 vƓ'ӧO:e^Oǖ=# L\gF%  _0FCJ}$@$sʈLö E@" (Ef 7]̙f~  *pkTRvHH JN:Jzn $83~Bf=$@$pxP0@$@$@$|PҥKVZb@ Nx @{2; @84jHwﮄǏ/]tqD "O=L6M~7]vqx%u~馛R&MSi!nPa޾}ʬYT p?Cm>RR%#F̻ZxTRe7v2}\O<=t萌5JZn718gDb0N3nfYٷo6CҥK q-q{[<ɓ'_~ҬY3I2{s6[1C >KJDGǸ;~g9alcGΝ^z1r{ <#GRJ>lC°bŊ%u;T%{lRnvi}s=ҫW/% L_ A3 pLօbŊ˖-<kO?՛qNqAb>D.Χn x%`E}+&   0F$@Nؾ},\P{wGMNCcy$@$@$@$@$@$@$@$@$@$@$@$@$@$n燻9"$I1 @#$@$@$J? mhӦ%9{l7oHH  >ԡCU5D8 L֭['}ϕ+W\vU {ו/jn׮]QB I>}\5kTgڸq 83aoN:U,w}JB~^/jد7QcE0Hzl&{ N-ھ}{֭༃]~] 2D ժU+ )S&/KT,YMSYp$۲elڴI=*ǎsΩ}ND2zh9r*WM*_DV\g flٲJ\"w+ƍKΜ9eVq6`Y`\zwm޼1߷z<?~\pCa'|R߯qM5Ud8P]x嗕2˸wܚ2ebD۶m -د7WI<#G;n8ٷo[7c=ծ][ ,iW@`J.-=L6Mvܩ~C:uJFZ bzKrĉ>W\ߒzo= "a֬Yx*8;F3Yd?Ḇ9 4kת ל:uȁvvl^ @=F$@$@$@$@$@$@$@$@$@&9r0G0-i4v}"            mwyrȷw^N8WJ,YlCa8=6~xy&IHH &הp ѧLA$@$@$C)'ȂHHHbO?$'HҦM|? #HH >*;F4[[tfAS:״cw{37 @Bxd޽P'Dz8Af||~e˖Jq3fHF̙32h Т؆7߬~8٣I뮻dرb@GyD=)c>̙3tƅ^t LRKS"'cƌrx睻A\d̘1yJ(X}wƷzͲx KhZdiTb y!ԲeKx ~s>}*M4=p8|%ay[nCٛUXQ]GΝbtא2e(goe#u2yd%\h"ɕ++(Pqv!{O^sua\O N =-e @ >K}o߾2r8 gtN: /'fTqK.fق vKAnBe|\[EyٗU^]֬Y{U,|gW^yE }1&M9wH"\t?6۩ccI^\}8:){D$@$/">ȳHH裏sp ? d|lT֬ +~VN$@$@$@$@$@$@$@$@$@$@$@$@$*p,T]|Ӂ$b HHHpW_HHBKqh$@$@$@$TR ,H ~0쇀  >* M+Xl۶MB B4}Y8p'JƍHH#goOcnk&]tQBC  ׌լYSV\ %dj)T4mԌr gȐAʕ+'?{K"6nS}0PÇ '¥JRb{2Bڱc@LmiCQ.߁xy*k4l٢DqON8a%%Ļ i7ؼyȑ#J NAgϞ!aOlebӦM2tPd&|l\K^u9Ѕ0Z=",6xT'|W_HǎzM_vrwZE`\m۶UhXܹeۆn8[:1 &sA  (Es7O5ķLhE/_>uܷopVO>5jxEl^ gΜQ8:Ov?Axy}܇a =s3z_b~}}ƫQFҽ{w=f{>ϮAOVřBӧWڴi#=>= sد6~!z C>]}=" g_7Ƿ9r^z瓳gϪ%KE zlQzF0'2-p>uloHb?ky3}% ܱ@3= "ɓ'U ꫜHGH?Bl @PT~y "3 <~\"VˇQW' 9]*a9:C $bocׯ_7 CܺuܹS 'Oɛ7oe.Y$4N$Ђ-[A5>_BQ;2et%eɒELQ!k.%~QWyB n;i$U'fcM!^Ou]J\;Zj > ھ}@})8Kiٳ.=!.1͛7c)S&ur\mgΜY+a_CI'xB|M6^TaÆ >խ[7s,=|뭷*ُ>H"r… ;ގ@?ݫ +T__ٱ"ϟWݎOl<ذ$ ͛7|nr~lg` AZ||~͂yVV ?M}cX PLYL8p|3YΝׯ#GH%3;$6\z-I7T'MT]twb%         n/[h P7ڎ(C$@$@$@$@$@$@$@$@$@$@$@$@$`68Zѣ7 D47Nqٲeuha~a͚5e֬YAAINE D #@  {FP$I$;뽴qRB_QjoŊ*Z7aNj+b14;> TREv!W\KJժU HHHHHHHHHHHHHHHHHH"=#ҥӧO ~?\ -ZȨQٳңG6lD  BҥKre/{}GwK$ zW^%HLj,/Ge͚ 3@$@v }.k`~ #`S(P7'{C$@$@$@$@$@$@$@$@Hرc2eմL2I#bdA$@$@$@$@$@$@$@$@$@$@$@$@$@Fbp?>~#=$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@ $IDʔ)#s̑Ç޽{;𘖑ٳL4IΟ?iF c.  @˖-r7y"EL$@ ȑCƌ;ҥ󱗻 XN}a)%K1? Xb>k4$@$^y*@dvj 5HHHHHHHHHH >c|*y"EPT1eR7bB$@$@$@$@$@$@$@$@$@$@$@$@$4J* \~]:]>#     @;wN6mڤ+VLRJHvnذA:$v<˂\ /ʢEŋK֬Y]pHHHHHHHH#XWz<$ +WN");}o!ݺu[|M6m?YHHlx衇 @|-ZDNؒ815?ΡdDb*I }.ŧ.F$$^l$@[FjHHHH-[̙3>}zүXOTk~#\g% %pU9rM7$Z3F!fIHHHHHHHHHHHH v dɒE .ĴV^-gϞ4i.H f!`+W.)P(Q5f2zh3pL^[.]*VLΐ!ɓGx y'[nQyﯮ{؆CR_ʟ)ɓ']JsSiʔ)#?O?ŋUmJƌ/͛7Ǜ`sϩtF(0iy*gƍ * ~J4iRɛ7|ҦMkeb u|0yuϟ+ ΰZjIRV_}Sw}VO?TvimD#hѢ/_>ݻworc9\6i$ٺuJ~wJfd|;qCԩS4$@K5j.X@*UZ_{ݮ]҆X48޽:'L 7> xj˖-۷ӧ%Gj|Gjժcf\Ej֬)svq՛oYڵkgqr *ԏ@0Es|k8'Ǝ+۶m<_A0.cxZEc,c Ɓ1fe86ΗB y- WŞGY01bwØ;TtdɤM6Iĉ2n8+eZ @qXol @0`.BÆ #щ۷Wf:$~G4      &C_ $@$@$@$@$@$5 _gH3?3fʕ+UΝ;˭3-={Ti+&ՓGСC};_z%5߉y30~Fs9vܣ.ͣ, @Ϣ_~E*V( . Kc?EX SiqpiHw}'SgO낣# RuI#}5 2hŒv;v!F)j3u_xh~>!  @ qׯ_ٙHHHHH ]V4iYU cpv%swPR?50~IOo_3~T`"a|W|x:-`_;3O2Et颞:2jڴ]jUcUVU㻦Ȱ.˟a*_#eʔ[o1cd֬Y<gL/t9vJ_$@:uu=֜9sZӓ 0#I$j.ќ''x>X>p @m$M$@$@$@$@$@CŋVg0F$ #\}aÆRpa&Vp/HH vpMBkHbW^ N @ѐ!CR7v"p7vnQ\|YN:%oX7i֬YʯY%ޛ&M3{c߾}b ٳg~ܹ^~ 0D;秹r8A1.]t%KжsN+(P@G۷|7V@wy@L? EÇKƍi&=jD}!6,8s<*\tiqU!x@z޽riՊiӦɚ5k8g %>p?~\_|Q L2g/_n ,X f6 Dz`vj3 >6[0epH v uydϷmۦ~q? D&}=j -XUjԘ>!k.5K}wjXbB (>LJdpl[a,VZo&p~wh؂9qai's̙3S8c?T\Y֯_/H0fK-}޲ʌ3\aۓدK60~\c)HH)'N.]T,H&T}kڵkʕ+,YcFy3!`mv~Q&#k.:tnΛ7ńhX% Bb pݽ{K&N(ΝSB*U#n`- w}תߖ/*ǰ( +0~WI4$6kL aC qE  \sÇU{J\=ޞ>} > 4~SN-[nUi?_|<3*GM,ae C)a-{I$@$@$@$@$@$ ~;tIoA(vƥ맄<#e =>og$8{;n8Yx*:tHCֹsgn51cF1~ݤIM6]IK/$p|Ͷl2>-{3gdѢE*"`ٲesOW_)d-2 %K D2eʨx/_VbD[?{緪Uj1סvڒ"El"      "*_.]ÂIHHHHHCM2exZI ψk cPSit^D&L ?*o߾χ2`#?h}g$κEAwr=v޼n;I"c-e IHHH |lUަM|( 2J;n (QBذa8qPHHQɒ%S-[TBIpp{全'OߛBa_~Y Ҫͅ *Z0 hX/9rɬ/+t>_N(7\!g)C kD|?s;wn Ӻvj7$0p2Tr2i$8g_׭[W6ol )3F {;c J*㏫̙3ձ$@$ @B8'O+o~<:!{Quڵ+f;vP}蒿,W޽{eٲe{&DǥK*A% 3ϝ;H6%    #`sȡzM_BƧ~Z= Δ)SdΝf VAfN y`={ƌUp 8P0C.R`aN0<{l fy+VX >@tr6w\յ]I0cvW e:};1Luօm0zj8b|yigʕ+zqJm?Z|lܸQ]M$F/ &#H5T.hő @ D?TT0$@!@?#7j1HT5 nˉy3@lM0s @C`Sl pM6O?$_/5qzrHH"c,Xs޴im-د@Y @ E$@@jլfbSYXٳg5k8r8N-(c)Q8ЋipB(ݺu=z1=*pԆ?zɓ}R+"ӧWYƏ/ϙ3ZG@Hs8YYp8H,YT+&C K/d{̲m6;W>D,@#r-w}j'{N z-[T&(G{*իv}VX -v`L}j+TPAwDƍ} 36Ę]U0n3H4i#;aÆy/^\.]Z4vm~W4s17| >V5ƽhhs^;ΈHnݺƐ1NYNY~hb!7HK!sZ_ַo_C $vG0>L#     >N:y4 !HX3yz.9xɒ% 01o ży~F;:lkt3?$@-Ó̧eyؘ}v)W5_pªLgf@yz? ?iXw?E޻{՚̯Z wsjMB0k?t[µ^Eo  '0rHoh-$UTzb+;J$@$@$@$@$@$@$@$@$@$@$@$@$I/4HjB$EL1ӤI:ֳիW[e5i bH;o޼8Y83mDh[d qvޭD {-={[~lNx x8au0Z -[XD#yOff5f婭NAD .]lfͬ6lf`̙&&m:o X`1eg%rv9}X !b[lkv! d 4?ʂ(2l-+Ajlܹ>Ǔ8=1܎1ݥHBjժIٖX$'Ojʉ'1 f;fqbϟWH ֭[+qdaIT;VpWZDx'1m&=w :ͮ]v?ZN wn vQoԩSfaF$^pu =8}HHHHHHH رcՅ[aHHHHHHvT4 !9fg䆏03f>4[#o޼/g;Tg$_u t]I?'}[`޷l׃/%ŻYbˑ1@^(Xv];<_ mܸQ ~WLC}`$z$@$@Mʕ+2bIšX2f_IHHHHHHHHHHHH F -i@(Wy\L,Y$.fN \KL>cg/V`ylo.W3gV8' M$@$@$@$@$/<[i8姟~*OQ~;.o*xWB|g_Ma-M%ԱoV :~˖-g@u[^wt=ƳxGUs&1Yٲeθd/UիK4iec|9L2l25a;k;c#fمk\͚4igp@5WTIu ȸy__~cCzJ }M*>jc:^3E1>b8s{f͚qNh fQ?C ㋹42 4H/^\%Ÿ4H 0b0WΜ9Eyx:ujK;{2 $fP@HHHHHH  ӆ9!4 !@?#r־3L"u'}P̛G3 ?#8Aef޼H;=ۼxO-|:-[@-w H -R+ЫCh?$]%U cMD;t蠎>v$Y*&  X>{b,YX,J$@$@$@$@$@$@$@$@$@$@$@$@$0 N~g`L:6)$@~p/^={Ȉ#?WE@piӦ*&ILR}ilt_ɓ'L,Q- p Pԯ}$ʓ'$KLE6"dEHG q DL@ {ϛG +'w-5X7=*k;~r܏m-0 &ׯW"pl 8m`$@'/_>ɞ=`_|gQbŊbD!+G~[Znk֬{* {Q}7Vڵoltd޼yPBll0vJ ! A\8 r2u cvŃ]qGֱs$~Cy;7J۷tMش g+WTKkhK" ěa 7,w!;A)SH ~y-`/ hg͚=ODC$@$@$@$@1LL`@IDATN*z(~C"="q)<թSGƇH3edó]?_ԝv?~y饗dw|]'=o.oy`ԏkvzWvK>}1cxU&I$Q~qz2_ 0@ 0S>E+VX֭+Wƻ]c#V% ׸ nX[ݸ{/{%s(]V1x2kΘ1cn:7PͱX\qmv`uxCM0 1k8܋0V4 dv{3w\'^ر̜934T ͙3ǏLB$ ֭[o7xM ]X'ܱc:nX3@ Hkz(*  `Ǘa-Hq16mjJb1]`gG֫XgHH &ڶm}6;I_$@$@$@$@$@$@$@$@$@$@$@$@$@QKJ*J?reHBJgMQe-Q}Z#nWM4QBW^U8`xܫWk^vM G!&xa#dt"Cղ 0(_|.hpO""^awVMo֬%m6dKE.~}Q_pE! ~_^} g6lp2E{nݺX,R;w^08ǢfOE`n`_{-ZĎg% "++W9PF6ca -Z,}]u-]E, B04M@4     Wkfs bQ'7a]3ƥ 0e%.8x`]5gl߄W,pk:BxqJkٲݪb5o߾ҸqcUQ;@턶,HHHHHH#)R_&"     HT6M[lt$@!&@?#6bv@|1?c3i3͹v3rg'hap@W s C R|[`~km[JpAkiȑsN/Ok?) ]*N D>AYl۶@X,J$@$@$@$@$@$@$@$@$@$@$@$@$09 S4 @Ldܸq*-[d֬YJK uիW{=s)w[NL_C [_,\{( q+wVPHNW$?,͓+Iz+EyLN>] fzf٧~ǝw) VB֣Y)C KjBpʮ 'OC0O6 8LR@_~JI <:ߞDLF0iq/Oۂ~3^;u@J/N믿s.-ܢ‘Ǽ?1o}G8PȳtR'N`ӧc} |S6sƙ3g\Ww0HHHHH"PBAiӦI=ǏKnݔ#+Bc#F7|Vl`v}Wc+VP̟ޓf͚96DmڴU "`|((3fXa^"S![Yո 7h[2G)wE}D=[@D}؈;Jۘ]Up1[:tȽq sgbnջȭ[*Q^z]ļ\6ltHqF_Ӗ,Y2g^uz~ $<;rpZ*5B4M{2~x<Q$@a"Ю];"VK$ʕjm޼TVfHHyuW"رC5o55 p߽{w%0+ Dk}9M$@$`9ǚkŲgkgI g7 X ]byX_li_VF7s|M3bm栣, @')-<ͱ]Gf^߇y4x>RX 4loͼf~@q2yd:auz'2HH]vɷ~#GW^híد@Y @d3R8jLD$'i$@$(ԩS?784h3 h^ӛ0Ҝh5ێ5k*_BPD-}N޿UaDP-A}X_{ѪƼ-1Ƭ\c+SfS'[;o$+ZF; hUTA%hm0@$@6 OnvUʰaÔ"ЃńL.ZH tN|k^8Ξ5k*Roѣjun2p0>Pi݆h6StuV{۶mֶ>\nV=W\f7ӛiBcb=䌺OwP&$)XhQlYg>1#?hB 8!MF3=D=yƌ7c… JHl0R]+0^mcdNOt/o{a̙3-a{}Rzu)R>ΝC^4B8b>9rꇰ=N8aśo 4 %PhQ)\J=v7']1 AƄA]|g;vXPػwoU E@o`IOa7ӇUbc;~xuq-[&/+WNPY 70! J5n8շԩSKVt*?HHHHHHHHHHHHH) -Zn$@@{%M6Ub}ѣG;Ҳ+g;vt!r!v1cF%6w\%B Vbŀˋ/Sɵo3bV,ĩU *y͚5tR-^UF?VĶd.]:96f|ڴi]! 2*aÆVpZI}fE={J`0 B Wpo,YTV:`%`Ej=.C\n:{\9{ܹ%NovV^->e}#^TRf>P|c78mGe*jkٲJt<11jj*v'ǔo.]Zfwl,+pUp C֭[{m:dϞ@vh\^ ~~w y8I"\9 !/_>yWeH  =;ށHb@jլa˭mHH'`^w/=|%b=6jNF\6 ;GuIH%2̻U%+ ܠ.kA\jsO3o3gAwe@o`)OA? #,YgD|;zwk HH Qx >\k۶mc7-IHHHHHHHHHHHHH &%4 p&tAPd|~\⒵k׮믿~vڥB\O>.̍5kMGlܸQuΩplV T`Rkٲe}5sw&#- |9 Z `,k?[nҠAcx)J/1Y?㏫02tfvXΘ1ԭ[WebAh-[^~A퇰'х@"X5x`SpC6}tɛըQe"mY% YxVR%%ߪUZ ߓ/~`@dD:H &+ ΃{Xؾ}{@XH?~zAO>HM1 $rg~s ?w,YR;vLNNԩg)"5e%cqoVG_ Dg 0@,X}b͛7׻ eqoQ<=zT1o'ҧOo^q qfuΟ?~5nX4hfvر=F$~#]VǹpI       ` cx6mܹS=:uJK|㰧zL:5.Uvm)XF:coBK+WTpϛ7O,m9k֬RxqnٲegN N%d?c M6=WrevF\ p#\*7xk; =!:>d6ǝp㠙2eRcx }=>PYdqS8CNy ߫qQ;qHy8Sa9$@'2dPa-ۂ0&cϚHHHHHHbŇF$@$@$@$@$@$}~wSz @H f "=-|sD0 d<ʣ3HyM!pϊ@|[`.a=Gh0~@p^u ¾X۳gZXk 80 @%uz}oÆ %w܉3<e             H4T"3gT?)R$Ѵ %|fݻX$8vwX?k,ǗA<0[lV8,8_FT >VAbzb1I8 ps_xE9sQ _w`]&Mի D19đw}7NζmVMνD-ZPB}_`y0+qׯJ}LR6&1{`P>'p,ym{KÁ;v҂v~E$n6`Nõ ;suVۦ89" Ut9CƳ0D8 e}yWdذaJQӤI#-m)Rt|}$@$@$@$@$fϞ-3PSfKy˯Q7^x;1<cު z{.]Ώǫg7+Qx6}ץCb#GSk|Q˖-?(/_V—a͚5}F|S|}M`ڵ i*aVek8NIeq;z)[q .('D?}~h'3F}n"f|Ը-b,48Pe+y803 @(YOʁ%gΜ ކXz!x"ڵ%K" H r![jf$@ ?jx3w x$ucDykn`bIL/,?!S @(T`ߛ:DoO$@$/>H:w8( 30!b>4jzTs iӼOOa؊+\76@#7`J?#p3=m7z_yT$@Nbٲe^}^@L[j`] ?^z)aUyRR>5~,XO tM\w $Z8j?c(gO$@$@$@$@$@$@$@$@$@$@$@$@1Fz 6mX /&_{5bqC t,q78^rrZ786 6mjF3d ʕL({J% Js5t:/: MN:tL63{A̛7}ԭ[|ʙ+ AY[ԩPСC庛dt涙ν`!޸~z%0u8E8d|Ӽ0Pq:. AM#,2ÖHcRzs0'&>1;vD)wOffM$Ib™7x@fZ:~,ڵk˺u따/}_~.?3s=\ ο3 l{>9.c9/Tej7/L#@j*i9&o?\yw #mFד@D _] G448TBy  D[V7&@?)[&@ 7 M>FMmkdznݺ$ *1&g*Ci~&MY}y]w `s/u3bqFOα\.دW1 |I/+()0zQhǧP]$ȹ]vn 1!{tצMt3W^q jpǀT{Ce KBN~ۖ,Y6m -B s!?Y@@@@@@@OժU_ Al `*LN`Jݺu>dy4T @K.!13740]xW7RzFu ӣk` .4w}]]m !1cԩ er_} | $]`.ԍ xiھ} O ! 鶒oǎ~}uS` `cƌq7Ϙ1Յjw$)Zg`+;wf͚/< s(ζF;>4$Xׇ^իafJJ#i(@AKpQȊ GqM6͵cܸqvg|bm@X7       @& h:੺\AZjIM R`{#>k ~5_#P@ @ (IX50y_&$hS%L5EMKURc=+hG@@@ r}_|-r技gkѢE4v"@c>?X**:A귺:%,'2~ ~~ӧL$GsֱcG;v-]4֭ޚ)@@@" | VLB@@N~5LHZ3㌤z @ D;>8 he%2hHk@L8qW{X&T      D#`^?~7# 4{ߺupL(l@ i|%@@@ t=={Lx]}x=ȵ\ko9 P \re ~"vjw]6~gK   I`U鏄   }wŋtAV'o/"/5|7_U@"3'R)! }u7ӹ>Q"h?      @` &X޽s#a/۾}{޵kW(&>VFH#>hgP@@@ Fm۶E}n9s1V;FMNJ @Z{#< ȆhѢ;֬Yc+W$XOX,8CGOƍo߾n:1U@@@X`mذܺu6Z   i/|rӵ7J 4HRAHOKX+_`@ |$Rm# 3f̰1cƸ p֥KlkF$S      ^ࠃ:unZ̉\ /gZ#j  D*pWX#͞'eeZOi{"ykͼ##@ ~.دUjժnU 0^u瞳ښ6m   #W_%دO   usԸqc @(\WԸS* |^ {>-bŋ~s      oÇ[ԩSQ (S#L(vAA >z-ۼyUT)*   @vLҡO+ִ\ȵ\ko״'`^>}viS$PjU;L޽ziǏOR  g϶UVYٲem۶P%)@@ и'Nty7onժU+0? @t3g_C=ԟf(E+5y~=5@:|0H.y@ ϷQF*ԬY.TV'&o*      , GdS   ^ 6L Q@@@@@@`3f($7%pO?mK, &ػkgqFc @? pBMs~vaYΝYfx饗l懚ѥKkҤ}6f?ݸqcyG7mdŋwӽe ;vxOrʦWn]+V, 6٤ʒSEV|<˃ڵ6eM'pu{ DDp\r-,Ss4e(իWO|?__/^lC/eM@>OI~ְaC4~__Aۮ_a(nٳiӦ8Oq7nl+V~ݰa]veયURmDx~P#@f2Rм[o֮]n[?2ԩ/_}F(Ғ%K8k(׻24O/8&֔:GhKm˳9=7O.@IDAT<ѱײe<5 ,\~u֙sϔS4i޽5:X ^ *xnݺ!P}ڵk[ժU]TU;v;9k,SpX8#@(LebC3/vi:ׯԠA;@"    @_6w[2e~fW@@@@@@(@\__XΝ #         T/د 1c|I-O`Ȑ! Js]|Ŷ_@ lܸj^ZUV SP7o(pUty ~eM4iӦE ;n8k_~qwu=Vi^:ul6vaÆ s~?x`ڵj3h ?M7d)wߵGyěeʕ Ͻ#Fy}v5x:G q'NtSeoܱUzb<7]m/b)" @t{4 3SP@R8R*VkM+@,>ޑҭoIӱ·zVtiׄ~o$$H27O{ ,p^~w'SPRmNDuC})S>4D(VZK:0uTmlP ߐӰT @@@@L6KWuĺV_`M      9"pqǹA \i:D@@@@@@@@Ppd| `*Tpx\кo @P /ySd<^zVdILSpgꪫܦf#FN| xxL3fh7o<}*FM@@@@@ tw=^ݭZji]TV`ԧl@@@@@@HP`&LHy}          (Șt))\Dz (\ \ o$0D(ТE O}]ѣG@neMPB'nVW Tx$ ({MOdD5jC5ѲeKeK~z^:Nk rv紷oNב([Gq /x^[)_%NY\$5B@@@@5dOTRߖIJ_@@@@@@@ W(?޺v!^5kUP{# D .3fLG@ o .# @ht ROB2]3}RE~Eڜ\ =ydW~u!<%K!CXΝ[n^{'O@d tAvUW?nw*0Wns */pnAu󂠄s\԰aCSƑ#G3<uVR%dޢT_W ?pPIA2UΓO>i`\r);c[lqA1\@㎳ .4ieOT9`h{ߌSN{׉+l<]tA@ =jʮJP 6Z^l7v~kժ^{v[}tt_rANW^/8ێ1O?w={%zpu |{[+W@*S]+TX=*P=c?}9V;M6n]S jPXs=yC+P"SUKAt*Wulǔ>M^I9 <]W'xN=T۾})W^?כ%MSR`}x.Pm۶zL$_?w]vɯ%"gLE/\g]'cǂO}5k֘7NC} \XFnO{߭SwO> D=q 'X߾}kuf̘arԷܽ{{s=]~18@r&PS2:'?7yôF6l06my N{o>3ozr#/tG_QR: DHEs0;@2N`Wg*޽Nכ 7 K@@@@@@@ >h+]eܸq9b) Kw鏄 `d#!   @f |- >GG@ %z}T}G|r{Nm(r^@QIADAZ}% -^x| pС.DLEQjUWYW(3\`Lx|yS_~]tE6{lL@2 /[:u򬛪's4V^_ On5}t\П)^ ׌@+)XiWL2c駟cRf7pK<*T0U^ Nn:&xsg[nyfu Խr<&M=zY' pj qAZUDJzk޳jyIayC=Znm&c^MD ix)Cc۶Z{&<*^^oܤ5+@ 6xyLqf͚ NP$9/ca ZF?|_pRG[RS_/o$}RpOLC^6:ddRaXF:џpIs۶m*^} ^0oՂ`PzP/ @2L2e  da>k7eR-؇       N'L|ZtիW/[M2A΄jRG@@@@@@M  c͛7[N*UxDYO7wD@@@@ tw}u]v1*        pǻGt#j ű* ɻ+dB@4`Y @d r!,@@ 40uxdM@4xGQ5@T@AJ.m۷o3gi-sZ ,pu?l @ioFAbH;}Ǯ& <`kOHovwOڭS9k֬q-[Զx*U&͛g~ ܫ m۶uaUnt1ǘ8vԨQvw y.bS1?u9'k!jw}n)iԥK8p[ܵkp٘ 0x`m.PrRVR}?_?z𒂒8 ` bk׮O?íQ + #(OA)Jc>ܹ-Wr%^/s~]yѼuyLԩS]%ʔ)cM4I}A: b{LΠx@,PiY@ :mGvm1o36@\˴@@@@@@ <D`R0H$@jL   d@NL$@ }0&mA@ 9%KC=\pKNrq|Wlڵ.HW_mڵmZi%PX1;ꨣܟB;.0_|& F&M!C_u1 JHDpr٩[nzi<)?4hPDW/ڴicM6u;6uS)YusVN;)`Kݻw7N9p٘ аaC;w 03f̰[ b Jnfr~Ge&jժr %uyppp R<0\V7ʷ{=zo|Xʟ}Y裏L+Ur%y"&@h^ QÇvŋw ,+e Y}#!@ +xijM-*d]v޽{[֭][}`W^X8({}=}w S T#!){_ڟ߲eW}K.9=e˖u==n:q/t.~rgR p=usZ |S  D*w7n_zVNHW|Z4 h<      @˖-B a„ n\7         -ТE WA >k֬lծ|v}- /`H;ϯŢEDL~nk֬>">3}5~CUlfÆ (j^&MCqaΝռT9VWZe~mAYe ,pA 1 05(;O'IM<9rd` m6߫ZjUJ;vpke_ߞ{D z ~P>/0UA*O2e ta͚5CnnݺSOٲeO>~+Wc=gxgI|R&jX_/)SUW]XA2%mW`̙vZCVdIh@ Eb'oYJE`R ٯ_,cESRJ9uօNV_O'/52SWx<U;cW.Hs=g'tz衮'M6i1)  Uڵ@@@@@B _ކ隒n-T6(b@@@@@@@(^wq6zh7oM6)~F~:*F@@O>Z0p  @v s1aI  @<;f' 5GyՏv7Q1@ "2 8 4oߚiDj.R{'m.W^yej+E @ϟ[lY: 4@3f̰z(ꀷ>_t"'@v%{5%zܹ.P]US7us8,?xcǎ~~@{n|yҥK9:udcǎ?/^x4hi7o e'10w}g7Sƍ]]L 5P>hy 8֧rٳg\<-Q"nݺ5OzI{Yu '2Ezؽ{-ZU}>_o32O w@ EOHv&+ul?o{߿FXHY%{ ֏?ۇbytKµ#;eb/u_{%tg{΅M6Dv L4o!S~ @. ދ`. @ Z]3ծ]hWg=pǺa 3$7b*2"      @6 .د8~xfΐ-[ƌ! d|͌]E-@rL\r9b  ,\>~i!`Z* @ M34.V)e۶m]`>}X.]B֊cl #O?o킍yyO^~eoҚ4iO'jns=T>ݪrELU]w/۽Ξz)kٲ U|nQӦM-YKCśu.٫{4 +zUA`J|$[B% "`J JN;4wժUO۵^8իFyED/nvÇy睗gS%:O#xrQG 8кuf{W5׭[gV#𽨠}ԪU+Sm۶GXAZ|͟??pvBmopeTg/މ,IM*K:ԙ}H KX|gAt$uV0[n.r۹s{xX~A߭ӱwǺ`lʔ)>tܿKӴy/5 QG_]bEo7_|aukbĈ8BdRɒ%#Ѐ::7B\{H@R'kIH nH~tNQI <+9@@@@@@@P_/7Λ JP0      $EL! d@f\25l̙Y׾Loh \3t;&Q0_~nFAArN)h<\yOVUZ+aMYge 6(Q;6tPksv T RJ ztM7E{iѦ`r5/^삄oXǎm.g᭖tsA`?~[QF!jajլy.on lٲŪT}׶cAx};0|~y睦TA}QSf+իW&X(PnRJvj\ҽ+ȸ:P /jժesuڢE {gl͚5n;}tK\_l߾{4o<~;g[v믶iӦ1OG4h }ϮΪ+zPQIW.]>dNl7zjkQ{2S .l_y߱ Ң?fF#.bY{2|pSPX(ܛ=}ڵۊ}ٶbŊۑeeb/Yu_^4h}g/u[c ]Zli{w     @<z!۰aۤVo! D@@@@@@"8Fzj7`*Ydkh!/vgzOyD@4@7|6<n@HU` 8E@ GqDN"@ TP!_#}0 3@(o Q`&⺷ۭ<.8O?~5F  6اOi Iת*Dt饗[_q.mPe ۞ XQ*>E  p'HԩB9+ Iu.+8O?ԶoV;C>tI6c ? EPg}/^VֽT~ zr֭[zogR`a{;2d.]U9 Lҍgl/ &ȑ#mֶm[w_44sLF:XׯWSP.MZUVBk :tv{c}j .{ɒ%ֹsc9&ϼhz߿ Ԭw})S E\}yI,#!@ģ?聾}71c#Z^T)իtM{}gO=TU#SꫯaÆ-Z˻瞶m۶ڟԐtGKfW{v 'ظqw}g}UZzOoݺ}iuLStK:gBB@\Oq ܋`}څ 'xnxlm @ 7G}^׿qڒU`d@@@@@@H3̤AtӚnZ&$R%q1u( @"/xMݬk @HMW%! @V h rYi9#9i(d@aGeQSiJ 4owǎ6w\#lz5jX߾}M+ֵ^k&MJJRZ g5ʦO30ЯV}NEQJޣí]we˗/Wڰadɒ.H*ppmns̱{z-फ़G`Xciop=;,L=I^ WOoѾڵkgo OQvGx*@gǛW_oM{f:zҩM)HfL{u@c9MGbo(f?*~k >MBA3xǂey{%PeaY}޸q1~;ϣ𯰺t}Tvdb/:{8Ա=:ukf7p{Oڵk?Ωx~)WPeR &4-Թi= ܋`6 @ VD\gkX+0p@z&]cWNV J,hM@@@@@@@bx饗K.qR@ϟo|lnY#8x6x`7{ʔ)~?8@tyyL~L׽E@~ {{ӉPH$^xJdyl;w&M… ʯ) rW kX ;GVT=LTp]N~(УВ'e˖9gERP̺u뚂k(Xf:Ls::ƫN pz=֫W/7]X#^'r;oɒ%b/_޽>^X:(EvxF<7i6k,nٲeھ ?w\J*[~0~Q3XbAYMy6'hoh^۷o7]իW; y 'woݺ{\% ժUݽO>n'uQƍtjI?*z0XrB&m2ٛ_J>|/IWL5ޚ5kEƁ/(E^4j͛g:5k,}~C>c;餓2: ֣lKضPB}g\5FVp"9{v![%*+gm@ 5ztAm6{uwfT4ENn@@@@@@@ {N8qƍog2         @ 4oܯ͌3kτ;:4[nO?ʖ->&  ?.!%N@w+%[:W%K@25pM%JpA0IoiI{l hKXʋex7cY7׃(H#0i$W-:S=dLdb7)%2`Thb^45klXL\wɒ%.Я~G7w"uF@@@@ I p~Uܵ^kXt       }jղF}׶yk$-B@@@@@@@@`3g̚ve[CNoI'O3     vfgLA`E"+      doÆ s 7n~B@@@@@@@@@ Zhn޼-ZD4ݛ |-X9\s;6MkK@+}QUCjTkM5e#@͚5g4{|+V7poœ={-[!wqV| \Z{SrPQ(i&>9;^r)%va&Lp^5m4D@@@@@ !ϷW_}mrֳgτ+%oiډ       hŋۮ]L~I   @*4۪UlٲֶmTT!m\~}W>[J*Mr"ͳ 68FBi#    Pd[ĉz͛7jժy @,y&f̘AX0n޽_vt[oesNKe @ k+)ڛ+vf@2eG݈ =bR}]O?ݟfH@Or<( tu=C/9Δ'O-[Fx≶{dv=  d〤v1Hj)Hw;vy뭷Zӽi]?r       l *X˖-믿9s/bիWOv5(2X~^x.\h?;0ܹ5k,_^z%[xqftŚ4ibO?mڴeQݻn3-;cL4`۱c*W{mذխ[׊+/?le҅5ktm>SN.Jj׮m_~ymjՎ;.~X 4 ;.m_F]cM6vYgk.ZYT)w֭Ç#1Ν?7 .8YÐ3>{4`K,V3s3ӧOO>UO?;ffC2ݺus=X3T@@ Ds^2PR]y +K7n8*yŋ[Ϟ=.yrw]=㌄g_ucxfUVSQǓQҸ'ch %Iꪫ0yuFp}] {„ N7hݤrw^F>ýIov60=ܓ'د&\z8;.˖-3]PVU\/ 6jZj`> 7xh.rݽmQ7()rҥm۶mϳҍ?*wq)m)%K cVAk7ꦭx vd_{O L58o_V    O 󒑜8wyοM8h=4R`_|/1c=>(⁁.䒸ME5Wa;vh=+ݚ7m[o xv6 wy_еjJzgb "@͛7jpRz hSN9'wc]SDB@@@ RKw@    @ =5DFϴ,\]~gO?O5f:ugd֭ |[PgyƞyxՆ"Ym5́AgϞ׻FƯж;?OݺuzmmSɻqF3cFf;w>@~ڽ{_~]Vxq|ʕ38SMal@@@ mnVS_XIc<]Rl͏@@@@@@@ 4xZ6vXf>I$B4))plذ_ϟn\ؾ}鯠T~} nWZC~P ඍ7+Vooذ.2S`V_RJۉ&֮]/S+dv͚5vWI#Im?کitʗ/o/6LdɒBQ<6 .͚5sEnٲd?0]vZ9N /|VX1O\a \yBzS)ot^z}xIS_9  PZ5 >@B@@ 뼤yAB% 6mjqRu8sќT'|s:WjyN:?sϺqW$|~#m߾͚5?7 mF&=709 #@f[.\*m۶t&9#`$D$Pzuw>զ,I/0tPS@{]1x`KC?ҿ%@@@ o_9O3   }sqe Ybk$-B RqM?i t!X6mlٲɓ'ێ;3l}&L7ɸq6{owM{͛7wGzmո,JF3fkxh׎GF3駟Lƙ8q qx;B_]6uKeʔ&cS  DI"6E!${>h_~y>}J7 @@@@@@R$uPP,dƍo߾/s#ZTՍyYEC7(55iĦMVM0Hku7Kh(.{ӧ 6ݻuYW.dbРA~ߛn~S/)k<7+RPӧm Y]] ۵kWkժGA^y\s |G8K^hQ F3tw;iҤ,{<8[t=O=Iaz1@L=zt7#  RxkK-JhzQVqySu8sўLQF.dʕ@yb}u.o֭@$]uURilذ4hRɒ%mΝ<qRR4 @@l@M_j Twljc6堃rn{е:cƌɦ&@@@ ҥKKb   ^:ӼI@ }M3@{~yD4 7`Kv5Ɖ'+WYfag=YxD:t=SqM"p\>]ül2W9K^K^7uFפ{iĈddž f_/. fa+@(8 e @ hM%ž       d@R]vQ J`j A (xn8Pׯ_@_fMSPzפktƚ*Vhs͝;ϚnIF*_)kN\q۶m*.E?mGW 3 ĥn$Z+}ˮ W;;xuˮ]r8p5 /^ӆM +˗PHmT C~ҿ+ /ٺuky7md)؍^- yf^<pY:˖-OnzNFZf3OᄈuXH'+JǖӧAIee4i}>n߾_eժU))կDm#  PTt8/9rH?.jq$43`:C~KuLDUۉIaKy簕aA\R}!y x:S5qƊrI3 §s ()y[:3o,g=-k&LKho<%N2ŝ;THgO:վ{۽{7GH@-f̘O3ֻ&C8 @@@,Yb^߿e˖V^Va9   @ 7wUYD_1VX||~~Z֭йsgZJy۷9kڮtgcq{7fj,zD3ke,Pc&]k,}7 6^!^c[>Uǥ)]1O۝GRy ~߉ć<  1¿Dt5f        _N8ݟ  4TBo2i\r+^[P}Ǯ*]<&=*3Sx$o?+WΊ˞f*vΜ9yo9,ӓ;yŋs==_^qUV*^^yD _nF\5jȽW@݌څ^X``zU",WѡC/{~kӦ3T7r!VZ53fLX^=Vvvu}îQ`$zUTCnAB_|/nhҶ|Сk<4\՝ 7onUVVZ.~ƍ]٢b1m4>pf8E5B֬Y3wxԟ>tl)Fp裏\Yeʔ/֭k:ݻwZjcJ*+o=qc7?pf*^3  @: xRq^K/%K=qIizjdL:׮]۝[F5 +,;pґHUE R#""E"Mґ*Ez;Nݳ%y$Ld&3߻p>֭[6(t @0|C[ߒ;wn0!^t:8R ekذK79r ?|!\4iR?MDi5V懺Ν;K9ZJ#tt__F>i%*UJ]D!Ù!Yn]O>HݻwJ,)/*o88²#I ~wU'NXn>7n\!      G~#~:WHHHHHH"~Q5k֔͛7`N>c #~,Voϓms⚜/){{]c1' cgLΜ9|vݻw٨u+H  0O>1BoO\@x-&             pnmŊzK pH cƌFi畮] ?x@ dYn͚53ڳgPh>O@GKoY'7aŒN<6 !H CǏGQsGɉ'd˖-(Q"]vtky< o |{СC֭[*1&L/_,ӦMS 9ֲeK%R~QuO}Uի`1 {C^sD@a"0qFr1d,/,k׮5D1A[jRHċ{2ܵjՒE xAdK.GI%x.h xxҥK\ y-]ٗ_~)}Dý> uV:o\`L[|HCl3gTxg1?g~)WL<|)S}AI&ax6z;Q .zve?tU&#    P /%Ky V߱>M P.+־^CH{ɒ%*WG 9Ù>g ju\ZO XBݥm۶+(S}yAWI &H@3ƍ;,/y>+e4Ն{KG}[:7Kokeu "Ǐ F/pF5}tzF8'a 3f>{V9;w]ۼyT_9 }HF$8 22۱cΕ&q9.myh#     :z<, ,XHsh$@Ecr1F ` !pw-mڴRxq}j^XüjXiwSnByupO~O|&}3+c5kZ֯_/BSc EqH؛1at|d1O?w}g{Tg̰q0W^qͣp+kt2ucʖ-_v͜\~]Fb >  0-= +WlU_ PW<HHHHHHHHHHHHH " `9֬YP)"+J xEॗ^~GiѢE0] /Wx#aYh4}xڛvI^uD/= ZjpTR}7 uvjh/_QV*  3`#xӟAKN}cT lM4QjτoD^|y۴i7N6$IoN܂&J/Oe޻w 8P~isNٳgL81F?YfUSѧo{mڴQ,wڥlԩ_H4eB F$8ٲe(8VA;VLHHHHHH 4`!`sAHHHHHH r P7r-k5&#w^:6mds<ƫi:M?n`w)R97k?"6?# 4P_sOJ֬{5`*$=<'tMc}]5pQ5>+W.]-1&>`˖-3* [mUZUҦMkmɺ-<)7g? \A}tq)?KVX> v2~@:n hxw۷{|Ѭ% D|3f([J%"r r)|chΖz))SԩSGjժe*v,Η_~p pÆ st.!p Ǐ"=z$FR_ZٲeO/B͛'4 M*1ELЁ3~[b`m8sI 9zh1&Ӏ68yjyD-ӤISKXvQ 0aΓ'ȑC:w&?~ܘ4[h;/Нr2 (3Dsf'Vbx7T =ZHŸ}ǞiV3v(}9yя}ʎS#m?EO'O|pڒ%KWw(-^iZm}Qf\O('NUs_ ):="#G}rʉkd<}**_}4 ?Q'{=7Cxh$@$o4 ]ՖWtH<#}׳~02x} D#(Բu+|[xR+чr~X2yX+Q {ː! |ͮ?ƽ01W\eE:LBvŋ+ayJFlٲrOdq Χigmm+XaVܸqc-ɓ'Ulٲn@NadϞݺęA               3g|Pycqo?[ СCrA%ߧOU=`H7tYeG4gheb촂{1}}I_  a{88t9/VY!    fd=bÉnݺTU{ڧi_p VR@qʕ`g޲eKJ[pgh*H$E -o޼i\ gA*Mc:/_ }̝H9&5j(_aZc ~}k!;#wCXu`Cƍ&&JH]O/ |@ԏy@$pwcҏ9brg+5Rs; ~K͛7ϘW82gs\ܽ.}SuP Ճk֬"6w -L)YA@vjƍm#['q8Y4 Ν~s.]Wpuh>X`ԗy @.}ǂv?'YJ$@$@$@$@$@$@$@$@$@$@$@$@$@AOs=YN9HΗJ@\}„ 9 / M#C*THw0J9SL{9jJ4ŋ0Wc1J?#-[T>FjԨTtԊ2suLy5Qzj([o۴i_XOkР}o@ 8ǃ|_rtܽ.,_s9|-L # p%6ŋUˬCZ(w(% I$@$@$@$@$@$@$@$@$@$@$@$@$@A"P|y/rbŊ ْ DYL|AvQ)SxՈ#c|Mc=+)STߺuK IH2ݸqCmH:UT>}HӦM/RƍgT͛'sظq1QKGصk_jx:8䗁? y, DLxեTR{챩y6F(ڗ$@$@$@$@$LꗬVKc4hܿ߫j8>Mw*(3+ :T! ݽ{w aIUTq^ /\P:w#"@(#hg8Ǐݻw;< Ν[l8p@ jbonUb6ܭ\,/UoUc֭[m _^8*U~kNNo9l0ҥKSaI 4n}gI@UVRN~7! #}׏xiӌcH#h#>(ڪ D8iӊ~ƣ_sh$@$@eZXR9}@  B)% 5&7~9s?a]|`!|lqg1pK>9<>`vT@6&?D@\C̃I1RR/^UV)qԣQFү_?u֬Y1myg>S|9oU۷o7i"\9 e( F, 2GIN"_ޣ?S&             %SB}lxw/>a„bǏ7ռysc=+L̛ݻw hѢj0;w9Nɒ%%uj2+6kL'Nlb_tI%Kft7n\5gҰaC#L>]n߾m揍 օX &PNBxf6iļ[pu<b0 (5//Q,X@ L4)v8yqC\P? n, @~ɏ?Xի=cW}?e]*!B9رc=\bćx֭[K,YS>}(Q`X"r%ʕ+'t!ٸqoQW{2K|3ܶm9sFC4Й={V~iݮΓ<_Յ0;Ѓz[_]^,Yf_6[lj̙3,l$@aAb8bF,-qܸqj"[S#Hk׮SNys(!UV5j믿ʦMm XO|ߵ>uRX0׭VZ%ȣI \rE-[%gIH9> 0O0 bb?VU{bI kL.8~'F)SF2f1fΜY2dc_?THOEx(o!/F8q"~i30FჰjL~8 A8̒"c_}U?G*I fox8qBraK+ Tf̘a˙3 S|9MiKo߾6i0A`I&wjKHH _ٞ={Tp/g?ϋ9 @X\Qn->epHCܹsҩS'NL N$ |';zh*]tRxq 6uT[:=Vx'  ͛'_mV 4,$c ͓]MZhvݺueق_|Ya5 ZlaP&͟?_ ƆCTIUT7n诽>,bֹsgU? ypkGq$D zڵk,Y¡@7_~&|͚56MA$wD px '0<༼iӦ'g **U*/&qxFc 0<p_jܸ`U}Y頍{E ŋINWN#klxB<|ݻˏ?hnMV {~<2dN>˗P/enӦaZT@IDAT4pm㹈g5KtQ% >}/Y8!4m} 9^:cT$@$@$@$@$'VKڵ˦܇u[UU˓'(ƾP;vէie+\wypC~@?Ҁ-ݿ`(*THCLqZd~.]O8# 4;w7ސӧOBO}~NF!ڶw^K/!j{_%~+1ޮR_s,/pPHHHHHHƖ^vM(%J$Xm     ӧO7*JWH , X=&WC(P>MJ.b|22`.m+VL:YBc`z~0R뱼6&M[EX~1ڻw|@ҥKU _yqʡ<^;XH]Ss"~mo0f qH7IɓB`]>}?ųdɒ2h @: '{뭷ҟwjJVZDT٣&Ə_=q9 ܷ06S1ɒZt_e~ʕSO)fZ`aq"ElFv -!xIJ6o>ǏW? g*ao߾9Ce)+_ʝ,Y28p!)Xk]e+ 0ۑ/ Hf۶mѼp?HHHHA~E ~ ߴb3v]95-n(;uPe(9AұcGܹܿ_'cƌo˗/8C+C/ 5* }֏E89r" >Pĉo}SПA0P5a.C֬YVNͳFzZ™[2el|<]fo˕+'+WVpzXbE{>~x㯿jIˆ[^O0:qgܹsgϞ-xH@ƌ~J$Lv\D1;q @ܹƞcL64vmڴ1%ڙ$@E o޼J> 8'0j(㏝G=y1b4 %`\3  1wqy6vA. s-[la̷~kCqÂ(٘`9~C߫Fyf5Qoek`N>H 0|W̃iѢ;g ~pY,Xi6l(ݺudO}[`3ɵ~Yv<37Y>W\(DHH> _D(k-OF$@$@$@$@$@$@$@$@$@$@$@$@$Nz!v!,8s<Ѭ @ O<a:Lپ}YΒ{[w B 0Hk׮J$Nm|SN- ~ D8&g/_>%Lk/ˆ:)no%rhG93 !&ISfK>asB<:OWK_/?PTCLpĈ0^ZM9p!Ĉ=s9|mט^4mۗ~tͪ9 MA$Tt !ҭ[I5fZBxwJ־`R̙3sJ=N:E]:]/}! 6r9Kۦ ^nI`bfg x:>HN:؏cѣ%SL0r#ݷzK ?^3gY9",y yz[6Lˑ#4mT~Z&N8S1z]/u:ØPK    UVK[7 iT3mBG9P zí\:~vɓ:]c _pNC/u:K~OhC X:qvĶolG` pJ ԶN/pOGB ,P}.]2J*/!k6_󐎷ˀ &Ady߾}A^mf&:ۥ5mu}<98ƛm{A9sf׍e~]>Gazx  (=zT{7ZH,_WU:~cI%7ݥx$|X+"EX0 {ܹﺗb]xQ.]2r/3LaBl'b1I0kss:ysDa$@$?Ļ?{g̘a$x4 %hZ9&ל>̝;W  ƍݼ[ ~! 2 湩~ݻw ϛ7/!k6_k29mNKai"ܼnѶ8=3bnߘ_jNCzΗK ]Oߑc![hQ5V~ݺuh+U4h@oXwH";wƷ3E/oKmٲE+O2EBq=Ad̦}'04!w s`Ai$@$@?eȐ!*Q|3/-0ǁɊ @xה[`ΝJ3|kÒo&yUEh֬rTÇKԮYfIEcX^$`@ =7!$KÇĉr0&dϞ]ŋ2韛J8G, gٲeS!VHIZ^ 1a4,YR6mڤAдD* ̓Q$bDQ|H2=dJ>mڴlNÈgϞULL>0qnݺ7nT}M  Zsɞ={_~eq;|bŊ8@ׂqϰnݺ)@kGyӎrtHH  8q$2 @(p?޽{.YDUJE7ʂ+σk126ɨW,#x86eǎruМ>E9t`siҤ +k8}l.2sݮc|HHHHHHHHHHHHHB@ժUr,_X D͛ /{СCT":ݬ, &{\te  Dhk W5H{ļKƣH"Yw_a̙/P|葴nZ|A4b ñ3b      @NaZ$3I"|IB@|6')g˽kNN*;vݻw˰aäK.X$@$@$@$@$@$@aI,ԬY M$@$@$@$@$@$˗/˼yTtIZ;HH8n3/& H {ggŘ$@$@$ lڴIm͛W}o@3             'PjU?~]~TR%+ Zn-*TF:.\"p=s,7 &3K2q|icIHHHH˜@N㋕E'{cdE68A$@xɋ/([lÇ%Yd~qرcXb#ݻԫWOe~aIHHHHHb%pm1c$IiРA0 @6mܽ{WUq?~ KN$Q8nڳ1bl }VI$@$@ pM֭cႹ" fn$@$@$@$@$@$@$@$@$@$@$@$@$@aL-_ba|.Yt  -[VNbg$@$@-Zhl۶M͗/Xls8ZXf HHHHHBPen~G$D"|I@…ǏeǎR\p(6@"Em۶2bu|h"Gp @;w\zU~4ip M$@$@$@$@$@$'7onsHM=;/& H `Ž?Z|[U$\ @ OΜ9]6} )/`pHHHHHHHHHHHHH\TĉG=z$+VpHHHHHH $ $O\؝;c .j۾};~50_W͛'Oŋٳ^za^+H_ >C(.gΜK޼yc=zTo\B.NlڴI6l ۶mHԩ%[lRfMUď_;h vO 7oJ„ O>qם6t|g$W\K/  mܸQ>,W\3V\YVjq]}ڵ$K̛Cc2٪ٳ2j(3pMۂ ȑ#*8AҾ}{(r%} (ƝGUcǎ)~x8'frq~ҤI#[„ <vl_IoKfö#_sCבد}|(cǎ7aرƱڵ3W  XiYd۷I޻wOF)]tGСCBѢE8b;wlAÇ I,$jevյ9tɒ%JoVdϞ]p~ټy8tFW“e׮]rҥTۂoܸ =*@ǵAg{ɓ'=|̙3gdJ<,V(ƵkdÆ Bi$< &{Wc-='=lNi'ZƝڅb}]j.li\;wСC/6ԃM>GUVɉ'lmxӎ@?l7nTms9Jaؽ{T[kM6޽{ѣG:8 phy&@fvFiUV:WHHHHHHHHHѣ.ԼXbҸqb5oHHHHHHHHHHHHH ď_ʗ/ InF#                  P#PhQH[n5ֹ 3BgϞQ1ւH `2g,="EV3fA駟c5:(= PJWtRjU#ulk%KL ^ZfW}Y_p:"D}QuJ*ϟ_V@U_|Q֭[g>D/^X3I$;Hl٤lٲ ռysɔ)TXQҦM+SNf鵡9s{ q}9Vz2 \QM6& K\cƌ1*{\!,lyv>]Bm㪆Zf^nw=p/W\N: n*SzGO>ro/`k;kK(!ܹȑCr-*Uٳv_QFzVT)@4[!zloEݺuUm=oݻUz%KўA_=OV#X͞m߾]}Q D' .Wx 1bDF'qjݫ c @@'/_< y2                  ~=~qg8qbUx8ټysU%&*NjXuE &MxA?sca1"ZUƌUn={X 2l [!?~|%xW\)nrN8![lDIڵK`ҥ!_qmۦDx5y@?7iz:αcǤN:)f7nv'-Aha $P˿[ڵkDTTP7#!P}{USbSƔ)SP&M2>P͵ -[TGUxzj)X` A{{}M`i6s^7z8~F3aZ&$@}6liڡ (i=Zbh:h0aBU˗/˴ilsa;~gGO>!C̆ =}tAna1cϞ=?m;w\mSmsHj 7mrfB7|c:4         %Э[7rдiSy嗣F՜b!t2X             `v@8g,% D|XEM*h!GCw׳g\… J ˫ 0֐|qc6D:w,ϟׇ,QӧO[oe.\X<(Z6olz%P6t]N*&LPS}]vMc=JHuJ8\z}`>}z7ް Ǿ ø0cǎUѨH"'18k!Bfc{1ɺ'%ce@@?Xbdƍ6v  >lbYNw^8p<ӪsNٳgL81F޶#t%fͪo>C]kӦk.U߼L:]VVZeaرcRP!}Ŋ,_mr#X D̙G?@VfL$@$@$@$@$@$@$@$@$\07Zh`)HHHHHHHHHHHHHH |&a3Fĉç,iXxQݻwK)m Nʕ+.#]nٲe.p' \x3e   "pN# p'~Y~ h$hd:A| NsSO=ze|"39K}J D8'D?Vamn\VzРA.c6Ϟ JJM@ aՀL2,Y2n0+Ɖ8qBF-3fPa]hڴZ 3o}C,|$@$@$p`fϼI$C_EҥshF70'            Hp3n8sr&4AiׯG#  G#      of]H `_? @bŔcvdžk_fL9(ƍ+'NT߿ԭ[7D% 7o.DLDA!"in>doAt*I$cݮQh$! ۲e\~]#?W◎.^|wJޟm=d=_ "A~ߴ$9G#HHH < 9獥&   Qd׮]*c1:(:%!            #ZE^|P7N^aRRHHHHHHHHHHHHHW>+AO$@$@$/l ~ ?~%&N8XǦMđgDU!7|#-Z5Bp]K4x+TgEXV\ib]~uKk! aXGV@ٽ{@~uɾ}TڵJ}ERȰP,sl|<."00! EhΝ[ (SNYYюyL0AVZzgϞ5ׯ_7p1 cn˙CMzH@={믿.fmK         'kzR7oVĉ?z:*Ţ TXQ9Sy,[1($0}Y֜U&  s;>_Ǘ) <HHH J bdɢ6 @$Ȝ9Q~4PpHHHbf_ԙ\(ٳ̙3G8 [naÆIΝC, @ o^T"` i˖-X$VZ֬YɓO͐!GCؠ`k.U^}js[NU D?Ѷqvć.s|.J>>QMO?_H,,3_6lPB.]r:{sԮsC-mrKA1!7ui׮S{BqIH"y.2pFY  @0?K7#pNk׮rUYfjܚ  uI$@$@$@$@$@$@$@$@$@$@$@$@$RL)Ŋ7*xOH*pHHH:x_L @xZG# H"t6Y  -KķRq,ĉZdi,!q'*qBgIB4 (\ IwBCCRfMyꩧ,_mΝX֨QCBȈ>Yd V`Gj`4|p  <حӥK'Z%Jȋ/Yb[+Rl%gwYťp;38pҼys}zNqGheƌ2zhٱcܾ}[oڴI;utůqG`,nĈ mmB~DՑwܸqu\Tts^PYaflٲX'N*hY 3fQ֭[\! ll'm~b2d{,o-dtR9yŋ2~xYxݻWRJemޙ_1)ZHJ _DJBUT(dR)i/~w;޹sz;gΜ9̜;s9( GqQKvڵ-[ͫ6lK*~iL/'LVnލQo7{^7ӦdʀjժIg 8:O' #IHHH… eg5g$9E$@$@$@$@$@$@$@$@$@$@$@$@$@IBt"'4HHHHHHHHHHHHHHHHHH ԪUKUСC/SӮkז~XBu3HdiwXaH gEׯ֕*U*ϭE;6w\7oߪ\:H#%K;qz*UHJTvz8?asqڹs@DIXvvDPg Jɓ5kViݺ,X@/ӧOSǏjds9GϯiLâܹs]wݕ4XuH s{BgL1G}4y $ '1 S|N3 $,˨Q}0aO # GQ23 ā`}uŋ[bq089slٲE0a182A$l:t ?lܸQ^{5y' .ZRB8q FHHH@+J{I=sVM4Qѣ0@  ,ѳgO%ˠAdfqbtM2c _dȑҵkL?~\.\(7δ 㲯yXm" /DcZn-<Q޽{[ƍ5k]7oVĶU:+˫D9H^dɒzZVPA:Cb@;P{E\@|B{WJ@Y#NΝ;U{ݥKeڵK/=͟?` ~db{)%ze%@-+]uF:u}dҾ}{ɕ+.6r޽13Dqmm۶Mfؑ+)E9pުCZH 5},=!Qm0Qmu`WE@y8X=Gqg[ϟ/J6m6&J"=~}L.#}1p?nH.s̑+ꪠMrՌ֒ 8!}l{޳S1pwz]}9S=^z++ l2i׮EbFgH#Wna_>).L8ʔxEr\{,2^~xu)1 $@$@$@$@$@$@$@$@$@1%ӱcGUVLσG37 Ik{O%$70 8aҤIr7U.IHH>`|0̀HHH *vܩFpJ$@$@$V Ӫά, @8묳2UfB HxJ "3gNw1/r9ӊA:V?37N0A:t萎(Xg g.ⅈ l $ƍ˴=ܓ)L1ݚ*}nZ<(FR3JO֯j93HNnԟ}Y%Q{,Y2gقB֬YB2f#H!mYsz]~r `~Gu}'r[ *A[]v)\]=b[pH6m̵HaՈrRbM/#| *$;v*Af߿B}J&Xf9~I_hdɒE7 Pu]zvgr 6&Mȗ_~)+WT sV|x= K,c2&}/jֱG2q=SXGKS'$@$@8@N$@$@"/cE6xد C8Ã& ׫\ 8 ̹v:,$@$@$%R,HHH =$`jW֊H ?*k%#:u(ӧOŋBv Mί\{ݻwf͚ 3 yŌ lpd}ˀ]%q @ +VvڙI +B,XҫU&w^<^]#H޽ɓqC, u) =zD0n)X0Y%XNf]'5g Y%~u04sg$^#`?]^y͸=2-܋wyLߕ3~ uCӶWoDZt\/GtPee{}]6mj7uLr-"^xaj '{gT~I! lذAfϞ,U\ o3 $pN=4%x>2~>_|Ug^f9$r=ի'u)9xulٲ ĪD 6vyX)Sȣ>(W/wH-mC>m](ҽvvRn׿Nnz8rׁ{}@^xj/i,  D"d.2  D#3gD3@Z8ztb0rH&@>?HHHHHHHHHHHHH YLY &9,OFHHHHHHHHHHHHHHHHHH @^P^h~CC2a%־}{/ $@O{|Byʾ}2e3y2m #/s*qkƍ%_|Q.(dI~m<^dؾ}bz%qƂ-[n;v(:K*qZj%D;H8rܸqP~}9}v_BS'~mu6m$61$꾅):8nZ}3ժU5ShQ>}~X(ښҥK B˖-/"۶mbŊI-cǎe v…3aGF#ĚW.@w;(Qe*_2 Nۜ#@j} }yJg$*X$w#%oQ9t萬_^vܩ/ޙ|ٮ=H"vذaU&{u?x&-[) Ϩ^&ex2}'uM??I߿_~$}Y[ZM$@$@$@$@$@$@$@$@$`Go߾믿M͚5;.~             #gx=urIk $@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$(֭kpB+H1bFc mҹsԯ8kH$p DYR%I8<2R'YB2ڜ,ligrȒ%)SF}YygJ c9rPMW~6lNYW>,&MR9s-_d  hX4/cqOpB RfM'Y.j߄P FNp9r =zHpi VX!FR̙S^z%D ke$@$@$@$@$@$@$@$@$@$@$@$@$@$6js̱⌐ @"(Q\pʔ%K?fцȗ/L8Q<'M6< Ďͧk׮3ԣ#[}=bHbHT aPII7ސC)۴i# Hzh tO*' lpB:ul߾]eB wb         !Jǎ9}ҥKLR"gzY?             6 H\رcBhf$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@$@nԭ[W~W9z,_\j֬*y_T]v2o<ɚ5kֆ& @fǏ'Nd ~Zto@` `;5,8>}ZƌcդK.V HFnMk6 DeG" *ֳgO+ @z?~,^XUB ңGxԒb)r"Y              ș34lP>3پ}YF*V?xd                  #)Sԅ R׏O:Tsܴi,X@F%ݺuKj~$@iBcǎҨQ#W\S7yl wNƽ҃Yd7d|I3Z 8%nV_ sYSoL:U֭[ +N:RHHHHHHHHHݻ'TfɒEƍ'ٳgO i PW x@ꫯVNPD)TA$@$@$@$rVX!;wyJzZ5k@R|˿Cƍ?6]uUdkшd9zȑCaHX'Nu͛bV^V݋a"mZ*Ufq/0HHH҈@ʕ嬳R'C!`ȣ>*?ͻ[/b @t ࿺竃`N1 &S* ]F<Ԭ)kNe }dٲl2Aˑ#G0F.]:-~FN>|`./jC>F [,h_X?S`Ne]WYp$gB0NN}Ax1~Fgנo>k9W]u%co#>z@KIows}~F4 .E ~@Py)_Ecveeenc<|׏0 z$@$>#ywUU)"=\:T;(a              O_>}=(E"PNpȑ#|N|sԲ>$}bjwhk}Zh_b}K#&L0{'}PK:EA>AO=d7Զ 0ù>!Zfݛ6mzzv 8goҥc_̐' )N=ztԛ2,t!igoUOQ>g<>f$\Ep<$48+n Z~zQ_{'X7m'Niwobiɛ7i[#GƨZ Dbs-vD:tizFmn[X}-syN2Zl΁}}Fձ|;y eϺp&ȝ.Ul2Mtr~s7buUF"4`7x4nتO7ͦm$wfpl8 @j9[R %J9,h"<I?M$C]Z3ku;m۶Ye^~偲 +DtϞ=O-z- snu|Ώ՜GMLy"H q ٳG|7PKsX-͚5oPGeӦMV C9sf n —+VHժUmK @ :O\YN*>q`E-w⛐g~?: lm˓'7#Wcڠ̥WZ% r~RF obvWe]fe}'**c?Զ/B| 8>Q 4|Gb'R! +ICΏ΀7Gڱ Ydɒ=id03V?g /SV LnT ƺ'2)x"mw|gHjՔiG[vo't r@h}1;qԱ|?իt{ʺu>tW !W\Hzm}va%0B$@$@$@$@$Әu?|䫯REN:'+>GVe1_~K7q]&ֱ-{NA i࿋/" .T}cࢃú,7xI>o  IKGA@<$;wZzX4Jc^1>VH@zPM.X@ʔ)㗃N gΜoHݺuؘgyFZh!+WN~$@$@$@$@$@$7S6mHHHHHH |~zuoРAtI 1cOov9v옪qJ+y*#q >N96:Yw}2i$X^{d͚U>3ٵk۵/?cQ.`Aoݻwv=_^#ӐN?# {9а8ӧOW駟X`CF^WOu? KVd4{W&NW$  7;̰+Cbsh) @b0)'ELZ!C&]qW܍5J'.;w, *qJ7T>UTKd8`A.]_: kϗej*REUXD9>|Tw͚5rOS_:@\SxNF?#o*|=B_~3 xcp3\ $:L6MGC.r' GN?#!OIBewIK$VҜM6Y{)k>B? 3e$@$@I40!o޼2nܸVq0HHHHHHHHHHHHHH"&иqc%( @NN=\:th_CoWu>}lܸ1b>liٲ^Z?|Uք d֭S0iԩ*;@h }-,8p$T\Y_OP.m۶ŋb"ճEfϞ~bw֬Y*(_^pKc~*:E3G}ꪫE* ig={v%ұcGe.}w2?~\CHgO;r1 .T*DV'<oF `x\_ M}kաbŊVI-[s& Ӧؕ sUemi:G'NIJ@믿[ivZJ EXB2'JѣG} 8nڵkչڷoݓ]^[mi{cy)$xqi;"[N0 @t 8駉8:B=-r8 zK')2eʨu}HŊK/?':#//b9B" vn YFU?.˗//'}GݻWўawwʕ+1YF*JH .철6|x@X?2 0 Tr):u ,HHHHHH !`L&ư I.A&1E=~LBH'|"jª e˖Dmsɓ'[1^xq>|e6Ήd,8;cOψ G1B?#Q݌}3~F쨤fZ,3krtR5*SayϞ= s9', ^DZ˖-@~@b$y]cD:l`gF(c H/աCˇ|xjE"ujK9 @ ˗O֭͛7"K9Yc;{Q0 "m-)sEZgG3g%۴iS%OfTbI/y1|j#B`?>m4۬@m&;@Tu۵k̞2e+j$YoݺuJlۮA|ǎ-x;4C#s~ɓGn)U:G qJ%Qpay738/PTREОTVM+UVg+t횅餮B V!pue:8ߋ/˞!~Pv|4nPmgyF bq %ܲ/'^^[nﶽ]:O7|`:Ļp:SuvPhݴnvY% @OSN JN޿<~$-ټysc}XJi8xK6~i/;vYfM>$\r%RH/]ᩧП>R8Kz٢E ݭX,YDZnoW;oя>-[T?'B0!֬`sW=#H Ue\k׮Ԩk69ro!gywaHHHHHH2/N u]9C n:WG$ 1_|0,:6:T%gIڿ?z- _}矪ݻW͝Q]V׾ (@bnƾ3~FImϬ M4IWc1% 'OYxn\fsH$}Qw-P=_/=WOAY˂ Լ0fjGo}6olfQ[nUi}`7t8qNRpq@pM!ʕKMŶ+W*a ch{MҼ,|={d:8v#~ӦMS_f4lКeg HᅴYwpnYu}.^[<ݶ;wߝwީ dq\{Įkf‰z玲p $@$@$@$@ A|+ukeˬ]0<Za8Kf?X>-j`#eGAvs gO ͛7e߇~q ( u￯>@;Z0C9^XGW^gy$@C:CK ZnK_"9 xKZGVk׮ $ a%B&M^z c !XTI a.W\X1;u!fWo2~F HfB-m۶ sv6-*x=ODЂ­ZRs4ף ,˸7'bL7<3IDw`H0:ɳ-AlѢ@~%0=H;vP pxob6? g#YL7~@pa_|`I]^pB yG"Hy7A_Ws< =$]@;ZjUA{!{jvK.Ҷm[/ %?s=*6W_URQ3yf-IHHHHHHHHHHHHbDT< Ĝ@͚5cB7ސXiN#_}'~ Fhq5xU!E8s$wܪ(^muf0ä`i[~J*P:_ڵv)MOA;?~v 'Zbz (f43:E]$~ZHݻdbeVgvC_[f~vG (QB*W,`_LU<r N6iƌ& ^f#{T;ֆPE"x!C /-7T=RJ ڇp,{ɭ;vDy ½I30h1 w~ &!@ml,&w;Z?UT Png~^O?Y,Z|{4̳pڇ~sZ8j(SK.DE_ZBXţ?ǫ~hg$@Ob4† "/gY$@$@$@$@$@$0Bw׼ys)_|:`IHHHHH e `35أ:RqH3hf~/`޼^zIc `H0:ɷ-VA>%>t2g;> #Xsk4;SGeԩV܌f~3x~@pp}=\yq>;C: ]({|gj|w Q9$̣?gXU< %]@dRqpoc\.|6? ޓ.![ $@I1h *TMZfeuIHHHHHHHHHHHHH UD+0(GQ=& 'x>@=DڵkDڴi#ND O+W.%濽\rӧOza@K…[lQ0bȑ#VVׯom7'{uYV1f 8JBO>5 B,YUV2|p%L1EWofel3D&7in7`B 1dbe؝Oݴ;{QB(C_WCzر?+'Lnpv0/lM$/f}7dSd"W\qU5v#GD5d>eI'/D^ j[}6l{j_|Av$ iӦM?~_۶mդ]Zi^GgϮ&Tr!hn([ !g"'1o>1 y%X2L5c>Y dZܿ[n\ Adž`/ܼy%>"~HG{ɐ-Z&>جBtT̺*T((+k'_Ĝ ac'ω:wlѸ_p]BzҧOk+LuФIyꩧK.gQOHX2eڊq3۷tA%C Eƹ{ o/p8HHHHFM?ilCSbŊE-8ӀãN ?lIw;U2eSN#|Pwy- 7 MjDm`a6G/ a ]vY~$].@>N i޽?C῏nv@IDATK}!6l "0F}p~R}*!J_` T!^F ;%HuQ|Lg\ M/p Vzu'c~_}zaI A`L2 ˗(ۄHp:.,@{ҳgO+ {?DqO @On:sq  9D _?#7|s&hHE9`izin]4z,'NCy,DDݦ=cYn7󤛟-l2'lPk{,3P?"o?~ TŊ՘oMc[RF Yl{s3̠ o͚5Mǽm1ty,>CL_+OlMDHbr(28%Ģq;IA}nj#ׯWUG[{Y}Bm|^6rI$ ʕ+ݛYJ P7g'            H9€q M\Y! .\P0wŊ &|gpkwy*MORU;$o߮q]j*d 8K ~q/ijғɵi㶽3mŤ;6 A8Z׫Mᶾr6y1N$@$@$@${niL+ex4A2ů:߈ HfTvpaGh0 WwV#ub[ǎa2ms$}0hxO K?'O8Bҿ??4c'ߖ@vz/2x>FʹEmz,Xwˆ @0x>8^Z҉]- `Q:t*XV\)7=k@ػw`l2 hl4 .IH ||mРAM I @%Rq$&M$HcHH y/С`c[? Σ?gZEv$6]S[3 7N֮]+G(T% @ ذazN?tP{ 7nT~!A.Uk״ "ʗ//u0tdbm_:"mwܶw/n&8Gt0)|΋>tvoͺ1N$@$@$@$8BhKp&}UZ,'͛[پKKq%_b~jЭ[72e̙3G-ZDP֑#G;wJ~zЯ^K .'MJZUXQ ]vYA $}2ѣyܹsU_߮]Dkqw;~x&c݇:xb9^-C$h;_?7xcH{bLg"8g5kVHHHHHH u 2ĪOFm gqlBW'br鄵 t32~x0|iذaS`to[,3kA^iѢEXnvԩS2m41~NjzpS R SAKgntaL-ڈd@́-QT^]/_vu>-[t9;w>x?[x;VC`(!^6Gڇ.? \;?} ͛7ڵkeӦMҿEpR{b'pB%qP Ҵxpc+Vqsv @2#F(S&I,YDp ¿ƍx G!H tUEO: @D ҬY3% @wߪ*V(_Ų H[p3ϤmYq $9j:y휦% DNRJⰄ-[(Ȏ9~lc'1_&sl{sy +HǂC1gΜ+W<+ n9a>67— h"-" D&c5yÆ C/^<,PߨQ#5?h/|%;CʪU`P"|=DRS3_?=~@!g7F(9v< sOdΝ;ͪzD '0zhY`L22pGbbn             Ip puV w]ȃ0 $0"E߯U*K⋨Y JQ9r<#'ڙ9uQ3$iN11<FmѢJXOĽسgOu5J aÇks.cݾ5&60@>2dĐ={Ȅ O?U "s 9&W\־fN7?Ot|X7sf6 (v"M)ST1ʕS]~8 %~lk;Lm(<'#+:`鵥9c펛!Pb;SXƴ̣L7ci[Ρv    Ɖf7Z}NG뮻NB}p'ME%++ԩSG}N8!|`9|i۶mXi~_:µӗV^_~eرcʉDپ}#b'sQK}{ڵ-[ ͛WoذaK/xQx,Xi؟IpI$J4hd믿N.݉'ӽ{wꪫlٲ]I: '@$@$\0W6ǣt.I@$@JflR^$@NO>rIUnݺ-|X%1RhÏ|&}Bt,xBISMB4}A:@Cq6M?#& ^}~F$oZ3ynohݺ(%f͚ɢEDlb{uvS'=N;>تIF^qBڂ$ǀO|/Ν;~0Q';ܼ SF1bc2GfΜPEhw,%KTu;v渂lñ+*UJƍ'[nUmwj;vȘ1c2T_"1OYf)!wTbСꫯ 9T\YÇVG +VpIzfIH :K.ReŊoC}-=\{C_Iʳ$@$@$@$@$@$5ka06;TA$@$@$@$@$@$h~':u2H"ҳgD3@Ds *Wzs"ehx<-Hyfkܸi q͙39`<ܱ:tPc9 XoC8옑nH F/ǾYK?#vT7-V<'N-bV/Dɓ'V-YV$%_Sz]"={6_$M2V{؆!ߪ-o\r˭x#q:$7nIQn3`elm6c9=QFR`LG]dI4LAV^/5;S )"aoXWgQh_ xFݵkW$2*Fd_:A}uf%k2`H u 3F[UAy<8u+5o_> @tT^]/ ;w@HRq͛7… UJe$'T`*œnJ*I֭*#֙#[T"5jPY1 ̀*T W\q9h{1yAt)۱cG+3}:ud \|+WVvfݓi,h`ꫯ:5͛+̟??nw&M h{H)!3e]&؈fS%Ċ% ~zIswzg33eʔd!0H_BQ 1A|YfLB c@u)%D׃-M_~%Xֈg\皩Y[o&!M5{ w-7ƍ͑i㶽3ooa&n rVn]k{/j_OYӐr%o%H5d[G! b     H3۷oSZc(DnHHHHHHR~j袋HJF$&hA}۷ܹZ7# ᅴIVYg$:+YJtl3[l\kvm1GuVKH{"yxn^eyf}2~xAeiHMDçZΝ;@c<+s CkU/7o^82/ $3g CrƌqFwޑMʑ#GT]] Fo8![\rvȔa>@^xܹ@gQb aD, l Ads9 Iyvyڷo %`iѢ%ٕ(s=Wm۶meukM/_^J,i9#\r={ 7<8ΐA3}`º׬fϞ&!!B8: (}l7#mw±Y3%{1ht}q&^z+XK!"l2i׮@t ;vHڵ7zB[m۶%JիUH.B/ѣG+&u=C³5?L Xh7``"!8WwnA *jժ#o޼Y VL³ߚ5kz/ W^>ܙ堭2ϣqsZʸۄO.ݺuSY!裏"^zJwXs+VB2vm{_O~ɇ~ὥRJ.7RV!   H(iLCSuk׮FDRVXG0]w]pʕ*tX-;*޵K*% N8.'z/2H"$Vv:N"}ҥKUĔ$ e.\X~Ydj+Q#TE`wLW2ůZJ9BB;*DWGu>|wD ~#\ \'|D]F uJ7z>h @b_Ybun_[ЦMOgHHHHH&>W=K.'OHHHHHHLcl0&S͖-^ҚcP5Lټ*׫WO x\˃:HZdݺuzLK=:c;/^\q8a_́]`A|d !XL6:D "dH<ƾH'M#|[;v嗫q7#  vv 6st%5^)"o 7Փ(7nl{=?+? [nzoyƣTB@0駟V󑰎_ѣGK |Dž 8Oc57O" qiFXjJx!syopHHHH 1꧁v/}Z:@ [85jz'{woS>pq)^26PJ"CЄ E%*Qi@zKMBDURJ(E(Sg_s=þg޳{wqc{ohѢ?ծhJYiDgq''qwLB*9Xq)~߉wPV Pz„ O_*V(:^o=c^`}5oBCuߖ-[>`bYk_if~>7 ~Tۧ:>ΔmsbWu'tIU4Pu{`d`o ?ɪM6k~' _ږaoa{GSG[K/ {5}`VF b&7B[wW^yE~w{hÚ'>C cn.=#t@>`n_uv[t{ʍJMhU 2a; `Z:A5د߼'m"{~ԉ|yE]$v  N|uׅ/j @@Tk5`&x-r`-[:u 6)駟M /\gN2F{rюc(žgO?P 3077[uO= .[_{]kmݮzuc.ovn#Gٺ{`Feq0Gǻ-Qbˏg컝&3R~zn5'߶L棏>2A3ƍvrʙyH6To__X)pއj`mn\u~ [8v[[O|vV9EսL.s('{p۵^Gak/oEpm[4ekX_w⹎¶1[yz΍7(Iڤu LB;0 JV#e@sޑn'C@@@@@@"?cs˗SIMLڵrZjҋ:vlX^믿pjժ@k BRf}kYǰF+pN@-H&MȼyLc09Zh?YN:aѲeL` }46m`zQ͛堃2Օ+Wk׮#ր|.ͻ{n3`ժU&`ұk.*#[@[R%iРE4HZѤ +@Hg+ۆXocy݉nݺE>f2sKD^zd<cio9d9LV%n@@ T"W/k߿oy衇sȊ<rҥW'Ҿ|ʹ;~ԋe;09ꨣ|)tsbI$%7v14aڟb >eʔ1:W}f:.Au3R,Vޟ h(o{5XNeUjͤ\_N'դ߯.\( ,ZH:w[fr! $E@OuPI'?#e۶mf Nc~I Pf#{   6kڴi%]uUϚ_;6Ȉ@8Sg资PMaj֬):F䟀\`)NH:%1H9bhTg$Եșr]Q,㙽gOǁ<"z^G5$?DOOynd8sErEgIYcԹ]5 ky="/*o>9O?5Mޏ>h6vyyYD@@@@@@YsqΜ9Sz( h5j׆N:Tx8-%G/{fCIhxՁLza,E&^xq9_d9W_% T`%l﹍uǏ׻bŊIÆ ~2~7qȀ  1zak2QAO'JuN[@[Gm͛ W>Tp:bEN=~ hj #FpjÇGũe9q@       !=\wNtGBIVJ(7ߜ~ ϥBX\`ʕ1?#>>#   @>+Du3;;F N=TSիW˲eҧ4Ǐ:sܹ2x!  *uV=zB۷oVz!  (+z4tP9c,l 66:KOƎy_#sGJARA`2h SygTRP5b 8@@@@@@@VnݺrGNGɎ;dɒYAHG]vݻczb:HqK)~IسgOZ{&}6A@@ { }( Hg)f2{wf͚90GI+2eɓYf/-[4i*  ,~7olJ+J*>@@@-3_|a\wuɮGBȶхHIY,,>4=x))"s)EN@q]tqI[iӦqJt o:-      i)pEҶm۴lF [ZiѢEL?bG&2QR&Uڄ@vL0!ʕ+s^2"If٤-  @}/O#='f92 ޓo< 6{W+/\-Z$tP  dG1-Zqtډ  d֭[_~n{G%+mc3LҲd 0v4xGn%+- C Fԭ[W Q 7j22        i\3g$ot|@N=T?'s)>?r#Jݻgjh W^yEm&˗O7B@@> x 6@ 5ׯ/|lذA>Cٳg+Ɣ$qvRzhPwyG֮]+W^y̘1C)zF   @! 7N~wsK/TW^Gx@@@D _֭[g{駟*p<H@N0/Ǝfɉ)7#O+J@6?$ 8"˰aLL8Q/^(ǢIݪQ3@@@@@@@ 3Zl ofFh   ) PV-9Zj)P     @z h3s5q``@@X &ofwJڵ34 @@F={H=d߾}C*Ud#mF@@@@ nvYlisƍES`yi5      $Xsuo,          l֭[[g͚p4hժN:ɟ5   @vaÆ)" PJ@@@H)zHkSN8AzR2     {'cƌ1,YR&N(E@MD%@@@@@@@ ڴi6`.          ) PR%_ɂ OZQT{QF˗/n!իL@@@_Ə/k֬1euAիK   +W!Ch qj    &yfڵc<Y{GY@IDATRFB;~SQC@@@@@@իKZLK̙#6mʀV@@@@@@@@@L8묳LS'N4v@b_e˚<)@@HΝ;e"E'R@@@W믿^vaիx≾Oa     z]w^T3ϔn!*I*@߄rs0@@@@@@fmۚݻWf͚@@@@@@@@@ >lFqs)X(@ਣݫgϞl2>    @ 7N֮]kuEIݺu3@@j_|ѝJ*rwgG@@@@ {9y饗LS+T <)R$N7 @@@@@@@?ڴi7c w@@@@@@@@@-дiS)][o%Kv8~tQwnjm6ԩ޽;MjO5@@@v)Ç7tBAE=@@@R^`ӦMҧO>p}@@@@@ V\)={t6~x\{ o{Z       h޼-[ߖ{&@@@@@@@@@jlܰa|wd-AF)u1[+ۂ*@@@ Ǝ+֭3رwq j   G[oכu]twyys@@@@2K@ҥlݺ4ꫯ$!`@@@@@@@H@bŤu2e?>M&%rss:nhw%   V`a2k֬@ O/)@J?w/̪X8~̸SJ@  =* hb iF^}UӺ7|S5j-Y~ ,YR&O, 6]vѣyr}(C@@"cy̱srrdРAIE@@(zKz)SxٲeeԨQs JEgS Jq )#ɵȼ" )(tUB >3gXLS7@@@@@@Mm۶&د['B$o="oo"Eܝu@@?iӦ@@@@ nnG_y(  @{MrssCJըGԭ[LnԣGSnݺIf͚iP{  3f_t%H:ug`+   @lڴIw?z}HeS١n -`a S>  {DѢE矗8 MȉjovF@@@@@@KsΑ~1cF\e9tL      dfy @JN0UꫯdڵPmB\st?.HvܙB5*   @۷o|dk }!@@@HY^zɚ5kLt^nݺl]    /cA.2ٳg)lҸq (Q1       @ |ҰaCoY<5K)"Nơ9& +pg!է  :KJ.#sH@_#8-] @@ ڴi# ,\9s&Y9I*7NKYd+y7SO=n͠   +0zhٰa߹sg]@@@6m ˗'x"DBYqi$ G{-2@P^avC z-˗/7; m 7z3r       q mBf̘!: @ƍ@@? {]wW %!   @RZn-GB2I3l@_@:4dMS,YR^y9e۶mOKfͤk׮ D@@زe SP/@D>e di'4,]       @ wyt"D         "Z+UdΝ;Sj#j׮-?[={ʢE,   "0bٸqW\!jJSO@@@zY~٫Cre     tm¨QZj} a@@@@@@@ի'UTUVG}$۶m8J`ڴi2~3E@ U~mSKJ>}R @h޼?kO@@ z ꫯF @ hGyԊSP@ J{T(R&P;D} tY>S;v }E_)SLE?    6}￿ 4()    L4INj >eܸq($S,"ZdS4Q1@;SOMR5#w^dƍ_|\uU98GIKi       w3Fvm&Bl߾}7,O?ɬY|.@n͛7Z KNњQ-@HUzrD%ew~t)X@@h׮ y "%M~Au&SLIǦPg@@B_mfZޣGZj*d@@@ ֮]+={t~5/ t`]f+PH-      df y g!p3d߾}i ￿ [|ySW^yEF U   @X_U{1Oɒ%ag#   @zo]tM6 _zҡCS:t[X14i+W.Ȕ=Ų@@@@@@H-ZHRd2sL&oN 5DŽM|?\}x$?I`蠃矗BfՃ H       @<m۶u'o}R@@@ kF~'gE@@@@@ s[>raY@ $v@@@@@@@9iԨ)}ŲrB:"         ^f:u z2i$ $Nő@@]`o>Sn~tҾ@@@+˔)SA+T /{Ubk@@@@@ ;wN:ɮ]z-m۶Mġ9F 7N&MA@@@@@@8JO>]f@@@@@@@@@d \p$MȜlR b:w,+W̜@@H[ykf_reҶ-T@@@oVr]\}1C&@@@ྋ/6W1"u*GM@@@D@(e˖I=63Fjժgh"       p?,[ҩSB8 E"{g}VΝ+:(fraIժU3ϔ֭[K2eT~YA${oFf͚֦M9cޅ˟)Eotw_?͠qNftRs:Jvp!C}rW׻ߖ9sxWE|I'Iv̾z^/_Q;Jݺu;_~L6-_> (mlX{4c[nBͥQFA[v;ݦyL~XM?Sj*UN}q%KwGҥKK߾}m#Gr-AO= ?JRL?` D_~|}]]-Z-[P'}w^z|eڗXO?$|gQϏkc?"馛?C~iw}fͤqXl,mg  :t>}HnnK2pl> 0u֤ID ym|HC@@ usw}w    i'0awL%:K(vd@ƂzPC Hڽ{s=wE}ox0Mv._,8yF?1:QmAcυyF>/< o@G`׮]:m۶J_uU> p.!!      $Q>u~(6;wNbM8t"v<Ϲh,~{qǹ03_gϞ67wӶm||]z1tlٲ~ e 뭟33(䱜nO?nի/;ܢ@1qD7|Z]pG9<`y;cƌq뮻|Fr6{~X9A+gO>q8ȸ-8}gΜ9r c![C=uf>|x>o3pkxj*w?gZw7mk[pyٓLb'7Kn,y Ȁ;rkfq9Q"@]tyYQd-]/_ۮ];rʦNߨku)qQcgM_~qߗś"2 dGa>+` ~;wn]|]kߒV~hӊ/VX1wܸq΄yUfMs^$vuܷӶo>WzS}2ϟߝz.ə,Ͼ_|wYk ȳO,ᶀXϯ:x.[{<'[|6>66ұ/hԩJ{5 /(oxmj ͚5s?:fBhC ꫹E1bŊ~)T;   O{߇   zU`j ju6ڏ豠3"3u3۟~<<"Gn F9~53=O~N_mcυyF]u-r+D 1g@: tMCtl+uF \s5wc=6wv$PLB@@@@@@H@ 0(6m'LBqh _gBwqy9RK֭L2LX/sb ٽ{w8͋ >UV ͙_-Z$ =J>9cLݵl"q3stAኈyR6l߶m8[]ǂs!8A 8lȗGWԨQC8nӕ,9AQ1믿n8_-Ogg`"ZoOyy?T[΅*Lllr& *ƍ oB{&[ɒ%-{9rE:Ĺx̼ng#FpWK}KvݦylRwEcZѦRJEV_u&M68 ,+W''p!r@^szʽ/k֬q?F@@@ {[ &!oR,}Z>\G׾8c^n\wuOwޱ/< Ikk׮7oN̙c !_ ZqǛ~a5MӦMgX/^,N\4'x,\Pw:,|Ɂ47N:)6].n&?֝HǾ g2=zk @jS+@Lԩ|駦)˄fцh߾sʞ={cǎ`{eTj   @ hA >]f@@@ k'ؕ;WM7${' +챠3kws{xö|xI` L2g+m`ٽd?s|.3ソ@ $/CRU`ҤI2aS=_|NB ƣG^@@@@@@@bŊ ~?8>VZP2E H[eذa [cD=#vU۞={=t[A+~׭[W Z/L@ z~,u&=W\qMtk믿^`IhPY43Ф%is\R%jyʬV ުC9EJhAKk\ |ܠA< A!4i%Jr"`m믿GnY~衇K.Br-fw `Um`zQ #thܹsu V}@@@@ [ &x=zߺuiwqtMZMU+V(gϖ5k5kD'5q*&ᇦO\$k?wyK_a~w[;w#G,E:R"E_U>`b~D g@ wޢSk߻;CZF3RE`С_[o%6l05tS@@2C@Ǔ^4m۶Ҽyh@@@P@u읦&M@ i2yF?J.-K.ͷqҹsgIeܼxXϯyFTpR*<s|.3R8%JE@@ w׺;VԩgX5C@@@@@@E]vn962P@fj:dyz}nU]w2e Oʕtɒ%n0 &SvoYA[uMӧO ㎓Sx |%鄡W~դu*%o@YoYo{Ir*h壏>2{e. } 'qP_#5ZP{zPnpC!!@j[wd…D\1}mjժyw?E_4NXIҠ?wE/h41נF/r!v2dzٓ*y/ʕ+#~|$@@(o)ު?>pm.Sh֭[g}.K2dH@Z&}ڟE /Uɑ5/h:#D'1cViN\MժU3G=W05kݗL<$~A>>N5gHS}#7~Y=Og`7xcאŋ˻+-ݻw:DOo ܮ6mʷ+on]VcI:qXǔC4FWWN+VwHX_#@+VN;de%!@NNTzuS_<e!  6o^K;ɗ   )-зo_sVRԱm_Jי! 2yFxx/c#U4;?woIJu$< $ɼCO + xNcǎ5rW_}\qGHfiQ       ng}L6P_ ?5.]Zt2D&|i 9D3WPXR?/o}?MkVMj׮mڮU xxUW&M2V͝(a `BNMv}Egu^=wݔd>5}tyog tR5`InǸ@?C(2@ f͒N:I4xFD_?x9O3TҀ;w TF iժ }ʣ>*9Fɒ%˖-SN9E :c{+TҀ~-[VN=TSr!O?\.2sUJӦMe˖2B)?E쟶[?﮳ڶmMY:Aoo6oܜkҥ۷/q1uҋHåƍ܅J)I&滲GhԾp}'`'x3cZ-ZT.bSɓ'U˗\rίL=~Q>/A7[oh38C@%lU4سjNmXFl^ :GW pn_7Н}Wv޼yz|I۰̘1C>SӇh R1bDQ2ڿ˗u@7W̞=;߱fΜiYT)+E RΝ+ݺuʕ+ǖ>sʈwzcX+گu-W'<9~V6jJ>k^}?}u:裍u^x.z\[OSNn3|ӦML駟{̇)@@.0l0ٸq٨4>/x)E@@H^xAz!SO`ԩfI*ԍ:  <#csA:?ί3<#*oJ?TkO|.\GGAk-:\aĮIk?s@_Cӧ`I=С䨣2O<syg},@馛dѢEA 77Wc@N9Ȁ       ເNЫ$kZz,XcP $pah[;0&QR\~p'N_~ŗCw-0ڤ5mҁg믿n̠Xbܷo_`{|0p+ltQ_BN{ݱcG ݦk ?M|I|?4uu}BJ?\=l`+ƻλo\<G@ ~mY?kҀ8BkKV^$۶m3V'Ӏ 6X+ ?^6i׊+*v&ɑ 6H=q3ƹL4ɝ0O _2j}Ǎgͬ]6#/,R'-⮳ϤAsڵkg&/sGa6md~tgi0,ʻ~ǏYL^?y,\믿$vG@@hT+{t:v{alY{?[_~XI|Kg;d$ ͛7w >6Ծ+WDϯL>~[` ?[~][\s }Jz_A47  Lh97}AZX Ğo_>z{cڤ>';&6iX(xV?|iҾ>gm|8i_eꩯu;MjдiSyꩧ*s7t7Ƹ}z[oVN;4l0xﹸ뮻LuMߛ~XzF4?G8֭[mQ?4ihmc97? Ϩ:!_[@ǹZttʓyf6} {tNl2|⽨fVtItN=p@Tvٲyf=\'> –ȍ{Tw3WnD/\;nK?TtM9fS'םMVi [je}-YfEZɈo @?qDeh0 .0酁i͚5;Z/ \tp G`^xa&} :Y`3zȑ#Il ":y& 1J.-SNݻ .oq{G_oV^hp{GƎ+ .Ç#<6c9F֯_oq@yVqG?s蟦Fϣ'py/Yz <~|GK}:~&?0oiVj },m>^I   @%o)?>-o{C-:u,w* "k;~ )q4'|oo| q~OeFtp}rH۝7n,:)֪UOk:쳥L2v7n:ZD4ŋC5}'r4`xvb/D{1Ǡo4rlڴIZU67c=n2ޱ7nt,8EЛ"O>&˕W^);w_>mR7֯_Z ^K/>Yk_k׺?>}j)]vwԉy 4"Cy&qy2wC}\k?`޿?S9Z 9nr؆ xr9瘱*b_+(XK.1#G!>|ENfUI   _:>S5ӌlA@@H^ut|@ uRa,($jxx/?Ijpcu/s#[:~zftH ^3j_Nk?t^*~B5kB y}v>}Y׺uk3w?Cj3^Ǡq:n;wÛe@1^wu.^)U        N \gUpnzRNTg9zvNYw?ggR\grjQX܆ :6.Z(dӜyiPNaSgf_l֕,Y2wÆ >`w_wx3 ,uQfg\g"<⹣27d2n]40i駟9j29e˖mBz sڹ dҹ2W Sw3 <וk>l3f}|mz{M7۝f-=r4VǑ!pSDn} gXs}XQ`9OϙxTZ~&\'q"@MZW#>ޕ9[37j/ܻP>9w:=s&0!z} k;ig\'0O`v#ી}8);y2q@2J@?ʕ+msY¹P=>~ߣb[&!m_}ZXzۿ5k4۴>T}(0xy+U8%~G<ϛ=eo?Yzӊ+rw@k_`7kN@ELZԦMFw&uyeu~ 7d?<:ۺTPq}/}Й(=oN< ޽}'ȪǤNP_{߶sz]>J$/Hk_5]|wSe} x(lƌn} d|z}t׍5ʬKFۢqHә<(vg247~v7yy{!J@IDAT.>Gs?cEoyR V_-Ik,#/q)/ٓ{g&M{>Z  ~ |u:pƍ~M9    1:?sꩧz¡#jT.; <#<#:6ؾXp; u8G,8=3| 6sD3ݻ٦wJSf >תZ)"΅K(֭҇J/[,c\vef炉{M唒%Ky睗g?q~>,˙@M:|k+fk?ڵkͲ̷u] zS}#[D/6GWw=uי.h<)>`![v:w/߿:V}{-[x9AMZv=wW}mY\N;ͽ'na0_yqyG_9@hѢ2ydѱ&ΝLű    G@g:uC wOB@@H/SN5jȴiuj@vXPIc-qV׏2Hy{cW4~G;^|.8vl-D+D.`khzk6D~}|D{gp櫺]wHvm4xɞ={ۮ+t5}"!#c}w%裏B@sUmM        \p矛lz-m@]&ŋ@:I'(K,C9$h4=t[A+?x9sD k'"-(o8&x߯믛4ޙgۢE 3Y}B t3$iA'aQѣG @Xwi\4S/ lkP 6ȼyiӦfTwʄ /[DZNkj[tpsX-`Ӌ",;puI)nܵA bVgkO}ǡ`tx^+ * ^@Μ9S4 z|a?w 4 첾7駟nﺷpW: HӦM̭j*('tlt";@?Fھ}< 5` >lq}.0`Faԧ06P|f͚C%BݻLn b/Ѽ6(Xi-  #PPߒ=J4%O˶Uo"Y{w~SaÆyWǽ6i$5k qFSmDYFt`I={x5:w:oY~>ڻP}`,_W.+V0ENhWzq~D#wСj+Q!}n77quHr}~S')w#=R[7n,_{}عsg&~M{;y_zo?iЂ"\hZZlY]|Wbnڷl 7iX?X>]I^]F]l$ z V"@\:Y؅^(O?0}t*t;}O {;$@@@ V]fܹ&kc-|   Iݻ曦Xrƌ$HMT <#ylD;nZE:^?<# Y `Pc~bˊ6Hq~rE }=(k?o?3>HZJ*uoYy&FJbݺufie@ 5J^z%^5uԠl/D&n       ۻyed N5P =P] Th`6o,:H2dLy.I*yS5 ~ubt+^PM9fc馛D'MH?;v찻 q!xl}}&oPy)y].}ӧyՠN<wvXowC-l=_nݺNj$ܢE iʔ)n@d ck@ }o L?Yg}  b[ ]b-%Oۢ5j`srG M99\={4}=[sm~Aw`>ٷ;ZN(s…a Gۗn{w>ܱcGw%\.B4l4$X oc_MNc>ɸ0l JQ۷O.2ѠO92m"  @b j"$MQL3C}.(qFbݿ! c#Z@Ϲ$x-Hs}=sεU;ϩkKd$
Hf(uC* ,3gΘVkZq@tڟk>Hf 6H^ AJJL41MLUk|-q&E=C ZM&ժU\rNh"}_DCÆ K1grzΝ;3뮻Ҵaѓ),yv?~\7nl^[fj._$bߵk_nռ%Ұ+Ā{&prkAXC.+yQEh;˹D@@ 2sl)=.v~Wu*RǴD33f0kݿ9[9}}ﳖY,{6of7kTĤk֬T=4믛zrֹ@;x8:w&vw:ȳ>k8FKdfLk9,Oq:;nӺC <`īSN|@:p tر b1   ?n@SԢ5@@@k:wlwzСr@习I03;H>usoD#K(#-{?ci~{҆ LݢhYi?{ Y௿{G4&o]^z%ϕ@HBLB@@@@@@B!дiS~۞fd+̐5n8խ[W*Ud5l0;qgޯ򊽊 ht=iӟxTtQJ*eə%euXYSLq.zi}O?]?֒[ ;O?5}H=-M /{<.24իʹ&2.[me˖v'I@( ȑCnYtԮ]ĉs4=+SV4tyѣG5] f8 5o<] yt(PYt!ٷojk>-'OL,3M4|{s_|=Є 64.\(ǏM$VZr饗icK\}1@@@ -ѴPi3Nk I x*V'뻟:YuIX>&j*k2ͭs~*U,;ɴca\}v7<G0ϱPn7ǂ=V$2:1J}kB M͋ V麣?V"tnJCۺu:;{L@v>XL  7sLkL_~I:mM$  $O?mηau~`d8   @ |G&9&OH^v d习GW03;H>Q:ުVܖHs u$3 Dzzw-D7H~w}={̙3Gev%ą^(_|'| 9ؙF۷˩{JHED@@@@@@@ 7xX' k"?3[gSDF_-[x? ֭3˯Z  آE79r$&5& դ}Zʗ//N aWe5թSGn63Mk׬Yf⪾1ݻٳge_UPpޙsvj'^uϰ`=tS}a8G~m"֞Vyk ĞIkXKG럖;CP}6i4ȑ#=nԩSvaQʭj/rO`d%qݻw7ήiiYnz+3fK"\+ngYf3!p(Q=S{B {憻zl_Xc/3!O>߿,;Zwy_f׮]\dq  [tUBq|(Ǵ "V&=ztknܸQ;UI17eTXўN _u7pE9Fc-[VV\ioT}no41#Mz̙4{l$uv"ǂtX>p ϟt?{faĴZՉ'Ӵi Vt"<#χHu]H[ }ɓi6ZyM4q*PT)^_-7oӑx(Py;o .>@_@@@ Jz}ԩS8%#,   CؠA|=wsAj iX<8#~`g:g$њ>:9&gܖHs u$3|+C&f' ϵʕ믿4I(Os[re3~ղsNy7=U1G{˘$ŋefY^.\8чbD [n       W %%E7n,cƌ1/_.-[XhhԻK:vh/^\=*<3r13f+ѥ'Mj[\j"{~fꫯ۷Mh@ ?,;v?P4` ^6E~u|b]f͚j4uh21C_g͚k AOtmV':&MD\U_WBof%.о-Zc{zR?OOE 8p@.buIX*4ٻs]yrmYɼモ~,MTr'fH?M'Ky@\~2}tфVyފOE^ΤJI^xab5dO<޽<5i|(VI:f_+O`8~\veҺukСyM~d/YK/˧i@{܏?(={]{1袋Lr }-}Ec-ZMj*ݻ f+W.YdK(ކX*V?/gM4~{BvDZP]?t|>$DZnv}gܹsۉ=XtiyeС즛n &ȍ7h>iɓ'K>)   ǖ9NCxC7}6 x~jZ~O_5[b]ޣߧ4Q& FqƙU.Rst,:ݾ}{ٺuI =諾:uZjP`rFxx(b-=&K/cScǎ5G5Q{Sx ;wlذ!ov<c>@} { ASMVFә9FyuG}d?ib_}LzN_ݓgԗH,֭9fv!ǧ{1ޚ@PѢ> %χHG_1o}Wkc>KDž$AME Zo^g !3:s{W{ uq4_eVhbLk,bbyjy @hx>cذaRZD G@@@@@@@p%ϕ4zGw2# \l[WtM9Ү L^.[=> ֟n+hD4tOWjӭ+aY+?=>ՎLo]-+vڵkdzuQ٦ڸ{mϕ\ޙ3g|vV4Jlsiqy ~osd zDs| W"@Jgwϝ;ZdIT?=u޸q+fj|J^f`^+4wVjYq%繂[E ,<Ǜ>H"i?T}uV}W4}Ľr-7w%67νUW#{ `SɓD}ߕ6VZ6}W҇ٳ\\_3*]v; _/l۶ަsPW24yW4\IR9sLiq%Y_gիYϕ&s4p /Е-ͦf%  @B \y泂+q.L?K_cP̱P srsD~~BEy鷇KY}jVu~iOUxwM[\IR[haoqfcS;Kfdf>DXPf:}1V_=}b`QkWgAYcVq%յo{Z\y|\|op%No=f<vy^wS}焲C0뺂/_6QW466k$D3<l:~0@8w$Cw )#F!yHm   @ =7/elt@@H8*/ծ];ԩS 7N@O޿@G\P:ۭ8#3gδ_Gs;#-|5?`o%G8#?>Bu^u4`9us!ΈS/sޮEuEkǚ@g Hjj յ弦B?m߾=çŒ3Lg&>u ;Co @^=뮳"-LA@@@@@@15j+ղep;zHwȜWnȕ͞vWcqlW:{NNas5?Cq]!޾~Fw]t泺.  $]ºؒu+!9ް`4ߩ-}[}r߷qu2u}uݷXJoxm2wRxq{Nd؈5:;cA=V췾FN6[Dڷoo=|AoݺU\A]2-G-[4oDA Rhƍ˞={"y  q"p48D@@V@;Di^\s52a„D&cq.}{       @R h:+;# 6LJD~k2t{;aDj0B-l if$? ? W+V$u%p 8x;0ԓm&;w %Jz7ˆ ̀4&jע5%p ᅲ$S͟?yjb wwa 24nɒ%E/L gٷo9Y?#| 5OhBu+!H8Ͷ=*}IMVF_-O6yp?"56l+0sε;wg{&@@ -jGKSFa_bHC:]vú˖-[{U޽ t~ 3\7+ ո\r~W_+s*U=ƠI4Iq_%Fٮ>sY(o}M7}m'V1tG_c?o烎A#z:QM'CG h%u$t]yrb^pz=q@߁ ~:uĘ駟DԔ*UĚ dE@2{-zĂ^GkMLX}H.lO.F      Č@fd , o:JMWtivi b_pH|js @|hhB-Ȩlٲ/6YO_$&`JNO=\)G$y46  HC:`OkQTR( =v,/ 7v5jP fu2Cq0 `Qȑ$$VY<=1/# TRE*V(l{ݺu&w|L;ţ2|\uVi۶̙3G@@[`͚5v߂ / @@?$ՄZ4ʕ+I'n"f$rWp6Y# N^ ^g H5cڏ9s:S%H޽M}]2e ~},Y:#      -PvmbwyGΝ;t[СI#:fxصkWPeA/-3@ !ϏM   pL3oEM]߃x=D:vh4~x{ "!`/^,|Q˼y瞋Ħ  İٳgK.v,^z} @@@Of͚b%RZJ ,W @<6"` pM Wl㍫#Eؽ{lR/v>}qA*F [h@@@@@@@P ȑCի'gϖCG}$wqG7C{ FSNӧB1VBM:ǥuҜ  @ $C7t@@B 1m~5w^c>}$W婧'OԩSE(̙3X ʕ+gεlР 4`y[EVC@@x6l|fSN>$  $u~VVM/_.K3@Hx<-qI81ԢDF ^my@ :Yfrۯ_t"_P@@@@@@@bXy&vq$}E$йsg=-p^ 2C")PHy7d^@bW mȣg   iC@ {0# ТE 2e:tHf͚%ڵ !@ u֕_~YqJXbRjLʪ   vg˖M^uIIIǡg@@@ iVX!_ĉf̷z,]T͛4 C iK yFw *m"HdoAl@.]d֭JӧK,Y!Kd< @@@@@@@뮻$gΜr)Ypꫜl!.Dȓ',>W^yEkg@@@ {9ҥ?tSN2c ɞ={lu     @Xc>{iw~X6F!@ X@@@@@@@F .0?Frl @@@@@@@@@ )T7{l9p@Pp(P@,Y"\riޓ]cS  1$cɾ}Lz&MP    %p9i߾,yꩧdܸq% l&@@@@H`SNs;~73ڵkx -8b{>#      @R ϟ_-{쑍7&,         @ ʕ֞>}ZƏ +PxqYh̙ӌ7ߔaÆ%x  .d:ua(XkN@@@8v4lPz-?M+ct @@@@#СCٲeiD2k,ɚ5kx6F)@ X @@@@@@wmon޼y4         Ċ@n;G3gJG TZU&M$)))fO=,X %2  -pܹ=QFI"EL   Ć޽{Fb ӡ9sʜ9sG @@@@!Cdƌf[yEIB"m6@ $ D       @7n,ٳg7[?~zf@@@@@@@@@.Pxqi֬믿ӽWf hժ fKҦMٴiSN@IDAT&@@@ R=h(-חmFjl@@@O>Ln&OcժUҼys?[    $eg1CIIIiӦI ah!H;!!      @ \xRfM3~@s         ={1b{ %ЧO;ɓ'aÆ?D;l@@B(tR2ei`2~NS   Xpr-g\eݺuf^(ڧ @@@@m۶I֭/4n8>:O/RdI4      ģ@˖-nϝ;מf@@@@@@@@@X\+WJG RfM#]w%Jb  @ 9rD:uddȑRH>   2d4o\N8a:SZ5ٴi\s5=@@@@@ y5GmhB!J       y&MH.]ٳ~ &)))[@jj?\ (`g@2Г:}~ҾX @8-< $|.L13NHL~Lʨ@ 2=*GXgϞvZSqRNWaȞ=,X@4_-}yV9rq4  xe޽zIvµ)E@@PԩSҩS':u/o"L Χ# Ğ?">{!Ďmb3$/iժرX\2iҤw H"      FPBrwȊ+dݢ'VRp&r8p@B'pB?    ķ@={P@@DhԨ*UJv)|ru%0O (P@-[fνܷo|&،3<ΆEw@@HJKɓ ,(ǏOJ  Ģ?,M6[0/<쳱]@ p>uB 3Ǫ  @z-%\"-ܹsGl k!      DCe˖fΝkO3x7(F      }# 3@@ d"O<=#FL MEʒ%K$O<f͒gy&]b   ÇSNZ#G/ܾ   @֬Y#7x7o޼2o<Foe@@@@*0yd'Ȟ=̟?_n  -:I@@@@@@@hҤtYΞ=+wᒒO TZUCB@ zW\qg x(_e,@@< ԩSGi@+M $@۶mo߾rA9s 4H)@#d(*PR%={4nX/7xC.r>   ؾ}tMLۻwoYl~#;"    1!JÆ e?jՒQFDd 2u@@@@@@@/дiSܹ9sFΝ+#G,YDc  . nIA@ X4m6y3 -  @HW.>lHۤ1@@@@@(\iF&L GcNJ + _~EO.'N0A֯_/K.@@p ;wN^9vر4k @@@( ̙3G:t`W˟?L8Q7o^iC``,D@%A .3ȭ@ϟ֭[˗_~i־MlH'DYGmwG@@@@@@(Pԭ[WyٷoYFn@~ ㏲r%C@ 4p4- @r˗/9(@@@@@$x'孷 3|p޽ɓ'I5v 篿*Ws47l ^ziu   =l޼ٌ_5*i-8   m3gH^dvW*V(͓2e@ l߾kK 1(At @ ڷo}#.]jTP!Yd,X0qHJ KR"       "p=#={=DhA          uf;6އDL {`~_?~H b:g̘!sk@@@ v!UVM77-G@@@@ o94x̟?_J*fY dږ0       @52A)N8!3BeOAv&M$M63  Ԯ][>u&   ^{JٲeûZG@  q0@@8}trQ#EO>2sL9 >\wNb&/V̎@eٲe&8ݻe˖-ҢE yw3O*  *paIK/IJt   aiӦI׮]رcf9sW^yE:vឰ9p ZJn&,@HE}0!v5@رc駟S4@z>\'`-mf s\6:      .'O_̝;W8 W:u$;KB?%%O\D R@@Y|S W? h@B 55U=ca   @ \s5ҪU+wkIϞ=ǘ@"Edr-b:z)A@@ y:w,?p͚5W^3xF  ĈMɓ'=*[̞=[*Vhc#1hI{ ^E}0@[ gΜ=zW;v͛ٳgMZz(@g$@_O*C@@@@@@@{1~3g$o3      )SF˗qEj   ' M+зo_2l0ڵΝ;u(W,ZHj׮-OI&e]& %#  @f&Nh_;UP!2edYG@@@`˖-r}w}gվ}{=z4"L      jC&/#O(&d0       LՓѣGe…KΜ9"     @ { 8*   PlYiٲ̚5K~7sO< 1'Pzu1chB49M{,J@@HToV}Q{xo\~}&@@@+_H'Ν3˗/7NZnލ:    ą;3ke̙%K?D # @@@@@@QM۴iS;Mt)B@@@@@@@@@@o߾vCɓ'aA &5k&cƌ֣Gڞ  M&jԩ} U6J   ]FҧO;oʕ>#ѯ    tE}QpaYx͛Fd +      $k{ƌ4         Ě@rL&o&ƍ.l >ϛҶm[yL   @x47|cdԨQ"  4iwu֙eYf{N֮]+%KLW      &̙S~m)Zhrb0 oZ       pwH…P-[&GMa3F@@@@@@@@@8`)))C SNHv2O:wlzi֬|0tƈ  @T^{51cve޼y+W"  $oI&M? ]~ҿɖ-[2q0V@@@@!0k,ӧL2ETc !F@@@@@@@#5kViٲ=<\`k@@@ i>,˖-K7ܹsKӦMg      @tʗ//w}̝;W~WDN=zn:>ƌ# wu[NJ*c-!  @[nMswG@@={t]D/^ljћoLv3{_awɑ#GH"ƹVZrw{?ם>5ѣڵ1V,]?3V޶|@ V}zt."ٯi@@@@@@ ZhvP u$@֬YeƌY$s[֮]\$b  %n9}YGҬYb%@@@8 zmy .l۶0dB 8&Ck3g{(ngD 0 [˗Ăpюׯ_#4+⌤iٲX`. ^>qDپ}'Ok7Kx`_wBυ8#v#3@ ;!#@h|I=vhѱcGUdg      $@ժUD_K;#F^h" +U"}nxJIF|I9rլ}Guٲef&]znѢ <4O?mtM!OI{‘lCw}&O /v~u&'un]vv)S&Sʔ)c_ࡉ3vڢF9/zUBnk~f~yM:+W.ygvPX͜9SyIuֵLxꫯҬTiы4aS,?ם>c4pA}Ҧ3ckBbZ/?hGZj֬iO5mT G@@@@@@B rʴiD: U@Μ9eѢERF /d׮]v_=ߍ   h-z!C4@@@#Rw=٭Z1cE]*$@q$,PFH9~xl_|E5idϞ=c`"fj'lՋ?ӧOÇ婧2>ܫCp^+V,2m~v@08vݲqFљdYJuB]6l`_@m;vL>$,?D/p/LZ<-W1K.-)))Lo.JKD/ dVo]>s:e5=7VEMsNzfjggM^P!9tIFތ1%wjy>rmԨ/fZN碎]/ǚ>W}`^;}oVn=)]UcMڷf+w"X+vĪ@ɒ%߶סC8q}߉۷d{Q@@@@@@ 8=mΜ9r5j!k3g T~34ƭp#Gq>4d9rpboh,熗,Y"_|\{Mg$-X0ikwO}5n<1ʺuLmx.Qu $q@@ z&Mdǎfx+V4dF*Dߌi1BZj%׿: 9` 'L`'Փ5qUW]elǍ'ׯE8O<񄹯 }y{sJ‘wѢEfsYd1[:O?-^$xz[ D,ݷ< پ}{ټyIݵkW n<T/([>G:zٳgO>_5]@PX=:MJ(aNk"aozR:uLwM4MO?5k֔9s3G`&(KlZ`Q*<@_w2׋ڜqʔ)Ҷm[34MJݱcG_Ô`^ ʽ#       JbŊG?.^{--B. 3Mi`͛%Yȹi@@ g}֌T>}\qI0r  D^`ĉ&&ֳJӦM_K/Ԛ- VđЎ!k3g T3/_>ٶm[.Ϛ5KZnmO4n?%ƂpˠAL 'Έ?J9z׬\paYf)S&Mc{Er%~'翶N(g}q@@ 46>(k׮5CK.? 5jT@@@@@@@e=J„X/}C\`vT{>coI[ bˑ#IL nݺ9VT)s?Mh"`-бRJdjԢI[4h`/^, B 2|}cC& ,_$u5mOc8J;M;iyRH|眳^l%\v. tF;|'D 7C]_w͛7|`{"xq@t_of߾<.ƙMO?T㏠bE@ }3g#K,+2M1/@ߘEt@@@@@@OM6viӦL ,_}UȆ' Y 4?۶Nד5Q{~Zի'4e& Yn]{=3Yu5טt]v3 eL[;i0NM<jF$ԩSGdE m;27_|vc_^wkV,[@?7ΝIʚU_ *$~x3ӑ[6K.-kזJ."yW4cҤIRdIM7$5k < r{ʕ+~J*ULrвM6}gC+VLUf.bڵhRP=7zA)|nРA(7m={4S?^达KO <(FO      ^z{Ν~Bk5rey}Z5kf_y}@@@ oC^lv<|7ҢE { @4#l2s~ Xc%bAh|Pg.pȐ!_@V<We+ƈV.P_DםhskV$$ФIWjժ=Dceʔ;[͛7ą[nERx껻!1&d&+W4`.2o}\r%K/_N?GX1Ju[Yx]oi 5Rxqn01j6l(7n3@p L0A^z%YʬYRJ$m#S$Ag@@@@@@@ɖ-i@Sk"eg=LLlݺ^[/B X:΋6u噽5'U-ZdM&mF޽{ 6, m:VO z 4q'j/5ح&[I֨Ο?/|NJŊhѢf:)b}}_+s\Vvsֵ{׬`z z}?:yEnĵǎe˖ٸ^f] .0Gy$53lk=g >pi@@@@@@ O믗͛78'>2lq@F3k(q޼y -[ڵk0jg} ո)ފ.:?Ϊ˗ 3Ė,Y"(DR@c2vQL"{$Q` @@@@@@HtK/Tj׮mT?=@< ɆVP5Vꉋފxۋ'{L2?zIlOϦYMi$m\ u^~b*Uʜ'i d{g[MK/oF;S /EV#%JM>}t8qkvf9rYlSN5 59c&MՓכl5j}섉ZW >]v7ʷ~ki~d h4}Y_;zg59P[9fx m۶֭[Kɒ%>{n10P/޻wI`[{1 m&ݺu?$m޼!CҥKMcǚd@WKǏ/Gz{#[zK Q}e#DnVuK)2$K,! i%"0c̙9sY>k<993}1uGg w^gtUt{_ y5}_|EoV_zӷ/ / cƌTo\D229GKڵeĉ&x~Կ4iӒțF@@@@@@D0`uĈ&؝? O0{HFXS@@@ e &&Тx G   q't|&"Ңy󝜕(G@wđ]qj_7H-e5+WLFi!HrƂI^ԨQĜ$˗/7xƱoO.Mx.!uf9סsL#lw={H%D^5a\46ȻkiR֨(&֕3vY4hI 47|c¹8 j/:1Y4>V2eLܹ;w[oebzٺc11)b6Tzʕfyɾ=s>{gKMiQF  \[>ڤc j$ 3N@@@@@@@ 4iؚ5kL5~tEtuOll=zj%$}qWQMf.M7nɓG4ibhRK.IͶo˖-f~b.<}Rt˖-͟vY_o2~T.ٯ>7G'N2z`wEΟ?$A8z'E'[Ų֛cXmd,_ipNVR+ޞtNoj_t ǎ3paÆҫW/;n/OћNveWriV)_O?[XE|X_}U КV2*U\K1{^?t?-:h믿 ZwajB… +T`ѢIkZ-&pU9rt.:JJɄ*~E?C&8cm>̮g5N?Y'6@@@@@@ eз~+}`Mj"@Ϟ=MÇ믿^Mu  @P [NFm(wuWP!  Y%c5醎˶&6mW :xD|)8ڎFȘ3 8#7&Zi:uŋO?t$z2o$7%b:^&nˌ3D4رm֎㾦*O3rr>C:F 4ƀ(Vmq.\iEx|RP!3^5O?d7=k׮f6CFcL b"( f͚. -k9IhRf4ր\6DoKo<3D]믻ĥ祾Wj'ݕy@ S4&~&]]t^{-SE@No C@@@@@@\]v&@7Gx^["3W\GUZUNjQNO\%m&adu~&etjLG=ƍ]a%${˺3ޞx2 mIHϫjҤ?cեoUuzmg?,ZYA4Vp礵ϟ^vgՁgΜV5kHll֤Ή~7Q@cb AD:ȹ耢E:ėEU j0frJMnNdei@@@@@F@+8qSO=%@ 6L^x=,ZȞg@@D:$ݺuáA5@@@ c{FAV߈4ih7MKAE #q$鍍1g@qFom,2fx%y7̴'3o;bnj^x:P;vK_*<o޼O@ 4U˖-?c dΜ91(? b3       z#V.]d&С޼e% ҥ Лu0&YMV]`ksHĘpn7ӡD}֭+}orw*f͚~ȕ+<%7osM7r~tڵfZ#͟?~=VBMiuQ@6mZɓ'qv       S|ЮoΜ94@bdʕW^Q&nVLu &ikzժU39'oVPBzMu{Mfn:wmnzGo|қChrTi3sC jr_+Mr۴ZV-iҤ7q8 Yhգ띷G+Soղm6k_@Rh_AyڴiRD ӧO˳>{{ɎFY>ǣBȰ7ߜfXܹsv:(QZ?zԟK.X4׺Zz5jdL9@IDAT6[x=HEGGkˢ]z{{7|cgN?z)O?d-KŊMz I9Gyn!     ?~\Z^u9v옙"aIիWSNu@i>D@@ S]faʕ+ܹs%Gr<*E@@BA@ &cʗ/o-]D$@FHqB5Έ O=ձښl/?8#iie|}"EG1dtL/޽]:~= o;Vk̨P(^x)9ٯƿbDBK"ol[6m* {W4ҳgOJ"Vѿѯ\bfmuhiOv@ 3wa/YIV@ ,@P>@@@@@@R@Z6m$?cPN@DDg&a&xӢ7;LuC|clzno̙3&!Ν;Mֺԗֶ:~&!\\GMEC]6j&7G׮]Mr_hѢ#FZq\;yN6mlcd6MeƍJ@3gNiٲY4&6~z{WXz+7A lH9tP?Zv1V I,ezNvg0v͚5{n9z2d}$M< _4y d[}ӧO5jH\69H9s:>      @f o>^jM &0uTsϓ;66W_Z7h/  >xgLP9]w"@@@ t}':HJiɗ/I@gI:,l+/HqB5HFbAX T~}3;qD{OR+IM'si<M8|ر9&O|~`o;,R!A.I%b5GJ+p.qV *޽{e޼yR^=Rh3M9~kV^ִ>ך5kl_빡+}~$ Æ +V= ,(^VL/jbKdu>        `|A7p͙3J_e˚6[rqߺR+65Go2lWj֙nzlI}s}L4)?f7n,k6۽;R*'O/2Uɖ߿$K"h#Jk=jߋ+M-wyT\쬯]muzg, JA7xZ\"O޼y]pmy}_]y2":,X`vԞ6+W4~uW^yE}]J*f ^/Or&k4c狧~Zn&ӏY|M>Y3ޞ>7     d>+J2VZn|.iΝ+K-L@ @@shy饗L+dѢER\9?o5C@@OzH4Ysvɾ}g}ؽ0a4iĞg@@@ mW=cO.:V裏d.?oHx _8q=Ƃpޫe˖RF h)⌤=ˬ#zto(++nKVs5++8(PB~=DFc=xc%ݎ8 ɓ'tYV^-͚53 /]$JJf5IUeѢEl>.\X+fmڴ)c9iyQcΚ5{; ? ٯ      R@6nTyaٺu/.2]@oXjjOzҨ*UHͦL81._l'MAΜ9EvhdE荙,_~EҰa"##aϝ;'|/wuiѣGv通^z)6j"<=Z(휼wРA):?vhl@l`=P׿쁺˳bԩmwȑ#m6ܹsԧ=d_;kO LJzI6mZM)m / :P$rQ<$<o*)B ٻYf…<Dr5)gL2a ω]f͚X7R:9Gxn!     ڵ$Hz}}C 'VZjc&ᯯp@@2 ۶m+:>Cˀd]@@@tȑ#Ei^={HVB#@P xGS_8I~f=t1cƘEbI8 !HJBY`„ nǻQ̙c;ﴧ3ssܖkVfQ7,pJ"E ̙3rM Fc&(Oj@4h` rwHjv ,R|y]NownJ#SR &&F'Z}o|yB @@@@@@@@߾}dfC@o5j 6L4 BM:wܤ]5sPq~Ŋ\~GsS&=qI2:vX퀡.:fZn-hRR2_mU4ٯ1jJ& LJG5q>o([n:yꩧDω+9ִ7kߔ=ysIMjl%s6Mׅ vi/Yri 3 )\W;f1裏JѢE͍E ڠnM{1yW =c {{&~ ~M7%^tYsFS6'Ο?4Є/ Q<5w&M1P 4RP?{}g>}H~zHi7}ƍ2x`i׮ m7|cZ 5j~oΑ/n @@@@@@o==z+">z>> !=ڵkE۵k_Mܺu(Q"sN  d0Yf$   ձ:*:^Jo?1c<""Rb?xcgo'og)d-71?Ք)SLW}K5}tYxر%/b=xc[PrE{ҿs4v~ay !\[Zs~AÚLQc-]:togFW/JY!KN̽^wAG6l        @ \t)Ot|X@DG euɑ8̜=/tn;0qD{h GB?GO]FDG2T#Qmi8%;ƪUׇg-p|rlG`kIP1/e֫o5Ҿ8^rťj-9rc @STӕ{РAv}~$Dv\ѾT^}t;G`|`/w$RLiw{#ٳI'cնm[N\زeˤq1bK= pYtsk?OI9@':n4v>#\w׿&d}KWk>s>=5+#V|nݺ@{#G2U<~{eӦMk]#QLGR*~.:&*TeYJz!mRU>}t$Mlڴ˱seڵkZVq w6L3c:>-q TMW*GZ ]Y{ ]^>={V^]6ol5{zw^        PfM뮻モ;w*TMd@XXT\dA9vsY[%$.*U2?K;B@i!~:{I8KCJjoY6n( 40A?3zڵ?nC@@gJIvԄ\W͛WUf~ O 66Vڴic'[e͚5$ SM|,Q       0nь3i&@ /zӤ7?? =zԫ`@Po=c     IH"hbT *pˆ hѢ [n54@@@!CM>V7Q@O BG      ŋ7c0x`ٻw(P PDC\J*~ziܸ;wN6m$:t+Vpg?7>  hv2 :-#GtIh   @f |2fD]ƀYb@T8#zhvN ;O@~)Cʕ+M ,(k׮re[i&@_;#@@@@@@@…cǎ2|9s,]TwP$0h iԨQJ\)@ɒ%e^7PB^ˎ +j_}2@@@@@E޽{˼ydÆ rqy'dʔ)HADz#͚5ϛΝ;kh_Z5E2&@_8#W? @@w7C`̘12sLӘ P B>|P      /JTTt$JIT@6ԪUK֬Y#… j*֭DGGKx8pH@@~W>j{eܹ#Gk`3@@@ >,cǎ5q]fw[n^xAzP  @g$x%=a\5@ 0Bj g%F8q7>gΜKF9       hذTPe9p@gc@@@@@@@@@[\r2~xL Mϟ4ҥҫW/IHHf@@?e˖r*Uϴ E@@@ u~I $+Vy払DogϞ$M     ٳgȑ#:u@H[!      /¬2m4kG@@@@@@@@@F`ҴiS'Nc=0mdŊ7o^IttNn?#  ҦMٵk97,111Rpn C@@Jɓ2|p)_;oWhQ?~>|X "sv@@@@.e˖ɀ$11t o@@@@@@H޽{A{=|r@F#        @9d̙R`A0k,Yzu$K.ϛ7OKߠ9t@|MTյkWٺuLeݺuRd=@@@_G[oU|M35wYDѣ2j(ɗ/G`7@@@@@37J%!!cɳ>lH       @p )RD:wl:ȢE @@@@@@@@@ ʔ)#&M8p@9}=*ЪU+YdʕtaΜ9ҿ   @ $&&ʀdʕWj͚5rmQ/    เ&Dʕɓ'˗ '|$$Wʖ     ;wK\\w2a/kc7P<@@@@@@@BH`voLbO3         @ WZnmHͧhӦ,^N;{lф֚\  @v 5J{=srQyWXbiW     9"͚5?ؤIYp=Ș~3       @ 2L2Ś@@@@@@@@@e֬YvG)@ :t`mY O.?0 v@@ s1cO6M*@@Jn(3]ϟ?5J4ƫ*7pCO@@@@_~$G-jՒ˗KyS3     @ ꫲyfٽ{V?eҤI!@Sk׮ e:oK9 @@ o߾注6'0ke{h   }7N>Cq_pa>|<裢@_v)ϟ@|&Xd}ME A( ].^(g[nK"EMxDT      СC744?.9s nu{K?@eD(       /7o^?ԬYS._,o4lPڷo8vj+&2e y  \@ի쩕6L^}U @@@1I~7oҬnAF!}|o.Ysر# ٥    SВ'OYlԯ_?;Nff        @v G *d0|9uTv6c#         a;Sz-ʞ={y&Ν;Dֹr2ݙ={ۗpr  *22R.^hڶm[Y`ea+8   9۷oN:I $**JbcćågϞ7I&jE@@@@2(0rH:uE-͛7`%A@@@@@@T@2h ӻ8Ae         >}^pAڷo/gϞ PJ;gy%!!!+  _~hBΟ?ojhٲ,^|e  d@||,\Pj׮-ՓKʵkL"""dĈra7oTV-[@@@@@{90a$gΜ2w\i׮]j|(@_bR       Æ pL:Ubcc@@@@@@@@@(2 ޽{w;ˆ :tpI&3   N`ǎҴiS9w٤I&l2ɝ;]X  }ꫯJr?s%Kqɉ'Lbe@@@@@Q@4-G2}t֭?66!A3:       @R sΕӧOˬYdȐ!FP%KdF@@@ Gt@@@@@ kUs=oILLciܸ\~Ws jE@@@@@@@@@ 4ٳ͑K,)*U*Z!\O>DZn-.\0CW\)S;  ZJ:w,qqqڵEIܹ4 @@#2e}ШQ#>|mVr鲎@@@@@ ,Y"ݻwxaÆɓ  oPV:      x'tRԩY}'U^         ӧvrӺvډ;Gx?&aVΜ94 @@BW>)SȢE$..[n!CHp.A@@@@U`ұcGrt#G@F HT       ?T֭[J@@@@@@@@@?ذajJM4x?G-)N`Ϟ=ҴiS9uꔩ;} (Qw&@@6mIu5Ӯ.#_&  @ \xQ,X QQQ_x̙SZh!C5<@@@@i׮ř.[fΜ)/4X0Y       RJrAS;N:><U!          44D"-^X:v d? M4~^|yٸq-[6F  )K/O?m7Ac$E@@@dڴi2o<9Ks-*Kr\1    {˗Mwz!s%o0\T$ Ig@@@@@@@̚5 ښ7o.111Z@@@@@@@@@#zJ^~eӢyʺu~~B;&7GJzBM  &(#G'mx'yL    +-Sg}5k֔CJ׮]E     (yfiݺ\ttK.2| 'Zd}h<       9RbE9|9~*˜Q+         (зo_={iABD\r6C#y?4iD8`RdIٰaTT)J  .  ?^F   @j{wyG̙#Νs뮓ݻˠAvY      lzz˖-ŋk:tEIxxxu $ H'@@@@@@@ `޽{5r          lҶm[YfZҥeRL`*A:uJ5k&w67p[NU  @ \|Yu&+V0 3    "::Z}]ٱcG.UZ$իDDD$[@@@@@ mf^ptM6H\ oМJ:      V !!A*W,0oܸQ7nۃP         ~ A?ܴRJe$Q?-Zȗ_~iWP!裏nݺ] _%m۶͛7>ɓG,X :t>1@@_/$տK/_>ڵ SiժX~uz;w7C Hg#      (zaPV-ٹsg&@@@@@@@@@>ӧO˽+4V|ǢIP))[m۶(P@VX!M4 '@@ ~w2}0`7nt}C   gϞ$ݵkWVZU  z;d:,@@@@@`He˖;.2D @ @ @ @ @t}c…Yz&[:z)t\c @ꪫw]t=IڵK= @ Paf̘wyg <86md7&@ @ @@~o=b~+Y@o>zj'@ @ @ @@) ̚5+ZnMXXzx7e˖X @ @ @ @ @@ <q:,TZj_ ^w^SO=5DAAA @/bŊ]w]N8!RJ @W`ܹ1lذ;bܸqQ\\Kխ[7?8bw1/ @ @ @~8bY_ / 7?C# @ @ @ @@ q%dGFUj} @ @ @ @O>LԳgl{e4,X$裏o=VZ P.\}#G,s=w^ @eǃ>^T]vc9&z5ka @ @ -k~5]y( 7?4% @ @ @ @$nmY ?ppeU~  @ @ @ @ @@ HN81wQQQr-ѯ_J` @lXɓ']w{o|+]m۶<7^ @ @1cW^p@Ϟ={m~+( 7?55 @ @ @ @ vXVA-_5kaE&@ @ @ @ @#Oga|Ma.]bȑQv)@/@޽{ǢEs5jTԭ[ % @ L>=uiw׈#"B @uxwcȐ!YiVz{ O>Y.q  @ @ jtmu tPw}!w^Z 䛀|K @ @ @r ?UrYg_^R @ @ @ @y,wYg:tѣGG@gϞ1wܬǣ> 6,tK/Bxgr-osFE @"M1lذ,_5jdׯ_QTT9 @ @ @`<@qt޽{guf7a @ @ @@`& YhQTZ5L;c9L  @ @ @ @ @8qbt-̙u3fLG?;2x饗Ї>,uG&Mʨ" @*} fK=:R௅ @I`1rȸglٲE0k۷ovaQn @ @N`Сo%uQqwF*U"@ /ǤH @ @ @?/<9眬G0Z @ @ @ @ @@e:uj1{lZcFӦM+ L6-g5kV&~Su6m*a @6Hkqqqv.]Ĉ#om^W!@ Pa,Y>h;jԨX`Jc~Љ>:r˕k @ @ @IX @,/GϞ=>Nh=z @ P^|,Yf4:uD^}'V9 @ @ @H~z"*S@o\ @ @ @&lٲԩSL4)㏏o @ @ @ @(|MѣGgW_Cj !/^H1"laaa\{q)ln\ Pxׯ_CYf1jԨa*8  @xcذa1tИ1cJQFt=<ѣGԬYss4 @ @ @+⬳]sύ?Ov~+gkd @ @ @(5N;s9n\9 +2R@EX|y;hР?\{m @.8󢸸8kرcF!"@ @ +q}e!ӧO_I(o8#⠃6hs4 @ @ @袋"[?D–@[9>g$@ @ @ @.pF>}~j֬&Lv @ @ @ @7O&2dHԮ]Lsύ^Wzq5.%@*ŋN ի @ PyRaòUVR%~erHԯ_) @ @X`qW窸㬳ʽC@[?c#$@ @ @ @@ 򗿌믿>o'FÆ K @ @ @ @ @"p7)˖-Jj׮]5*4iR^JT .- ٵ8∸;Zj/$@zhL0!+ ?9眓/CP' @H_? ܹs~~4hzv @ @X+VdtM>tys@~+Їi( @ @ @(kKFzxpY){Rۏ~J` @@e馛N%KdM6|0viNc @*cܸq1|1bD|+WJ$ @ @ Ptw#-EEE1x`|駢se+ lN @ @ @ )0uc=bܹ~gT @ @ @ @X_~zh<ӹ9眸K0f@E8qbp_djٲe[ip)K.qaA+ i @ @ @@,X 9>TA5bذaѣG)H acP @ @ @*OC=4^x\gW^yex&Gb @@?~{#b1wܕUzH/ 3ի9 @ @ @o)ˊ]v92tRvEr! \| @ @ @ @@5jT6AI0-rH}ݑJ @ @ @ @ @(p5cٲejx]vØ+@ cԩh7hH]v7D @2 ?>{fٰk֬ >21+ @ -Gz>ǢEVo ޽{|Y@DMB @ @O/q}'NՠA3fLNH P~˔_ @ @ @OvەjD@Y -+y @ @ @ @ Ê^64A/~ׯdK @ @ @ @",YկbРA9]v%jrmvT+V/˸sC_0f f͊;,&M+wٳ2UTɵ!@ @ zx衇bԨQ_ҦM^zŮy  @ @O<}>,+yZh?P)" TuB @ @ @I/~#<iذa\tEq'FժUsv @ @ @ @ @@eNEeCW^vmY`@e10%pDž^t Ƹf͚6; @,裏F߾}geRjՊw} B @@~|1z9rdsZ . :(,,̵!@ @ @ @ @AW_޽{;3駟iB\E;N8!.] ivQFEÆ +i /0?Eqqq6-ZĈ#]vpĆD @b =P7./_W]t:(zmJh @ @ @xSNz+Wt=⮻78fm  @ @ @ PjquY-%ηz83c5jZ=:"@ @ @ @ @e-0o޼,tСRRjzݬY\E`رq衇ܹs!l2yhժUEq @HO?>}ēO>U ۣ^z6; @e˖e?po ~QvU @ @Gwމs9'+zq饗gv;xM @ @ @*0eʔ8NN8!N9hҤwyA @ @ @ @*_M xlzYmlT`ԩѽ{2M74zرc%1l @< /իW1/ '!  @ @ @ @L⋸㦛n~{Zj}޽{oq  @ @ @ @ @\wuqgƢE!լY38+@&t8餓nˉ?'5Z P /b{wVXX /o!@ @f̘ }sm6 ѣGt)TS&@ @ @<9sfr-q뭷Ƈ~4i$ ݓ @`} @ @ @ @@ ѧOHےW^q7ǦnZdKBO??t1xhԨQA @[kƒ%KB4hC }ݷ|: @L`ѢE3Guڴia5sqDݣE `Jtg?YI- !&cׯ_GҬY5jTb|A?/2;ٕ:vC-ܲɖ @P`ƌpPlڴi}=S}  @ @ Pq/^>hs=C… 35k'|rt;Ǽ @# ^ @ @ @(39sd 6,ƎK,Y5jDΝcmvs4 @ @ @ @ @|xᇳ>,+ K(߆^x嗣gϞdԩS'8W @#3D߾}swk 0 ?GժUC @ZPx jxG^;vh۶m|㏣W^1iҤl(qg>6 @e/|K.+Vd5l0n,D+T @'of)gEr7nݺek׮]c7^y  @ @ @ >?=Pv… WTͣO>ѷonV:R@t- @ @ @(sKƸqѣG[oʚ b;:w{Wl&˲4}ؠÆ ǂ nfqg{nЎ\ . 7ܐ_{: @ n3fȅ3<_5k֌+ M!mڴYy  @ @ @ ͛@IDAT@?oGyd빎8∸#=3b!@ @`RozF{̘1{onr{gԨQc:@ @ @+}Ǐ~ONj/˗/_5jot= ܞdH@ -C|] @ @ @ @@Xxqg}6d&Ls箱ȭ:Ro Nkvf͚k| @ @ @ @ @?~yYhYI?i뮻. 7+i%_|E};vlnw\OT^=f 8p`,\0UV\s5q"@ @`-.]={GMnɫ hhРAt5 iHA [lZ @ @7?<xy<_zvԩS>;SېK@%[>lC%@ @ @ @uXbEL:5y(?>f̘ƋTZ5ڶm?Ob]vǎ;hҸ59H @ @ @ @?>}G+ C|smvώ*7]w5[ne PyfϞMK @) 'yJvZ\yQz\ @Oߏ'x"Ξ={4m۶}'[k]ju @ @O`ܹ|/B5~H Mmv9κu| POH} @ @ @ PVX׿RoZ_}Xd.((VZe%)x-X$@ @ @ @ @#0|,O>ɽ}}AEӦMsmvk|p̘1#BQQQ&_n @`=ϟ~zr-+lq뭷kC @ |SO}OZƍG׮]skB @ @C`ٲe1uԘ4iRL81ۦy6|[j֬[{DǎN:;];N@o}d &@ @ @ @.~ӍJSLɭ NtM#ٺ;D۶m#d!@ @ @ @ @_~gqFy睹ˤI?)v;Q }cƌɕ߻w,o6ʵ!@* o߾1cƌ 9䐸馛g6rv @TBs= }Wx+ g}b[y  @ @ @ Ro }s+-Z@b}ݣSNYN;EEEk|ga驝 @ @ @F /lz(?-[o)7mӚڪV8 @ @ @ @#<'tR̚5+׾{7Zʵ!i;/ . *fm1˖-?qe˳7pk&/  @P 3?>|l=XtAAAj*vye]}QN5ATFaS7f @ @ @;tT$7mx㍘6mZ,^xƓ&jM6ٚM[ 5D @ @ @ @O ?ςҖ/_ 0svI'e]oqUt駟7pCnڵ?z\ @ f̘{l<쳹3C 4  @@EHSLɂ}SqoYP[h {c6[ @ @ @@;wn6ed}믿VR%o2GN;eSmݺu{@~}  @ @ @ @@ IO7|3[%8 M6BSoɺ6D˖-Fy,t @ @ @ @X[~ӶdI/i%)/}KOduv[r!y9E @*P\\7pCw ~ĥ^5k֬4M PJ}S3<=\̟?#mҤIt9۴i՞ @ @ [ow]v8[Soz>sV) w,  @ @ @ @@~ w}7n׿5wܵ\aaaySoZ[j[7oUV]k9 @ @ @ @ʿ@G ֭[\wuV[Aj|8ò{*KNկ~W]uUT^ɖ(i?>ƎEqmŞ{kC @ _,Y'O΂}S?|j[d{wmٲju @ @^$7odE3bŊkU`fbwv[ou#- n8KW"@ @ @ @y!Ge)8ӦM4MqqZ(RoIpd֌N$@ @ @ @ @@N|0W_Z .FժUsv@ G9{ɕ&:thn:f(_zkq1wܬ8+ڵkbUC @`--Z'N̅N0!Rƍg;w @ @ @@_w{uozbv![SozP@oP  @ @ @@z΂9sif͚e l2h"҄ @ @ @ @(#GBg͚+vk6 5!g7tS~ϳ(Tl>(N8=ztnM6[n%vkC @ ͛Ǐ{.}٘4iR,^xo喱^{mf:@ @ @+P\\ڷz+[M ={Z_Lm6[K~b  @` H @ @ @*g}N%c<7<nf|=o @ @ @ @ @N 'v?X|y#8"򗿄r$vL7ވ=Nے裏믿>6h&[ @n0`@|W ;_u͵!@ P^,ط$_o߯y`򛞿 @ @ @@ ̝;7ߎ[ ,Xԩnmpf͚EAAZ_lj P:~KY/ @ @ @ @ |ǑBӚBKv޼ySdK  'pB|YժU/{DW{ @ @ ,\00m8})Mo 6m&Rז-[FQQ\9 ~S6 @ @ @GE4/)d?m?Xbzl&YoIoڦI%K&[/Vo"@ @ @ @ @ qꩧf%jՊ>;<̨YfI-XlYwyqWF1-[n%zcP$'4_ cѢEYqI'W\mQ> G @H ?>3ߒYW5ڵkG?i`ߴ, @ @ aHai´0,om{[nj*pߒ^zk{ @@[>P!@ @ @ @A`ҥg^ngΜMv%n5jSpIp&Mrm[n'Kl  @ @ @ @ ~~Or&/ /_.ڸqcd7 @ @ @ @ i /0XlYn{o]w5f@>|_"F+u1dȐysmv @uXhQ\r%qWD7-UTO?=?F͚5&@ /)Ss'|ƫN:e)7Nd!@ @ @u(..?8})7WXtMߖ-[~g~Μ@J/  @ @ @ @'~M|)_iھI mf-2Oے7'|r;ڶmzk뮹6; @6@ vo M[?۷}K~ANK; @ @VO{Ms7ڕ-i4_ Mk-roj'@, wɼ @ @ @ _|Eg͚/yG ^ߥ$$d&,oܸqT^}}> @ @ @ @c= 7|3WGZ⬳ΊQf\] I&Jc=bѼy\ @`wܑ;Zjq9ĹiB @`Cg?_{xr3fXׯ{.w]w$@ @ @2 ٳ# ߒm/yp"W^V[e[6k,DU@ﺊ9 @ @ @ ˖->( Na%kIpzGq}hРA @ @ @ @Q ku7ƅ^)diҤI\veqQGEWB /K/4RhLZ֭^{m/F P&dؗӟ4nhӦMI- @Hr` &dIoY㵶fرcv)v[SQA @ @*ҥKҼz)ȷd[[xzԬY37o%i[_ (~ç @ @ @ @B ?ܚnLLKiޝQy?tBB0a8#ʈ ]: 3"N !$&}Nwϯ_׺sԹ>7V%pqIʂnСCHgE @ @ @ @@XlYKM7ݔb|9ҬY>II Og>^yҹ~OgNǏ/ @.0o޼t)_%kI_TT @:*ؘ{RoΝ;͗3rH)OlM @ @[@1?^oM"vq,7/#ww~0a&E @ @ @ @ @ 7B2η-Z ڴ[oGpKk:dȐM;W @ @ @ @ @9sӧ|>,m}-kA Z*M6-vmS_ q^.체nݺŧ>t 7$B О@<_裏YjJ|ɓK*t)%KNKַرcKm* @`<#K_RzJtM騣* @KO=T)7B~_}neCMtP)7~H  @ @D|tҺtͺǧ?}7nb _wy @ @ @ @Xzuʃ#8o)xe뭷z'NX.G3 @ @ @ @[ƍwߝ.`E@駟f̘ƌSjW!W"7#7_&M 5A s=7vm)~ϋeu]vY1bo  @:'0w>)*Zvita}TSSK#@ @ @@b_l@hs;M?sٚFoƾaÆm^C8a[[ @ @ @ @m [PE 6=P>SSmmm]@_뮻ҴiҲeJ>]wuiԨQ6 % DoϘ1g!fϞ<-r]  @& ,]4=cYo? liؑ#G>8=) @ @M`ժUY`o[YF%K6b^<7|^,ǏYb 0w۵ @ @ @ @:(.!mׯmw4hP9(_UUUK @ @ @ @@X|yꪫ7T/)&>T]]ݯ<_bz衇J;[n%/ @-A੧J_җzƌt';GQ @uRF9o޼6=3 =ò~wp  @ @@SSSZxqYbε]zWyolO4g @B@oM @ @ @ @ 0EUK}Y__YgU1F׾4rȾ|΍+rtn)566p i֬YٽޥF @-Z ~|ʂ}{udz롇Gn5v @ @ @'b޴ fkF=cr~i˂|#7߾,7|9a=gH @ @ @ @-PWW"7_ռ/^8ź~.`Ǘ!y@p e6 @ @ @ @.3d!r?w}̙3G]n@_xWӉ'~ҩ;NЇ>TjS!@I|:ujɛ @[l}ғO>֬Y6,tA`q| @ @.իWg1Z[,#7]vOaYpoe'NLUUU}, @]+ k=F @ @ @ ˗/ς#oӆ ;ĠAرcS[,^=z.; @ @ @ @hYGM~կ~UB$qt73f|sK7{: К>M~_1"]|3LC ) @lnF㏧~͋oR @>'|,7~f566/~~p iɥ6 @+tOFE{;x`1bD{/ @ @+E|cߚ5k:4f{ƌ"Fxovm~ @ oS'@ @ @ @e˲`<8Rz ށޣF*Go\,  @ @ @ @%p /0=se8}_Ev Їӧ+Vꓟdַ_VjT!@,&r-KK,)n햅uQ6 @%E?Q_`A1a„umiu: @ @ @R>E`oVaÆʗov˨Ço^DlY~ @ @ @ @tڵkB#8_|{ҥaFy6kI ;5 @ @ @ @-[)}K.I+Xe6… ӗӟtvƍ˂;R -wiڴi}F.,ԮB зVX}ϟI;6tAez׻} @ @ \ﭷ*a7/[ˠƌnҚmȑ#"@|a[{  @ @ @ @Y n0~KaK,)#r{iƍ]~VGok|_L0hР.? @ @ @ @)t뭷3g Vo>(էvZZti>tM7ɓ'T @@O Ľ3f~*|ǦYf%n=N8 @`"'}r޼y>p@:KΆg6m* @ @[@|w=F`ŋKk17c;snll믪Њމ'|b۰aú!@5  @ @ @ @@L03#8y7:'So}[#, @ zOd{r|tAY{ ]9 @ @l91o]aarW-ek17rmM1G [~{Kq  @ @ @ @tP c<7 η|;666vpu:th)bppq{ذa; @ @ @ @6Qߋ/8va8>?zi…|nSjT!@],C:+͙341ce]l2yrE kOzꫯ{>ÇO_C}㳆=S@Fr: @ @q\Aypoeת!C &dkZ9rȮ:q @* [y N @ @ @ @6nܘ-[x] Qq5kDcRbo R1 @ @ @ @[@L\x뭷+2-X???/kAV\f̘fϞ>X"`3L^zi{, @^x,JCVUUO<1jv @-@K.$}N !*]Y8\Q @SOeko{QFF{٪vt @ @ л1gSepo[uuu]z555YoZ!1ד.7 7 @ @ @ @++Wc¯b(pkvAcǎM\ .֋#딌K @ @ @ G⾕;#]}iܹeg??s1Qdl@5kVKrfA1ѦtF ~tMK/M˖-+4对wR  @@ =\)7~y晴vv@p,SLѮ @ @_ "wɒ%ʶ+VtI92塽nmV,cL @ 혓^ @ @ @ @t@1 8,hN֭#>DmmmY@pe[aÆ>= @ @ @ @}R)?LW^yeRh)Y^ףF/ ~ٿ˥KO7|soJm* @(Ϧ>;{yРAs\9sf09  @ KJ)7}c}0~'e]R׉'Z @ @5k޸&zkA+W3&?0ߘ(^c!@]a @ @ @ @t@cccZlYYHpۥ?{ie y}JUUU}z'@ @ @ @ 8~8 Ľzj6mZ6bq:FO"7_ҨQf% p .(z뭩qG뮻.tA6 @?桾O?tHǐ!C{]~ѣG`= @ @( ĜB1GPV[~}]Y"7m,UWWwE ~{! @ @ @ @qs~eG֭ ߸ɿ28n>|x @ @ @ @>7.gС鳟l:eʔR կ~QKSnO}Oq@IDATS6xWN\sM׿֮][ic9ԦB вER9s椆_PhgwߴgNjjj T  @ @/_F0oGe˖U pXf̷e~uq @}W@o}o @ @ @ @D<(8ȃ+˘P'x8 B#8_z?/cZ  @ @ @ @` t;ԮB7^⊲0~oL{oc @@/ 466I\rIZxq,ƌ.4mڴT[[[jW!@H>/RYo;P p/)A, @ @+[oU -[ yx)7n\)򍾃s1( @@;gN @ @ @ @@? 7++Áy})&e%~b(pLV6'N1 @ @ @ @"o믿>};I+W,;G~#R&c^}tiCDŽsN X|0^(]c,8SE]O  @` ,Z(=3YoYo{6{桾Q4 @ @[ƍSmV[U)7y(|_ @\a+ @ @ @ @ax("&<ؖWZcgApb=24hP @ @ @ @Z4fϞnᆴp²n{g:3 'ax M6--Xtw9}LG}tM'|2}WUEs1骫JkY  @@X~}z0<7%Ktv,w+{Wu"@ @ З6lؐFoq{my=ill1bDЛv\&@hC@o8v @ @ @ @ @`KhhhH˗//!Q^8ѣbp\l{\ @ @ @鮻J^{mSꭷ:|_r~틻 u̙3ӬYR{͗|#O[ޤ$@~,0o޼tE{'mܸt%}{׿ԦBRg}l;wnH c,w}-N8qK%s] @ @X >[re)7yp(+0UVuUƍ|[+Cs28 @U!@ @ @ @ @.aÆ,(PmHqBI[Â+=  @ @ @ @@{ |,L??.$b9tg>l =%0gΜ,x??Ji:thBO`/OwRә/~Wț @-J`ɒ%eϧ5kt:#7}^{oe  @ @ϵpʲ2[Ou)z5zb=o, @ @ @ @ @MMMYPp1 zVY' fA0oVe}Çt  @ @ @ @?뮻.s=le {o:믿^:of͚ԦB}[`ʕkM7v,SNIC  @Xvmz.^NY{gR~ƏߡD @ @3yho17yo^yQgّiر){+wՇ @`@ Po%@ @ @ @ @@ [-[eC[$w6ܓKLW -Gmߞ| @ @ @lEM7ݔfϞ,YR6N;픦MN<4f̘}6t@wsWf!uuuq[V# M7ߜfΜ.]Z:QFӧgȑ#K* @"АΝ{ϗ}͛ס?.쒅Fon/' @ @lܸ1ż$yHoesT0rb<7y[G[q_m2hР:% @0~[B  @ @ @ @ 00kp༬ +UVuhԍfbcS\#Ft) @ @ @]wݕ,Ç|3_rw} t@&yg?YXN'|r˳I_K;T @Wҝwޙ.ꫯΥ&r) /LǏ/ @@^3Ro;gΜT__ߡvmKayԩSS|b!@ @ lذ!yy=/޼|n+c<7ʖAѧ @- m{  @ @ @ @ @` 2[oXl_K=`OCzoW&TM @ @ @:._2]wu__ƍ^xGNMY&cg?Μ93}_LUUUvy? |7ӟN]vYyf% @Zz˂}_|Ŵnݺg<!yo^Fد @ @``L+Wl17 իWRRXoK!y9?!@ @v @ @ @ @ @@PP)5kZ=SmFJ S5> @ @ @Kv[6!iD'MN>tI''w6tק/<'ocZ/~.Ç?tW}ݷ @|Ͳ@uժU:5c=`wݥr]vIUUUC' @ @-a[\[jۖ/_b*-ǎv @>V8 @ @ @ @ в@CCCxHrTWWDo<keXp^遧n~ O @ @ @.wqG /oȐ!Dl %pt离ҵ^vuײv  @;"OSboY, J;s b{9  @ @@Dneq_171DSSSx1f̘,7xy aÆ9: @S@|]5 @ @ @ @@\ ΃+ʾk׮q#F(GpqkB]1 @ @ @@̞=;}MK,)9rd?xeljx矟.\X~YKTT wElûK1"0BJoB}_|Ŵz*~G쓾o~6ܹs0߻;555^;K.$}3^RQ!@6U`Æ i޼y)B|^H/RZvmPߝv) `<7B}G١1t"@ @_=w5yzm766euuu3fLy.+j;@ @ߞv @ @ @ @ @b#T8b۪U&M첓@555YHpG‚}zđu%@ @ @ @*Oo鮻ʾ.ѣ0SN9%E@w k+_J{Y)Sm @@/r˳'M./|! 2k%@"z4gΜRo{444|]v) `>|xyg[ @ @*P֛ƼyGs<7/y[e}b  @E@_, @ @ @ @ @$qƴf͚T n-8o/}!48޶#Fd1s18m592 4hKp @ @ @,'hv~x:餓1}gܬ] 6q+8}m٦ԮB7o^{wbӌ3ҩ @ZXdIYK/mOJq?|G]w5M:,w=HG!@ @իPb8o^rٲe|WWWڪ,7y+y+@ߚ=_#@ @, wK~w] @ @ @ @ #_e+m ypܑѧG @ @ @ٳg;Epqf=>va]D ,7( wyOURQ!@` ̟??]q;H %qƥӧiӦegv @^)-X ͙3' }_|[ougذaiwO{WmB^:̨# @ Ї⻖-F(ovX~=zEl}Q mk; @ @@7gA @ @ @ @HYHpÃyHp^wTWWacǖ;c0  @ @/lܸ1WvXztO]S|V[ekۙ2yO[C @۽F'@ @ @ @ @@LVp+%bzW a-Gȑ#KAQe6x^yo @ @ @]!c}{{ɾ-YSS>яf7#질-J_|q[)8 }  @Dovme!7}tie/q @ DkV.\S]* s= &tj  @ @8<3eϱ755uЛ?GpCzz^?߉хn` @l~E @ @ @ @ @O`͚5Yp18 .c;lhhÆ +y p^m0g(w Н @ @ @.XvmW1#g?ٴ뮻6ۯ sM>`G׾4uԲvؒ?*yeD$gyf:ѣKv- @@A ^zRoF[ѥ&M2%)|kl!@ @tV v+z[j۽!s@x;,+ >d @ @Ȣ @ @ @ @ @;֭[,88ݔ5&KKt '),J\pAzJCw|y , ztWl:iM^9 @.xTK6l0Om.d{g*;H @?4U hѢtwo==hmI{l:ӡlotUWeY7n\:ӗawY  wҼyܹs5B}oѩ6lX2eJFoǎ۩t&@ @^ go@CzO#VWWCx+m-{. @ @N @ @ @ @ @zK <^vm0qWWuduzrtW}٧S.zkI/;ԩS'辌}W/l:رcӔ)S5B} @ @(fFo[my־ԫ Jf̛[mU|_k{tp @ oʉ @ @ @ @ @cmذς5* ÇOP @ @ @@{߻;-]Yv)}Lԧҁlm O/B[UUUK/͂J;T Jp7뮻.-Zl?< %ۿ[X @ s6 H!y73CK @ڵkz3<{wʐ!CRM_R[+C|ݳ @hM@ok2  @ @ @ @ @آb<7. ›Q[[a @ @ @c 6oO?R]]]~w$ؘKҟR~6]|iv(wU%='NU~$dɒt 7o1-_?;/ye6 @֯_ϟ,_NZ;=[&LP @ @hjjʞS ͷ2y9<7ʼ-!syneV`ߡCv) @ ~ @ @ @ @ @H1yexp9eea)b_w޹ @ @ @I 򓟤{7L ..k P)`7|sꪫRqKMMM:e7nLO8PJp׿nnݺVUUB~8R  P. Λ7/[#7_=ٝY" (}[Z'Mԙ%@ @$O!Šʶv^/F[<3Wx&`=y$y{gʃ>8=-Qbgh~1Y~H&MjG4{#4+_J򗿜}Qph /"8;L^{mz饗ʮ!~֜~ON[mU> @`KXti/rzSי%D(W\n喲'L=/}) 6]#8"=#-"F-0gΜ{l8m lٲ,fZhQYשS>;}ӟN555el @(~`,7B|@߼p.;bN;ghgA'@ @@g!]l+ YwLTe8ovk!ʻ< @ @G@oy) @ @ @ @ @@]]]ܑzLvQ/7nCWcmz@\l+֋'i @ @ @ ˥g}P<lƁ+f_W]wU6ĉWt)־{o~<6c'N ?L'pB^{u`ܹnHzk~~9礣:JCF@WyxoP߅ nҽgƍk1w]wMm}_$@ @? 444daě塼y{z%tY-yoX/6ګ%: @ @( w. @ @ @ @ @zO &d\n] 현# Hc755v1F\ ug; @ @ Н/b~~gyC㎥}i-8ϥ^"HX͘1#tIB?oKoD:7tgga~z;ttuץxsx{!td(} @@,[,-X XqWgC.e;=CO @)aÆ9x59`bn^o x'- @ @$a[һZ @ @ @ @ @ @;1c18༭Q%i) Zp1XaLLҟQ8W @ @3Ow_- nOrh~0滔XBe9ŤIy睗/fVԙk6M>=NI@'"J7pCUcƌI .L.=ܓ>SeD??38# 7,i@܏U ]b&Մ u[ۧGB @$!fk+Fn<뒇Cx~kso"@ @~ @ @ @ @ @ @@_hhh( Cb[ޙ1 t[brꖂ;8y[MMMcq @ @ @/NfIˏ:,7ѣG7a` 򑏤>:>n40?df_@ ߅ Sӟ.ػp92ow*N BhD V ZEQQD*"*( (4J %$=gߓw&3's]Էf9s&':~W2k9@%áz-#&O^U62o|cw}me/{Y5$rWTC~{ғmذa76=  ;ro?מ*j1sMNeD0߭ڪdz @ʡEoQwd>_eĈ5!EoQ5_# @ @ \ @ @ @ @ @ 0@VX0;Dk);{{n9ZyJnN8X$@M2*O|y晦5P'Nm+/rPb6l> @ @XRy3@[.x;:Ǡ)v @ގ}w] @ @߁غ3 @ @ @ @ @{sH@IDAT @`,[lPFڻvVtX⋐.󃂊vQk.3[ą @ @ nj_zykzh%֩ x w-}-N-9S *ߝwn٦N]]@.W^yeo $iO{:=nܸ?;X 8;w\}k]ߞsXCC`Μ9 -}v'JRM4%7b _N. @e7 ޢ~cgx@w ~mXamCd{1tT @ @O<WU\s5ΕTC9$2wÇ7Zf saKv]-]wE%evX[μ <9bZlo2٬?p?[O =;b֬}[ѯSYJ{˶-uo9pt4$}3psΉ*VZj x`p AZi4 0g˓O>Y[vIgСC+qm9rdgm @zXY o[=|˭ev"tN=N]I*ʕDRɠ=Ր cW @`` ,\02.>SbŊN!1"jzcmn[xQ @|-_[snOo끼)g]fݬ]w>Cy @ @X~׽3 @ @ @ @ @ @˗W?4>88r..]G1IEp~T.׍)…;Xٓ @ @Z/7pC|tJ桇ُ8koyyj[w3[% o%s2'u#Nmigʔ XtA`ժ'ヨ{#e1}zľl3fDX_+j{^.-'%;.G+ -[O>dMo}s=@ -[lֵ# @`Xdzk}{wAE8o[yQ0oÇw} @ @ a @ @ @ @ @ @@gVT> ܬ,,/br?r{cU~|?/Ep.!Cs5O @ @ϟW^ye׿smox`tA׿>&Op%O}*կEugo%?5n5k"6⦛"^x˟0!bڴ-}wۭ%7%0sfKxs8ygcm_a-k^Ycޛʓo{{fWcZ}.P'@xg[|C|gV~͞=;V\l h:}l; @/+ofn}p9HoO;tꏑK[-"+ @ @ @=~ۣd  @ @ @ @ @ @~$A[~fB%K#/u֋ 5*Cr_fG%@ @ @G2JjLlRNZ T7Ao ,X zx{88餓:u{ꪖ?1*0=^ӧ~}yZBo-["n!駛_С/y^W:dp!~{3' TW @,\027Ggh˿'l'OVkvsY] @K mOnyM[-[.o1bDC[vWwN?,v$@ @ @nۍE @ @ @ @ @ @`0 dp9HXyf s2dȐꇝu6,8+ v @ @@OdW\Q b*Feȑ>ę)+/|!N9uv 0߫s++'Mo_t7߼aofuv#@ 1_|5zҥ^\3VoWz3W!@ @ @Y@@~t @ @ @ @ @ @(Aal€{b|ŊF2?h9p܊ r]n֔ 6`  @ @oooOS,_o&qV_V[mpxbmyIYY]G\{mIJe v MFKN\4iy/ioyKě1mZ9]wuqaԔ)S}# 03-"7wIhرkN<927|;r. @C sװ[{}-Yʕ+ zW -ַnjS +|:XP @ @ G @ @ @ @ @ @ UR0W"n_?ɱε>|x@"< X1WE-d=5 @ @xkf?t]v%2tnꪫӟtdݳ>-lAߙ3#.%V;UxZ jUM`Μ|<ͫ34ޣX =}Jnuk~Gyd+ֶW_}up~?|ko[_˄. ˰ ߊw v%@/7Dur|5FR[v׶7gk%@ @ @& w= @ @ @ @ @ @~!dɒjp} pw | AFck .SG/g. @ @>h%to[ ^`AÃ{EӧO߿͘1#}$WC3 /ܞ?~^6|5fXjVMo8䐨?G%y5FW cwqe-4w#s=ώ=oo{'?I/J 0 goWJmkw%@XG˗/=a~E][U [СC#/wP1s( @ @ @;8wwM @ @ @ @ @ @52&\9h.4rk6W @w5ٳ'nOUQ댢.}JR @߬ߢtMcȐ!]9}  @!Ws_v\[o.׬[-ʁcƌYkoB @ @)a=% @ @ @ @ @ @ . -a0brݬ~8C<:\ͺ+aùv=-"@ @@^SIw6|_e}i {cĈMכXw/BM>OIJeW.\_qǚaD /ꨄמqrHR2D$_r%;pNO>>WC{ ߬3ķgbʕ]:ihdMvI @`ȿ+\ߦw_o<#Gl -xak ]|kСqkI @ @a  @ @ @ @ @ @ \y+U7a펬߷>x~,$@ @ֵ@]{Z?#M/!0wiӦEҟJ azw?Ӧ=Æ=^ ~׻;ӚXsFg]qkxcxX n:[ǣ>*[UdY~j?~naWOc @@_-Z~8V;!CD]T[xX}?aÆ爋#@ @ @~ @ @ @ @ @ @J:H~d'@ا~|rʕ:7k6tYgm @ @@{fΜYc5uر~e/a_WguVM/O'|rdhq(|^.DsL{1~| Pmj կ[\Y]|_2Êk2Ȳhgݨr%/yI5Kag@;k֬jXovKvg„ UE6,s9 @,{)aU+V_J>Elq-M#~o|#j/8#@@GV\si 2|3wٲe= lIlխYoɵ  /_^{Fv}=>"d7"H-5Wpgk'@ @ @ naw @ @ @ @ @ @ @:(EpPRbCir]n7 :X' @?]w]uUV5'ք1|2q^ߙ>8c6k'~:s"o%}1~|O_;θ/9OJNw|kQ>R;G ͐ -OW~vǿU"wҤI ߬ |cĈ  @VV~PV-b}Zο;(]y2W!@ @ @ @6f @ @ @ @ @ @ @B ?D(Pȓ!C ׏v}pokM\O7uZ @ysFv[,]GӧOo ~+^Q d3<3N<Ħ.&|zj=<\\Wj 4}3{I/Q Y=E`0 \yeT> }#8#bm{&0,XP 6k֬~Z8Yq}ho w@}ٺmy%Crn\Sg[oyfN @ @ @ w0< @ @ @ @ @ @  .BCsal EHpQv\ Gy-  @of 7׬dԩSnÆ kKw__M've8/~O&D|Q ZE@W|}uj[COD|rD"~$m|-1qjo9w- 5yя]*XC 67 %_3!G_uhr @ @ @) wp> @ @ @ @ @ @ 0(rXp5Wm5V<K B#3= @+W/뮻ZϜ9MQF^{⢋ZVxbG~TWi g9s`n lͪoyV\3tn; @XlYknn۬暍 hѢsͪUzvq^[uP5#jO끻#>Ɉ_}C8 +Uh@%,8#+_J}#9'b„cZtM`ŊO?]=3ٳgW~37wG)7djpo[_O4)&Nnaw1 @] ]xq1I֛Jn1(X=c[-S @ @ @D@y  @ @ @ @ @ @ @ ,[,ܞC3دs1:H!?p>@ϰrhxjFȑ#;hw6lذxK_s&vL<9G#U#b!*ͫǴGw\UWo".(bWi P+節z Fcs΍ :2vئ[nf? P,_5(w"8,TxwӁTWV| =  @ @ @% 췷䝗 @ @ @ @ @ @ @Vklp~cvgF F~Q! .w\(Ը߇'K%@P@v-… =5{yĜ9- D~z:4J&i'>uVV E5  tIo"˖-X[f]nw|2|0ݞl @ @ @b @ @ @ @ @ @ @zP ?[n+(QqW_jUm8t\.Xݕ@x @`O cŊ=F1lذ?vZlFmgʈ}%lUjm"osWtB`}("~?I#jG ͭ$XϩgXoQEaebw 6 &NX2ȷhuylm?ZVV~(uvwZxq +ɟ}Sa_ @ @ @ ^a핲 @ @ @ @ @ @ @ P>\ g"EҥK[X N2Ə15QXE]+  @u)Szk5_bÆ -Bwn֮_۞\ @ @ @ @~k= @ @ @ @ @ @ @ @ d@ ܬn+,8"| g!^nfȑ#:αgk&@-x+eq}-ϟo|cSOz-".,b٥2'ٳgWC+'O[ou7>@1cfm&1e[>հ-2rp ˴ױsEUˉ8_rwVCUCr!kߋ+ս*̟??27 :|ˁE;-[|x_ @>trX6/^!EݓayQFE @ @ @ @}C@ox\ @ @ @ @ @ @ @ "L Rj2YpE=/#@\s:U9ߧcɒ+uV[葓͛7/o~;#(3@ `dvao?ilvE[=sΉ.(59~x['tRL:u d׿㡇 q-;vl|pp%WbNջk~;zq嗗|]mQ50t׾62y +">[}Wqɫ=Z|y\zqu]O\ vŋ-ַ3|E>id0c[_g`oXW |}(tX[̕tfu(w4\/~1>6k{7|s>:.š:ylkY;̨EvG!Ct6OEo_ˊ~4f>&:q'`}sqiu+9{dA3gl%dP_}Mk+{np k[p~֬Y -ozӛ1a„tyO|"*XGSQ=4_Ӈ1q%Tk&t2Jpՠ&{y~roZ͟?ƻ&T -YgoQǏﳶ.`X|yMn~_-BvX9,Xבڞ |M!@ @ @ @ Vaw @ @ @ @ @ @ @ @ cǎcWlٲ`faxQ);;r^3s-vk9qZGꮄ yڳ^B@7vyKJw}wkoqlݔ)S*|qe;ĦӮuY ~f1cFu{'θ:f'5~'NO}zuQ̙3gVߺF2uʔ) c7Jo˙+*!FuǙ{ϏSO=uȱSN9exǫA\rIu1?1~ԜjJjg1qg>\ U_~ _Gc}u1c⢋.-PMa/K_5 t2@8Âq饗Vu~ kNw}GW]uUxT2駣Ȝ٭TGkY .ng^cJ>_.\VXo9̷Cp{{s]W t|_>7˖-ԭ!E]vg|D!@ @ @ @~  @ @ @ @ @ @ @ @$0|mTM˰ 6P Yxqc[H=g8r^GHO ஞS r(‚|+W!@ȟE0>nV 7n\ }38Y9kmf߼>;{[ϟ_sNcɓ'_/=X:q5?~|W -d|TZW|ɸ{jF4 ͅvaU !;vlL;Su;Cmo{[|Cz>ֱȼJqTJmGzkT^G}g7VR=Opa:~1o޼o={СCAoqk2[M7ݴ57T/KȺ]/xc]}V{A9w 6ʁ m|F} @ @ @ @%/zKy  @ @ @ @ @ @ @ @D`ذa@ ˥)wBݧ~mUVUÒҫ?"\Lh]l\޷#c]+?<\#-(l3vݚueM}'NXznJ(l˺J^j%06b׾_X![. -}k^Sŋꫯ9߱;sX o|/,AY*em @ @ @ @`;XyM @ @ @ @ @ @ @ P#8AGBHloTL\Ƌf9WBZr/%냆{bb: @GqQG;tMt|{"Vh9Ww}j;0Z|nl_{~m&O7tS7 zc=ZH>G[o믿>wֱȐ(bڴ^7~-wOķ3gN_yjGϛqU{r]-3ǯ zO wˊ͊:+m.+˭Gd]'W~䝏 @ @ @ @~41B @ @ @ @ @ @ @ @O dOK[gcUeh72hfc9WJ^Kn/+f!†E]^Wmik8Ny>zgtwxq{8C/͡ }%{]TBQ\&/škmb닝[nF{XΌ3j~S쳢Hw߁uZc7@IDAT{]z׻x%+pe 4d׿q1Q "<qy/~X|:={v'?ҹ &LnF7p}ȟgEnOߴعv]={Wa֋"v[sϱb|mu[n( @ @ @ @( G= @ @ @ @ @ @ @ @a X-zYUIrp}?;֑hlד[ ( 9! "sm+RCߵ 2|}247824M.g8}Q k׮bʕ+o[͵uQ5yj./}iBLsϚ̙ .׌O2??!oy@l&W"n۹ZF\p+a/nxk˟ -U0h n+6_5smik.0>m[ۑ>i DN @ @ @ @ +#@ @ @ @ @ @ @ @ @`dP[N-Pb~l]co5.Z/]Z%~NJxnrXq>ևO/ܹs+aV]w52~wL4}sNsϵL|.4]/'f͚U L/_^>Xsm[mUMYѺ {kv٥^`A~qEŶn[v t2,{۪{,oC}2>fn]v;f̘uy=WM96_.smϕ惽rnlP[[S-:6_O* @ @ @ @ \@os3 @ @ @ @ @ @ @ @[*(P38~5מ5ٿg`^׮=3|N gpr]0sΣFtJ͕+\+WA[ou]Az-r+~F.ֶw>Yvm<"_En6 -tcKڳ_?  @ @ @ @+WJ @ @ @ @ @ @ @ @~+Pf_*Ep[uyhwvb.V]v_,˗/) 2d b+utٙϫ+VW\Q2#򕯌K.xٖ+=ȈI:s}{{l /a-Ҏ?f+Ǝg}vnk[hN6-wxӛT[vŅ vhCZqTo8v)ĥ.+$WU7[ݖUW2@5L76 -Ƌ:^{S}mL+{z?zѹ  @ @ @ @ @;+!@ @ @ @ @ @ @ @ @>&atR͐jX?VOyM[su3/UVUs|׏Ç Cɲ` ێ;Crl3ޱ~ lI]P\ЛA)-^|77/b\3Έ|uQq1Ćnp:8jԨ5.k̘dP,Xu$VC9$ίo1dȐFz  @ @ @ @ @@~1I @ @ @ @ @ @ @ @@>Cu"X\4k6^.ht0nWו+WFzWo>\rIL>ɱc{]Zk{k]Z_c|$~xxg}X[-ElmW_5䱋-~ @ @ @ @ @ekϟ @ @ @ @ @ @ @ @ @k 2$2$1ZʁEpV w.י}7;Vg0⤓s|PmQS矯N(]y-xC>8ϸ+#Cc3gƫ^KCmf|ʔ)fl]v뺾d@+h}QGwi\v/*8kfl;?c r0o R @ @ @ @ @+ w> @ @ @ @ @ @ @ @!r`ѣ{,="xΜ9V[ k0{k|oOu :fv tf Ą jb'yEyfu`|PV\sO\-^D|$<-7n00|2cƁ{7Ǟ~|mV&5jTM2ywc=6~GQGl5dpYgU3W;[Ə@3&bF<ȣq뭷g>y{V3,: @ @ @ @ @@#aT @ @ @ @ @ @ @ @ @ ,[ݍm6>Oč73gΌo~1d~Ӵ|L[wΞ=\`W2a„^YjN}H 2a7޸f~~_<5Gq͂)/xᅈiӦŗ{kvi񲗽vɒ%~L$@ @ @ @ @߁8  @ @ @ @ @ @ @ @ @@ two'[nG}4nj3*!C`A˭dw^?ɓ[ﹸev̧z߬(wʔ)͖wh|-SN9fݚ>pr}cذa.gF_ōN:5N>[O>k|;R/]#˭%@ @ @ @ @A`U @ @ @ @ @ @ @ @ @@g#wv;#zW{W[[/b*7WMvzv]jcǮaЮ5YWf_|fu-Z]w]eM6?P;lΊ#[nm|믿>|ַp@ >|,YҁՖ @ @ @ @ @I``z+ @ @ @ @ @ @ @ @ @:뮻)w}ww}/~1sϵ^q-K2uҵ. 7\W_=XX_55wxGkun喚vۭѣkjժ_~įkcv{n_G&M{lO?coCѥK{6D @ @ @ @O@o"@ @ @ @ @ @ @ @ @ ZqiŽsOzҗCv&^>o@l}ӟaÆZfxi_/tP 22_; .5a5dtd1cC}Ağgkiĉq衇֌ Nuh⨣_1gΜ~Z @ @ @ @~ao @ @ @ @ @ @ @ @ @%iӦŗx;O>9vyNl]u{ LGqDͭ}ߌnfYgܹQplmwg m>Yg/b!R/:>ly4k֬bhʕ+ϯYW&Lf;=Ppu|C#FllJ.sJ:_\ }od p}Yti> @ @ @ @ @*  @ @ @ @ @ @ @ @ @M!Ck_Z<#q뭷Ƨ>aSk:/b{|'7ǞTPQF̙3;裏b„ & uGѣu}(ϟ`CŢE.?adP`(]|1]n7xclux!@ @ @ @ @AC @ @ @ @ @ @ @ @ 5sƒ%Kb-ځڹw~:VfqΚ@׈9sZv/e!;|&{4/eLp#yx`]n#Cy;R?jo}25å;[2/6:Fm4ա?vq}> [ml߱뮻w~#".6"^~Kn @ @ @ @C= @ @ @ @ @ @ @ @ @xYoF%5;*_CrGyd]ƌ3?aٻxCo࿓I$H&5.Q5-fZr/5RJq]KH yHb()(1eλ>ovsN$49w}>O3绶uWY_./ߦM~᜹ "On/N;-#FX~ǏOt`ԧ~| 'd]w-^ AF @ @ @ @,q- @ @ @ @ @ @ @ @ @@я.E%4 L~rgȴizݷz_ܪU^e:t0{g6ps1{Z+zj(?-]?*55/_)R`_=3fׅ={ @ @ @ @ @# @ @ @ @ @ @ @ @ @h2ӦM˫Z Y.:~S3`qǤc&\ !@`J.yї2quuɵ8,wb @ @ @ @XjJ?[#@ @ @ @ @ @ @ @ @h믿#F^(/rNȊ^'Ȱ.>C96G?fW\l` @ @ @ @ @ym*  @ @ @ @ @ @ @ @ @V>s=W)3~Ǎ7_{jݺMfLdi~ml.5& %m4#~mi5'ʘEΝ;"} @ @ @ @ @S@o|oVM @ @ @ @ @ @ @ @hoVyr>|x9w֭[GYok{;'uuI˖]w%;0_5(0vl//g~_י8q"Yٶnh멩IݳgϞ` kVjkkz)w/)]?X''o @ @ @ @ @ @ @ @ @`IO}g~3kJ=z(W[lE)sRPnIʝ1#?'~7_էFK>;9/^>zL;Yi?O0`@^~/}ó:+'||]oVgy&T-[FmT-ҵk׹M @ @ @ @4a-Y# @ @ @ @ @ @ @ @ @>,_=Pz/ СCz]-}铎;6ruɑG!\1ɿkr=ɕW&.;oAԦMK/4gqFƎ;߷;.'N2%Ç/ڢ;OiP_gu|Ru` @ @ @ @ @ m @ @ @ @ @ @ @ @ @UǏ/M6,CO?ӧW͙QL~߮_?-Z}Ud=߮VMMrWҮU!n)ϒ?_Jmmrq-ܥ}\zgK.$SNFUW]uwBq/R92uuus|*n7͹5@ @ @ @ @,~aX @ @ @ @ @ @ @ @ @QI&GI['Ji_nkW}W_.ɝ}-k&]lݬ>5&G񏳮/>5&[l1oa^}[.~\@>\||0O>~,}+}6ۤs bA @ @ @ @, a m @ @ @ @ @ @ @ @ @3{}WF=z(nz}s $G's,嗯+=ȤuYj]`Дu#fYyK]vշjEPեSN9%^eGqDiE.cĉy<@}ѹj*}ow1zJ-= @ @ @ @,}~wn @ @ @ @ @ @ @ @ @b7n\3r+2լ)}frYq:n)9f=9d}Yj92H{V_={QYg%o _2~.,vXSXZe &L_r{Ϧ+n׾V aҭ[Ʀ#@ @ @ @ @V @ @ @ @ @ @ @ @ @FU ˼\~L2iرc9w/<a#'^L6랛n?O.a]L>Kc-&dY}MoOG>}4%V4v 6ElAvq|{˷nݺr @ @ @ @ @`]0B @ @ @ @ @ @ @ @L083wѕ+Zo^-~{٧/`Rr;.qjM`fաݻ'瞛&[o{)!CO>it۷/y睳N;eWltN @ @ @ @ @ r^f @ @ @ @ @ @ @ @ @x7sw˃>I&5:{)5f:E`c 24s)W?{MO+1-K&u2hPuo. '$?YҦ͒ӧQW|̘1kjj-ʦnA @ @ @ @|ya_ @ @ @ @ @ @ @ @ @O?;\ިJ֭V[~=z4:OӟNKُUWM=69ДgQ'dե"w^r{)0 9deǴرc3T~ws>Fӥ\?;eYy:  @ @ @ @ @~!@ @ @ @ @ @ @ @ @4*0y 6;4:oUVrvmW ˔(T,BOK9GաCrɿ{cZ'\\vY+;7c/\V+}|X~]w˟M7Q[~ssN&@ @ @ @ @f;* @ @ @ @ @ @ @ @ @`NqhydM7ͮZ.lSׇ^y)8zvr'Lf%PYw7''V/}Nڴjcƌ)* V֦o߾X]}՛欒 @ @ @ @,Baۣ @ @ @ @ @ @ @ @ @!';({y4iRm6m]9w]vɊ+`+K%$]|y>_>gC-"Д~;80WWV('GsҢEV~p\%ɝw6/'$lG2ZK/\[OQU>ٳ @ @ @ @ @`D^#@ @ @ @ @ @ @ @ @rm~+bN3tjV ܣ曧Ht'קRHtCuI~fI !w=Kz(6Z+񏓃Nwo8gx뭷ʁH)ͼu]7?яJAe @ @ @ @ @K% @ @ @ @ @ @ @ @ L0!wyg9ɓ!{w9w7n0@cw*t|Ɏ;&;t<H%/fNFh|J+%R@kҫWsSw-ܒ".7L1dM~`7缅6 @ @ @ @X".& @ @ @ @ @ @ @ @ @9O!Cϭޚ9%jg~ۀGǗ=:Z}_S lx-M7nd͒6mC5*6,dwY}dݒwO")~g_U/|ߺ[d-v`^A @ @ @ @[@o~VO @ @ @ @ @ @ @rk@IDAT @!0| 807xc{9FW\1{w9O>)B $wQ_Fˏ\fd͓m/z ]9W-΍|)>[l={6]Zksx>7tSzKoݺuvitAyS @ @ @ @ @9 mo  @ @ @ @ @ @ @ @ @@Fx 7 /@SN߭*-Zh0G%0yrCɟ\_Fڴqbdfu4_S OMydVù;cҥ!0^{|_|#o W]uU. ۷>LA`)(h#/XH;mڗh"ڵ>wf7Q7\w钴ifc&__{oy̘p߷ު?OW_xnҳ笲z2|{ PWX=C2a„mk._;ݻjL @ @ @ @,aC3  @ @ @ @ @ @ @ @ @Æ e][o5SNF)A*ѣjLYS$R"O\tT]:vL:thXڷOڶU-"dvֹnjI;ߝ4^?>Yeܸ&}T[+ceWOX#)>GS_gZKg}o9W^yexhr?q @ @ @ @X ~G @ @ @ @ @ @ @ @ @cK\sM~W^biQJa;sZ@Iɛo&o5?ׄ.\nd啫K~vmBT`ȑ'|R߿ 7 @ @ @ @ @ [@v @ @ @ @ @ @ @ @ @so̤Iƻ4뗟Ymժ4XxS$ロW_zQ>2SɓZK1ԩ|kI.IoԗVJ_F`„ 4hP.< [樣{쑖-[6A @ @ @ @-~ @ @ @ @ @ @ @ @ @@ӦM˭Z}ᇫdmv-Z @ 2:~|yu7.)J]癥h>1#>̬,ykk۴IҶR۵K:thX"w'A@>|x9n(}?JَJI'RZ @ @ @ @,$a m  @ @ @ @ @ @ @ @ @z?0_~y.ҼU,+R8;,kv՘ |^J//䒼 UmJ o:իjL @ @ @ @,a B= @ @ @ @ @ @ @ @ @#Fȅ^n)&M_oA}x`ڵkW5A( /8wqGO^曧}S[[[5A @ @ @ @߯*: @ @ @ @ @ @ @ @ @Q/w^ު-Zd]vGmݶjL 07\q;vlմݻcI~Ҿ}1  @ @ @ @ e~Y1  @ @ @ @ @ @ @ @ @SN͠A!#Fرc=g?jV5A_'oE]{VX!vX:ꨬJUc @ @ @ @ @`~ίy @ @ @ @ @ @ @ @ @@>,&ovkCIv4 @!CrgܪUVw}3`lᆕ~ @ @ @ @ 0?~G @ @ @ @ @ @ @ @ @J s嗧ӧO9`owO-fR'@,P_|{gUirI'e- @ @ @ @ @s;7 @ @ @ @ @ @ @ @ @@W_}5sN@SVkjj뮻O߾}+* @E!K.ɥ^?Eo[: @ @ @ @ @ "c @ @ @ @ @ @ @ @ @@Y`ȑ93hРL>ҶmtA9kWU @C`ĉꪫryeUKٳgN<> @ @ @ @ @_ @ @ @ @ @ @ @ @ @`>l:z뭩رc?OӮ]1  @@sxrgZ*  @ @ @ @,~o @ @ @ @ @ @ @ @ @^)￿dUW '~M6Uc @(裏E瞪w='|r>lٲjL @ @ @ @aK{K @ @ @ @ @ @ @ @ Ш#rꩧ;_s5sI'LV4 @Kc=38SN9[[[$l @ @ @ @ @`>'i @ @ @ @ @ @ @ @ @`IxsiSWWWZkO?=_UXT @%X/~WG9묳^{Uk @ @ @ @ @+ w}vF @ @ @ @ @ @ @ @=f7pL>2*SO!-[VU @K?38Ao^r9Ba @ @ @ @Xj.  @ @ @ @ @ @ @ @ @`i3fL:\q2eJe]vvaiӦM_ <9餓Vl޽{Wk @ @ @ @ @# wyvB @ @ @ @ @ @ @ @?>կry票<:u?>G}tڵk7ۙ @ <8?V9묳Vk @ @ @ @ @@ߡ @ @ @ @ @ @ @ @ @ӧOW_N;-cƌw!{l_үB P. ʩ^{26k׮~ @ @ @ @h~z @ @ @ @ @ @ @ @ @`9 /TZj#8"rJ:w\W!@irW3̻[C9ӿm۶үB @ @ @ @S@o|oVM @ @ @ @ @ @ @ @ @ @ @ @h>~ϻR @ @ @ @ @ @ @ @ P%0eʔrYgWƺws9'oO @` K0`@>9sjUk @ @ @ @ @@۴ߏ @ @ @ @ @ @ @ @ @F>:jecǎ9sQGu֕~ @+p}?_yP۶ms'NHQw @ @ @ @ @@ߑ @ @ @ @ @ @ @ @ @oc=6~{6GqD8tԩүB O+2vZʃW_}\x~PS!@ @ @ @ @) i"@ @ @ @ @ @ @ @ @U'N̹[.&MmVӳgJ  @sg~NZYH[ @ @ @ @h~{* @ @ @ @ @ @ @ @ PrfѕnݺWU~WT @K/#<2C,m۶tI) @ @ @ @hZ~ @ @ @ @ @ @ @ @ Px7rGdVZciWU @wqy+ ޽{..> @ @ @ @X~; @ @ @ @ @ @ @ @ P%0}7)N02/N=*}* @M_`93sdԩ^袋+VT @ @ @ @ @` ]|L @ @ @ @ @ @ @ @<3O~s1*cm۶i?>-[ @,Ca^{[/W\qESS!@ @ @ @ @/b? @ @ @ @ @ @ @ @ @9n!nnysI' L 7'X7ȑ#ӷoߜp $G}tX`N_:rHO @`xooy'+_orfM6 @ @ @ @ @hpn @ @ @ @ @ @ @ @ @sO_v-/9  @K@Ϟ=裏sM6m#GL>}rgԩK- @ @ @ @ @` ԕE8O"@ @ @ @ @ @ @ @ @Kq2`l~VE]<ҧB @`@{駟ٕo}[TT @ @cޣǁ? "(&ebeZ,QCJ1J)j(xK D )BBф 45Pg|gߏWafp9f{?{1 @ @ @6@v$ @ @ @ @ @ @ @ @ @>htmF{^by'@Hcxꩧ⪫-"_`A>1rȨLc  @ @ @ @ @`drϦ9) @ @ @ @ @ @ @ @ @իW_cƌ5]vqǐ!CքI @^& iQZZ @ @ @ @ @@4m @ @ @ @ @ @ @ @ @`=EEYYY3 @ @ @ @ @4H @ @ @ @ @ @ @ @XO`ɒ%qI'?pISt΀ @@S TTT_F亝w9NS_| @ @ @ @lD! @ @ @ @ @ @ @ @ @`3 ̝;7ko6.,F# @ hժU92Dǎ7x#:蠸馛8 @ @ @ @[ ~J @ @ @ @ @ @ @ @7n\ >_kI @(' ,Hfq5ą^Xș @ @ @ @L@MF  @ @ @ @ @ @ @ @(d?O1pXbERW՘1cF|,N @V{O9唸Ą u @ @ @ @I [LŪ @ @ @ @ @ @ @ @&0r8Fp@̝;Wڰ @*N/"$5yѻwXtiQ @ @ @ @XLM  @ @ @ @ @ @ @ @ @@KXzu <8r ou @,?9N>XbERf׮]c̙QZZڒV @ @ @ @w= @ @ @ @ @ @ @ @ P ˖->:̙dk#FCj$@ 3<}wy'رcw}{ @ @ @ @-Y@ߖuF @ @ @ @ @ @ @ @ [}/$[ouG~j7I @^}8#c…I5'O2%S 嫑 @ @ @ @e@ @ @ @ @ @ @ @ @I`ѢEѳgϴog跘!P+ @@:u'|2zꕬ/_<>[j7I @ @ @ @&oK!@ @ @ @ @ @ @ @ @ ̝;78xגffOt  @ @ @ @ @ @ @ @ @a_~y\zi/~#ɤs @4LO>F >hz衱dɒ  @ @ @ @ U?zT%@IDAT  @ @ @ @ @ @ @ @ @@.¸O݀ @'0o޼8#&]v9sĎ; @ @ @ @y$o}  @ @ @ @ @ @ @ @ @@r\ ><~_'e2կ~sN @T`…qaoi @ @ @ @ P> @ @ @ @ @ @ @ @?Fgyf?>fq뭷駟 @M,k!5?k.]Ĝ9scǎɻ!@ @ @ @ @@! h[_M @ @ @ @ @ @ @ @ @UUU <8&M̗ĉcy!@ @` qkHD @ @ @ @@3 h @ @ @ @ @ @ @ @ 8\.vZܷVZEyyy߿qM @@K$ @ @ @ @PR%@ @ @ @ @ @ @ @ @ 6,mۺu6mF) @ 4׿5:u\p8Cn J @ @ @ @& qM @ @ @ @ @ @ @ @M+0bĈ曓KJJJbѯ_ @#/^'  @ @ @ @]@|B#@ @ @ @ @ @ @ @ @Z=ztfcҤIqk @u]kt)h…ѻwb @ @ @ @ @` h 1E @ @ @ @ @ @ @ @G믏+2,ĸqO< @Z4e]{.+W5$ @ @ @ @M@|"!@ @ @ @ @ @ @ @ @:~\ƌ3&8݀ @i;$cq|I%f @ @ @ @4P@B #@ @ @ @ @ @ @ @ @4iRs9i"#GÇ @4@Νc֬Y6$̜93UUU͟  @ @ @ @ PfuX"@ @ @ @ @ @ @ @ @ivG.KK/ΟeB @@*н{m۶8묳u @ @ @ @䣀fUD @ @ @ @ @ @ @ @̛7/N8ᄨHW_}:1^ @/|;?1b$E]_Iʆ @ @ @ @k drZ @ @ @ @ @ @ @ @ @ ^yٳg;I^)SD&ɫ<%C @@SNO<1o9Z{Y @ @ @ @4f͈j @ @ @ @ @ @ @ @[wM.Z( իWyd @ @ @ @ E@ @ @ @ @ @ @ @ @Q`ʕѷoXw=ӧkKN @2dH\|ITeeeżye @ @ @ @W ~6n#@ @ @ @ @ @ @ @ @u TUUű4i{.uoJ @@ ̓O>9&Oرcxꩧ4os @ @ @ @%-rUK @ @ @ @ @ @ @ @ 0lذo>  @!dbĉѫW$ߎ#<2.]Z.K @ @ @ @|n>k7 @ @ @ @ @ @ @ @ @@Ǝo֭[=ݺukN! @[n߹s$_|1=Xzu.? @ @ @ @@@"J$@ @ @ @ @ @ @ @ @@̞=;;4 &ġ @ Pm]̜93/%̙3'Z @ @ @ @? @ @ @ @ @ @ @ @ 2^y߿TTT$]tE1`Q* @XGSN1cƌh۶m2?a„;v:1^ @ @ @ @ 2gs_> @ @ @ @ @ @ @ @ G}}bf3&@ @ L2%N<ĤVZ_8蠃ZX!@ @ @ @ @PW I @ @ @ @ @ @ @ @*bi߮]FyyF-{+ @eee1bĈd"N8x1&@ @ @ @ @fwQ @ @ @ @ @ @ @ @jc{C#@ @ 92%-^89XbE TI @ @ @ @@&W{#@ @ @ @ @ @ @ @ @)pwGJJJb̙qabUE @.]=z_~9)++ɓ'o0 @ @ @ @B : @ @ @ @ @ @ @ @'K/ũ] @K`mӧG§LG.. @ @ @ @ \YH @ @ @ @ @ @ @ @J`ŊѣGxO9唘8qbQ( @8裣eĜ9s\?  @ @ @ @@ g: @ @ @ @ @ @ @ @)pg~urK  @(:*⊤(++ŋG$@ @ @ @ @2ٳ @ @ @ @ @ @ @ @mzjRovb޼yo|hW( @u TUUn  @ @ @ @ @ @ @ @ @^xkbQRR?x~6M @>g}kfW> @ @ @ @ @ @ @ @XO`֬Y1mڴd~wz @h Jy /l @ @ @ @ @ 2 @ @ @ @ @ @ @ @hU[VQ~{ 8O @ZEΝcҥd={k @ @ @ @ 6$H  @ @ @ @ @ @ @ @O`i^zi[u @%/})~_&gr:thTVV6L  @ @ @ @(nL+n @ @ @ @ @ @ @ @ @@c^{}cʕѪUX`A=~ @)PUUcIM7{n{, @ @ @ @ @`C -'@ @ @ @ @ @ @ @ @ ˒F5?5m(8 @%f[nL&<-[֨3m&@ @ @ @ @x4-or @ @ @ @ @ @ @ @l ]wݕ~MrC @ =zĀw}7FՐmb @ @ @ @ @&W7k @ @ @ @ @ @ @ @4P#Yf%7xc >; @ @`ѹsXjUlV/WMsS @ @ @ @(lTP @ @ @ @ @ @ @ @gNv):M~  @ P@iii :4 [bE\ymN @ @ @ @2gY @ @ @ @ @ @ @ @ @?_ӣGxg8餓e @M#׾$ҥK\T @ @ @ @Z@EV( @ @ @ @ @ @ @ @hrS~w'xb @lH_b1"YK.dC  @ @ @ @ P@&WԺb @ @ @ @ @ @ @ @l@*cXpa1k֬87m @G`ʕn{.ss[ @ @ @ @(xlW @ @ @ @ @ @ @ @sOW^n/B @jh۶m\zȑ#ӱ @ @ @ @䪟 @ @ @ @ @ @ @ @ @{?~25k,~1&@ @Y>ԩSۑf_Ν;7kN.'@ @ @ @ @0,  @ @ @ @ @ @ @ @ @ _ji>h/F @$mڴ??WUUŨQ @ @ @ @ @A\ӠHA @ @ @ @ @ @ @ @ @ZW^c%ӟcB @裏4{b-_Wyd @ @ @ @?l$# @ @ @ @ @ @ @ @W}ߟ q1`Q= @y+{Eiii|GѶmxcv|%F @ @ @ @@ d? @ @ @ @ @ @ @ @ @@!,Z(x$կ~QVVViˑ @"nbȐ!I+W  @ @ @ @hf G @ @ @ @ @ @ @ @";vlrDsΉVZ  @waÆEIII- @ @ @ @hF~ @ @ @ @ @ @ @ @(e˖mݖ[iV(˓ @"(--:*x7cڴiEt @ @ @ @>! @ @ @ @ @ @ @ @ & mݖ  @ B`iƍK @ @ @ @@&W|v; @ @ @ @ @ @ @ @X[{`dGtmec @/R… sy @ @ @ @hl\V @ @ @ @ @ @ @ @(s禍~o?~ ɓ @TG?Q:?~|:6 @ @ @ @ @aL @ @ @ @ @ @ @ @ OnN @ @  mڴI;"3 @ @ @ @!os @ @ @ @ @ @ @ @"jժ:ujmv4  @ vmK&/^3gtш @ @ @ @_@_( @ @ @ @ @ @ @ @ @f̘~~[oX  @gA~؀ @ @ @ @k4]#' @ @ @ @ @ @ @ @'P^^?L @(4޽{Gǎg̘˖-+K @ @ @ @@ h'@ @ @ @ @ @ @ @ @@ |&_>PK7 @$HZ*^* @ @ @ @XG@u8 @ @ @ @ @ @ @ @ @WqzG6O֬ @X&Sf&@ @ @ @ @Z5&@ @ @ @ @ @ @ @ @6mZ ɵ/Zo @h>w9:tPk={v)|x衇?k @ @ @ @䪟+[ @ @ @ @ @ @ @ @ PU_b,_Zgy>Yŷk|f @lz*i:(:v˗/wQUUZӵ: @ @ @ @ P~Z @ @ @ @ @ @ @ @6K`ʔ)ZnrHٳg?u$@ @@C\s5uvm{7.]3gΌ74A @ @ @ @@3h7} @ @ @ @ @ @ @ @h`ŋdz>7 G @+-}i@-{' @ @ @ @ 6d @ @ @ @ @ @ @ @h l5__2-ZT#?N9>]t)S%:j=k.VԩS㦛n';3m۶{E]#FȜk塇뮻.Ν͋*\|qGG#ݷ#͜9uj?Jl?[oUr}nرca^KФ\iZha~5i @ @ @ @/ F @ @ @ @ @ @ @ @ @@Yi&~;_V @ ,]4ƌ?78٪={vs9qg}j'x"[n jժ;vlG?ߣ{9rdwy~7*+gpt}W=qʼn'ר7-y4}fo>C-AOorX5 @ @ @ @ ~+ @ @ @ @ @ @ @ @ @v_믿/+ дRl~6[իWG݋ Ըշ|?{K.$Z˗^zi 8NAŃtܹ)_7o^~`C ɏ ֙5T^z8cذapzhjjiin4^-}Z@oD6k @ @ @ @ @`*7W @ @ @ @ @ @ @ @ @@9 [+Dk"Pv)@bʕj*| 8xGL:5/^nE.]2VC-*w|&ENN.[,Lw}wO =3M6ʄ _jaSv?Ş{[c1}xꩧx'](6IqS\q5m6֭[)W_-/gzꩧɓm MO>-}&qUثR r(N;Ò @ @ @ @zK  @ @ @ @ @ @ @ @ PNm]Α®yrZ(K56,n{K;y7pCl(7ߌ dPLǍToL}Cq={|駟^{muY|{mB{'D'.'?i/??f̘.<)}&YfelN%ͻ8C{7Z*<?~|s<@zqI'}Z,>M+WK 0w2v}|Y @ @ @ @)P2m @ @ @ @ @ @ @ @ PsK,z.hWO<1V\ͨQ17ul۶m\wu1iҤ83VRmUUUaÁ37PYhQ\veCͧ0跺g 뭮ɓ'V3}{v-z F)w„ ̠߆ @.wȐ!wHa1sh׮]g)ѴӚGsݧi5jT+.0gΜ /+ @ @ @ @ 2n @ @ @ @ @ @ @ @Q`РA @i |;߉sf&7bĈ;2^SCO}S5ʵZ [FZ*?6l7tSIxmu8cŋgՕ4n 1.<~_;\TkUVqqBuk4}̩]ticC߯7(M+WK nݺ6mZn)ݻwwܱe  @ @ @ @C@o=\J @ @ @ @ @ @ @ @rG?_Ҕ)Seٳ/Lho9RxnCaC Jg?ˌ3jԨػk~|XbE{[Xpaka66LZ*©ۆ~:+R8q3Vu.ʅK_p`fPOӇ^m[Ѥ lT{,[,ׯF/ԁ @ @ @ @[ @ @ @ @ @ @ @ @ )M6 'N֭A\Abڵ{\s5ѽ{L[}*a ˽~ӟ3;C/\2N0cƌLf}݆-i6,۶m[ҧ~ShK/ƍ|衇/XfM}c]o>M{ѶhT &wa  @ @ @ @\a-[9 @ @ @ @ @ @ @ @Jڷo#Fȵ/^8&MTG[O`ٲeqwd&0hР83m؆[2:thϴTI)cLS =묳b͚5ͭlnWT?+֥Kٖ.]W\qE':~!5^ȍiCi47zNGvء @ @ @ @4uʦ>A#@ @ @ @ @ @ @ @ @8CsAոp7j;2o}Cs3nRh٩SիzaVVSoiڵkl;xLT1cg>zOܳ;Fq q 2?~!CdU.\9g͹}-w[oo=,YRJ38#N88Sc%F}QN4}խܓx7 /ݤUV'[F'@ @ @ @ @T4' @ @ @ @ @ @ @ @4@ Ѽ7/b@XbEu~wy%1cFTUUe:6v^:^}L fXkbܸqB'Mc+YI b1|[bʕ%>t9Ӵ"{vh<n~6fN @ @ @ @lMa[S߽  @ @ @ @ @ @ @ @ D<9rdnvK.;.R'0mڴXvmf|p'x"3LC=C1=L}Cz*s)xՕ{'ݻwSN9%Y}~C&[۹ \|GϞ=-ZTH#FK/aj\j#鹦`/jF?Oӊ(#RwߝEΝ/3r{ @ @ @ @ߦ4̅ @ @ @ @ @ @ @ @MHnb)=#qDze˚ M@:ujɂ?է!Ξ=;3Đ!C2M i ps^{ +)`}{;ʔWZrK3&}Jqg\ҭxܺZ/\d?~.5!^O>dɚR駟>h̙3'}U)9}o馛l}rڧiEyn 4SK.$.#_W @ @ @ @ @@% @ @ @ @ @ @ @ @ P@׮]cĉq!#Ļ+Z%؂=Xf};io婧* k0om5kVɩ3Ě5k2>dŕm&?8WU?>UUUU5W駟ɓ'GVjS9hР8cj[[XrxܺZVTT4zP>1cFɚ6W^s~ť^ƍ=[o5HՅ?gyfzꩅ[liZQsޫ[n`L &L[V| @ @ @ @  @ @ @ @ @ @ @ @ @@Æ x F) k޼y+O9ݺuZ'hXW^y%3`3Zm6Rj}yfnx?gjlvq^K,Ʌ~_)SD =䓋OӧOϴo~󛙶M\2Rq1dȐjbۺuZ74 ݐYåp?<׿cƌ;cj?U>Mo{uhntMqFwt Mg @ @ @ @((nP'@ @ @ @ @ @ @ @ @)׮]?}{_{キ2[H`ҥwiL!*a Z0X/.DΝ4ɓ3Rpj׮]3mut='i yp=ŋK.|[57->(}isޫi-U矏/ѣGҗرcy睂~[ú  @ @ @ @A}t!@ @ @ @ @ @ @ @ @.лwxG/+"VXn}ݹW5ϼy /]w5:t:u;w!keޜ5T~>[0w1sիKBmk gӟ#F)S=쳹?5}|BC[o>S}Z'M˗/Ϝ>oJ.]K/muQ4;sOvm?!֯__;CtI5iMey7罺hnf͊{.$&\P]̿5W^ye6 @ @ @ @ do @ @ @ @ @ @ @ @ @ڴiO*ꫯf|R᷾|[ǎcٲe'jժHᦅG۶m .]6|8  ߾Zkyɱr?^yw @ @ @ @l@f_B @ @ @ @ @ @ @ @ @FH!oW\qEaS5k֔w.Xlwu̩^x!͛i+O[n)j۫WL[]6oŦ]uU1yx_*3f̈g"غM6{gS]Yn]|_s=)_z饙r<5VTTȑ#{EŸq)&|izjRp @ @ @ @ @% e=o%@ @ @ @ @ @ @ @ @g?hݺuf)vĉJ [O>/|T\UU -llgs/[ˏ=֡Cݻwms*_WG?<0mR8wm]\+=z},X裏&\4}Vb>O- @ @ @ @ @ZG @ @ @ @ @ @ @ @D~Ř1cra՗\2=8餓r{w]6|ɘ9sf}1w\~՗?s|L^3m :4?LPo|{ NKc=_[n%Ə);#vi{ugrsḣFG߾}s!)D矏8zWG -<:vկ]v͹r'~wu.]vѪU|qN;XlY"yyZT_~o4hPuSY0#8"N=9rdBs8ҧTyon4zիW% @ @ @ @ @hU|ge @ @ @ @ @ @ @ @ !Æ G}䖣G &.\=z(飁 >}K/E=RxgY/~g>SMi<}%s̉ĦWW]uU;d38#nf;kg\pr'ح[x׭[)`wɷյгg\0!CzI7k֬ҥK$xا٧iZ}jcڴi\sM5jTS9 @ @ @ @ *|M @ @ @ @ @ @ @ @ bRH?'xsrǕW^u}qjgm6~衇c=VkU"(6y797s9Gx_S~67yڧOUsܧij9 @ @ @ @ @" 췥K.@@韑J{jΜ9O/ݺuv-nmoׯǬYrN)6#x9G }gbѢExHa;cn{g3Iee -`>.0|6mZš)k&Ǝ;]wŨQ6& @ @ @ @ @ [G @ @ @ @ @ @ @ @ \RPkȑbѫW듟d9޹W j  `> @ @ @ @ 4*̊ @ @ @ @ @ @ @ @ @ @ @ @ @ @4Ƴv' @ @ @ @ @ @ @ @ @ @ @ @ @ @h~1- @ @ @ @ @ @ @ @ @ @ @ @ @ @h<agN @ @ @ @ @ @ @ @ @ @ @ @ @ @ D6cZ @ @ @ @ @ @ @ @ @ @ @ @ @ @ x~ڝ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ mƴ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @6; @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@Di @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ m"@ @ @ @ @ @ @ @ @ @ @ @ @ @ @xD @ @ @ @ @ @ @ @ @ @ @ @ @ @MT@o}0E @ @ @ @ @ @ @ @ @ @ @ @ @ @' ݉ @ @ @ @ @ @ @ @ @ @ @ @ @ @&`L @ @ @ @ @ @ @ @ @ @ @ @ @ @O@oY @ @ @ @ @ @ @ @ @ @ @ @ @ @4QaM @ @ @ @ @ @ @ @ @ @ @ @ @ @4Ƴv' @ @ @ @ @ @ @ @ @ @ @ @ @ @hMt^E @ @ @ @ @ @ @ @e*pG۶mtuE @3gΖ֘ @ @ @ @p @ @ @ @ @ @ @ @ @:uꖾ  @ @ @ @ @ @,PW @ @ @ @ @ @ @ @ @ @ @ @ @ @@er @ @ @ @ @ @ @ @ @ zqM75 @ @ @ @ @ @?~} @ @ @ @ @ @ @ @ @` m6A @ @ @ @ @h~1/ @ @ @ @ @ @ @ @ŋcٲee"K!@*++cʝJAZ = @ @ @ @ @ @ @ @ @ @ @ @ @[\sΉ &ll]ݻ~x8ܝR,eQ @ @ @ @l}?3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @[Wr  @ @ @ @ @ @ @ @ @ |ӟ۷e[/ZEX5p1pZ;A6&pǫn @ @ @ @ @^~b @ @ @ @ @ @ @ @T.,z豩OMX`ѣn+05hÇ @ @ @ @(2X% @ @ @ @ @ @ @ @ @ @ @ @ @ @ @z   @ @ @ @ @ @ @ @ @ @ @ @ @ @ @S @ @ @ @ @ @ @ @ @ @ @ @ @ @z @ @ @ @ @ @ @ @ @ @ @ @ @ @A@o9hݺu/<-[߬utK.+VD6m_o˗n;?o7k֬6lX\&M2z}ɽ:w? >l'?gy&ϟ۷}FGqD>[9o~QGO~_s=kvm3,zr-~q j:~l61vؚh#@ @ @ @ @fL @ @ @ @ @ @ @ @ZUW])Դ#~_ͅ VV}⢋.n=nݺ8sꫯ.:r~;p|\㎫5 1~k_;$wsכB_}R@СC_E·N:u·vX@vۭz{=|}ݒq_\_|q_ꐞ__wc 'tR.7>osu!D ~. o? ^Ẉm۶q痌wM7o|#wuW٦>-PH@x3o_#7Xti4 @ @ @ @ @f' =2&@ @ @ @ @ @ @ @ @(6SWX)voy睗 +jܹsε}KΥ8|xoN"ׅ ƣ> ,UV-?ְ@taYoƍ'Nn{)t9TN4) Nؤ6.JGQG}7|3~_gY}t-Rn1o޼H|݋/=zD׮]#/Y$7}R07:eT;6Zjkڴi裏Rq V~ꩧbѥKjgwEp )~de\pAqe- @ @ @ @ @@sj @ @ @ @ @ @ @ @ @@shӦM=ꨣeΝ;)<.s/r9X<7ul29f~W^kGy$Rmm%Y[ېҖ5Y^x tdo,&5kV]N>rgM]vA>-ğH,#F=]s?kV8qb<!)76۔T P.?!&LPԨ3r y %OM)ƍ˿SNmݖFz) @ @ @ @ @ @ @ @ @ @ @ @ @ 뮥KVR0~Xm<iӦO?]㸴ɓ'D-jY\ |p>oFE,VYe<7&MȼJiVZT_ܕݻǺ뮛'Jӭʑ;wΕguwAT 9hݺu袋3o۷~Oz_1jԨZ9rd #ęg]t>};;vJu)S:tKaÆuv @ @ @ @ @ka @ @ @ @ @ @ @ @  |嗥շjժT_ʳ>[⠃*R)~؇z!mck \ 'tRPد*.䒊 6AiޱcVdޮ]K%tmi#Firgzg}V'Aq?Ɯ9s_z*ڶmmQO>=iӦMN:5;\ۡ @ @ @ @ @*I @ @ @ @ @ @ @ @,r{t 6ؠT^I!)hnŎ;X~7K^z lvѮ]2{isXjKuֱ.W^oq޵Z+o7xcqѥK4oQmlUUU9{?<>ݔ*vL ?~|oUVP'9S5ToO)tΫ5rs{znSIn-fΜ<@^-"RxĉѣG!:Tn_2n/K/.l*)w.㠃-Z]wsL.??aG}466,z[p@qDž^8oT N4iR~|qGNbܸqs-_=;E~ߌ> ~'#}*/|a ]nbv/~g +S ^ʶn۷Ji?#B/&;w\:RakvH 7ܐ?~%۽;K `%HO:{FSN9%\R_wa"w]w!io~֛ʠAJs @\w9C\wu9>WҸNL3όc=4<O>= }Q\yq駗+ݺuѦMܼ;;.3& P:䪫*_|1tR_>}"ç9g̘u+K @ @ @ @ @ePjfL @ @ @ @ @ @ @ @:7x#Zn?:t78|[lE92R{]eUW[O@߷z+OBW\qź}o֬Y4O?4cJ4zOԖSゖo|) RT.<2yHkd ޽{}עm۶&O:=ںjmk׮]/rpjUUUj0`@]w5zQfocXS=SÆ 38j6D}Eu)H2סCbԨQ1u>_C'ꪫ^x!54):v-o?ig> F[ou5v6={ƫsM68;(6t}cĈ~Ry7|39ts=c~^j4T?~|J﫯z̝;Z'_|1vaҾ  @ @ @ @ Ѹ<1 @ @ @ @ @ @ @ @ @`t)?]tQlvy)omZɲkfϞS;wnbM6ɇڻwNoN;]q1cƌ:{W:-5TꪫƱv_9=3J6<;EG_}#gl]tҧ_|\1|v T @.W_}u]r{ҥK㊾'x7Yi]Ok+J ywK>Âcm  @ @ @ @ @, wY @ @ @ @ @ @ @ @{?'tR<1xYgUk)MM)̇=1eʔHO涢).c`Ǵ뮻nN~WUU[mU~{Yfȑ#ˇUo;?)07=::v2dHȉw=3Zn]4&N;- P%f*6Ķn.3gys}-ZsL7ws@YGqԔk&Lgw/A @ @ @ @H~= @ @ @ @ @ @ @ @ @`) GyÆ 7|bWk^7R 9/S}oQw˧K#6|xT}yk|<ܟ *!п۷oK."EozM2zwL>=^~^1 7&cF U @ @ @ @ @ m# @ @ @ @ @ @ @ @ @#pDx7W,Xu 6+_j3gB|J MTviXnr}I{FHor_x8KǥpVZB$g}V4na*ّ邏NS ?"ӗuQ;}ѥYI );?d-)po1w]̘1#ck jBCJeҤIq;û[oN @ @ @ @ Tn @ @ @ @ @ @ @ @ R/~8"^pq5XU j7 4(ڴiSj:9sСCcĉ…7hx뭷:+\s[:2pZ5-ҔmM-ZRԩSW^_~9Hal6d}Dvb„ q嗗o[lѠy+1'?I~6RM7vZѣ)e˖5ڋu]7Kҩ1;wM74ƌF?ʖ{」w_ׄsL\| v%oF~=tlz_wʉ'߹oF}㏏;ܹsx]ꫣW^7R6 @ @ @ @h.~˝t @ @ @ @ @ @ @ @ vaq9￟CN=a_"}+K$,7;mڴd[WmrٳKC P/JS_Wꫯ5Ԟwx SnQR@sycUV)oZSu >k >C]QG~x5kVJsoz7>&ޱ'|rj߾}\tEa)#<2|y&~;uTiԶǍ7OL2%ϟΑ~?(Ν&Oa  @ @ @ @ PSf @ @ @ @ @ @ @ @ @`Ihٲe^Jm])])T+1͓ O?;c ջc֋>F{ѰꪫƖ[nYozij;OqշǦyO:ycRcj*(9vԨQq饗FO,{ o{i˃~wyx'!uy&-)/ rY tM9x2uwL9 [cqŶ諾-oc[!8 zQc?<|Ҹ3gvW[mF>xbxi[>WmcƏ~hݺu7Ahs @ @ @ @ @_ܯU#@ @ @ @ @ @ @ @ @hѢE>_~9X  ;7O81w^}@`1nܸ0aBo>\sXk7%~ᇑ[Nc׮][V)l -Oz֭[y9c}x=tŽL'X&M/R>z뭷B_W_}J9h=gϞ~^V[mGҼcȐ!}wa-ż @ @ @ @4cV\ @ @ @ @ @ @ @ @ PA-[믟?TԩSO߾}+0) @)=}uiժU' @ @ @ @,UK­ @ @ @ @ @ @ @ @h>vXm۶I!C,uz02eRwL @ @ @ @ @%]Ւ@#@ @ @ @ @ @ @ @ @̙3c֬YMЦפU蠯כ0{ 4 @ @ @ @ @ P-$l  @ @ @ @ @ @ @ @ @&pQGŎ;ؤoM:nqԵk׸뛼W^: @ @ @ @ @j[V @ @ @ @ @ @ @ @ @` lv>JYq_V.u @ @ @ @ @ @`Z*Vi @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`! ]&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @C@q @ @ @ @ @ @ @ @ @ @ @ @ @ @߅kj @ @ @ @ @ @ @ @ @ @ @ @ @ @X:.*  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`! ]&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @C@q @ @ @ @ @ @ @ @ @ @ @ @ @ @߅kj @ @ @ @ @ @ @ @ @ @ @ @ @ @X:Z-˴J @ @ @ @ @ @ @ @h.x`,r\|-puc׭ @ @ @ @[F @ @ @ @ @ @ @ @ @@CFС @@3x#} @ @ @ @ @K@Ւ8k#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @Bբ8s @ @ @ @ @ @ @ @ @-p7_l#z,UUUkbڴi} @ @ @ @ @K%Y @ @ @ @ @ @ @ @/ @#ЪUСòs @ @ @ @ @`B@ @ @ @ @ @ @ @ @%_ߎO>d_ @ ^z9{? Pi[S @ @ @ @Y@د @ @ @ @ @ @ @ @ 'w}B? @֭[)}g.  @Y ̝;Y^"@ @ @ @ @` T-%X @ @ @ @ @ @ @ @ @ @ @ @ @ @X靝 @ @ @ @ @ @ @ @5/V\qe]/w3f̨7|p A'0|x7L? @ @ @ @H@9 @ @ @ @ @ @ @ @+pG{  <4(_ @.V[ ]o @ @ @ @hU\ @ @ @ @ @ @ @ @ @ @ @ @ @ @X a ` @ @ @ @ @ @ @ @ @ @ @ @ @ @h~]t  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`.  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @9mw5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ZL @ @ @ @ @ @ @ @*,0f̘{jڮ]X{O>z/n喘0aB[v} 7ܰ1SN#Fij>=woq'?={Rޛ[l6Ηz>|x}cslS:}ҡvX暥#8"zQ}Hh_fmޣ>/bo+-q9*5UOe˖1dȐycܸq[Vzzo֬YqhoHI'۷?ꪆG}tt5KO>֭[ǯ~z cƌr駟Ǿ[qu{\٩S8݊lgϞ95jT?>>|myyc]w:sYo~6mZ ].5o3Έ> ;gΜ\KAp@-/Y._^?s;9cRo 7N7}٧p{)qoy)7hyZkA/R^W'pS0̙3]5]WYeUO=(;#W9߿ΰƼ=,%\*\\ @ @ @ @h~u] @ @ @ @ @ @ @ @hݻwo|1wH~;ƿHc*묳NhѢHK oro[c- /D /b֬YԷꪫԩSspZk]|1+B^ީ -j)$zyWcٹnݺU?$7FmTט4vG c-/)w-oKrǎ#}fJzV=?ҹ;uꔟW\KaӧORtLmeVΝ;֕\s:xo]w:Ą ">g5SܲeRx kN\eooJ?lt)P:G(uq7UWm|uU`A3"@ @ @ @ @U@os @ @ @ @ @ @ @ @@sύ:t%/RzOͣ>:R_]eرѪUS;)g?Y)Ϋ+cMᠻ[qJS&lRcI)7wm۶5,HôiGS/2z꩘[3 'xbo |;yL%W]uU|Zk믿)X3wΪm~kK( 5 @ @ @ @ @,W ] @ @ @ @ @ @ @ @4 6 ?v{챊^M7T ^#7lu։/ѯ_ҹCRSK/ #F4G $M%><כ>"07ڼ{zrNKJիWy9U;yǗiJﬦ1eHn3f̈z*>&QG}4N;+֥wĉ| @ @ @ @ @`Y,}N @ @ @ @ @ @ @ @P{' KE9c|/@IDAT[TUOyg (H]y#v9[W$K$ y69hݺu- _~9'O;1f̘T]bJ*;mڴxk륗^ɓ'L ]^y啼ۗS{Mkiɭ,3ܘwV [`A3yx#?+R1jԨZO;DǎcРA9@ n2eJѡCXgub]v5X#;lذN @ @ @ @|- c@ @ @ @ @ @ @ @ @K_~YZsVJ|G)6|ݻwԩSlyc=_|<Ι3'~ܶF=_Н1bĈEеk| /,3_wVWB`A~3zlܹŔcǎ>nR{QI?<:^ѝw}wg?y'c6tӧ6mԩS㎋p[ @ @ @ @ @@e &K @ @ @ @ @ @ @ @@ ?~|~UV"zQUUU[Wl2;RߛoYիTohe1jԨ;zWsE K%t9rd|y"|6mo9sf<^{U1h~'l_2n|饗e]6KEonb 6kvL0!X+m]k.=N;mTZn<};iW_}U4O==k;~˴]y5e|=_Rו_wV+=,W@shoF nܸ|Gy$~.6(]  @ @ @ @X ~S @ @ @ @ @ @ @ @ @@Rh̝;7{{)GS_}K.ΰz'(8p`~%n"T55q.)d(E﮻C]_RskLy6zC?u]CpSʇ~4pNG b׿)u5H͋,rN;E (Nԟ}Y y])2HFs?O>dO]e嗯X9?3f̈7x#>hժU7va8c 7k)9}_`W_wqGf^SD[Yߦʯ9 4WfߖT<8cK<~xa2dH|GqWP,׿5ڴi[vy83acƌaqW]uU?>^|1tТ+{o9;6{jIAi* @ @ @ @ @`1T-s:% @ @ @ @ @ @ @ @ha[!wݻwAkm۶bw';O [ojT }뭷Js}(ZdMr^CsX*V[m5O_%vt=zSkH9s1| lTRW\Q>u/%<~qtҳf͊%߉'k4u)`8sҧC5\O[ȑ#s{s.ʯ9 4gfa)#As!D JO[c zh)~j;zu]y?SpJ+ŏ$Μ9Ba[l٘);6]c (MѣG[o-Is>ni1bĈ6lXN/wWUU;\;0/"Ҙc=Է+,J u]n@v{Gǹ[Lз)`_WyǏ'Oz̝;_ӿO/bߖ @ @ @ @@ @ @ @ @ @ @ @ @T1|;soyGPJ{5(MBRԯ*y{VI&Ż[h|gŐ\P!@ @ @ @ @˰et @ @ @ @ @ @ @ @,)Tu=ApѣGGǎ C*u L)5z(oPժ߿n=3Zn]4J<)5ʦreBk??bƌ駟.)7/2׿}cʔ)9'+ֵ}GҐz*۷9餓"ǏguVZJhoƜ9s-Z1OP͝;h-訥8g0`@L0aw߽4 @ @ @ @ @e[@}]= @ @ @ @ @ @ @ @*={9眓לW>슭{yS9rd̚5sk.~|\[l:uj0iҤxgR7n\Zlz꩙ދnNξ[؅_@ZlS(q*E8˜s 7_?Ooca .=zaÆE:omeQ+Ϊ: P@C30ɓ'9Yїˍ kΝ;Gr_|wq~m5v @ @ @ @ ]fo '@ @ @ @ @ @ @ @ @)pGkY lյn:{|ԩS{my|:vcƌIq#~3:ZhT>~ODgSNדB?זロwmƅ{q#G1jPJ MTviXnr}Is5D򮫼k6(ڴiSЊpΛoΐH'_Ņ6UoK@fr-d)po1~1cFn/Ԅ=3r;CV  @ @ @ @ @`h ^K&@ @ @ @ @ @ @ @ @\'?I7tSviѣGWZlYhXwu;Noq|ߏ/ƍlM7*V\qx#/=ѹsұEe׎^z{ݺuM7ݴR㡇sSgZc:1cbԨQFNjaĈ1qEC ,6f{4k{6w{{_~֡y(J qWtwݺ6}ڴiQ\"Bo۶m[k=UVY_^8p`[֐mVAU$x7dyGĆnַO>x N=H~*{WkS/~8"_p|=MAEI ?رc̝;7ΧlJV)}"LD @ @ @ @raK | @ @ @ @ @ @ @ @,mڴAy)|3oor!uQ)4Ʀ0_=~;Gm)D5%VYfi M~gϞ_U_E]T~ WM,MGg#WORq;sS9/ÇW\Q؆vpރ:rKOQxׯ_;6=#):=E0`@Qw.,+URt̙3);Uƚ;8sal7饗\\S -{;ݥm%Yu=Ij{W}5f$G]MߝGyd3Y MN:Up嗏o1g2eJ?#~gQ;0* @ @ @ @ @@MMZ @ @ @ @ @ @ @ @ @HE)m6譲*ynʡviccm ^R@ߟ kVm묳N!}}Mߢ4$[~\cR(am^ż\Ŷhmې1q,?^-՟pXK<8ɓ_̇of906!o69E+ՇbSz_KyS}UW-ܲԜW_}~JcΛo?x{+| ~sriוYsql-?>+g[^}_wu75uh.{]ߓ~3 ?xK-3g,j9D}?>Ϲ#;Zs{^뵇>  @ }QZhQxՑ@s,\tcX1  @ @ @ @ @X5ݪ  @ @ @ @ @ @ @ @ @` ;3֭[H9=4| 7N @ @ @ @ @hJaMi, @ @ @ @ @ @ @ @ POΝ;:5#vq @ @ @ @ @UNܼ  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@S m*I @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@j/ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@S m*I @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@j/ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@S m*I @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@j/ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@S m*I @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@hjgn @ @ @ @ @ @ @ @ *=ԱcV9w&@x㍚/OǏ @.Su1 @ @ @ @4&a4 @ @ @ @ @ @ @ @W`„ m$>lB @ @ @ @ @% Tə @ @ @ @ @ @ @ @ @ @ @ @ @ @XI @ @ @ @ @ @ @ @Vm:3fFzU~i޼y} @ @ @ @ @Zߖ~̏ @ @ @ @ @ @ @ @+@ǎS|Xuڵkt,J  @ @ @ @ @ZV - @ @ @ @ @ @ @ @-_W^IN˟ @@"wM6c{? hj6#@ @ @ @ @@F @ @ @ @ @ @ @ @ @f8 7qX})?>p+vBN+%KVuY @ @ @ @+^bO  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @hbO @ @ @ @ @ @ @ @ tAsΫڲ+u],XPn4hРZ;@&0v4{5s @ @ @ @(>  @ @ @ @ @ @ @ @ @`Y=Էoe=`{N: @ :ToKHG @ @ @ @`%X `  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @Q~ŧ3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ ~Wh  @ @ @ @ @ @ @ @ @ @ @ @ @ @ (aә @ @ @ @ @ @ @ @ @ @ @ @ @ @Va+U @ @ @ @ @ @ @ @ @ @ @ @ @ @hFL @ @ @ @ @ @ @ @ @ @ @ @ @ @+@a@ @ @ @ @ @ @ @ @ @9sҸq㪝SN_bbi֬Yi5HÆ [ٗk} @ @ @ @  ]/ @ @ @ @ @ @ @ @ @xt7W;!}oqtM/*~ߦح_r4hPm~twI&<͟??7mOmQo喼$裏c_СCk}z5 @ @ @ @ @m-W<  @ @ @ @ @ @ @ @ @@ Dѣq]wM?rnՆҽ[M6٤ư9_/o<'!C4X6lX>;{W檦*~fTW}ݗ?o>oϘ14\QǟI-?N'xbz7|!:8b1v5E(QGUԘ9W_qܨ޽{:ZV[mjva駟t쩧]vY^… +C)o:sҾ%pM738#O{I}iY4 @ @ @ @h1~[̥0 @ @ @ @ @ @ @ @ b>O%Kٳg}i'LѦҿԦMpת#!ql6Ko}ɓ'|0.Z(wc=zHovvοONN !zu6XAh)…cZātM+|v޼y裏N_}kSVV:mۖ,XzΙ3'vi)./1}'5 vmԥKϧӜ>}z*  <6ht-N9rtUWm,z+=yR[ֵ1 @ @ @ @4a-튘 @ @ @ @ @ @ @ @XGNvXO?t:#c=Y;tԩSSv_}F)NgqFa{o;Ɓ}s0mF+}s?Wk"+onH[s[ZANsMo}+ky?aկ~ǬOCzI&~SO=5?tmݶ&#8)9|\pAQ @ @ @ @ @M&v g  @ @ @ @ @ @ @ @ @ ls)hh%7)Ղ~dO~{2dH#F(mG`mM}Mm[[mݖ!{W;vlnݺ/}Kiʔ)o߾ۘ1cҌ3;D۵o>tIccļ[sO>ֻwӟRohӦM+ROrJF益^zζ5F'x"͛7f-. /gu*f_xqQq-#khs7j…gŃ>ﱏ>FNz衇ң>~o x_o&k?>LoV,-?~:}iiѢE/QyYfzΜ9GC @ @ @ @~Wūn @ @ @ @ @ @ @ @ @`)O}*0Svq-\**T[ޱ~=,?Ԫ#1>Qc3g^ңGtq.~a:s{nbX^{kuqV@v)򗿤UQpa=k~?u>7xcniذaiȐ!)޻~~kswLLq+s5Ձ񬭳:yq|ӟN'ҶnJ05XtyhM7-ĉ+/vqŚw ws-b-҄ 镾ǍԹstᇧ~k~892'_={6 @ @ @ @ @ @ @ @ @ @ @ @ @ @R]vf̙^xw_>x뭷^n #(pz2}y䑥'O.m7F]U޽#xyΩl-Gs… K ?~#RҾ}oeDxo|.#(ڦM:pkuz}<8Emw/ WTT7x#s1)*wyg&M*"|Ě]:xF,X.ߡ+o,?[)cǎ)SO=vyjaFgw]i a~6]uU7Q+A @ @ @ @Iد @ @ @ @ @ @ @ @&0u4mڴ\߽{TVk38#~5~U/7dv}7s4&NX?RcѮR&؉׶«[WӧO|ӆn6xܬzJ:uc_n蜫SGpiQb-em)Fo4wR +Zv7=SF8m<ݶm"LKf.={v>6BYoRb#m#|6b=s8k Gj_4~M>ExxFzSK/4x,?9`gIÆ ˧/ZOp+R־6:DXk]}kt)~ӟo=hݼyrp)S 'V22nՄ R| 2$=)”wqƌsIlAm`I81Mc=[ (Eq}y#X6#lO~RXE]^z|XwF~iWtΝ;g DuQ"/#wiey=.wܑ!qmُ[/r)i~zW\:[x/JEB @ @ @ @URC @ @ @ @ @ @ @ @J}Q[dI~.N;:9~y./]guJ1bDGN;TEvQ"d3!Z"`0>;ÇW:o0Ǩ}Kct'|2_:Vߍ}r`jպ6d1HOqoE08%\\k#8"oFn^@IDATZ#Drᨇzh4hP7"pOZ|*JEGoĎ=:E(t>;.첼կ{t65ofiԘ;?ʲkV~ZGe-Gr _iJq|_z&/qM|<Y0RwAT @ @ @ @ @`Xn @ @ @ @ @ @ @ @ @"T1Bڷo#/V_}xꩧXӧj0/\Div>$K~C-?daT:.V"\Q_Sߞ>c-~A#k_Zޝ;wnzknVQQveRÇ>6:԰{j\svFC\޿v@vmz׿iUTT=أ1SlQ}޴`<{,;4;S\͌kԷڭ暥*|;~ rg;E GuXF[lzՈ@S tZ~=3]xkӧO6mJ݈%1cFA@(%ְ뮻S9}۔7v1y✱[^_޾p=zt:ꨣ9眓Eo3&7.w޽ß+mFn;v,՗'~gk*vY Lt%'x"iɒ%iĉ/SO=uY^?s5\>s۶mk7iA @ @ @ @ @@5r56UI @ @ @ @ @ @ @ @ 8jԨя~d۷o*'L"wYkviܭ-#gϞ:dm뭷{n6J[򓟤[/SPYSۚ 6l|(FȱB`y v^z.]|AUj]W_4\ػ%xncЦ,^{ơx9U[T>Ɯ>h*kǍ@K/4_iӦ}{iuMfΜ.楀بܹscܫ{./QRM|5ol]CI>`3gNӟ"L( pbYW繇?;t$yofYA  @ @ @ @ @ u# @ @ @ @ @ @ @ @ @>+rCY ߊV[-yNrKmM1bD>>u4eʔOέ`F;66B#Oyw>ޫ Km:vsnDYgOg}2nu}>㴴Pe\M$&Rw^ -{.E 7ܐ/^ʏm]bI&8\y}y/:Fk׮ꫵUr۔oGhѣӟRɓK۱1`?v}6~k;>C5I:/}KoOkޫsڵ+;6g)e}wS>|xѣGi>#T @ @ @ @ @@ mZO @ @ @ @ @ @ @ @ @B B|?q~i3<3͚5_㏧_{cȋR^_jJ7bE`>)HV[D`e&F[w>}ҧ?Rթ0o2"췶/|tOQ_2}?sd Fc|VeεQ^AҧrJ8QbV7|s73gNӮϟ~E7Zu'9@5*,YC/´馛]x.o|9;(|o~VޭvO'c|p6MөSox/͜93ǻ}}I/rޏPnӿo;O#ķn#NTF9眓"<9UWyK?> ɓ'3f6*jt嗧_=!&MJGqDZpa>|x霱ѽ{tg纸6grxzGwk_M{:eʔ\6`t;};I ,ȿ#v[ڗ:4FgϞcצ!~~糭9Sǿڴiqiܸq|7R|ⷦJc7R#7(8SN @ @ @ @ @@ kL @ @ @ @ @ @ @ @fۧN:)F(t饗V[׾ju{lp-`@1bD6mZmymm~)>u[guR(F ]v٥.*ǎC}W]uUg?[޼̹ZZ*FFfϞ"H:[oR;#'J?,KG@Kرc~" 5BI~Zk{^*xuQ}t'BO#&טaV:_1?O9xذaiV)u{r0nLH:tȡ/܋iȱ"3fLm6+1GpvQ"7V_t衇SD;P^}N;T:K G}4y95+~c|p4iR,z¸X~Y-{2… SO<{_[oNJvUxG q1yJsPZnH^{mc~a'.0 oEUGy$`D_2]1Jw"7J]Ϛ5+A1XGԳ\qC^^{.em }wqtק޽{o`Fr/)[)koq<-|" @ @ @ @ @$?ڒҞ  @ @ @ @ @ @ @ @ 72dȐFAlQ^zԷojmTovz'r'?Haʪ)3fH3gaZ0K z_J7ޘ8k`={lD/9:"C'XJ . B/K @ @ @ @rv|O @ @ @ @ @ @ @ @=zHJKh ߿4x ڵk6ti\V_}9xt_}:t>Or?y#OػwUjaۘ;2YM69:[[iE9p ~' @+ЧORb' R ,Yd\E @ @ @ @ *V̀ @ @ @ @ @ @ @ @ @ @ @ @ @ @Xv+N @ @ @ @ @ @ @ @A:w-z  R \wuiqK  @`icǎMg^Z3  @ @ @ @ (aә @ @ @ @ @ @ @ @UsM}]n @@ ?~|ax`:餓Z LZСCd~ @ @ @ @V` @ @ @ @ @ @ @ @ @ @ @ @ @ @ @% Q|: @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ we@ @ @ @ @ @ @ @ @ @ @ @ @ @ @(>  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`e2\Ek @ @ @ @ @ @ @ @ @ @ @ @ @ @ @F m @ @ @ @ @ @ @ @ @ @ @ @ @ @ 2[a  @ @ @ @ @ @ @ @ @ @`y ̙3'7:uꔾ/V_+&Of͚Xc4lذ}G @ @ @ @+ߕZ @ @ @ @ @ @ @ @Xw^7o^SWTTu]7?mVK.;/rˋ:{N8ZL81=COSNM=zHK{wg}jN4)r-y{w3GMcǎm/Czy睥ڵKna0`@tڵtlij]j6rȼR7|qe-lMw}uyuTAV,0mڴt衇V[ZkJ5*x7l\T @ @ @ @ @" 췵\)$@ @ @ @ @ @ @ @ @DO[[޽{:Ӊ'X -Θ1#=ح;Bqk ]xq:S/~j6EPqto6lX~EE_yyA1Ȅ J.Q{.,z5nGb]ǎgQm.V#8ưwi;N$,?sִUj7tS7{I}Yo @ @ @ @ PaҒ @ @ @ @ @ @ @ @Xmۦ-2X`A E9sN;-͞=;wyصkԫWZׯڱĈ)t%E(o㥗^J /.\Xۧ=z~;{iɒ%M6;QD@G,qV2˼)Y9gS -5JsjNuKAsNy GAQQ@T@ow#|s^^s>o_~siծW[m~裏z7|sZoo~{#F i5׬16^xAQo( {"@D+f}M_|qy` L4)=3ySտ]  @ @ @ @,~w @ @ @ @ @ @ @ @ @Po߾+l̙sM{l={v/>ϗcC9$zզy/2w5Hv[ZeUyf{￿lPv!]uUNOwKOsuجYM5ut}scK?Niq'N[4iҤV[) ͏?nKO>d[^~UL0!}.c @ @ @ @Ia  @ @ @ @ @ @ @ @ @''ۗ'*W]uUկ~5 ^zvHeV2f>8#饗ꫯ1"7/9LyE{}sZX~5n Ν; 7ܐCU;ceIN/~:KFuCn!.l:s댯.篶j)oF;Sz)q?ÆJ?44Y~1ǤNׯ_fmꫯw=J3ϦM7ݴ]wuS|r-Sc'wlo/kON3glR\X|裏Ο^;m3֫W{ٳg7?OylO[lE4hPڵk湅Q1x?j4`袋_-ƻRK:^gu^xje~_Sݴg>FUbԥK^{UW]5G]s}7J=ٳg묡 @ @ @ @-UN @ @ @ @ @ @ @ @ 0"(:t(-~}5oT"nM6C:xw۷ocm!>|x^g֬Yiرu "pmM/xPԙ y[c "84/B߽[eM"lZzW_}u(K,D~}wrm6T"7nԙI<Ep[,+,F_\K\WV5#3LSN{wÍ#ķv_ 縉s1%Bz6,iܸq)Vñ}?~|:SgUZb|+闿e;v{wW\b\׶]w5=Z:zc| 80Em#.۵kzt"8_ (qM>hᮞ+?»_V}T?ou[\S\[%\2u=S)~kGu\OK]vYy a曧/l >=Vv @ @ @ @ @@C@ @ @ @ @ @ @ @ @W,zWTFPq-&E5e!CԘ㏗AŸ_~k,G&O5H#-'u޶khGMkNEOj߾}LF r~ofmeyE%m#|6b=s8kzק5X_#4B`r-wVnS92m)[wy)Bz|sK?rO?bߥs /0EhĉmֹͭoƴvioCLSnj?ژ;%V( J0z饗jջ/jp?iv8go~5Zr0cƌQ^ztwnݺZ+G믿/BSvk?qi}-#6BNcnkwj?QF]; :ܣGhjqiUD@IDAT?qtM=*~~L6-wq({U4DPtF@쩧"c>|x!W_}uoxs=spn3ZvRC)W}oQ6V*y[ve2,Sj[/xR;co s%};ߩxOq/}A1ܸqewE4 @ @ @ @ @`h_K'@ @ @ @ @ @ @ @ @P #.m&QFU⋠ņ}_}ռDwҥr<8p`NjTY-Eonfծ6/r9k,U)Bw#@o߾+|n!͞=:Uy[e!L<ݹsk/{9$5E`IʹQ(Z 7͍yԩSj"$Vm|բ3<&N׈"X4{|8yO]5^;vgmRڎ?F_K"D8D{}i5JKoEtcu=\Dplr}WvYfASR)9™gΜY陿up}WaEo苠(տV^yotl&c=6 ><]|)eΜ9e_J3} 2+r1vѣGZc5j7qoO<1qth ͏c=4xꫧ[.?_ )ˆT{x^Ԟ @ @ @ @E  @ @ @ @ @ @ @ @ @@ 392?N;V[3E[lM֪g^eUzq攡CifJKXzĈE5m918.Ju\֒z-ٳZC`UW23yr܄ 믿^>"7 js=Wm|̵=k?9 =1eg +@޽{׻Z::W^òޡC\,K,[s֪^{դ:^c6x @w}oZ{Sp)Bqkj3c|6dpbz@bNkk ON_K/6ltW\1cKoP /0-ob1ұcmq\GEW @ @ @ @_-VT  @ @ @ @ @ @ @ @ @!еk4lذT~{KGyd:묳RtIEk*Q FpmEwܑ/o=߮];~Pc~wip\nR m[@s :W 2dH:쳫WZi:+[%}饗raq m]ckԸz-TT۪^c~8g\SC筶Wzjot7"7a/׿5=SGŔT][nI/,esu?[X_iMm[kҘ1cUW]~ߥѣG?0͙3'=ꫯc=K7iO?tW}u~i9ȹ})Xc_}Ot! @ @ @ @ @\ΕG' @ @ @ @ @ @ @ @ К?ҟ+s=7z衩ےsEeQn~]j[on24hPٳgj:\Մ ң>Zt駟k\5:ocf 6t֭[:uj9sa}?O،v-A|_|q3VCرcӘ1cѣq셛11}}ԻDa*y ' >NJERK-_oXb|SN9%5/3t_~e5׮jƌ,?ϧN:ⷫlg?Y&MR[!\rIuh_ys]΄&6횷jr\v+7B[ڵKݺu[{Ҝ9sjl3#Y!@ @ @ @ @۶V'@ @ @ @ @ @ @ @ @j D`1[#2B+_>̙3kLpˋrQG#<2=90B1#2B0ӟ֘W=0cruוVZ)mᆹVO{oi)Bz|78n婧MVکo߾e_˗o]nr:o7jOXcMjG⾎(!g}vZguw^}"N]̏Ӹ#3ΨNQ`(O_rzW!^z\XctGm7.wC="T5J1?Ͽvmߟ;, n饗zRg?~ߧ'u#hexѣG&l28#x=L7f̘bjZmҮo}/){_NhJgϞM5\<|^zu]3b-O8׿5&z=op&t` qD.;6{"@ @ @ @ @vV&@ @ @ @ @ @ @ @ @w}SEK+Rg7ޘo;Ԙ<ؽ{~Yg܎;kr`^I :FkWu@ɸSN9%]{98#*C czk(;C~miw]d-)y[gs |K.dӲ."<,G.]r~z׻wty`T=[.|siӸŸ"8nC= [+Yf +o9*u29(myjFRK-"wWL|*t~7xyțo 80Ex>ScjK|Dpr|>ϥ+2''KB[Xw5m+(_#:>Q"d:_W|:tPު" {aF{׿&O۷o𼫬Jc=r /wo߾o{$[`qܯ_tw qn=[ @ @ @ @_@[ @ @ @ @ @ @ @ @ @ P-Axte̙j=x{Gr ^. Hk78[ԾK\s5N;픎9>xg-Jc~c|u^1x-R:ou}u @{fnG<8;6}k_K/x4iRs=w9};ߩ=5GXO<ˊ)Ds ֢Dl|U؇~8n>]Fzrhq=u6GoW17}=#so~"d~6J:u*׾XE@okN2k|";(CM&UW00'.ZkW[m)FC="8ʬY￟ç_]v%KNG Ҝ9sq+is{ sq\[|mQ7ښ{oVkAq~Rǎ 7P~) 5zm  @ @ @ @bGjWjߦF @ @ @ @ @ @ @ @$b J>`FAlQ^yԧO:c4h |?"\qUWMkSY"-зoꫯ}ײş뮻zVuQQ>s^A;ؿ:A El|˩[niW_Kg̘7WN뮻nP5.($;f̘{ځ뭹ZM:5=96^WXapƖk`={ȸU^Dݽ{!E浤?ĸ{&AG(q5%h͹s3ܻwNjzl<4#l;¹Dhn @ @ @ @ Ml, @ @ @ @ @ @ @ @ @`ah߾}I@:묓CNr3}رcp c'\qSzh"@;vlE @ @ @ @m @ @ @ @ @ @ @ @ tQF5} P <3)  @ @ @ @ @Y݂9{#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @C8s @ @ @ @ @ @ @ @ @-p饗 .`FpXڵkW^;LR @ @ @ @ @X. @ @ @ @ @ @ @ @ @S Kx( t!umѹ`WJ @ @ @ @ ]B@ @ @ @ @ @ @ @ @_^KSN]7j "]s5 hm#@ @ @ @ @@@ @ @ @ @ @ @ @ @m.pGk JeﭷޚvuOvCNJ9s|*E @ @ @ @ ` @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ɞ  @ @ @ @ @ @ @ @ @`Q׿t鲨]%@ZꫯN~׸_~ @`^#GLo漆'@ @ @ @ @@d @ @ @ @ @ @ @ @h駟i @,p뭷5w騣Z @`Al̈́.o @ @ @ @\K @ @ @ @ @ @ @ @ @ @ @ @ @ @ @-">  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ . @ @ @ @ @ @ @ @ @ @ @ @ @ @hL @ @ @ @ @ @ @ @ @ @ @ @ @ @aw5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@d @ @ @ @ @ @ @ @ @ @ @ @ @ @44 @ @ @ @ @ @ @ @ @ @ @ @ @ @Z$СEM&@ @ @ @ @ @ @ @ @ѣ_:K-TZ}:묓 Phs}m_wy'tMK>h6mZӧO` ^{Eu];Cb-]/~4r/})mf [GNC  6nKF#8"-ꫯNcƌܵZ+ySO=nrСC{R6T*~zRӑGYr)i̙q%UW]5k׮k2gΜtק/=Ci),6tӴ.XcĈGKs -g͚~g>뮻u:9o]}{~ԣGtQGc^}<.*-X۷oZ{g?z5HO?t>\m>St3fHzjyܔJOֺr~c hhY @ @ @ @~ϙ'r @ @ @ @ @ @ @ @ Dg.}\ӵ^_y@[gBx\`KgqFޭ=pmMj7{|e=ܳN?կ_~N_4{{M[ne\sMsqK]tQ_"9>H~׾?qD8%\M81+}+_I;;.}-Dp`\6x뭷Qhرcݻ_٪^H_|q=r嗧_<}O~zH뮻n9JWJ:蠃o5-B}ٴr&Fxq+"(sOjz__~N&G lsqRݻw^g/cjnnNy饗JָiN9`VJZڟ2x3Ϭ ^TZ7:'fgci:tG6U @ @ @ @ TM`< @ @ @ @ @ @ @ @ а@>}r@j? JO<1װ5XFi3ѣvS׿>ni}'SΜ93͘1#G2,"4Bc n|عsj_S1`ƔbK/~cN>Ek?*7pC |3 i=bYgfQL|UW={֙ɗ^zin@Mn׮]믿Κ5+E8j-J84&_[}RDp>|;i: EumӦMKwygjp8yލ0k6.z%@`hoƂw5vD @ @ @ @K@$ @ @ @ @ @ @ @ @ @&z[V9Gg}#<}tAl;6u(B|>2?i:j,sϥ#8"۷O;C`֘//| SNu4!Bz_}Tkn1{9Ԙ֯_/VX!=35v,_׷2"6=o'~Ԙϗ_~yn߇~8*8~7x)ޫ^sPcZ1չ8 =QSsMw\e]@b\szTV;k׮駟cOW_}u}sI'9j\M纘Nf,  @ @ @ @ @IMb0 @ @ @ @ @ @ @ @ X[/Ek{=4vj]r%9(6vau~=co4hР8eСE5ԖJ:hkkB;q4cƌN3gNAżNhbfi5/k_Z3fLV{^zƸ.,}ǹ-˜h_x?T\.SYP~ko[n)~5}V㸱I#FȇR=lذ\9rdϕB 7A{5y|}wi{|w H @ @ @ @Aa  @ @ @ @ @ @ @ @ @` 'SNMwi~ϫ;vUC}C v5^V|cO>9?N'tRoR-|{/wv-YveItP^⣏>J~z容8kۮ|/zJݻwCxyRE K,V]uղ}A",1e^~4z*h@K3}Ѵ]AG|wFJ;wΏ+x≩wiuIlMZveS7T&Mv}kFߙ{nCӴ @ @ @ @ @c@ @ @ @ @ @ @ @ @@CEEnzoqZk^Ϟ=&lG̙3k̝={v&맾}oA57n\2S}'zT Z%Bl # 9JqU . U<;<.1K۷/J.eʔ)Euss.&9W,_e %Вߌ:m)~8_ǎzt%BI'N>4q㮽th+z|&M#>;3=д{cO @ @ @ @ @@]auM @ @ @ @ @ @ @ @ @VPg}6٣G+6 ';z?j+Bd1`C #>Ph,ЌjqNX)B QoεżԮ]p|g64I/|ܹsS}_f̘&O{E߬YJ«jQ*bbLk[5vo+W(ˆTrN)}WZiz@^}#FTI)pl@s~3"#ȿ3~96:uj<>:5; <83&M>=vm+oQcj[J&LwÛo"lMW뮻\ @ @ @ @ @: @ @ @ @ @ @ @ @ @ZO 1gΜ4qt?>Y"4pn3Θ[wOZWCe{]72t0[o]Nĸ(jZb%raN[ sD26Z;6Bt+LS!3NբA/bYsŢt޽yfe-{?N^ c㼅g\ HٳotUW;jzc*9~|;P4w1{'nJڕí}n ͈ߖ~r'C9~헦M<靈>-.7|s팦/~G?Q:CSΌ=: 2>l>>QGU:97|&;sٯB @ @ @ @[ @ @ @ @ @ @ @ @ @w}IÇOƍK:uJwd7`z믿~jyr˕V"/wQcZۣGfkAS~"8}|_ͯEo^ҥKkͧ`_׭tD հnݺ5x|eɹZGxt#^SLISN1X~c6lX~#(tPjj@q}z7xc (հj}ȑ6ym=&(.ߌ;C;-䒹[gпg2z뭋j0jka޽sp/,{槟~:M4 @ @ @ @ @` @ @ @ @ @ @ @ @ @AsIc_Rub 70}K_J7tS:ssxys{t5W;w\43W۵k/i903ރs!}]i=m#ߌ">_~:ݵ^;c WC}}Ӟ}|oW^9̙E8|6l= @ @ @ @ @h @ @ @ @ @ @ @ @h=;,92]}9wˋ9TΔ*R.~)C"x/Aџ;Z.`޽{ׯ_=ztƥp &O~ߵ&N׈eY&׫qʔ)SʮbkQ ([#qm__KHyYgN:549"R}뭷6h\xt1m馹NUhoFo /Ë c{U)oVL0!#NG50vXp  @ @ @ @X:,  @ @ @ @ @ @ @ @ @@ DaÇOw\4hP4iR:#N;m[ĭ 3f;#}_N~{^㎭rZ+_}TEpoƍW#k T*[lEr-=ܓ~_?۴j.{#-飏>kl5VZ)?>>ypҥK?#饗^nݺgm(2NXU'F*O[:S+--6oK~>A{}%ދo9 @M͘={v^vkp.o`1m9}Ȑ!Ϯ=q( @ @ @ @ @@Mv5 @ @ @ @ @ @ @ @ @)пt)%#'?I-ߧOT5*E`oSKnyZ[FHqϞ=\~a"xӛop.ڂN8!Ϟ8qb袋ҝwޙjo5+A4[Ds=#SN{MoFu]7/N2%vmy|1܂JΝ3g6JWmp`+v4}m hoF; /~˛zQ9ף{к  @ @ @ @ @& wQ{]/ @ @ @ @ @ @ @ @w?(/_|.ytu5kݡCycǎMcƌIGE{m`R5nȣ7<1]_6bewLggqFa9g]׿^֣Q"[oM6٤ڕ/x.܊blyK|Ab\{iӦݻj㆜#0yȑ+bPEM7ݔf͚f0Nf5{?iҤ:3blAh(~do2 @ @ @ @ @EZ@"x @ @ @ @ @ @ @ @:tH>߭vZ'tR0aBy\dȐ͞=;W-;u֭\cǎi6뮻nFjVmPɓ'74{'o1ϋk7Yc޻< zQ jw}zTƢ"=hokquxӔ)Sr{1ΠVls|_|v!m6>tϣFjZEE1ni݋/W\ࣣ[gP3vi<+8B9A:  @ @ @ @ @"(afL @ @ @ @ @ @ @ @^{핊0cí8@dPC*%%L@4H9&8[\'횐<$( k}Lp8k=fkw^xatڵ>R`ӦM˵ )Xuv/cw#8"|xע1f̘HZ_~9R?:t(+ݻwBe_5w)vy|HovgkѼy^RR{g1rl[:6|9dov}Gřgoy\2f͚{!}ߌZۄ @ @ @ @ @@=X`燱} @ @ @ @ @ @ @ @ PWRm ˖-/|ԗBnSp 9sf|.FF K E]W% aekSm[QxUW]Ǐ/{ '>5Mw^>-^ok -7›eA .S(pqIw}whѢyߴ=أ߷ohbɒ%Y[E^լ38#H{|Yl)K/!Zl 4(RhzZ?R k7`! @ @ @ @ PJl @ @ @ @ @ @ @ @k暗zޖп6,; tQ՜|nB˖*> ֭[,㎋ۮ\_ސ~K⾵ٳDٰq5*v*W6?t5MIek. =k_| |}7W=)W^1iҤ86lu>}"=뼤]w51cW=J:/կ~7ދUTʎ_9s/Ӟ  @ @ @ @nO @ @ @ @ @ @ @ @Բ@vbU-W[ni~:_iӦѽ{oh;vZߥ4zꕽݏ @ @ @ @Wq&@ @ @ @ @ @ @ @ @̙֯3c6k޼ywÍnC31bD#Usl @ @ @ @ @DB @ @ @ @ @ @ @ @ @cҥk21+V]c ,Yimoj @ @ @ @ @X~׿; @ @ @ @ @ @ @ @ @z)бc;vl馛xk.0|0`O(;] @ @ @ @ @ @q m\i  @ @ @ @ @ @ @ @ @@ZjÆ |׏{ @ @ @ @ @ @@J7h @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6gD @ @ @ @ @ @ @ @ @ @ @ @ @ @ PMa3 @ @ @ @ @ @ @ @ @ @ @ @ @ @߆L @ @ @ @ @ @ @ @ @ @ @ @ @ @) 췚` @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@5Vp @ @ @ @ @ @ @ @ @ @ @ @ @ @hx~3u" @ @ @ @ @ @ @ @ @ @ @ @ @ @@i5N @ @ @ @ @ @ @ @J㏏-[& @@裏Э'NrN PiӪG @ @ @ @Z[+!@ @ @ @ @ @ @ @ @5n@VSN߉'ƠA6ܝʕ+ @ @ @ @ /P` @ @ @ @ @ @ @ @ @ @ @ @ @ @ @` nۻ; @ @ @ @ @ @ @ @46c9&Zj؎hsO,^3ѧOJu @ L0!Νa  @ @ @ @ V~׊d @ @ @ @ @ @ @ @ѣK.՝f<a'V;dȐ9rd> @@]ׯߺ @ @ @ @@(igp @ @ @ @ @ @ @ @ @ @ @ @ @ @ V~׊d @ @ @ @ @ @ @ @ @ @ @ @ @ @h~St @ @ @ @ @ @ @ @ @ @ @ @ @ @X+akg2 @ @ @ @ @ @ @ @ @ @ @ @ @ @4a ): @ @ @ @ @ @ @ @ @ @ @ @ @ @ߵ3 @ @ @ @ @ @ @ @ @ @ @ @ @ @߆ @ @ @ @ @ @ @ @ @ @ @ @ @ @JtfL @ @ @ @ @ @ @ @S1cĂ VGIIIt9n۷omvwߍ[o5}qgV:fʔ)Os=ӦMvEn?<5kͽ+c…O~JK/bѢE袋&kcU믿~{L>=zhժUN;cw, _ְ뮻GW?l}yԩT֭{ѫWݻw׿ue>}T8>_WCfBU|1cFvռy83ywQh߿瞅k/?p{?}UTnϢiӦ1bĈh#@ @ @ @ @Ꙁzl @ @ @ @ @ @ @ @W_)Դfy睗 恻ط~;.m٦°+V9\sMOHu&L?q|GY 4 @ @ @ @ @z' =2&@ @ @ @ @ @ @ @ @(дiBpŋ#.]4>я~s΍1cTJ&D*֭[ m۶\g͚O?t̜93,YR[<~ҤIibSVGJ%'qѳgϘ?~'|23O.yj"Җ-ofT*ԩS)5{ҥKlYP￟}Ay0`@⋑TVnhҤIeݑ¬++Ǐ_+]Wʠ_`ߊ~ˎsM$?1^z׾ @ @ @ @h~CvD @ @ @ @ @ @ @ @]vp/"n8s/: [aLqN.inBYS[o]loxꩧ m)wȑu = }ŕ… ?q|k'yjw[I"}) @ @ @ @ @ @ @ @ @ @ @ @ @ Pg<^yB}m+w}w![VlVk ,g}ܼ9sdzh4iҤܘuPՌ3 dM \{ҥKl… ڴ?~|ܦn)Cu^ѽR8A{0$2ЦB$pI'EfͲ+(=\ѦMc=WWO=TM<96x׿5.r-W^o*WV͛{lm6n8b뭷x㍕MN @ @ @ @[@د @ @ @ @ @ @ @ @˖-+쾴P_?_XN(פ>h)mc 冪:vX۸q \{zmMeo,3r4iR|"/3g?h#t@׮]]w{キ)H??㥗^+Wib};ОWwܿӟ4~Ň~wgwVi/y׾-ʚ7o'qw|w @ @ @ @ @2 .  @ @ @ @ @ @ @ @ @@}x a zyUzW;{QIe֭[gC}˖Yfq^gUY7JJ?! ŁlSkp]s |׳mfQJ\\pA /z1~Adɒ8qbR{)s-lm۶t~/j RXYgiNӦMn … cرYH*['īG|+w1gΜUN8!KMߣs}76oB @ @ @ @(-ߤ @ @ @ @ @ @ @ @k+W J 9sftMqwgm)O3DzUVZl a[ne޼F-Z/|2eJ|gsSa /L_zi&5޽{z_2n-{}uQqQZua3^?z*?g5dVUʪ?y<04i#y䑅1ŕ4f1f̘,77!CS'@@AgϞo;ᄌ[+q;1/8N;°&hѢ1bD|qE]T/t)Dͳ?~駟tԩq衇Px!C uT&pd]ϏnaY{:.5kV\q_Wʵ輤߫>JClXpC @ @ @ @4ba;: @ @ @ @ @ @ @ @6m7uO<guVv_=~ӟaߴh I8p`6^yecY@e˲%ꬷ6ckc-laƌz]=oq饗f$/K.xfϞ=kE }^ve٫e˖ NU.?nm⋭:3gNq*K. ]e:D۶m/"^mQ  @ @ @ @ @@s@ @ @ @ @ @ @ @ @@ ~~ҥN2xB^uc|ͳ&MG}4j*gYIaչs[n]ʆ޽{ƒ0k+z„ SI?x_?Ə_ @6>۷oԕW^y}ٵ7o޼ݱhѢ>}z֞-7 =zfM6-RB @ @ @ @T_@o @ @ @ @ @ @ @ @ @uF㎋<(;וּ`v!*2^}WקOB}CUKKKsXR_^+DÇ}ݷSO-T X83< Mk=~ŋgrjpaefϞrK+|U$@ @ @ @ @U@oc}M @ @ @ @ @ @ @ @ B ?ΒUGU^xo~S+.(R`o*#G#Fs=iܛo)wx*foVY=o[ezjΜ9qgGnݲp)Sd!˗/^{-N9唸馛]n{W}~ѱcwqG̚5ä˪>>l6oѢEP>vZz:tw9{ꩧ?pFTਣ={V9?Ak.~K\N)w_:[nguVkUs~Ҝ$͛-rH_}+] @ @ @ @ @"PX @ @ @ @ @ @ @ @ @ :4.Ҙ;wn` .\C=UU9b-, ۷o?>;X`A\{٫0*) rAEӦMcŊ!zh+裏 /,l+嗅T;c6[mC^=7o< LA)/oI'TanĉcҥYWLUU>:uj[gu @"pyEU_mڴ+"w_|'pB|ѤI׿-鷻}ݦFm-[o= k7?px=jt @ @ @P@IDAT @ @@C(it> @ @ @ @ @ @ @ @ PRPn*{EgI~gyf֕B^՜Iego\;z'xb]v^{嗱;FΝ ׵YϛWveV={.,veUOǚ{WY.6ԞT\/{r"yeCSv3~&a4/_#ʾWgeqM@X;.vZ8hqذa1iҤ¸%KvjHaguV>^VEEOӦM>:5k;xG)R  @ @ @ @ wj @ @ @ @ @ @ @ @ @M4&Yj ƍ˚g͚]t);u=XbEkoD6m[n6ԃWoqݱcBpmV[?׏/|FNn{ǠAUW]#G\_quJ`+d{ݻ: /{˗nj37ߌF UG~Ŕ)SWҼkcĈYǴg @ @ @ @6@ @ @ @ @ @ @ @ @ @D ~_^d5f#[bR}prOl^뻔F^ @ @ @ @ @*PR_7n @ @ @ @ @ @ @ @ @@:thlF5z1A̜9Fg͍͛Wl @ @ @ @ @u}G @ @ @ @ @ @ @ @4|%KҥKktКΫjik|޴+VN,C @ @ @ @ @\; @ @ @ @ @ @ @ @  waې:vcǎ6t5 @ @ @ @ @*[V @ @ @ @ @ @ @ @ @`= ޑ^j* X @ @ @ @ @%b6I @ @ @ @ @ @ @ @ @ @ @ @ @ @֡uki @ @ @ @ @ @ @ @ @ @ @ @ @ @~sK @ @ @ @ @ @ @ @ @ @ @ @ @ @X~!  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @~.  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @` ]&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @! ~<'$@ @ @ @ @ @ @ @ @ @ @ @ @ @ @u( wZ @ @ @ @ @ @ @ @ @ @ @ @ @ @@iئ] @ @ @ @ @ @ @ @ @@C8e˖ 8A裏t[cĉUI6mZU @ @ @ @ P+~k" @ @ @ @ @ @ @ @ 'O^ӡ @@>}zB @ @ @ @ @.  @ @ @ @ @ @ @ @ @ @ @ @ @ @X&A @ @ @ @ @ @ @ @[;c6n'@@#()))# U @ @ @ @ @uau  @ @ @ @ @ @ @ @@˖-#h<Ѷms`'%@ @ @ @ @~#t @ @ @ @ @ @ @ @}{/.\X7j V)G{?}+ @z]KZ @ @ @ @_ @ @ @ @ @ @ @ @Xg}v7n  @` tԩ;q4hІݐ @@Xre9Rp^nHA[lEa_}ˆ\2{iٲe/.HAyeɅgiˆܦq3g,Iϣ~xTo}+Rsqo |^*qyeÍ.[n&fz!7NzH!-ZhѢz߈@ٳ#V_( @ @ @ @ ng` @ @ @ @ @ @ @ @ H6mZN]xq`ۥKƧ~?яbܹ1f̘J56dHAnݺJ8׶mH!)u֬YOgAK,)-?iҤJ~@41ͩB{t-`+~q)DsE5ѣ#Ri֬YqѳgϘ?~'|2{^ɴ.w9 ?NFNx N)7=%'g4Gċ/XxW^y% ,NAP]v%^xHytAY}v˧}+ ]eP]F wU{  h,D%hcDQFk/QcQŎ Xx7ww.X\9s|Nߢ ><}w{Q4W4TL>Nw+^J_w}=^y{MX @ @ @ @dan @ @ @ @ @ @ @ @ 0"駟.6qt#8"0 /ڿt)OI//~#4\XbrK˶=Cv|e_e%ap@3fL0rGvکNm=ؼK*4Flt|99qgOv-}'$GQGUU?=ܳl 逸AtP?YG /LEoU~e_}U:UW]UUV\F?\9NϯѶKZ(E`b}9СCk8wL @ @ @ @ @>/[ڭ @ @ @ @ @ @ @ @jPÇ.(M4);'_38#֡CCE,m۶M?h_nҲ.b]׿RǸ%,i5׬]tIꫯ{'?>=!O /p@R6t??i 6K))J馛RCO0No^s5y[,vi5=cW_^~G)7GefҚxһロZjih/g=3uԩu":^r%SW{q:6O)ޕӢ|)G.wyÆ K1O\ygmqƥ^z)+kkƻ1w9Yfթ>)ء)VM7 3ϦݻӪoZ\xGu1]vߕ7{w7B8߁SR&NxN]b%.|MzꩧRΝ+ڴi3%SC @ @ @ @_2(  @ @ @ @ @ @ @ @ @[2dHYoj%Y#P5ʎ;X'跡f=zV{l>[oumjivءm,YpTm{!8"xr!+B} Lq_Db-^➎n--]v%o^{Es*+ۚ2^{9H~x66,EXt޽kܓoRݵk"{^~W\a묳N/'tRʢܱnyJ+а+ 7ܐgM6IݺuKW>o)|]w+;`[/EX]wU9jGPh;Bُٖ(jXs|]ᢃzAk9cQN;wn^rvmӫ. *{p8}t6JE_^,E#ofp {({Ʊ={+媫}W2Bzw}AlA~Gƻ"•:Ksy3'<_V]u\_Ԟ6 @ @ @ @@iy0"@ @ @ @ @ @ @ @ @ Tk׮F<{gYJc:TU3f}r [x9>3T Ͼ)>˷~#B "7#7LO>dرc~a=3_fCA&ꫯR|"cIg}vz7j.zl4iRsSlǻ4B#0Lz${w>V?~1j_Wk+)2c\%lb>Ԧoyzrha2ޙŧNb'p4]s,"#[nIcǎj߾}3E@usZroĵh3|s?Cen<~i:7W[jokv!bȑ97U-,E^Owe܏W_}unwdNF.Rn&E{-1B @ @ @ @- wz_'@ @ @ @ @ @ @ @ @Y^ *:w_:#Dee Y]n*&[hRǭ]b-jwlkglsW1ᨃ acƌs1G<0 8wqGnZfesmiF~P!Ekj55ac„ y?)5M_綏>(wqMvZP??;/ȟ]arhw5BY7tl{o*&ko0L&Nڶmau饗 oa;\s!S#|zԨQ9x:[oM=zojoUS<'xb;q==vǵoDݻw_~O?:{'8>ŽF{u\%X"y 2$ǹ{.yyɁ7\e;s믿Xc[ @ @ @ @Lov{O @ @ @ @ @ @ @ @fI&P8{7E]@|kx'R|+:uEe .X4Owfm{Q 705\Qmwߥ-JeeMtP S\O9N?A* ;feps}cUov}poqYDe|#7 ߕoyLP_xpe{f-鬳Aq(+n溾? SOm_ ,Oݻw/wٳgO~R;6/ǀ[,=#k׮y|JF{wN9| 7Ը=yg3+GXuq_Wk6oصZ'pB|s9g:sҰawߝnUzDY{Si:~33"o>|ӱ>`뭷4SA;㏯uCa1SuiX@x|y-g}v^cxo߾ZMnUcӥKj/8뮛 T#d6EEd}ځn""rj6lw0aB,'_|71E_s~|93=vavY*NwG:.G}"tvK ,@ bLwBV>"%H*ֺu<|I'U]¾ތuFnE aq5O2jԨZ>)ov54Fs\Xϊ+Xu Z"ȶ2跘9" N~a"?>heW뮻rz4Fk}kY0Jn\lmۦ}٧|b%z:Mi(~K"$yĉ*\TEs3{U1Π4L5/JV*W_Ik{)paQ?i網)|cW_})S5yi񮌿Ak >}׮nRZ6ѣG| @ @ @ @ @` nGv` @ @ @ @ @ @ @ @ @ D@mݖoE"SNipLegΝӈ#rZ>VOe}뭷.7Էo߼d/SDHdX~鵻{衇: 80 <8}yޱc> xUu%j&\fYu&6^s5UgO.lcjs1GK@4iR9&\Z+-2_-7 /K[ N2dCI'|rO}X,E oEԔG9 oM^{mp +"lʢ.Zh:իl{wzsT[otw86(%>r-W)#G,MP(K.dc=iVH\-*Qwwg\JՋoUc<Õw.ݺuK=zHC u]#H=Xr-l~iUŻ2eܸq.K<@zwszn/?~|@"T;ʿ'1cƔ @ @ @ @ @`z Tj @ @ @ @ @ @ @ @ݻwO_:4q)B`_|ԧOOmKO6tEY$KE=Z_~hR_y]|RK-jVLmqy'?"$O\pA*;8㌴>T]C1q@jWNܐ/˴[zk_ߕe(7GU+++D}]wMvZnׯ_n׷E0fITYR+B'L'd_{<<1Ղs+ox 7;/AGu]wݻwnhlUW68 0 iذa9Nl>J\ڥ2<~ .`S}a׮ZH\sqOƂ#xwZZ5h3\9]h%~YgtG3<3}ϟ8fo)Rb\si|GoF1eW{;tP(ڊr  @ @ @ @ @ @ @ @ @ @ @ @ 0k 5\im'߿o!=aw'pB:묳 2>X6l~#7"'k,AySZ@k}sϟS|GH{ЮӼ/*׫W#<2E@i\?nTa~AsVW}ݷ "Pi]Z6xw^Wre ԩS1<W x1w=F<oRj_y.SY#kYlGK//3Ϥ*>c)>n:#]|WNg37L-йcyyU+ f{|.V=>M-7~N?tw"|>K^zi;Ӌ/uCջxW7 m۶mk;]tԹs缶?OSW?= @ @ @ @̀k$ @ @ @ @ @ @ @ @ 0vii{AqK{e}j*EoEC=UYft'ӊO<)V6F_+e+qKOc[z{V-\Wx64g=93}Ug.G?B#}jN;:vwkj|GvhTo|Iyh(~mT;BJ'W"<5By4rt 7ʰ?~䦙&E}}Vod[ 6Ucg㏫׷jg34Z_|qVj:ӂ .g~ Giӈ#"8te**)?>_|EC @ @ @ @V& 췕]0%@ @ @ @ @ @ @ @ @K B"O:|R6yꩧ6 ep_Fۻw4}tzmƍvڵk/L}]Ì;6=Uj\tEΝ;e]6_^#:"]پgYb*˗{Çb@`oaǍ߄"[?=ݺuKݻwχ~7|e;&2dH\VSzo4+Dnj3M.nXBzzJGꫯu7[[S V?aY/*$SO  @ @ @ @ K @ @ @ @ @ @ @ @ @ ٻ+j6VYe;)^~t9TneomڴI[mUnDlRHeVˉ`"r}?x=ztn*n8`!eWϞ=X7Ծ<8^zC}Qy7JW\1z5dž;=ԧ1_4<䃝vi f1"M8ڷoN>zof#8"AE{l]_sl͖6`,H~wһ[/R'6ڨ/p0*'{*4rhi fm|eUƓ g0y7?hР7֪FS>}mS(|ꫯnP9vj k:v옧ܳPi-Yܵkrik6UU @ @ @ @ J g @ @ @ @ @ @ @ @ 0DO(U#Z +O c9&E`oC=4r!w]iҩZ퐹mm/hwб~;sR{92z뭩O߿ ?ta%\2>ciԨQ93~.(3|u]3OӴ S->쓫qmv_W|Gqr1د2X _|EXOei᠕k]\Xjԛ.Э[gG-yǎc=RݾK5ڣG_:;nuIO9EQG_|uw4Tb C".v}{n[ʖ[nCt!3ZYm/t91cƤ]wݵ#w֫zG}tAWY2س}fo>aFucO_|q>Vo1E@j0߿DhϵK"eV[m6dr4{k~xi׮ڧe"bڧO4O>A=?p0;O~OijY>-apxNk׮7q#<2Epwߝ"xu!ٳ uolGx^?m۶M ,@@I&O92xlN+q)˰D/Qd<mktO1A?spl#z衴F]jՔ{)q\7@E|v{+;KW\oSD@qBqEhvϭ~iko6|t}C޽{Ƭ> @ @ @ @h  @ @ @ @ @ @ @ @ 0 D bu)W]H?1ڧ<Xl6驧ʁVJi\n3<5q#TwE-Ry)=Yg.`Y{8 /0Oݕ_~zWAw?xuV +Tk\qR+nݺ1bDGu]Õ#లD`~t7Ԣ)ߕV{v֔OqclcG2Ԛ_k)Mz[~RKYLΝӿ(ǏOEhgr!9@m@R{}M]tQ@"7F#x5֨s뮻b-V{nE~<Q"p>(~q"Pv)kW{r盚̍_<׶]hR׿34:Nen햞]EHs~Mve]6=siw,bbbVM7ag8'x"|Ms9y睗vi|zϵ8~Gx=|gDxFqNjwӐ!CRS|xP%\2--{0{o^{|eY&ge^}ˊ0ŸO "f_Y{)£+Cf4׷eH94]v%>t衇k^ݻw r8jqFHRzA#w)Myꪫ t:th~EXj= 믿w"w%Gĵ`(j|f'[܌*jUs}?kVݖ.cƌIj#Bg/⫭ZeYsyJsuץ]w5  @ @ @ @JT6 @ @ @ @ @ @ @ @hm۶M+r<# 1>S["4>k:K͌Ok(okJM[c\7޸ѓDxlbc:S5Eꫯ?S3Ƿk[ǎ}91Vuo4La,Kcs_Fk&@ @ @ @ @`h3k'@ @ @ @ @ @ @ @ @K`}MHؘ!\h曍r*lG*" [LI55Oɵxg\ @ @ @ @ 2ZfZ @ @ @ @ @ @ @ @ @ӄ uڍݯQvomogFs?5Z)ߔָ橻*_Cg@ @ @ @ @'@ @ @ @ @ @ @ @ @6tF*ҨZN /pK]6z_; 0} @ @ @ @4fa4  @ @ @ @ @ @ @ @LAtq 0+)>  @ @ @ @ @Y͌8k#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @Bݴ8c @ @ @ @ @ @ @ @ @-pWK/tFpڴiS;F]n @ @ @ @ @W @ @ @ @ @ @ @ @ 0t)G!@YG]vK. ;S @ @ @ @ @V/ _B'@ @ @ @ @ @ @ @ @_Kcƌj $]nޏB[`Vj)G @ @ @ @, ׍@ @ @ @ @ @ @ @ @-.pa믿ŏ 0}Yd2{I] @L)0iҤ @ @ @ @__ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @+n  @ @ @ @ @ @ @ @ @`Vя~sY/fjk67s\guRϞ=A&'pO>dr @ @ @ @ @I~gg @ @ @ @ @ @ @ @Z3<3-bS 0 s= /z3X믿"Y @ @ @ @@LpN @ @ @ @ @ @ @ @ @ @ @ @ @ @4I@oL @ @ @ @ @ @ @ @ @ @ @ @ @ @3ߙ*: @ @ @ @ @ @ @ @ @ @ @ @ @ @h&ٙ @ @ @ @ @ @ @ @ @ @ @ @ @ @fa3Ut @ @ @ @ @ @ @ @ @ @ @ @ @ @ $aM3 @ @ @ @ @ @ @ @ @ @ @ @ @ @ fp @ @ @ @ @ @ @ @ @ аW_}z u9gf?]G @ @ @ @3ߙ:5 @ @ @ @ @ @ @ @ 0%j_^yo93-iWOlMZmL- >N{]w53]r%/CuwjӋ/6pԻw\Gw]Ӯ]K_>{+'|r8qbZlPudfK'pBjӦM?Uؽ{_vs??iذay{JOWRhwyK%\\__ݔ5uYiѕc=գGk.]诽ߦ`>1ڷooV\[wߥC9$}yΝ;w=uСr^lD0r~_mʚ >V-㾋s}kϦ=3 2F_@G8Ai)o}y/Uf,o9uQyQZdEfZ  @ @ @ @0~gKa! @ @ @ @ @ @ @ @ @` y)>Q"t5B _~4jԨ/G}4M0!ZY=lVwV~ߧnZdۖZj7| **.´{Lv1 BvX`zKcA1hر)…#両+bzg}=:K\sMJcܶm۴jiǍ"@8#G99+K?A^kطoԥK4|ad9  ,L?QN/ʌ%0bĈ+E  @ @ @ @ @`F;]!@ @ @ @ @ @ @ @ @@`̘1cGA[Ƒ?a7_CMM[nɡD;OlMooN:tUW/"n&ii[||)Ҩzy6m.E~{왞zꩼO9w}N}Q9 E5v͋/xzi'N.tGXR~k]-B~OO\I&ps=hM @ @ @ @ @fZ٦3 @ @ @ @ @ @ @ @ ~_神xu~c΁?ϛ:t"5\R"G+Lgyfj„ 9)ΈvmyYҶn~{vv5饗^*Ð/[oM׾}t衇<0?r͸8A1lw1=C&qz'=ܓ{4bĈ)>nÇW9pذa+k_WBop`3wyTDx{=#}Zc|0CK)VǏOJy|}7SL5f̘裏(/\6b3BãiȐ!{M/BoUG9G @ @ @ @YR@,yٝ4 @ @ @ @ @ @ @ @Y瞻N+ꫯn_[ny+"ER"1>Qj￟y晨NUgyA"(y&i}{Fae)˹+iUi>Zk ޽{-2iKkv뮻]\nK.9|-HK,Dwy\PuA9#"L^q&lׯ_7n\ /[n馛wcOM@q7?۹sY*~b=,XcU]SO=U?"T9wB -::7`3jgUWM]μ93?MK.dF=^Lq^پcnm{ol͖SGrnU\> 0 zf}ԡC#G*_k{vOK>|x>88Y}S.1>Bz2H8B?tn.Ͷݘ0Ž#;Wg菿h/N;{'?wV>q+JNRXGߋ/6l:aFg{0` _-lQ9U @ @ @ @ 0 E/&@ @ @ @ @ @ @ @ @Y[`5q#~5,F稣J.YsGWj饗N?яr_}GUMmc[~6wY|x !1O:\~ޘ#!CdaÆ>}䩟}ty{xe]"6B`kmhz'LgAF`pͶTis8sOP%x;q'W~_p)#:~P4"T.ۋ/x=Q;{es^R<.B @ @ @ @+Юn @ @ @ @ @ @ @ @ @`f؃:(]xiҤI/ϟ\0m9d?AېG,YߘSO=jWFXe؝s9)Z"( cO?m:#`0>N:@>,9Fۖ[nYvmV .H?|]b%ʾ)כo#pgkc}7"L2sEk&E`^{?'|rӸqrheGdSG8O~Գgbo-.Paک:w6l)+*YyC-{W\qqwˡ倊JP7<{N>3i뭷.c}wy;h'?&L(ߍ]vMҥK]~=ܓ"H?L H:\sUNQ7e}-#6BNczMDEYlŲgh[iҹ瞛uMM.M48zW)~~OJ=n8Gy$ŵsF@)"nH"|zp%z{C9lkJqSV^myM3OoSEiv޽.G{OJnm[nI?jxĻ#i%Y0c7x ΃C @ @ @ @Y  @ @ @ @ @ @ @ @ @`ã>:uСmRVjU"2} f]eUR Gؑ#G֚y7orw}7W%7guqp[]" ~w+Ә5DV[-Ehgu]7 4 ͍'*}ѴꪫM90'́NٯB%s<}N8quuLW=9$5 R}٧ -7x㢚|0oG}&{hkW^y%}y ̍8{G^x\O9WxϷr\c"aQ9:.ʢ1M*8v(=%xs`r"r(..J[~EsASNZQ)yjÊ)a/5sM}kaER7Ţ.AǣGm!@ @ @ @ @_lE @ @ @ @ @ @ @ @v)C=4]}ii?g?v{'+E8`8ꨣҭޚtc=S_k\}ꩧNEfi<蠃y}'J6mo^tMshƘ}SZƬGmݖc#O.yP!C=PիWz饗_{wU Bf'w=mFi׮76PFzlN4\WQ3fL/ ῕[vSb/+C#]6lŰ{u)Y֢ݻllA]"|>JӘ-ʶn[T[V^#8"=c)3j=d#Oj.=Eoe seZk;Uۭ[ԣG(}{-o}j۶d-?/NÇO[-*2h|՞6 @ @ @ @fe6;w @ @ @ @ @ @ @ @ @ y'~O?M>hmJ38#UP6,tyq5i֏?%(뭵2~t=Gxg.]rc1v!Eb;ܹs:]ݻwOqO'H}I&Pp 矟#0K.I -P>Kw\C#, H+B_O'tRڵkZӵ^[85jT~a9>aV WoĜ0"4ܩ* .`Y++Wv_sVkwm߾}~i\ޝ[U_("(NfejZYS9<[Zu23͜gQET~ׯ}>N\r\k{skf+_{٤|~>Gw{{g~No}b?<ƳY<]3YCCO5aq-ݷoFk*ʗ\rI׿b߽SL"W(\+O68 @ @ @ @JJ6  @ @ @ @ @ @ @ @ @\C92B,# o#FHKqN'NL_|qv"6Ο~J>볉o=N.B3}z9rd;6r![ne:*Xj=4<[__em̯k|k5Q\_nPr}km(ϭ*-ƌ-ח}xiJrJ^0>|x?{Yqi嗯ok׮|ztҌjf O(;Wvi+]upi)رcxׯ_>^< @ @ @ @ <-7'g @ @ @ @ @ @ @ @ @~,^zvKo|H ݞy9\1"4(`[=o)m{キ8N>ԧO|M\pA**g" V]u<΍c@k DСC<>tuץ,JWO2M/x޽{ޟ:ujU`}on,s"Ȼv_&L]"51-2*;)BS#ܾ<*˧5\Y,ח}w߾}E]^{~Gx7.y_`f<ƳڻwʺovQsԸ~ʡvs/de{f6h[߹'OLնN*ζf)K/ 2$-u#ԩSA @ @ @ @-+ e=F @ @ @ @ @ @ @ @څ믿:4rZzj1 ll5m*"PW9Ў6T#o~r|U&MJ#Fh #8|"4ʪy- *+/bQ.PyW+ΫzܹsCMhnl&CY.E?~|P>Tg{Fu7R馛/Bz衇j6mZӟTv"ܴ&ߎ>F1^"<Sj >7߼p &30[2ҌZ\wuSGL:2nL8FHFm:v옛\vey+auNhbŌyFay";{߮СC޽{_'/̡->a @ @ @ @ @@ a58 @ @ @ @ @ @ @ @ @C`„ 頃J}Moȑ#SF?otfE]4 \q/KG}s3O:ËFx|{7tSzS~kImY%!j@IDATsm٦87VOR^>yʻT=\wyiWm>ĸF'^nқo[?_gcź4nܸ`%8)e]RK-FU9eM;C޿뮻ҡqU}h{XF,GgwM)yjyxO<OѣG} @ @ @ @ @@ tjL @ @ @ @ @ @ @ @pwGVW._~y ,וw}n}79P")#W^un/.1mp"Яv޿[S|fT"o%.[VDcΝs-ܒC}ˍ# 0B>k>KӆnXP̹Ɖ3s= 'yte^ӧOn-'J}d9 ÇOǎ/`#(ırڵk~" 5B~y",>gUǻR%ƒ . F(lG}CoTԘE?/ҕW^CbᄡKߎ.JFT>xGn8gҤI3=հ߻ /0m`_:}=TjU8XYho^y1]wݵ2^1뮻.oFiy)}s0駟>ԥKE_|1.>V{Xk_Zy_wwtרv9ycM ,@~c>q{vj#@ @ @ @ @0m4!@ @ @ @ @ @ @ @ @0Pܵ^ƕ~#`N[ne6S;زNREF]j7C=FuqNT3#$s뭷N|pz衇ҙg"dK1v]_ű. S_]\ 3<:9 Q׭[Q"^۵]xlvmt9礧zgO}iF}=:rSNMw^ގ8tԣGhggϞ鷿m:c@k 388_~e?~|͍Tk{uJr=:m9P5Do6lo>4vIFcW^u.95vNM5_Wu2J"ṱ 6ƺPօ}]ͱ>>?\#7}#7Bkpgaq|ڴi9hDH.[Txy4p|I=sӶny8;}C_r%+~q˥xu]oʵUo&kI{S`0^y)oq<:-< @ @ @ @ @"0ʞ  @ @ @ @ @ @ @ @ P@l:hР[v)EoYfM췡{w˸qrHmE_*B '_{dFhe߾}a'ЧO4vشRK7|3OO;Cގ "8_~3;n_aZN:W^9{AmQt\si3fgVj"t7~7t&_j `KM:?O MC7 @ @ @ @ 0ff @ @ @ @ @ @ @ @ @v){曯ϰa54fV`̘1Uź:qęڵ9ŷe @ @ @ @ PTٲA @ @ @ @ @ @ @ @L>󪮬Ih/52_Y9r`@M0 @ @ @ @h&9 @ @ @ @ @ @ @ @hOo2dHUS^mժ:Ih/{NÇz=zjOlsZy~3w @ @ @ @̽~{  @ @ @ @ @ @ @ @ @\!&( PW`H{WqM{ljSj:&@ @ @ @ @VЊ} @ @ @ @ @ @ @ @ @ @ @ @ @ @ a6$ @ @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @ @ @ @ @ @ @ @ @ @ @ @ a6$ @ @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @ @ @ @ @ @ @ @ @ @ @ @ a6$ @ @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @ @ @ @ @ @ @ @ @ @ @ @ a6$ @ @ @ @ @ @ @ @ @ @ @ @ @ @@\ @ @ @ @ @ @ @ @ @;vZ>cw}wӝw96 @ =zF#@ @ @ @ @@mF @ @ @ @ @ @ @ @ @ 1bfjGs / @ @ @ @ @:Γ37 @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0+:͊AA @ @ @ @ @ @ @ @s_>w#z:t\6l>ʾ  @ @ @ @ @ @ @ @ @ @ @ @ @]( 0t)u}`WJ @ @ @ @ [ @ @ @ @ @ @ @ @ 0 iɳD͐%+b#X JKw? @ @ @ @da @ @ @ @ @ @ @ @hu:(]{> @mZjJwޙva  @`>}y]. @ @ @ @S0 @ @ @ @ @ @ @ @ @ @ @ @ @ @ жvx @ @ @ @ @ @ @ @ @&0-se^W_}uO[/ 0 @n;4q @ @ @ @4K@oL @ @ @ @ @ @ @ @M82,Ӵ'@X;aN;< Lfw o @ @ @ @: @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@6 @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0'k @ @ @ @ @ @ @ @ @ @ @ @ @ @ @f m  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`N;'E@ @ @ @ @ @ @ @ @ @ @ @ @ @ @,>' @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ iN@ @ @ @ @ @ @ @ @ @I駟NǏOݺuKm4Y>I&~8;hРԳgY>e#Fcֹp_a9> @ @ @ @ߖ7# @ @ @ @ @ @ @ @W/LӟC=^|ᇽ{N}Mַow^k5ӫWtgy&qfw+\/oH}Qرc6lX 'NZ_dER'ۡCʱhzgԧOJ+Z+?u=;3\pt衇9{nzrXo7^zizҫX`K\c5jo='?7L|]C I7jQN[AF.])S8a'xbv"P2~xt!Tw}[n7>roY-B 38#^ٞ]|qg!E r.`y睗|#va>4mڴu]<AѮ(#Fܣe̘16Ra=S{?駟^#?Oe>5v"3Ϋn\4yGsxg駟N^{m:3ӭZ,{+(ksrA6w?U-\3fLZr%S&6TZ=sCc'@ @ @ @ @ @ thS6c @ @ @ @ @ @ @ @ о<޽{SO=Fok /ܬ{葶~4jԨJsl:ɓw"u7gL2%=3yEir;NowYgg3l69:dȐ&gjnH]tkFo2ˤ.:*ʹ*ˇSoQEo_oF5ڷΜx[ev#opx ]_|LO7|6|G_W`/rNxΞ{jҍ^z>oO'6y>o՜'9dz2s^?^g]:;9V}6}=lؽhX 4f̘FO9_==C)0aB N8(92=3髯*} @ @ @ @ @M)  @ @ @ @ @ @ @ @ @`n( .`av}4n =Zۙcm(=Zhrcisk,\JYF0oQJfmêcw9o[Q;vva}WW;S6R>K?&MJtPZdEo뗟]vea_}n=hР~ߨ vS/ 6 a٫jZ|S< ǧydM*?S]9GH|Gx+ѳg}-V[r-Օ?<_r%+u7cuIK,D65\3-iuMv[Ss1Glk?i5C<>qWFY=S<_nme]6?kv~Fz]C5uX4٨=qY>sV=W\Q>PMY{_>7r-ւjy4tм7m)X+z.%<~:ov驧Ś~ᇵO @ @ @ @Y.0kY~y$@ @ @ @ @ @ @ @ @m/AQ^xO 'y?7lcJ?"(- Wܣk-# Og:uW#R//8W_1cƤiKf-='Cj"2YgUyNҥK|0]2}{_~9~<3O{ӣ>ZcmtIOovñ?Q;$[s,Jl=:m.++߱s|=Y:D_5B_庘o~O矟x|q7jmɡ38‘ F"JŚa1*I܋;9Gq<ÇO(tPkhY9CoUEmx}S~nU͵jγќwj׬N8!߸)ۮF}Xygҩ\rɼ~=9:f69}->l^?;,O'so /pFኀhw905\3B @ @ @ @0> @ @ @ @ @ @ @ @"oL|Iv-AF׿;4#4Tvk߿뮻.E(dիv&G1cr۴irhb;i _}Uܫr&lRn +~ӟwi)BK78m{^%มn馆W_}5 :2nZ.oDe|#4BV?\",\ ~"rwLgqF1NEn:g8N:i_ 6ؠ~×c{eI<@ѣG@}7Ӊ'"3{g>7袋mݖzT_ꫯͼF.C; Vkc=6޹X }O~{r/b뮻n+Fx7T6RKu9ַ>_"o?rnZuk1ScOܧx>QGUr1x\<?.FoqEY$pikt @ @ @ @ @ga| @ @ @ @ @ @ @ @ 0 DP>V_}UFti}7*ۈUVYO6T"5ʧ~=܆5~E#wM:wfG@rgJfaEp2ntܥKJ&L?яR=+JY=.k<8.㏯w n:ތyFjE a<rHy~+-,ʤIE^z[hӒ;-qc>+r8̄v5I}EPmQ^|b?FX犠_XX+5{Q7Ʊ7(['?>;v3跘Ow_K U飸Oz:uj)\k[m.?Ug:]9d5m4oŬsQrr?F8\լh;ܖaqޔ5Y7#[4ns-ƙgyFmw#\!>*Jjnˇ?âo @ @ @ @@6 @ @ @ @ @ @ @ @ @`.Xc5ri]{iĈgM%B^{4jԨTpOwJ+Rz'RѶv؟s50Sl9=?WkUќw|55nnhq.:O%\4v^}Q,M2Nw׮]+NjEɓ+l @ @ @ @ @q  @ @ @ @ @ @ @ @ @`xS|馛nJ{lL{o~tEG~'M._YaݺuK /p\}ӧOZve[l9Cuꪩk'˜~\zi=wՌR?HA^ժrJ}}cLmYo{C{\ʡ,WʁO;Sí^o`Fz#LvZ6mZE`(<aܵy^KgtY /]NCƳUz0ԖYg^}?>wa~UW'ֶag,K,`XXE@t}ҳr/Re;Js}6sQԷ{Xsj]m8G>`&N.]TtQ+ƒ+m @ @ @ @ @ !  @ @ @ @ @ @ @ @ @@,i}IlA%j56( Np@cE[V_nN RFXcC8VlmGΟS|1".3:u`ԙ^{V[=ҠA6lXzSAPrrrs=+AJ&,ڋ6mbw[;1cYUlp1j}h>infjo(v8'ߎ;v-mi饗NݺuC~}ޮ= @ @ @ @:Γ37 @ @ @ @ @ @ @ @ 07 0 R#rڴivGqDN{MEp\k6ur?>eԩ Z+6ذ?я*/Re{NۈN8!_Vwq5.8V fpJ6bKOC!i_K۷otE^{-#M7.5ׯ_ea\5ݻw}s6S9=ʄ nw*c%+XԡCx }Kc=6M2nf!Dqle xZ4V<m;\~=lRx\[n%M81w{ꩧK.$miVKq裏V @ @ @ @ڥvyL @ @ @ @ @ @ @ @4^:_R6לkpZ+wqW,|yUݖ=z駕 sB -TP=ݺuk}{n{VX!_BBGuQ Tl](ׯCtgۛPkbNA7pCO?]َW|vkoCFw_niw߭3Fy>yFb+;xWʻnw%m[oMmYnkpk_{_"6ְ"|n&EٳgիW{I_|E(wtΰ[jf:+b5>;uꔫ>ڇZt9?|e.m]e؈[}b7 @ @ @ @ڽv ] @ @ @ @:s@IDAT @ @ @ @]tQ4_}㫯zܹsm[@I&5x衇K6mZo[̸^;?Ciѕcs+ 6ؠqBic~ /@r ]s5i6Kqm٦ ƿ/3Ln8y7s=7icI2ءC=;ګۧ뮻.9A{w)O0!tAo߾9vȑ994#nK^xa>gEM믿~ĝ'w"<4A{x޶z+f>ٹ,5;B@GըKK-ϡvcay?:*Z/Nov>c=vm4eʔ\7dȐ;[={L'tR7n\~7#<=(s.5jTo?.lar7wuWǎ>-'cfX7%;׿59^.EPwg}һロ#ۮܴv\_^yѾu6~<|b-Vg:͢g0谊5<0Ϥ[nW,UokF?{2AzG ooYOO^EX5h;ܖakV훵J+ѣG>8=wfTisW38#{y)so @ @ @ @戫p @ @ @ @ @ @ @ @ @vm)>Q" 7B!%8rU[o5gF%+1av}ƚ1c+K/4mᆍ1闿e:ɓӎ;X{,/<ʱ_F+ЍΝ; p颋.WwקW_}5`F-Y"L4TkDu]+[lE׿^/6Z69ܻ <)B 4iRW^}.Dh=ܓ[#t6J;o~O#4o~twP]K.9:ԩS%ta?=w5J= 'Pgyߞ"Xb H|xt1-魷JӧO/O<^l\0z X'yg+‘vXERXbZ駟c9&b`aQ! =X'kq}M6$\<y=v*߫C=BqEhv7טrlW馛o}[g^b^5'^4hPp @ @ @ @s@9"\ @ @ @ @ @ @ @ @",uС9|g9gϞ9H5S#0\"L)%BSΏӧhV㜨} /rwmt9礧zU~㖷+md3H\rI4w]_P߿\{k+ߧ{Ӗ[nYMyerrvM5E_1nVl)΋GjE_|~X`tm6P5&Ro.ԭ[[ƼF\s:v5/2c-R/B<7x#,8~D+A1n܇T] ǨƎ)!oޔ)S*AK.dկ~U:6G?Q0,B 70N +'|2?IE~Vy6b찬n9kV߱6=iO!E)?cE]]}}W_\y/Xsb-U++5Ԯ7 @ @ @ @f<[f#@ @ @ @ @ @ @ @ @9K4hPC}uF!nQx VܰhZ7n\rhe߾}GY*-'acƌI/RtO-\F0xN>ųݻwZ6tZ+{.xUVoyR#Huر947̃D;쐷;|ˁ͍vPEjZ٨aAkV׬9X;o5X#4+=xfc7BSNikН;wN̟&W6unioe~U{XԳQ;aKYޣWs5Es| @ @ @ @jz@ @ @ @ @ @ @ @ @ @s{"ϰaLj̘1U9'Nlg̮ݙܴ[{=t @ @ @ @hmN=  @ @ @ @ @ @ @ @ @C`ʔ)?b=f⋪b_~lp@@SMJ=97] @ @ @ @Z[@ok  @ @ @ @ @ @ @ @%o2dHUWjUu^{=wiUOGUDF{4ܴ[{=t @ @ @ @;QQqCTSL0|sȩ2K)MKH9-QR MMQPRyzۧsG ᳞p^{5|p>~  @`Y ]'@ @ @ @ @ @ @ @ @-D`wOQ/СCtG/4z.]4S✫ou 6g#k#@ @ @ @ @@K'@ @ @ @ @ @ @ @ @ @۷D  @ @ @ @ @MMUS @ @ @ @ @ @ @ @ @ @ @ @ @ @ @Т#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @&' ]2&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @Т#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @&' ]2&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @Т#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @&' ]2&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @h @ @ @ @ @ @ @ @&0dȐԾ}ښ8FMLw߭u]w]3fLm$@ v @ @ @ @ " AuB @ @ @ @ @ @ @ @K*0nܸ%m4I&( @ @ @ @ @@<9s#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @C @ @ @ @ @ @ @ @ в4bĈ`hZ*Ns) @ @ @ @ @ 6+d~ @ @ @ @ @ @ @ @h۷OQ @i&uԩ,J  @ @ @ @ @& - @ @ @ @ @ @ @ @_`ڴio5C@'x+ @6lR @ @ @ @~ @ @ @ @ @ @ @ @ N=tm-q @+VG1cƤC9dN ,-Z,eQ @ @ @ @xV+~ f@ @ @ @ @ @ @ @ @ @ @ @ @ @ @V@;  @ @ @ @ @ @ @ @ @ |_M:thi˶^4k[n%͝;5㎩5w,N`ԨQwY\3  @ @ @ @ P/as2 @ @ @ @ @ @ @ @,E]_=M{hcƌ5wSNi+05h~̏ @ @ @ @@3h `  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @^~d @ @ @ @ @ @ @ @ @ @ @ @ @ @h~U @ @ @ @ @ @ @ @ @ @ @ @ @ @z9 @ @ @ @ @ @ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @ @ @ @ @ @ @% ^|N&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Ц9, @ @ @ @ @ @ @ @ @ @v>(;67fmRnj?f͚F]/Vo'NL3fH;vL h˵> @ @ @ @h~ŵ4 @ @ @ @ @ @ @ @h> .L7pCzG/fϞwzs4hРԩS ~7u]W]N:)=/5S~J^{mR֭'\:t \sԷojժt!7.4gΜ ]X뭷^ݻwvmUh9rd4iRzWSr[ou ڪt}ݗƏ__ҍ>tAK|真zt]wUSپKSTt8L+WihѢ|?y㏫g..=:]yU.#l1'|r^{. ȅI/)vkӧOa*Y~o>uYU1bD{Kkr뭷V -M@]VxǻqUکhwyg7L=zh3  @ @ @ @ht~%1! @ @ @ @ @ @ @ @ _{/xiڴio߾iРASNi)LϟߓيnݺUszY{'M81m22gΜt1ǤWS%6tiݺu)dvܹ)Bg֬Y{^zwrpq/(|A={vzs?뮻n@%… suu*dpEyOkV (<@8p`zgR;J5N\S+~+4 >jիWPj2lذ4rҾ%0s4iҤ`xO Aq K/O*o4yzuꫧ|+O믿~kĈiԩwINn۶m:SұG@rp؏(?яF}\ ]1y-HSvOeBӟT^qMu5jTClo[]ƹ ( PoCnj3gV׬ں=q֥K]kOW_,9 0kN2%?cKo9 .\?́=P^ò>Vˁq_=#Ox?~|_GK|^_\sa}ÆC^qN0!Gm?sH'NLϯm kT~Ό3R׳fͪ @ @ @ @T[ @ @ @ @ @ @ @ @hTeVKZ-m7+nk;.w]tQCtD} 4.Ku;w.?h#yM7n$Y`|8B#Ĺ[ny֭[C9$[JMl(oYgN;;m6iJ;CJvaSNwiJnaZs5UW]UiƍKjD瞛ׯ_>ύuܹ՞W_}unקO4pԥK~k켖^?R<dM{N14Lc/]v%E}7x\eYԫW|vqkuy 4uI̞=;z6vm|iСO?qwqGn)㾎3aqMwrwOmY~_8VCX0x;vXz=b>,XcU;տ略sOU?ݰK.uy#8xsۿlVy=[newD2z<:gϞŻGMÆ K=z׸k׮鷿m. @ @ @ @ @Z @ @ @ @ @ @ @ @ @@&M&N\'!C1o4mڴ*<EiӦM ع*k;yεY3.UcH]9Nk|O?K6(#m۶׿RF(kx?a|+4Է ug?cD z(h1~"軼|98B|+vb'ԸSL)5F{Wu]iR;1}\x6ĸkK/[ySvf͚~k^yqs19|yXoql)n+h!cǎ- j*f-lr_K_0+oEM_җҘ1cҼyJR?ƋxҾ}qgMW9,<¨c,lE |3iȑEU~iͥ6 @ @ @ @ B o @ @ @ @ @ @ @ @ 4~D#nHg.-FFdM|{s" QuV]u?φr뮻Jbvlly?!}=:^x!˙K.Qvi裏1B^N.´FU;6n湟S6[ -:я~"8JƽAF`pJ]:O0[|'_O@SܣlWqm-7,BzO;|cMnbǢĵPm @ @ @ @ Z @ @ @ @ @ @ @ @h,~;ܹssߑGC"5" F]|j*۷A7}_N~{r`e׮]+7[}r]⭼KGM',Z(1q~_o9AX^6dtqǥ:guI[;K!箨0OE(gNy%5\w]+B~ VZi<8Օhs衇K.$| <0watǗD:vc)UmDfz}ESN9t_~9GLMlPѶmst9N8!Ż󩧞J_O?΋(oqA=?~(zzK;!oK/4EhjV^6lXXFi.fQ_Yf.,7GxyCZ?HKiZnanuz>3rX#TŚ9,fۚkXc:M3oq=E3Zo`_Hqu][V1l;7kQ"8x#(8WKAܥm @ @ @ @ @@jŀ @ @ @ @ @ @ @ @h7~[&O[.ӧOnގ̚5!ӦMJ+;c٠Zvکج]^_޾QXE0pR|e?wQ^nR>vy}yhEl92Z-ZT]ܓq 'X_RѦrҥKݻwۯs`OGtPjݺb-O0!s1iiM6Ij߯"gaE}C=Wyl @ @ @ @h/j @ @ @ @ @ @ @ @4cv-EjFܵ^#c^~VYggϞ~_{~;ѱc :ڵk5jT?M{64 C{kg5ȡGǎ?>vaSዥ+hcEOηrK:saD@#\#š{PO]QW}衇v#(S!P^6t|xʔ)K{gZ}Ӯޯ\ʢ̘1#曥OSz^Sk]tS,\}.X G(huͭX}߉묳N]ח/o\zxWW^y%ڶmi]Z^nR~~y}yhg}vZynKÆ i}LN]Q?fqOwQ9tսsX!{O_*MO1h[]i׮](E]qq7 @ @ @ @ ,I @ @ @ @ @ @ @ @4nr@]v%my<2tF?~󟧓N:cEX̙3naV[-pp|M'|rR?L\rIMWoժUPG;qСC+m,;sm]:Bs8㌴N;_Ryhe}C|JPJcSۯf }>|9J}QZhQz7H~zI<3+t=zT{hV1JqWw>uk.GykjS^ymYU[5[^_޾c9` /Lw_)>`#h})tRS^JǪh߾}|>5C5՗:F]z W5P\.J7tS2om)nݺuxݻw>^>Vl @ @ @ @ @@2_&@ @ @ @ @ @ @ @ @V@oG?>e6:+o_u硇*.&v 6 ꪫJյ+zWJۍycy9#?L2wxf̘|%綾^55yFXf|-kje Dy4k֬tWy敐u:u,XCU㞫*ίFkm6^W뭷ު\ (/o c'Ehjϯj Z.,_{Mcח/={k&M:5>RӕW^Y<;X@IDATk:z?ƽڽ{gTՕ9WwuKw/=xsa裏;..z5_y` @ @ @ @ @@& @ @ @ @ @ @ @ @ @M\`+OB}'m/W\qEi_WKr#4;_}4~||-Lm۶mC83s7:{O>Ɂe7O~RQ1VxW\z饩o4|K+j9f?8'?ic=6}s9RF)o Ip^:! _Bޝ1cFkUٮ-JT|-&M} y*5N裏*tc92EXzcxd TmshaJОviy[oSO=53>c98_zo}+Zk;<{&!_j~zO=M74m׭[6ct{UN%%;wnڵk7Ri,wk>O?>x?Hq^E+"/_'-~k< _Ӵi`]yq$w}sxWx7{O޽w驧ϳM:@1bDn:EtF`oQ"3\Fowk飏>*5wbC:uJ|A*R m1~N8tM7رcǦ[/+#(,aqsIGn8gKU;+73̟ w򗿔U8Xܹs-k#(WlDpuo! H+rN1JVGz\|?yj׮]0(mڴ)O]9,k 7LC SLItnUN};//w^?L:tp'zSs @ @ @ @,@%h  @ @ @ @ @ @ @ @ N;tᇧW_4 ~R9|Xult~̧< 8ykFe]ґG.3,bXGwtIj+}Mعvە7{oiЦbwum[\"9#4JmT"(K[>XK3o>N׾~cU .L3f(Fmݖ9j/BWUQ<Eo>o}w+̿ Vs[ }j'HGuT~1+,'Lv*bM5iq+t;;vL_sxm^E7o^)7~O> 5 qW߹.mu*z#sΜ9FpoF(oW.7ߜØxoKoFNO[ouOro^~K_R/Uz9,WU~⺗+Y[]w=z뭩{y*7_uGrs={|>vM-Gv @ @ @ @VZg @ @ @ @ @ @ @ @A`VgN9 rrQ믧_r0Sӧٳgp?{|uEpmÍp=597"7H=zHӦMS;!SN91Lu)S͞=;u)PY[+~"`3~{"wY݈p~;miu]VCUw98~[o曗J4ndϧXC=ouU89:øqOE8툵}!wE<Ë+ofo߾fs!_s}/GYg- 4/ "4CmdO @ @ @ @@ @ @ @ @ @ @ @ @ @Y }{?y7\'1Jisn*I B7dF6mR~},yA+k.m6"ƯϘUj~v3<:&R/N[o? 4  @ @ @ @ @ Zv @ @ @ @ @ @ @ @ @a*R'浬:~h̙jj%@ 4QSs r[o{KL @ @ @ @(Ц9.ʚ @ @ @ @ @ @ @ @ @%0o޼4:Mi:O>zc .l.GMq->ki-[3 @ @ @ @xU @ @ @ @ @ @ @ @41c=6 8Nb-tފ<{iĈuꫯ^sHr>js.7o)-\W$@ @ @ @ @@sܯ @ @ @ @ @ @ @ @ @& ҡCtGZ'X)-̦~ۗ  @ @ @ @ @` Z @ @ @ @ @ @ @ @ @ @ @ @ @ @4Ba @ @ @ @ @ @ @ @ @ @ @ @ @ @,_ah @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6‹bJ @ @ @ @ @ @ @ @ @ @ @ @ @ @ |._o @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@#/) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @|F @ @ @ @ @ @ @ @ @ @ @ @ @ @P@o#(D @ @ @ @ @ @ @ @ @ @ @ @ @ @Wh @ @ @ @ @ @ @ @  ڷoJw߭u=]w]3fLm$@ v @ @ @ @ " AuB @ @ @ @ @ @ @ @K*0nܸ%m4I&( @ @ @ @ @@<9s#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @C @ @ @ @ @ @ @ @ в4bĈ`hZ*Ns) @ @ @ @ @ 6+d~ @ @ @ @ @ @ @ @h۷OQ @i&uԩ,J  @ @ @ @ @& - @ @ @ @ @ @ @ @_`ڴio5C@'x+ @6lR @ @ @ @~ @ @ @ @ @ @ @ @ N=tm-q @+VG1cƤC9dN ,-Z,eQ @ @ @ @xV+~ f@ @ @ @ @ @ @ @ @ @ @ @ @ @ @V@;  @ @ @ @ @ @ @ @ @ |_M:thi˶^4k[n%͝;5㎩5w,N`ԨQwY\3  @ @ @ @ P/as2 @ @ @ @ @ @ @ @,E]_=M{hcƌ5wSNi+05h~̏ @ @ @ @@3h `  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @^~d @ @ @ @ @ @ @ @ @ @ @ @ @ @h~U @ @ @ @ @ @ @ @ @ @ @ @ @ @z9 @ @ @ @ @ @ @ @ @ @ @ @ @ @p @ @ @ @ @ @ @ @ @ @ @ @ @ @% ^|N&@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Ц9, @ @ @ @ @ @ @ @ @ @v>(;67fmRnj?f͚F]/Vo'NL3fH;vL h˵> @ @ @ @h~ŵ4 @ @ @ @ @ @ @ @ ".\n裏_~9͞=;u=3iРASNo뮻B]M;]vM'tRzg_j~7֭[O>th+i&mƩo߾ӹsұhq|_4aÆeR6b1Җ>tAUN[q.ꫯ}7{7C.94wmȐ!UkȰ??qsʔ)U\T @ @ @ @ @" 췩\)$@ @ @ @ @ @ @ @ @MH駟NGqDz*:yDnvҼy*:uj>|xv"7~yt駗;65_q9w}7W7qg< 6ؠzo7Xn׾}tYgUѣӕW^Y~qGydaK:wMI П|4}5;S=z[, @ @ @ @,%Ғ @ @ @ @ @ @ @ @X{/xiڴiu߾}ӠARNɓS"N2%͟?:wuVc={V{{I'NL[neWFW^9k?ᄡ[: :tq]x}ǽ+ՅO>N\ VP@^ FYڷѸfΜ&M'5o޼59!@ @ @ @ @F% Q]!@ @ @ @ @ @;k2HD$A !byH)^TQ5+*\%[5%CjPD~n99yB{^O^k{x^> @ @ @y_O/~=t'vڕ'6}xgmU<4hРvͶNJ\sl5sMnm=zt:UW]>Z5rI&aÆGPq?#7L- :#R|VZ)!ѣ DlاvKpm @ @ @ @ @mmY @ @ @ @ @ @ @ @ 0o s=Xbt);ڴislK/4u/]ySOsM2%4lwqG<|U[fsvQǭmFhs!C;4{x%kWs[me_Lw_+e:}Wz_~--kgrzKǷ|}4t|ӦMkTWz=6uf7:M<9=裏=.6{L:k 1Ox9r*}'M~tw'|2 -?57n\{N @ @ @ @~I @ @ @ @ @ @ @ @ @9'Qtڶ|WG{Gor0d ׫?Mݻw]~)>|y9ݺuK_իW.Z?Ω1/뮴[,?miJ={L뭷^JΩk׮9oU,bĉ闿e+Rvx=袋v-}gMn}:mF8YQo_܃q=7d*8ޥ^굣a.tKgxƊ#F~.z9T9w/N?\oqŻ%Xm[lXc|>zwDruv9O>Ż桇J{WݻwƋ,H+Na @ @ @ @%  @ @ @ @ @ @ @ @ @/K,OO>zK/tu]14f̘?"\3ԩS3{:t萿}~ K<[T;.?~n]w]0<LjҮ]>t|.G[7`84y|sq6=#,>__󻶘$BS:ESݾm]ѣGڦMԾ}|c³jڴiiOgyf~;楽{骫׼Zg}N;^z|qq1o#kfۆ%Ga mۦz+ᄅo8ۭy#8:>q~E>cmoD{'w1 2$}ex#lZZ";-qt)u{ꩧR7 0Xgr-r#P9QΉs1'N:2$sMZ;jvH?L#L?q7n\=ꨣ҄ r@h0 P?3/"XuM7MFc袋W_}uz7^HvZ3{y\9-첍+̶sUWD@l0ǚ"`>o2зO|%}ދ e#08~sTisعsxA=AE{+?s"8©oG#T(>1W q6~c{饗!zh~>cVc}cƌI?яuY'ų(q"T[!@ @ @ @ @ܤ @ @ @ @ @ @ @ @ zO<1OJ~aO~^{p뮻V[m04U:u+_qtק.(E",Ұ[{U<~gwܛo\W[6mڤӧ._q}#0+" sKx`uLoyJjFnSO=5r!ޕW^9;'8&:to>:tA)E6۔sDZ>쳼}5ה @n\2eʔQuԵk׼ 7x#y)BSt7'Šk9Bh#4ףYc%aeʞźmUVIg}vn޽{4\js1i 6(״2ˤOAχ~xns}򵊆#7b "9~CGs}7N^xa?[/~QջRsK5o=zH /po\_~Mhÿ[}J_nэ7ޘwo4BDp<FPp=zt]V!@ @ @ @ @Ԗ @ @ @ @ @ @ @ @ @6W_vԩGɡ>`kD_-6Yl"<3Js9^?={,xEn.y91&•zegn?_q|h@ΝsO5&:]{o -PI{.{g[,iرe=*CfͰ/V>?>OhcyĉӓO> رcs9-mo_k"G塿ofZw1gOcm(Zdnκ}72Bm߾}n{w˧R)ιaeT#,g?Ys-e{àrDrQ[$~TNZr%s[\"xҤI? @ @ @ @ 0@7m @ @ @ @ @ @ @ @ @jXc5O<<۶GÆ K묳N0aB;ҨQ~M]k[owyiMm.J.]q#0W_kr-gXK[o#F̰֍/긵x-(Bf]{l{fN)BX|!K,DY|S|r9O=TYVVXafիl{g}ƌڦMr_QYj]#(/3|W۫*✫۰Ok#x(m]QsTZm>_ˮvX8p`R} +=@=떡@^{.4,ݻwOk\>u[&~Svf;ma]?rȴ>M74-gϞӷoEPuJ \ #.Qc&@ @ @ @ @Al @ @ @ @ @ @ @ @ 0W lszwXo99#<2=q?ce)s2|7|8uE+jy5K5gyfZiЗ_~9p [V֭[p g6Sqƥ7xĻ0> Bl]tb}e}ڴie=Ov6VV ]l^_✫[/vСmj\W=Iu|?D`QGo^{w}SS7,EmO2,.Jk4XOk<ݧONWݻKPK.$w})=7S)}+;vq_hO?-v&@ @ @ @ @KJ* @ @ @ @ @ @ @ @ @>!lAZ}w}wSηFYg>r_k* m|3VCw49e;S_q[N *+QFk&?飏>JӧOO#Fȟ_=va塪lM~WkһwFwiӦ}c}m6\s[N\moO}NՋuT6U[3:nڿcРAiN'|r;Sa_|qSO=w^ IyԷor_cN:4u5^NRC5a krhSAU+Mwܸqk{ /VXYg:d9)!KL2%r-CTwq頃J?^F^R׮]ɓ'|2Pz}K:t|w7l;cT۫k=v-#4;Hq]c}/x-M-WϽjRj{O>}\^|?1رcǦs=7s1" 6:wܢr饗.Ӆ^.*5mnsXcsUCߵ>_~y2z衙G  @ @ @ @ @m< @ @ @ @ @ @ @ @ @Xr%s>,.q͢V[m^{N³<=y段ZMY7G 5:tLc=\7\k|Qǭe@ǎtmoy饗^E3%)sTiG!v뮻j:B -ǿ7hrWM>z4(OOޜJ5췱lhμ:xfd)>7Q7GtMg ~8 @ @ @ @~  @ @ @ @ @ @ @ @ @WQ .H=X>z28wWO:tho=vqyiĉ-2򓟔N8T ,wԹ2V{o4`>p@(,:yZl, L Hd@IDAT2ɡlI/B:;N7n\ f*vγi7{<顇~?V7]xtW\qE裏f:}e\0j36b7OLM+iԩ\r-W>|xYoXjVz뭗|ȆnX^N:ikT];3CHFmڵkvz4 :Y=AVwսm۶k׮y=>} k6mZu @ @ @ @]@oIMH @ @ @ @ @ @ @ @7tSm&x饗^JP{k6}N|AFaY~>&;vqǴ+~194p|.O=T5Zr{aVZiK7z^zZ+Ϸ~~mG~aZdEҾ~24P]vg-iUWЇvXӧOn/}DgwK+rs{=g{^3fL=3 ,@zرco?#yLݺu/~yD%O>*曧k,{'R꫹=7MZ{E]Ə`ߑ#G`?8m{鷿mތk==eq#xvK{NF*e]6NyNկR<q/}9Z2"dx6l܏ JDg!@ @ @ @ @9'~Mmf @ @ @ @ @ @ @ @ @,pwDmݖ3w+q?<GcsD da Ժݒ2$M2%r-塷j }gV;jMzOvRhGl% Z:u.!'xb#L}Q=BHU"c-2i]wMW^yezӶn[ݝ7xZQ '%f ;.u9?ñڥG @ @ @ @hی> @ @ @ @ @ @ @ @ @-p衇]v%u֭S au:t(Da` ;و񱞥^6Øhl8.B #;Ny衇g"Ǎݢ4'[WZ]_VW'07 G?QuM6-7 @뮻.>.;B9y?F-~};{n瞛߱Vey묳NzcKK.]#G BG ´_Իw4f̘|b7pCir=²9y/خ]wYV5gur/y"`3~[Oǧ^;-s>eʔtK.dZuUˀ9z:LΣFJqw{u^x!P}7'nny}!o]_wu0ٍe=Z_VN:/Y+ @ @ @ @}~kbE @ @ @ @ @ @ @ @ @< K/+֭[Hz ̋yq^<_tM[}kg @ @ @ @U@o @ @ @ @ @ @ @ @ @_IΝ;+yN/.c&lIB @ @ @ @%b @ @ @ @ @ @ @ @ @ @ @ @ @ @ asB՜ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0O . @ @ @ @ @ @ @ @ @ @ @ @ @ @ @;'TI @ @ @ @ @ @ @ @ @ @ @ @ @ @󔀰yrY, @ @ @ @ @ @ @ @ @ @ @ @ @ @ asB՜ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0O . @ @ @ @ @ @ @ @ @ @ @ @ @ @ @;'TI @ @ @ @ @ @ @ @ @ @ @ @ @ @@yjK @ @ @ @ @ @ @ @:u4ϟ @ [hvE!C4Gh3<Ӽz @ @ @ @ @a5J @ @ @ @ @ @ @ @->|xA? @ @ @ @ @͋6 @ @ @ @ @ @ @ @ @ @ @ @ @ @ y< @ @ @ @ @ @ @ @ _Fp m۶<v!M4V!@ @ @ @ @ 0 ۯ @ @ @ @ @ @ @ @ @K ЩS:۷O]vꜰ3%@ @ @ @ @  @ @ @ @ @ @ @ @ @`3fL-riW̟ZW|N9|x<# <85jcm۶徦*ӧOO7tS ~8}gzliwao9=y#8"ExԩSivU;sӄ R.]ү~Fs9Nqr!e_=]tEvQiӦMZzJ+^{Fϩ;=syseM{g2eJ4hPݒJO<-9%K[ou+H[Ln!-/WI  @ @ @ @ @<% w\K @ @ @ @ @ @ @ @s@~鬳J~L˼QGN:ܯ!jSVX!s19a묳NY~w\! 9jrp֣DoN{5פ?tP]!<@i nF8[oU~ê[ȧ~z{ォ3ԧMw]Q4|h?Ss?aZuUsƍW^8;/EeϞ= ~#̺ꫯkijza!Eչ'rLKرc%ᇳ] *q<ÕT Ydۗ+رcmKOS:#ԻwkVC @ @ @ @s߹RX @ @ @ @ @ @ @ @ZF`kiĉgM:eʔyoӆ}wް)ogFͮqe!JT|w}kO즘X E(믿^{EnݺE]4<.K/"5cî( )[ӓO>V_}{#,vWNcƌIov7iҤ>k6Eq@6, {8:Er8yԩS 7ܐĽSp]oacc9 ^j)#xiOq:gZ^kFQF|"ZY xn'LzӰ4 ..&@`۷o\.v)нܩ ; @ @ @ @4% ) @ @ @ @ @ @ @ @ @'ONG}tݫW4|icǸq駟"tVgI۷t7Pmi9sӶnCXGN8tUW?0 lmۚjoZ[n!ŋ/xWTNMo}VK>h_A|\?cs@ruرcӕW^"GI,Lގ_?GX/C\ [WTV|}7 4?~رK3<3бc4}t'4wvrlӞzy)Sߚ&"v)U`(ŸYo믿>K-6CnݺiԨQeX_^}]q9H9ߖA!]?Z=&ְ߆ ڵk-"_׆fnsu7ߜ77lv-ܒj?u-wWu2$ON;-9^}^=v`aÆw}"@Tq}[E|=MVU5o> :4Ü>v-V}}{lԩ;>`?f gmzu9bsȑ)lv!vkT{kܸq){U @ @ @ @mb @ @ @ @ @ @ @ @T B '?I>W_=Slkӟ4u=SZ+|cN8!s1+!'L"0J1.o{oy)8 _x7"J.&kjr-zQڶ%TwEMŽT ྰOСCӧO<~",9ev|([mUD}رBEwuWZwub-Z+3z;hryS]/2ˤ=z;qÇO ,@D+L~a馛y_$g#ށzh[.wﳃ:h4ns^x!m)Xz:u}jO+~>䓺V'_Jm7X~n>kr7pCi6u.]9WsN =OlIZeURK/mص-}#w,w:R#Fht͏>h[oMkqƻaO~L[HqŻ%[m[lXc|>zwDruv9oFy衇^{z",ʆS&@ @ @ @ @ ٍ @ @ @ @ @ @ @ @hK,QUկ~ڵkNN;6"L2J3 @(nemX"6J!9~oM7V?tcx'L6-ǹ̩p38#My-Ԏ;{骫׼zgN;^z)kgoq)n!Æ +#Jovk;@찎O_QX?iD{'w1 2$}ex#lZZ~wK@NRXǾz*m3Gu3(ao|#]veES~hˎ* @ @ @ @ ^xM @ @ @ @ @ @ @ @X{s[?93CHGyd>GuTSEü/|F1-JX[l{W,ᴏC9| zFtק.(E",+"oˡŤ -PQ黺/-{Qw+FeEgQD8nY}>,Wkʥm&e9Ɯqov-ܲhN[mU:O<ØYfr_+}G\oҁXN 7<J%5SOMrHwWH#8"*o}+}頃Jy6lScs%h 6/~wuԵk׼7KC Io3<3Ehj.]Sxkr;Bh#4ףYc%ޣaeʞź->ܽ{hjU58clP)mh%o(q<@k%Aeȁ"kV7vn2k [Z!цD{ovm>_M;߆Q"8x#(8Ə= . @ @ @ @ @@jˀ @ @ @ @ @ @ @ @] #4cǎday;sd㕝T"2j z{k_Z@({ٳ믗Vڵk&c|Q"Ν;}'5D89S 7n\s„ ɲ_矿l8qb!SN=9L:{!&M&O<Ør/?)4!E7\aEi5Z[s仵YIk(?O=ߵ^F{5 #$5s=R}=ܳ -ڿoa2tмfmVݕ:uCkgh?c88{쑏'|#ohsDih|ZS>(o~3Ӻ9^{~ߋ|jUܓq"P9s`r":6c۷o|rWߢ({w^T"HO^[<{؜{(k}o%–fSxe%ոEq @ @ @ @ @_ܮ @ @ @ @ @ @ @ @h@ 4(r!ꫯNwuWz衇һロgREX5٩Gyd馛￟;tG7ѳy[.]՚#6-#7=t7^,~ۚZ+m)k2䱑65U knPhqEnza})SS6~g}6ŧaСCߓO>n7\ ?J۶mӷ9m905A9} {-] Bfo¾.M6$z|g!!ӧO/Sԋ>EgW^#z̘1y:묓ڴiS+*믿~Qw߿ѹL*d_;wG_z1bD@{2@}'F5➌"Է\&u]7f(ݻwOKO? hsXl]vf߅u-ȑ#\^zA R`yÜr)WC%B7|<9眓>Úf?~|9~e)Tp[lR.r9daqeĉ}O Q4U!~ŘN,Jða·˭Gs?׿xg矿Ňi9&Ӑ!C|tڵk|?EpeǎSEF6lXy483J+[_~t ' nݺH_}#7(?jpuS!.Lcڴiٳg^j[=ߵx7Vվo/ιzqyh/⭝E^5NRm>[QG/㮻^{4wN]/EmԧLRޏqod|zOV5SV5aqӧljy#;B#TK.Iw_wo]~EDJE(E[O?-v&@ @ @ @ @@J] @ @ @ @ @ @ @ @@F(k|"XOS>|xmxOsOzwE]CNe"T5F+wW̋xsPml7ѣgWxm>h6h?uYnУ@QVݻwρW m8s5L޽{c@Gy$ Ν;>^}\pj@dnl?EӛWp6?A4hPcZ֔sLvAwyg8p`cA YFJ\sM0)Ĉ;W fm~r_Sx+mڴiѶjlرx׺]=:V۫SmSbյͩcnj[m/{N>>+x#/N~{zꩧR:]wݕ[jSNe{u=MCMPisXTqu@չ5xxtFjZ_miEhɓ;ZjW+hS]{դ8jjK.$?sc-#$.6OZ2vO߿b{\ιks5׿zW|ԨQL뮻n^q;3T9? @ @ @ @  @ @ @ @ @ @ @ @ @4XdEʳ9vgl]xȑ#s]uU5NN@[o5.B~oVm_Vqc-LZj65 fw(—?v~;W: /xWEso߾'|R7꣏>Us=wC_95o|P>Eh_t< < 39|6 ^hy3fLmpv"=ztgw{gي}fOQo4,S;Yw{w^cU^5vWWT#SOM܎AӖR m|hmm:nxf;U[S:thgyLjR @ @ @ @+ 췾F#@ @ @ @ @ @ @ @ @.(+{j;UimM+R>Gs|S;yeO>9UCXhR>}ʞطW\1aQ1l%XlYG}t:ĉt n-5 k/.6 Vl}٧܎"0,~cG.5n[Է{b}w}w!|mFu#|xghU`5"Z=eK/jR0lShrg}I~NeOLw~iW\qElpv6|ԣGSN;K/M5 |%,V-ݓkfիWG{2~?kt7F6^ӬΚ76\sM5ƊsX=MuO?tPݷw֭iĈ)eʔ)9ԹZg @ @ @ @/ F$@ @ @ @ @ @ @ @ @.&o'iNK<@gy&pWUV:SSꫯNW]uU}2K*l|?>.)xeJ;sK|le)ebUm"qp(V}?A[cj;C4hԚx7 . tAiȐ!NHo|iUq}9ꫯ^{-EdqoDvmW$[ N w}`w1p 9q„ 馛nJlMgk_9c1Doע(>E]= co =Ceiܟ]w]:sIX`ArG߄߇xF(^xaZ~oD>P\F?;oiܸqy1y1n+xEo~۷ol~%~~y)~ZGjb>3 +ו+k&C9$=ztz/\OӴj.,y zGӞ{&MZ36~庸6{;r2>!{0`@zꩧ{N;+y)87\^C7:Vų÷~{'~Ww#*O㩧6,3ҏ @ @ @ @Z)н4#@ @ @ @ @ @ @ @ @"aq{l*B_#ZWn^&mrQE{~'D@jFw|w'O?l^g7ƒ_97}I9Wqw]w}iEɿw^׍wqH#FN8qb|G[o>VsϝsTGpu##xO6[N1JMqw`ܳ:+>oVF޽{89z_`j!MT*"4JJcy >Qnm:ӨQRF`]KxqouڮhxE}Z۵i+gr{??=٠b<|+bRPƿi7/K.dP暫<kF_N_~yZ`s/8,UulFq~7OEus%B9njvqm"o8ݫHsԎ_tENa1pvGoF.vlN{w*~\aA7_ы5՚Ԏ7 ^{sxmsL4 ۷o:CS|O{1~:‚x]$.|˹FpoF(o7.lGs?<m7Xb*C!C/"F\va\_̫At9:~Ӯ׽Z{ZnԿ<[2~#X9oުΧخ5x ZlD!@ @ @ @ @R`_{6 @ @ @ @ @ @ @ @ @@;"4km.pWҢ.ڸL;5k95"0_~3-c'Ń1j6pZ ]jR5cz,ꫯqeH;Sގ;l\nƎo>}"5¥c،x:#PGFo5 /pqӿ'O7?Be#~ "J{vujU8?s9:øqO&Ybq_Gs Oފ@Y.x;{oO?\hrrwzx 34Ҍ;s @ @ @ @"н-%@ @ @ @ @ @ @ @ @ZDB9bdM;4]E0K/?M@' D}Gݻ_>:yA_EٳgZuU8GٿiUkFmF 9lBԡ=C ɟ:M0 @ @ @ @ Jnl @ @ @ @ @ @ @ @ ^zԫWv}..8m>zfBt#0#g9O7|N4v* @ @ @ @@d  @ @ @ @ @ @ @ @ @`/ɓ۽)S4iRSGog%ӓn<=]i5GJy @ @ @ @ @~i, @ @ @ @ @ @ @ @ 0 ? 6+۷oz? :*-WZiʞMnk{X> @ @ @ @~gd @ @ @ @ @ @ @ @ @`:ݻww}BKnaB̈qέ3[G3 @ @ @ @t n]cVI @ @ @ @ @ @ @ @ @ @ @ @ @ @j m @ @ @ @ @ @ @ @ @ @ @ @ @ @ta]B[& @ @ @ @ @ @ @ @ @ @ @ @ @ @[ @ @ @ @ @ @ @ @ @ @ @ @ @ @"~ȅL @ @ @ @ @ @ @ @ @ @ @ @ @ @- 췶# @ @ @ @ @ @ @ @ @ @ @ @ @ @ Ev m @ @ @ @ @ @ @ @ @ @ @ @ @ @ P[@omG @ @ @ @ @ @ @ @ @ @ @ @ @ @ @t"L @ @ @ @ @ @ @ @Nvm4O'1 o0]vY;[l hI`̘1-v @ @ @ @u[F @ @ @ @ @ @ @ @ @@kڦ @L"Ϧ( @ @ @ @ @gn̍ @ @ @ @ @ @ @ @ @ @ @ @ @ @L $A @ @ @ @ @ @ @ @][+LÆ VO. Э[ro}z} @ @ @ @ @wa2? @ @ @ @ @ @ @ @>{B]G{O>]gVJ @ @ @ @ 0 / @ @ @ @ @ @ @ @ @`7n\!tH ~]vk\kkwLM[nIoԚ9N @ @ @ @  @ @ @ @ @ @ @ @ V3<3-m=LwygaK:æL뭷" @ @ @ @@LK @ @ @ @ @ @ @ @ @ @ @ @ @ @ @!>  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @`f;3\Ek @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ 035 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@vOg @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @hYO?Mw_nꪫ\0aBۛc9ҷ&3{?Əsδ˵> @ @ @ @ @ @ @ @ @ @ @ @ @`2eJoF{4qԿ4p馛7<ӧ_}te53|G'HwqGl뭷N/|_ݸKӇ~fut衇N9g;o4hP|uVF{/KOl6)U 6 ڹȑ#_}ӒK.Yy.uFW\qEzgӋ/zYd4dȐpUV)Os9iK=XӟԤ{<.~Ya/*>~wy4xfۼ闿ey,[_M7ݔ\ݣGt!4n}uYܷA`f7񍼜wiwY6vۭy7+o7v&.* @ @ @ @ @" wFRI @ @ @ @ @ @ @ @]VGc=ғO> gDXmϞ=ӤIөڠNFߟ8∲}ݗnrqqǥ~;WU~հj=Ӿ[v{'>[oU!rW_}r1bDis'aÇoy-h+_~:ty?ɸ7pC:c駟Eo=]tEMNb=a{:c7lذtm뭷^jk?OVl D`@_{bt&p7w}w0`t6C!@ @ @ @ @E@r%̃ @ @ @ @ @ @ @ @4#;o~iܸqAo^xcǎM'On\W48p`ݽ[?V^yfT/|{#￟o^{m(]oNK5%X"6l饗^*w򗿤VZ)]|iwo׸:y)>Qm]{dĉ駟N#GFXxS6.qM2%W7w`E]4?)B#M뮻СCѣSUYf4,:W7X7۠vk.q;hI`J?S6g}W\Qۘ}IM4i @ @ @ @ @t% w&C @ @ @ @ @ @ @ @ }e84묳"d5?:(zj駟yڰQ6g׿>8yNe#ӟr#墋.J[ou}'7޸۶>Hw\AÇo;~P裏Ni\[n8󖁈4ޏ{j=(|ɴ{>a„tUƌwo+B @ @ @ @ @ 5ueZ% @ @ @ @ @ @ @ @1< ~@~[*O;c7pCz:4t߾}ӎ;z2vذa_иܳgܑ,Lꪫrl5yۑq}#6BntIM~>s=7WvzYiQ:+DsX_nrKn%\2{+,Do]:x7swޙw}f=={=g{ݟtVwCXK/;vuIG()Sڽ?X~=5t;b5iҤߟ/k#GO?mu0O?>jؑ^sq+G}4GK?鮻J?x;T_((S&L(| @ @ @ @ @@3~AQE @ @ @ @ @ @ @ @j2\snݦ6hJ6[Yzy'xy=31ls=X\sM݂~qa{(Žc=.c,icEd{M[7ߜG\p_77wi|}٤e]:wqGZc5B -^{[UW]5?i5L>]D wԧOf_<;E݆c0N8!{Ooqlse]6 :4)-ٌK/Q|pͰ05s=]w1W\1?q:yjJku'>oULbĉ'?I 6 c ,@}ӿuXsKk9naZaR׿us@[s9g#R<@S^[srܯ^8}M`; <8miUVYyS#o=ϳw~8p`F5jTg}Ҁ5oUW]x @ @ @ @ H @ @ @ @ @ @ @ @ @ӯ@}OӉ.biv~ƍW8zMkly)BatYghն,dc1cƴm{#_5Z}5bYݻupM6$RGbO>y:DeaKNzJm]~t]/i뭷N>hQ"GC="3?|GK~KTO<1 3A͕:*tA)%iSLIsO^Ks}Qs9'Ew|98B|vF1bM0vآnqm&E/,̒wk z#Vq-}uf-3Om„ ꫯ׼\or /Ȑ!CR6.>B2H[nN?RKaj~{xG vX'W3VJmaҝwޙ&MT6;v/+Ϟ:=)~Gu3(a}-]qEU~没  @ @ @ @tQa][6 @ @ @ @ @ @ @ @kF9o&NXֵv#BP#'B +"D.Q\pQc&cwK.dwNj`7xqR5jĸ?ww?sKPs9cjޓ{ly3[;#VYguRX?>1"]wu[nS.,p駗!]tQzWR'3o}nLa{G"l7z+3.oCMO=T{]wX 7k+-u_r%97ƈ߮'|2=3iCH\pA1.r\GXkK}k:?mݖ[-R;H~N Gv*CpG(kv5jT#_NgqFZb%UW]m+lj`9oseo1I'"8Jc<,wBg<{΁0[;8O@SܣlWqm-7,Bz?|~ƍիzg1cQEB @ @ @ @M7RC @ @ @ @ @ @ @ @L/rJCsAnOulZegA4(}N7pCr`|׸Y#^!v7ly:w1f"Gfwy) ;ZbEWK/.4\2 s5LtP)2sM6$Fjgyf:ʣ/|0`@~3S랍6*ڣGM7Mw\:S;{챴V[cǹk|GxwB˓gc廲o߾.w$B#H_O{nԹ暫:D}٧܏9'qEYtEg5{VH~nzZU ?Z|{wo=[XߟZE9~# SOMŻ1Br饗gwzhYWbm}׬z;iyi45~-JG{(kE}LlM~?88mxw5gDp<FPp܇/b]vA @ @ @ @ @ @ @ @ @ @ @ @ @`ྑ#GW^d>90#dW^)7vZXJQF .V6?}R?M}[Ӹ#]iRFկ~&LКSئXo4zW[lۖByǦ={"$0B2@AثW|q-)BOkݓBb7zeihO^v9 ymm.ݻwވP>,]w]nj0h1sϝCRcgaű{]mQ^{r;6瞼_P=أA]v}Ek507{Wl'dhz}W_==Sihvx`:S=6UW]5}H_"Ek ǩxe*6ݑ$9tM7?0:kK\sM;ҨQ{wGo@N:CkhK.@cDg,Xs_·bMbGMovz׾Nj5X#-Riرj뭷N$)]o=[9z]wMnaZs5[|!!_~e9luO4~px]ɓ1➌Tj]κb>yu{SvGx*_~{w^)&m+={q-i"<&IDAT_?/&@ @ @ @ @@ʶM @ @ @ @ @ @ @ @ @` [wu+g}]wu_a#FHw^я~sEXロwFm'֨c}y]vY5j:N[n94H#oÇO{iW_}6q"4Jkv6;CӶn=a57ƮU]*NQjZH JO=Tksc=>_x ^}tGZθ.X4{hYfijۘ_s;֑ꚫYզZYciȑ.V]uvӞNŽ}s >_Zzsz[nDht 'Po.m@Ϟ=ӎ;nfa? /48E͞Z_mliTY\8wѡ=ܹ{w^cU^5vWWT#7?Տ?x *ۭ٨6>h fisX{nݺuK}1bDp_Lpʔ)9ԹM @ @ @ @# s\J @ @ @ @ @ @ @ @"pM7jҟ /{0aBfm>|߾9#jg_aҠA#,oL\pA:蠃Ґ!C '"0"l0;k[f6>.쒯O3 +0&lRr!ѣSyV?Oj.oqwG&MuC?K?n\M9rdb)}ӀSO=UtMK,Di]wݕFzU:V!ųq1Ǥo=ߓovOqͫ}ڻݑUVɧSOMDo̘1y? @ @ @ @ y;oh# @ @ @ @ @ @ @ @ @%r#`Z"8jn-ŧ!rS+q:*^Sk"\q+"}k_k|n]B -4sF`fu;vm#q о"hqGH[qWzVGK~xs%\S|wɓ'[lEq[nezrpj?aÆϬΚ"P:`#(lDZj}{.R#SNɟy7}'O?-;^%ƒ_97Ba><^z" ^,95\Cbᄡ"N%u;38O[;a#Fspĉ[=T;+Bz_GrZEs+>s=wm5{+6":q 7_?6l:Ŝ[*;sYg;/3Eoݻ-Ӟc}Z|n|뭷AlAt?S/w^x≩wı{Sӏ @ @ @ @Z!Эm4!@ @ @ @ @ @ @ @ @"Ku]S߾}T~#NoZ-'ǚێVb-V4k'*gyҺ뮛stѣGwJoQw1G٠޹QFs9'E_=ˠArꫯ`馛|0mV 4SnMUW"`7Mo8Ԡk5o0XwstExnz ~k/οsa]GUF q1_5{#7By#q Ǹg#-RK4C= A\pAar}1;z/<]}/{X.mY[{ 70]wuy*aƷzkyoUSlךoq<-|" @ @ @ @ @@)0˗)  @ @ @ @ @ @ @ @ Yf%Z{sh!ve.JZtE7?{k#o2-;g+x#$0ݮcB _}4`4nܸ|?ivx}aMk;vl^_'ktF}8K-TCsߍW7j^xNݞ_@ @ @ @ @ @`~!#@ @ @ @ @ @ @ @ @@f^ i @ @ @ @ @ƻO  @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @% @ @ @ @ @ @ @ @ @ @ @ @ @ @ @P`  @ @ @ @ @ @ @ @ @t @CccA @ @ @ @@G @ @ @ @ @ @ @ @9~?"@ @ @ @ @ @D`S< @ @ @ @ @ @ @ @ @ @ @ @ @ @ܱtwwu @ @ @ @ @ @ @ @XBn @]`ݮ@~ @ @ @ @~)/g @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ " @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @eQ @ @ @ @ @ @ @ @ @ @ @ @ @ @P۱G) @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ P%@ @ @ @ @ @ @ @ @ @ @ @ @ @ @e{ @ @ @ @ @ @ @ @ @ @ @ @ @ @ZaѾIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7580812 h2-4.2.0/docs/source/_templates/0000755000076500000240000000000014747620663015773 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369303.0 h2-4.2.0/docs/source/_templates/.gitkeep0000644000076500000240000000000013711524627017403 0ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/docs/source/advanced-usage.rst0000644000076500000240000003632114744263537017244 0ustar00kriechistaffAdvanced Usage ============== Priority -------- .. versionadded:: 2.0.0 `RFC 7540`_ has a fairly substantial and complex section describing how to build a HTTP/2 priority tree, and the effect that should have on sending data from a server. h2 does not enforce any priority logic by default for servers. This is because scheduling data sends is outside the scope of this library, as it likely requires fairly substantial understanding of the scheduler being used. However, for servers that *do* want to follow the priority recommendations given by clients, the Hyper project provides `an implementation`_ of the `RFC 7540`_ priority tree that will be useful to plug into a server. That, combined with the :class:`PriorityUpdated ` event from this library, can be used to build a server that conforms to RFC 7540's recommendations for priority handling. Related Events -------------- .. versionadded:: 2.4.0 In the 2.4.0 release h2 added support for signaling "related events". These are a HTTP/2-only construct that exist because certain HTTP/2 events can occur simultaneously: that is, one HTTP/2 frame can cause multiple state transitions to occur at the same time. One example of this is a HEADERS frame that contains priority information and carries the END_STREAM flag: this would cause three events to fire (one of the various request/response received events, a :class:`PriorityUpdated ` event, and a :class:`StreamEnded ` event). Ordinarily h2's logic will emit those events to you one at a time. This means that you may attempt to process, for example, a :class:`DataReceived ` event, not knowing that the next event out will be a :class:`StreamEnded ` event. h2 *does* know this, however, and so will forbid you from taking certain actions that are a violation of the HTTP/2 protocol. To avoid this asymmetry of information, events that can occur simultaneously now carry properties for their "related events". These allow users to find the events that can have occurred simultaneously with each other before the event is emitted by h2. The following objects have "related events": - :class:`RequestReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this request. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this request. - :class:`ResponseReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this response. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this response. - :class:`TrailersReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this set of trailers. This will **always** be present for trailers, as they must terminate streams. - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this response. - :class:`InformationalResponseReceived `: - :data:`priority_updated `: any :class:`PriorityUpdated ` event that occurred at the same time as receiving this informational response. - :class:`DataReceived `: - :data:`stream_ended `: any :class:`StreamEnded ` event that occurred at the same time as receiving this data. .. warning:: h2 does not know if you are looking for related events or expecting to find events in the event stream. Therefore, it will always emit "related events" in the event stream. If you are using the "related events" event pattern, you will want to be careful to avoid double-processing related events. .. _h2-connection-advanced: Connections: Advanced --------------------- Thread Safety ~~~~~~~~~~~~~ ``H2Connection`` objects are *not* thread-safe. They cannot safely be accessed from multiple threads at once. This is a deliberate design decision: it is not trivially possible to design the ``H2Connection`` object in a way that would be either lock-free or have the locks at a fine granularity. Your implementations should bear this in mind, and handle it appropriately. It should be simple enough to use locking alongside the ``H2Connection``: simply lock around the connection object itself. Because the ``H2Connection`` object does no I/O it should be entirely safe to do that. Alternatively, have a single thread take ownership of the ``H2Connection`` and use a message-passing interface to serialize access to the ``H2Connection``. If you are using a non-threaded concurrency approach (e.g. Twisted), this should not affect you. Internal Buffers ~~~~~~~~~~~~~~~~ In order to avoid doing I/O, the ``H2Connection`` employs an internal buffer. This buffer is *unbounded* in size: it can potentially grow infinitely. This means that, if you are not making sure to regularly empty it, you are at risk of exceeding the memory limit of a single process and finding your program crashes. It is highly recommended that you send data at regular intervals, ideally as soon as possible. .. _advanced-sending-data: Sending Data ~~~~~~~~~~~~ When sending data on the network, it's important to remember that you may not be able to send an unbounded amount of data at once. Particularly when using TCP, it is often the case that there are limits on how much data may be in flight at any one time. These limits can be very low, and your operating system will only buffer so much data in memory before it starts to complain. For this reason, it is possible to consume only a subset of the data available when you call :meth:`data_to_send `. However, once you have pulled the data out of the ``H2Connection`` internal buffer, it is *not* possible to put it back on again. For that reason, it is advisable that you confirm how much space is available in the OS buffer before sending. Alternatively, use tools made available by your framework. For example, the Python standard library :mod:`socket ` module provides a :meth:`sendall ` method that will automatically block until all the data has been sent. This will enable you to always use the unbounded form of :meth:`data_to_send `, and will help you avoid subtle bugs. When To Send ~~~~~~~~~~~~ In addition to knowing how much data to send (see :ref:`advanced-sending-data`) it is important to know when to send data. For h2, this amounts to knowing when to call :meth:`data_to_send `. h2 may write data into its send buffer at two times. The first is whenever :meth:`receive_data ` is called. This data is sent in response to some control frames that require no user input: for example, responding to PING frames. The second time is in response to user action: whenever a user calls a method like :meth:`send_headers `, data may be written into the buffer. In a standard design for a h2 consumer, then, that means there are two places where you'll potentially want to send data. The first is in your "receive data" loop. This is where you take the data you receive, pass it into :meth:`receive_data `, and then dispatch events. For this loop, it is usually best to save sending data until the loop is complete: that allows you to empty the buffer only once. The other place you'll want to send the data is when initiating requests or taking any other active, unprompted action on the connection. In this instance, you'll want to make all the relevant ``send_*`` calls, and *then* call :meth:`data_to_send `. Headers ------- HTTP/2 defines several "special header fields" which are used to encode data that was previously sent in either the request or status line of HTTP/1.1. These header fields are distinguished from ordinary header fields because their field name begins with a ``:`` character. The special header fields defined in `RFC 7540`_ are: - ``:status`` - ``:path`` - ``:method`` - ``:scheme`` - ``:authority`` `RFC 7540`_ **mandates** that all of these header fields appear *first* in the header block, before the ordinary header fields. This could cause difficulty if the :meth:`send_headers ` method accepted a plain ``dict`` for the ``headers`` argument, because ``dict`` objects are unordered. For this reason, we require that you provide a list of two-tuples. .. _RFC 7540: https://tools.ietf.org/html/rfc7540 .. _an implementation: http://python-hyper.org/projects/priority/en/latest/ Flow Control ------------ HTTP/2 defines a complex flow control system that uses a sliding window of data on both a per-stream and per-connection basis. Essentially, each implementation allows its peer to send a specific amount of data at any time (the "flow control window") before it must stop. Each stream has a separate window, and the connection as a whole has a window. Each window can be opened by an implementation by sending a ``WINDOW_UPDATE`` frame, either on a specific stream (causing the window for that stream to be opened), or on stream ``0``, which causes the window for the entire connection to be opened. In HTTP/2, only data in ``DATA`` frames is flow controlled. All other frames are exempt from flow control. Each ``DATA`` frame consumes both stream and connection flow control window bytes. This means that the maximum amount of data that can be sent on any one stream before a ``WINDOW_UPDATE`` frame is received is the *lower* of the stream and connection windows. The maximum amount of data that can be sent on *all* streams before a ``WINDOW_UPDATE`` frame is received is the size of the connection flow control window. Working With Flow Control ~~~~~~~~~~~~~~~~~~~~~~~~~ The amount of flow control window a ``DATA`` frame consumes is the sum of both its contained application data *and* the amount of padding used. h2 shows this to the user in a :class:`DataReceived ` event by using the :data:`flow_controlled_length ` field. When working with flow control in h2, users *must* use this field: simply using ``len(datareceived.data)`` can eventually lead to deadlock. When data has been received and given to the user in a :class:`DataReceived `, it is the responsibility of the user to re-open the flow control window when the user is ready for more data. h2 does not do this automatically to avoid flooding the user with data: if we did, the remote peer could send unbounded amounts of data that the user would need to buffer before processing. To re-open the flow control window, then, the user must call :meth:`increment_flow_control_window ` with the :data:`flow_controlled_length ` of the received data. h2 requires that you manage both the connection and the stream flow control windows separately, so you may need to increment both the stream the data was received on and stream ``0``. When sending data, a HTTP/2 implementation must not send more than flow control window available for that stream. As noted above, the maximum amount of data that can be sent on the stream is the minimum of the stream and the connection flow control windows. You can find out how much data you can send on a given stream by using the :meth:`local_flow_control_window ` method, which will do all of these calculations for you. If you attempt to send more than this amount of data on a stream, h2 will throw a :class:`ProtocolError ` and refuse to send the data. In h2, receiving a ``WINDOW_UPDATE`` frame causes a :class:`WindowUpdated ` event to fire. This will notify you that there is potentially more room in a flow control window. Note that, just because an increment of a given size was received *does not* mean that that much more data can be sent: remember that both the connection and stream flow control windows constrain how much data can be sent. As a result, when a :class:`WindowUpdated ` event fires with a non-zero stream ID, and the user has more data to send on that stream, the user should call :meth:`local_flow_control_window ` to check if there really is more room to send data on that stream. When a :class:`WindowUpdated ` event fires with a stream ID of ``0``, that may have unblocked *all* streams that are currently blocked. The user should use :meth:`local_flow_control_window ` to check all blocked streams to see if more data is available. Auto Flow Control ~~~~~~~~~~~~~~~~~ .. versionadded:: 2.5.0 In most cases, there is no advantage for users in managing their own flow control strategies. While particular high performance or specific-use-case applications may gain value from directly controlling the emission of ``WINDOW_UPDATE`` frames, the average application can use a lowest-common-denominator strategy to emit those frames. As of version 2.5.0, h2 now provides this automatic strategy for users, if they want to use it. This automatic strategy is built around a single method: :meth:`acknowledge_received_data `. This method flags to the connection object that your application has dealt with a certain number of flow controlled bytes, and that the window should be incremented in some way. Whenever your application has "processed" some received bytes, this method should be called to signal that they have been processed. The key difference between this method and :meth:`increment_flow_control_window ` is that the method :meth:`acknowledge_received_data ` does not guarantee that it will emit a ``WINDOW_UPDATE`` frame, and if it does it will not necessarily emit them for *only* the stream or *only* the frame. Instead, the ``WINDOW_UPDATE`` frames will be *coalesced*: they will be emitted only when a certain number of bytes have been freed up. For most applications, this method should be preferred to the manual flow control mechanism. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/api.rst0000644000076500000240000000614214036557047015140 0ustar00kriechistaffh2 API ====== This document details the API of h2. Semantic Versioning ------------------- h2 follows semantic versioning for its public API. Please note that the guarantees of semantic versioning apply only to the API that is *documented here*. Simply because a method or data field is not prefaced by an underscore does not make it part of h2's public API. Anything not documented here is subject to change at any time. Connection ---------- .. autoclass:: h2.connection.H2Connection :members: :exclude-members: inbound_flow_control_window Configuration ------------- .. autoclass:: h2.config.H2Configuration :members: .. _h2-events-api: Events ------ .. autoclass:: h2.events.RequestReceived :members: .. autoclass:: h2.events.ResponseReceived :members: .. autoclass:: h2.events.TrailersReceived :members: .. autoclass:: h2.events.InformationalResponseReceived :members: .. autoclass:: h2.events.DataReceived :members: .. autoclass:: h2.events.WindowUpdated :members: .. autoclass:: h2.events.RemoteSettingsChanged :members: .. autoclass:: h2.events.PingReceived :members: .. autoclass:: h2.events.PingAckReceived :members: .. autoclass:: h2.events.StreamEnded :members: .. autoclass:: h2.events.StreamReset :members: .. autoclass:: h2.events.PushedStreamReceived :members: .. autoclass:: h2.events.SettingsAcknowledged :members: .. autoclass:: h2.events.PriorityUpdated :members: .. autoclass:: h2.events.ConnectionTerminated :members: .. autoclass:: h2.events.AlternativeServiceAvailable :members: .. autoclass:: h2.events.UnknownFrameReceived :members: Exceptions ---------- .. autoclass:: h2.exceptions.H2Error :members: .. autoclass:: h2.exceptions.NoSuchStreamError :show-inheritance: :members: .. autoclass:: h2.exceptions.StreamClosedError :show-inheritance: :members: .. autoclass:: h2.exceptions.RFC1122Error :show-inheritance: :members: Protocol Errors ~~~~~~~~~~~~~~~ .. autoclass:: h2.exceptions.ProtocolError :show-inheritance: :members: .. autoclass:: h2.exceptions.FrameTooLargeError :show-inheritance: :members: .. autoclass:: h2.exceptions.FrameDataMissingError :show-inheritance: :members: .. autoclass:: h2.exceptions.TooManyStreamsError :show-inheritance: :members: .. autoclass:: h2.exceptions.FlowControlError :show-inheritance: :members: .. autoclass:: h2.exceptions.StreamIDTooLowError :show-inheritance: :members: .. autoclass:: h2.exceptions.InvalidSettingsValueError :members: .. autoclass:: h2.exceptions.NoAvailableStreamIDError :show-inheritance: :members: .. autoclass:: h2.exceptions.InvalidBodyLengthError :show-inheritance: :members: .. autoclass:: h2.exceptions.UnsupportedFrameError :members: .. autoclass:: h2.exceptions.DenialOfServiceError :show-inheritance: :members: HTTP/2 Error Codes ------------------ .. automodule:: h2.errors :members: Settings -------- .. autoclass:: h2.settings.SettingCodes :members: .. autoclass:: h2.settings.Settings :inherited-members: .. autoclass:: h2.settings.ChangedSetting :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/docs/source/asyncio-example.rst0000644000076500000240000000151014744263537017463 0ustar00kriechistaffAsyncio Example Server ====================== This example is a basic HTTP/2 server written using `asyncio`_, using some functionality that was introduced in Python 3.5. This server represents basically just the same JSON-headers-returning server that was built in the :doc:`basic-usage` document. This example demonstrates some basic asyncio techniques. .. literalinclude:: ../../examples/asyncio/asyncio-server.py :language: python :linenos: :encoding: utf-8 You can use ``cert.crt`` and ``cert.key`` files provided within the repository or generate your own certificates using `OpenSSL`_: .. code-block:: console $ openssl req -x509 -newkey rsa:2048 -keyout cert.key -out cert.crt -days 365 -nodes .. _asyncio: https://docs.python.org/3/library/asyncio.html .. _OpenSSL: https://openssl-library.org/source/index.html././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/docs/source/basic-usage.rst0000644000076500000240000007121014744263537016554 0ustar00kriechistaffGetting Started: Writing Your Own HTTP/2 Server =============================================== This document explains how to get started writing fully-fledged HTTP/2 implementations using h2 as the underlying protocol stack. It covers the basic concepts you need to understand, and talks you through writing a very simple HTTP/2 server. This document assumes you're moderately familiar with writing Python, and have *some* understanding of how computer networks work. If you don't, you'll find it a lot easier if you get some understanding of those concepts first and then return to this documentation. .. _h2-connection-basic: Connections ----------- h2's core object is the :class:`H2Connection ` object. This object is an abstract representation of the state of a single HTTP/2 connection, and holds all the important protocol state. When using h2, this object will be the first thing you create and the object that does most of the heavy lifting. The interface to this object is relatively simple. For sending data, you call the object with methods indicating what actions you want to perform: for example, you may want to send headers (you'd use the :meth:`send_headers ` method), or send data (you'd use the :meth:`send_data ` method). After you've decided what actions you want to perform, you get some bytes out of the object that represent the HTTP/2-encoded representation of your actions, and send them out over the network however you see fit. When you receive data from the network, you pass that data in to the ``H2Connection`` object, which returns a list of *events*. These events, covered in more detail later in :ref:`h2-events-basic`, define the set of actions the remote peer has performed on the connection, as represented by the HTTP/2-encoded data you just passed to the object. Thus, you end up with a simple loop (which you may recognise as a more-specific form of an `event loop`_): 1. First, you perform some actions. 2. You send the data created by performing those actions to the network. 3. You read data from the network. 4. You decode those into events. 5. The events cause you to trigger some actions: go back to step 1. Of course, HTTP/2 is more complex than that, but in the very simplest case you can write a fairly effective HTTP/2 tool using just that kind of loop. Later in this document, we'll do just that. Some important subtleties of ``H2Connection`` objects are covered in :doc:`advanced-usage`: see :ref:`h2-connection-advanced` for more information. However, one subtlety should be covered, and that is this: h2's ``H2Connection`` object doesn't do I/O. Let's talk briefly about why. I/O ~~~ Any useful HTTP/2 tool eventually needs to do I/O. This is because it's not very useful to be able to speak to other computers using a protocol like HTTP/2 unless you actually *speak* to them sometimes. However, doing I/O is not a trivial thing: there are lots of different ways to do it, and once you choose a way to do it your code usually won't work well with the approaches you *didn't* choose. While there are lots of different ways to do I/O, when it comes down to it all HTTP/2 implementations transform bytes received into events, and events into bytes to send. So there's no reason to have lots of different versions of this core protocol code: one for Twisted, one for gevent, one for threading, and one for synchronous code. This is why we said at the top that h2 is a *HTTP/2 Protocol Stack*, not a *fully-fledged implementation*. h2 knows how to transform bytes into events and back, but that's it. The I/O and smarts might be different, but the core HTTP/2 logic is the same: that's what h2 provides. Not doing I/O makes h2 general, and also relatively simple. It has an easy-to-understand performance envelope, it's easy to test (and as a result easy to get correct behaviour out of), and it behaves in a reproducible way. These are all great traits to have in a library that is doing something quite complex. This document will talk you through how to build a relatively simple HTTP/2 implementation using h2, to give you an understanding of where it fits in your software. .. _h2-events-basic: Events ------ When writing a HTTP/2 implementation it's important to know what the remote peer is doing: if you didn't care, writing networked programs would be a lot easier! h2 encodes the actions of the remote peer in the form of *events*. When you receive data from the remote peer and pass it into your ``H2Connection`` object (see :ref:`h2-connection-basic`), the ``H2Connection`` returns a list of objects, each one representing a single event that has occurred. Each event refers to a single action the remote peer has taken. Some events are fairly high-level, referring to things that are more general than HTTP/2: for example, the :class:`RequestReceived ` event is a general HTTP concept, not just a HTTP/2 one. Other events are extremely HTTP/2-specific: for example, :class:`PushedStreamReceived ` refers to Server Push, a very HTTP/2-specific concept. The reason these events exist is that h2 is intended to be very general. This means that, in many cases, h2 does not know exactly what to do in response to an event. Your code will need to handle these events, and make decisions about what to do. That's the major role of any HTTP/2 implementation built on top of h2. A full list of events is available in :ref:`h2-events-api`. For the purposes of this example, we will handle only a small set of events. Writing Your Server ------------------- Armed with the knowledge you just obtained, we're going to write a very simple HTTP/2 web server. The goal of this tutorial is to write a server that can handle a HTTP GET, and that returns the headers sent by the client, encoded in JSON. Basically, something a lot like `httpbin.org/get`_. Nothing fancy, but this is a good way to get a handle on how you should interact with h2. For the sake of simplicity, we're going to write this using the Python standard library, in Python 3. In reality, you'll probably want to use an asynchronous framework of some kind: see the `examples directory`_ in the repository for some examples of how you'd do that. Before we start, create a new file called ``h2server.py``: we'll use that as our workspace. Additionally, you should install h2: follow the instructions in :doc:`installation`. Step 1: Sockets ~~~~~~~~~~~~~~~ To begin with, we need to make sure we can listen for incoming data and send it back. To do that, we need to use the `standard library's socket module`_. For now we're going to skip doing TLS: if you want to reach your server from your web browser, though, you'll need to add TLS and some other function. Consider looking at our examples in our `examples directory`_ instead. Let's begin. First, open up ``h2server.py``. We need to import the socket module and start listening for connections. This is not a socket tutorial, so we're not going to dive too deeply into how this works. If you want more detail about sockets, there are lots of good tutorials on the web that you should investigate. When you want to listen for incoming connections, you need to *bind* an address first. So let's do that. Try setting up your file to look like this: .. code-block:: python import socket sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: print(sock.accept()) In a shell window, execute this program (``python h2server.py``). Then, open another shell and run ``curl http://localhost:8080/``. In the first shell, you should see something like this: .. code-block:: console $ python h2server.py (, ('127.0.0.1', 58800)) Run that ``curl`` command a few more times. You should see a few more similar lines appear. Note that the ``curl`` command itself will exit with an error. That's fine: it happens because we didn't send any data. Now go ahead and stop the server running by hitting Ctrl+C in the first shell. You should see a ``KeyboardInterrupt`` error take the process down. What's the program above doing? Well, first it creates a :func:`socket ` object. This socket is then *bound* to a specific address: ``('0.0.0.0', 8080)``. This is a special address: it means that this socket should be listening for any traffic to TCP port 8080. Don't worry about the call to ``setsockopt``: it just makes sure you can run this program repeatedly. We then loop forever calling the :meth:`accept ` method on the socket. The accept method blocks until someone attempts to connect to our TCP port: when they do, it returns a tuple: the first element is a new socket object, the second element is a tuple of the address the new connection is from. You can see this in the output from our ``h2server.py`` script. At this point, we have a script that can accept inbound connections. This is a good start! Let's start getting HTTP/2 involved. Step 2: Add a H2Connection ~~~~~~~~~~~~~~~~~~~~~~~~~~ Now that we can listen for socket information, we want to prepare our HTTP/2 connection object and start handing it data. For now, let's just see what happens as we feed it data. To make HTTP/2 connections, we need a tool that knows how to speak HTTP/2. You can simply use `curl`_ or any other client with HTTP/2 support like `httpx`_. To confirm that it works, try running this command and verifying that the output looks similar to the one shown below: .. code-block:: console $ curl --http2 https://nghttp2.org/httpbin/get {'args': {}, 'headers': {'Host': 'nghttp2.org'}, 'origin': '10.0.0.2', 'url': 'https://nghttp2.org/httpbin/get'} To use it with our server though, you will need to invoke it with a different ``--http2-prior-knowledge`` flag as we are going to serve over the insecure connection. Assuming it works, you're now ready to start sending HTTP/2 data. Back in our ``h2server.py`` script, we're going to want to start handling data. Let's add a function that takes a socket returned from ``accept``, and reads data from it. Let's call that function ``handle``. That function should create a :class:`H2Connection ` object and then loop on the socket, reading data and passing it to the connection. To read data from a socket we need to call ``recv``. The ``recv`` function takes a number as its argument, which is the *maximum* amount of data to be returned from a single call (note that ``recv`` will return as soon as any data is available, even if that amount is vastly less than the number you passed to it). For the purposes of writing this kind of software the specific value is not enormously useful, but should not be overly large. For that reason, when you're unsure, a number like 4096 or 65535 is a good bet. We'll use 65535 for this example. The function should look something like this: .. code-block:: python import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) while True: data = sock.recv(65535) print(conn.receive_data(data)) Let's update our main loop so that it passes data on to our new data handling function. Your ``h2server.py`` should end up looking a like this: .. code-block:: python import socket import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) while True: data = sock.recv(65535) if not data: break print(conn.receive_data(data)) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Running that in one shell, in your other shell you can run ``curl -v --http2-prior-knowledge http://localhost:8080/`` command. That shell should hang, and you should then see the following output from your ``h2server.py`` shell: .. code-block:: console $ python h2server.py [] You'll then need to kill ``curl`` and ``h2server.py`` with Ctrl+C. Feel free to do this a few times, to see how things behave. So, what did we see here? When the connection was opened, we used the :meth:`recv ` method to read some data from the socket, in a loop. We then passed that data to the connection object, which returned us a single event object: :class:`RemoteSettingsChanged `. But what we didn't see was anything else. So it seems like all ``curl`` did was change its settings, but nothing else. If you look at the other ``curl`` window, you'll notice that it hangs for a while and then eventually fails with a socket timeout. It was waiting for something: what? Well, it turns out that at the start of a connection, both sides need to send a bit of data, called "the HTTP/2 preamble". We don't need to get into too much detail here, but basically both sides need to send a single block of HTTP/2 data that tells the other side what their settings are. ``curl`` did that, but we didn't. Let's do that next. Step 3: Sending the Preamble ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ h2 makes doing connection setup really easy. All you need to do is call the :meth:`initiate_connection ` method, and then send the corresponding data. Let's update our ``handle`` function to do just that: .. code-block:: python def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) print(conn.receive_data(data)) The big change here is the call to ``initiate_connection``, but there's another new method in there: :meth:`data_to_send `. When you make function calls on your ``H2Connection`` object, these will often want to cause HTTP/2 data to be written out to the network. But h2 doesn't do any I/O, so it can't do that itself. Instead, it writes it to an internal buffer. You can retrieve data from this buffer using the ``data_to_send`` method. There are some subtleties about that method, but we don't need to worry about them right now: all we need to do is make sure we're sending whatever data is outstanding. Your ``h2server.py`` script should now look like this: .. code-block:: python import socket import h2.connection import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break print(conn.receive_data(data)) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) With this change made, rerun your ``h2server.py`` script and hit it with the same ``curl`` command: ``curl -v --http2-prior-knowledge http://localhost:8080/``. The ``curl`` command still hangs, but this time we get a bit more output from our ``h2server.py`` script: .. code-block:: console $ python h2server.py [] [] [, ] So, what's happening? The first thing to note is that we're going around our loop more than once now. First, we receive some data that triggers a :class:`RemoteSettingsChanged ` event. Then, we get some more data that triggers a :class:`SettingsAcknowledged ` event. Finally, even more data that triggers *two* events: :class:`RequestReceived ` and :class:`StreamEnded `. So, what's happening is that ``curl`` is telling us about its settings, acknowledging ours, and then sending us a request. Then it ends a *stream*, which is a HTTP/2 communications channel that holds a request and response pair. A stream isn't done until it's either *reset* or both sides *close* it: in this sense it's bi-directional. So what the ``StreamEnded`` event tells us is that ``curl`` is closing its half of the stream: it won't send us any more data on that stream. That means the request is done. So why is ``curl`` hanging? Well, we haven't sent a response yet: let's do that. Step 4: Handling Events ~~~~~~~~~~~~~~~~~~~~~~~ What we want to do is send a response when we receive a request. Happily, we get an event when we receive a request, so we can use that to be our signal. Let's define a new function that sends a response. For now, this response can just be a little bit of data that prints "it works!". The function should take the ``H2Connection`` object, and the event that signaled the request. Let's define it. .. code-block:: python def send_response(conn, event): stream_id = event.stream_id conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0') ], ) conn.send_data( stream_id=stream_id, data=b'it works!', end_stream=True ) So while this is only a short function, there's quite a lot going on here we need to unpack. Firstly, what's a stream ID? Earlier we discussed streams briefly, to say that they're a bi-directional communications channel that holds a request and response pair. Part of what makes HTTP/2 great is that there can be lots of streams going on at once, sending and receiving different requests and responses. To identify each stream, we use a *stream ID*. These are unique across the lifetime of a connection, and they go in ascending order. Most ``H2Connection`` functions take a stream ID: they require you to actively tell the connection which one to use. In this case, as a simple server, we will never need to choose a stream ID ourselves: the client will always choose one for us. That means we'll always be able to get the one we need off the events that fire. Next, we send some *headers*. In HTTP/2, a response is made up of some set of headers, and optionally some data. The headers have to come first: if you're a client then you'll be sending *request* headers, but in our case these headers are our *response* headers. Mostly these aren't very exciting, but you'll notice once special header in there: ``:status``. This is a HTTP/2-specific header, and it's used to hold the HTTP status code that used to go at the top of a HTTP response. Here, we're saying the response is ``200 OK``, which is successful. To send headers in h2, you use the :meth:`send_headers ` function. Next, we want to send the body data. To do that, we use the :meth:`send_data ` function. This also takes a stream ID. Note that the data is binary: h2 does not work with unicode strings, so you *must* pass bytestrings to the ``H2Connection``. The one exception is headers: h2 will automatically encode those into UTF-8. The last thing to note is that on our call to ``send_data``, we set ``end_stream`` to ``True``. This tells h2 (and the remote peer) that we're done with sending data: the response is over. Because we know that ``curl`` will have ended its side of the stream, when we end ours the stream will be totally done with. We're nearly ready to go with this: we just need to plumb this function in. Let's amend our ``handle`` function again: .. code-block:: python import h2.events import h2.config def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) The changes here are all at the end. Now, when we receive some events, we look through them for the ``RequestReceived`` event. If we find it, we make sure we send a response. Then, at the bottom of the loop we check whether we have any data to send, and if we do, we send it. Then, we repeat again. With these changes, your ``h2server.py`` file should look like this: .. code-block:: python import socket import h2.connection import h2.events import h2.config def send_response(conn, event): stream_id = event.stream_id conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0') ], ) conn.send_data( stream_id=stream_id, data=b'it works!', end_stream=True ) def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Alright. Let's run this, and then run our ``curl`` command again. This time, nothing is printed from our server, and the ``curl`` side prints ``it works!``. Success! Try running it a few more times, and we can see that not only does it work the first time, it works the other times too! We can speak HTTP/2! Let's add the final step: returning the JSON-encoded request headers. Step 5: Returning Headers ~~~~~~~~~~~~~~~~~~~~~~~~~ If we want to return the request headers in JSON, the first thing we have to do is find them. Handily, if you check the documentation for :class:`RequestReceived ` you'll find that this event carries, in addition to the stream ID, the request headers. This means we can make a really simple change to our ``send_response`` function to take those headers and encode them as a JSON object. Let's do that: .. code-block:: python import json def send_response(conn, event): stream_id = event.stream_id response_data = json.dumps(dict(event.headers)).encode('utf-8') conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0'), ('content-length', str(len(response_data))), ('content-type', 'application/json'), ], ) conn.send_data( stream_id=stream_id, data=response_data, end_stream=True ) This is a really simple change, but it's all we need to do: a few extra headers and the JSON dump, but that's it. Section 6: Bringing It All Together ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This should be all we need! Let's take all the work we just did and throw that into our ``h2server.py`` file, which should now look like this: .. code-block:: python import json import socket import h2.connection import h2.events import h2.config def send_response(conn, event): stream_id = event.stream_id response_data = json.dumps(dict(event.headers)).encode('utf-8') conn.send_headers( stream_id=stream_id, headers=[ (':status', '200'), ('server', 'basic-h2-server/1.0'), ('content-length', str(len(response_data))), ('content-type', 'application/json'), ], ) conn.send_data( stream_id=stream_id, data=response_data, end_stream=True ) def handle(sock): config = h2.config.H2Configuration(client_side=False) conn = h2.connection.H2Connection(config=config) conn.initiate_connection() sock.sendall(conn.data_to_send()) while True: data = sock.recv(65535) if not data: break events = conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): send_response(conn, event) data_to_send = conn.data_to_send() if data_to_send: sock.sendall(data_to_send) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 8080)) sock.listen(5) while True: handle(sock.accept()[0]) Now, execute ``h2server.py`` and then point ``curl`` at it again. You should see something like the following output from ``curl``: .. code-block:: console $ curl -v --http2-prior-knowledge http://localhost:8080/ {":scheme": "http", ":authority": "localhost", ":method": "GET", ":path": "/"} Here you can see the HTTP/2 request 'special headers' that ``curl`` sends. These are similar to the ``:status`` header we have to send on our response: they encode important parts of the HTTP request in a clearly-defined way. If you were writing a client stack using h2, you'd need to make sure you were sending those headers. Congratulations! ~~~~~~~~~~~~~~~~ Congratulations! You've written your first HTTP/2 server! If you want to extend it, there are a few directions you could investigate: - We didn't handle a few events that we saw were being raised: you could add some methods to handle those appropriately. - Right now our server is single threaded, so it can only handle one client at a time. Consider rewriting this server to use threads, or writing this server again using your favourite asynchronous programming framework. If you plan to use threads, you should know that a ``H2Connection`` object is deliberately not thread-safe. As a possible design pattern, consider creating threads and passing the sockets returned by ``accept`` to those threads, and then letting those threads create their own ``H2Connection`` objects. - Take a look at some of our long-form code examples in :doc:`examples`. - Alternatively, try playing around with our examples in our repository's `examples directory`_. These examples are a bit more fully-featured, and can be reached from your web browser. Try adjusting what they do, or adding new features to them! - You may want to make this server reachable from your web browser. To do that, you'll need to add proper TLS support to your server. This can be tricky, and in many cases requires `PyOpenSSL`_ in addition to the other libraries you have installed. Check the `Eventlet example`_ to see what PyOpenSSL code is required to TLS-ify your server. .. _event loop: https://en.wikipedia.org/wiki/Event_loop .. _httpbin.org/get: https://httpbin.org/get .. _examples directory: https://github.com/python-hyper/h2/tree/master/examples .. _standard library's socket module: https://docs.python.org/3/library/socket.html .. _Application Layer Protocol Negotiation: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation .. _get your certificate here: https://raw.githubusercontent.com/python-hyper/h2/master/examples/twisted/server.crt .. _get your private key here: https://raw.githubusercontent.com/python-hyper/h2/master/examples/twisted/server.key .. _PyOpenSSL: http://pyopenssl.readthedocs.org/ .. _Eventlet example: https://github.com/python-hyper/h2/blob/master/examples/eventlet/eventlet-server.py .. _curl: https://curl.se/docs/http2.html .. _httpx: https://www.python-httpx.org/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596371586.0 h2-4.2.0/docs/source/conf.py0000644000076500000240000000475113711531202015120 0ustar00kriechistaff# Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # import os import sys import re sys.path.insert(0, os.path.abspath('../..')) PROJECT_ROOT = os.path.dirname(__file__) # Get the version version_regex = r'__version__ = ["\']([^"\']*)["\']' with open(os.path.join(PROJECT_ROOT, '../../', 'src/h2/__init__.py')) as file_: text = file_.read() match = re.search(version_regex, text) version = match.group(1) # -- Project information ----------------------------------------------------- project = 'hyper-h2' copyright = '2020, Cory Benfield' author = 'Cory Benfield' release = version # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.viewcode', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('https://docs.python.org/', None), 'hpack': ('https://hpack.readthedocs.io/en/stable/', None), 'pyopenssl': ('https://pyopenssl.readthedocs.org/en/latest/', None), } master_doc = 'index' # -- 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 = 'default' # 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'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/curio-example.rst0000644000076500000240000000103214036557047017132 0ustar00kriechistaffCurio Example Server ==================== This example is a basic HTTP/2 server written using `curio`_, David Beazley's example of how to build a concurrent networking framework using Python 3.5's new ``async``/``await`` syntax. This example is notable for demonstrating the correct use of HTTP/2 flow control with h2. It is also a good example of the brand new syntax. .. literalinclude:: ../../examples/curio/curio-server.py :language: python :linenos: :encoding: utf-8 .. _curio: https://curio.readthedocs.org/en/latest/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/eventlet-example.rst0000644000076500000240000000127013711524610017630 0ustar00kriechistaffEventlet Example Server ======================= This example is a basic HTTP/2 server written using the `eventlet`_ concurrent networking framework. This example is notable for demonstrating how to configure `PyOpenSSL`_, which `eventlet`_ uses for its TLS layer. In terms of HTTP/2 functionality, this example is very simple: it returns the request headers as a JSON document to the caller. It does not obey HTTP/2 flow control, which is a flaw, but it is otherwise functional. .. literalinclude:: ../../examples/eventlet/eventlet-server.py :language: python :linenos: :encoding: utf-8 .. _eventlet: http://eventlet.net/ .. _PyOpenSSL: https://pyopenssl.readthedocs.org/en/stable/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1631462011.0 h2-4.2.0/docs/source/examples.rst0000644000076500000240000000107014117421173016166 0ustar00kriechistaffCode Examples ============= This section of the documentation contains long-form code examples. These are intended as references for developers that would like to get an understanding of how h2 fits in with various Python I/O frameworks. Example Servers --------------- .. toctree:: :maxdepth: 2 asyncio-example curio-example eventlet-example gevent-example tornado-example twisted-example wsgi-example Example Clients --------------- .. toctree:: :maxdepth: 2 plain-sockets-example twisted-head-example twisted-post-example ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/gevent-example.rst0000644000076500000240000000130314036557047017302 0ustar00kriechistaffGevent Example Server ===================== This example is a basic HTTP/2 server written using `gevent`_, a powerful coroutine-based Python networking library that uses `greenlet`_ to provide a high-level synchronous API on top of the `libev`_ or `libuv`_ event loop. This example is inspired by the curio one and also demonstrates the correct use of HTTP/2 flow control with h2 and how gevent can be simple to use. .. literalinclude:: ../../examples/gevent/gevent-server.py :language: python :linenos: :encoding: utf-8 .. _gevent: http://www.gevent.org/ .. _greenlet: https://greenlet.readthedocs.io/en/latest/ .. _libev: http://software.schmorp.de/pkg/libev.html .. _libuv: http://libuv.org/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/index.rst0000644000076500000240000000230714036557047015475 0ustar00kriechistaff.. hyper-h2 documentation master file, created by sphinx-quickstart on Thu Sep 17 10:06:02 2015. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. h2: A pure-Python HTTP/2 protocol stack ======================================= h2 is a HTTP/2 protocol stack, written entirely in Python. The goal of h2 is to be a common HTTP/2 stack for the Python ecosystem, usable in all programs regardless of concurrency model or environment. To achieve this, h2 is entirely self-contained: it does no I/O of any kind, leaving that up to a wrapper library to control. This ensures that it can seamlessly work in all kinds of environments, from single-threaded code to Twisted. Its goal is to be 100% compatible with RFC 7540, implementing a complete HTTP/2 protocol stack build on a set of finite state machines. Its secondary goals are to be fast, clear, and efficient. For usage examples, see :doc:`basic-usage` or consult the examples in the repository. Contents -------- .. toctree:: :maxdepth: 2 installation basic-usage negotiating-http2 examples advanced-usage low-level api testimonials release-process release-notes ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/installation.rst0000644000076500000240000000072114036557047017065 0ustar00kriechistaffInstallation ============ h2 is a pure-python project. This means installing it is extremely simple. To get the latest release from PyPI, simply run: .. code-block:: console $ python -m pip install h2 Alternatively, feel free to download one of the release tarballs from `our GitHub page`_, extract it to your favourite directory, and then run .. code-block:: console $ python setup.py install .. _our GitHub page: https://github.com/python-hyper/h2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/low-level.rst0000644000076500000240000001754014036557047016301 0ustar00kriechistaffLow-Level Details ================= .. warning:: This section of the documentation covers low-level implementation details of h2. This is most likely to be of use to h2 developers and to other HTTP/2 implementers, though it could well be of general interest. Feel free to peruse it, but if you're looking for information about how to *use* h2 you should consider looking elsewhere. State Machines -------------- h2 is fundamentally built on top of a pair of interacting Finite State Machines. One of these FSMs manages per-connection state, and another manages per-stream state. Almost without exception (see :ref:`priority` for more details) every single frame is unconditionally translated into events for both state machines and those state machines are turned. The advantages of a system such as this is that the finite state machines can very densely encode the kinds of things that are allowed at any particular moment in a HTTP/2 connection. However, most importantly, almost all protocols are defined *in terms* of finite state machines: that is, protocol descriptions can be reduced to a number of states and inputs. That makes FSMs a very natural tool for implementing protocol stacks. Indeed, most protocol implementations that do not explicitly encode a finite state machine almost always *implicitly* encode a finite state machine, by using classes with a bunch of variables that amount to state-tracking variables, or by using the call-stack as an implicit state tracking mechanism. While these methods are not immediately problematic, they tend to lack *explicitness*, and can lead to subtle bugs of the form "protocol action X is incorrectly allowed in state Y". For these reasons, we have implemented two *explicit* finite state machines. These machines aim to encode most of the protocol-specific state, in particular regarding what frame is allowed at what time. This target goal is sometimes not achieved: in particular, as of this writing the *stream* FSM contains a number of other state variables that really ought to be rolled into the state machine itself in the form of new states, or in the form of a transformation of the FSM to use state *vectors* instead of state *scalars*. The following sections contain some implementers notes on these FSMs. Connection State Machine ~~~~~~~~~~~~~~~~~~~~~~~~ The "outer" state machine, the first one that is encountered when sending or receiving data, is the connection state machine. This state machine tracks whole-connection state. This state machine is primarily intended to forbid certain actions on the basis of whether the implementation is acting as a client or a server. For example, clients are not permitted to send ``PUSH_PROMISE`` frames: this state machine forbids that by refusing to define a valid transition from the ``CLIENT_OPEN`` state for the ``SEND_PUSH_PROMISE`` event. Otherwise, this particular state machine triggers no side-effects. It has a very coarse, high-level, functionality. A visual representation of this FSM is shown below: .. image:: _static/h2.connection.H2ConnectionStateMachine.dot.png :alt: A visual representation of the connection FSM. :target: _static/h2.connection.H2ConnectionStateMachine.dot.png .. _stream-state-machine: Stream State Machine ~~~~~~~~~~~~~~~~~~~~ Once the connection state machine has been spun, any frame that belongs to a stream is passed to the stream state machine for its given stream. Each stream has its own instance of the state machine, but all of them share the transition table: this is because the table itself is sufficiently large that having it be per-instance would be a ridiculous memory overhead. Unlike the connection state machine, the stream state machine is quite complex. This is because it frequently needs to encode some side-effects. The most common side-effect is emitting a ``RST_STREAM`` frame when an error is encountered: the need to do this means that far more transitions need to be encoded than for the connection state machine. Many of the side-effect functions in this state machine also raise :class:`ProtocolError ` exceptions. This is almost always done on the basis of an extra state variable, which is an annoying code smell: it should always be possible for the state machine itself to police these using explicit state management. A future refactor will hopefully address this problem by making these additional state variables part of the state definitions in the FSM, which will lead to an expansion of the number of states but a greater degree of simplicity in understanding and tracking what is going on in the state machine. The other action taken by the side-effect functions defined here is returning :ref:`events `. Most of these events are returned directly to the user, and reflect the specific state transition that has taken place, but some of the events are purely *internal*: they are used to signal to other parts of the h2 codebase what action has been taken. The major use of the internal events functionality at this time is for validating header blocks: there are different rules for request headers than there are for response headers, and different rules again for trailers. The internal events are used to determine *exactly what* kind of data the user is attempting to send, and using that information to do the correct kind of validation. This approach ensures that the final source of truth about what's happening at the protocol level lives inside the FSM, which is an extremely important design principle we want to continue to enshrine in h2. A visual representation of this FSM is shown below: .. image:: _static/h2.stream.H2StreamStateMachine.dot.png :alt: A visual representation of the stream FSM. :target: _static/h2.stream.H2StreamStateMachine.dot.png .. _priority: Priority ~~~~~~~~ In the :ref:`stream-state-machine` section we said that any frame that belongs to a stream is passed to the stream state machine. This turns out to be not quite true. Specifically, while ``PRIORITY`` frames are technically sent on a given stream (that is, `RFC 7540 Section 6.3`_ defines them as "always identifying a stream" and forbids the use of stream ID ``0`` for them), in practice they are almost completely exempt from the usual stream FSM behaviour. Specifically, the RFC has this to say: The ``PRIORITY`` frame can be sent on a stream in any state, though it cannot be sent between consecutive frames that comprise a single header block (Section 4.3). Given that the consecutive header block requirement is handled outside of the FSMs, this section of the RFC essentially means that there is *never* a situation where it is invalid to receive a ``PRIORITY`` frame. This means that including it in the stream FSM would require that we allow ``SEND_PRIORITY`` and ``RECV_PRIORITY`` in all states. This is not a totally onerous task: however, another key note is that h2 uses the *absence* of a stream state machine to flag a closed stream. This is primarily for memory conservation reasons: if we needed to keep around an FSM for every stream we've ever seen, that would cause long-lived HTTP/2 connections to consume increasingly large amounts of memory. On top of this, it would require us to create a stream FSM each time we received a ``PRIORITY`` frame for a given stream, giving a malicious peer an easy route to force a h2 user to allocate nearly unbounded amounts of memory. For this reason, h2 circumvents the stream FSM entirely for ``PRIORITY`` frames. Instead, these frames are treated as being connection-level frames that *just happen* to identify a specific stream. They do not bring streams into being, or in any sense interact with h2's view of streams. Their stream details are treated as strictly metadata that h2 is not interested in beyond being able to parse it out. .. _RFC 7540 Section 6.3: https://tools.ietf.org/html/rfc7540#section-6.3 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/negotiating-http2.rst0000644000076500000240000001611014036557047017732 0ustar00kriechistaffNegotiating HTTP/2 ================== `RFC 7540`_ specifies three methods of negotiating HTTP/2 connections. This document outlines how to use h2 with each one. .. _starting-alpn: HTTPS URLs (ALPN) ------------------------- Starting HTTP/2 for HTTPS URLs is outlined in `RFC 7540 Section 3.3`_. In this case, the client and server use a TLS extension to negotiate HTTP/2: `ALPN`_. How to use ALPN is currently not covered in this document: please consult the documentation for either the :mod:`ssl module ` in the standard library, or the :mod:`PyOpenSSL ` third-party modules, for more on this topic. This method is the simplest to use once the TLS connection is established. To use it with h2, after you've established the connection and confirmed that HTTP/2 has been negotiated with `ALPN`_, create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_connection `. This will ensure that the appropriate preamble data is placed in the data buffer. You should then immediately send the data returned by :meth:`H2Connection.data_to_send ` on your TLS connection. At this point, you're free to use all the HTTP/2 functionality provided by h2. .. note:: Although h2 is not concerned with negotiating protocol versions, it is important to note that support for `ALPN`_ is not available in the standard library of Python versions < 2.7.9. As a consequence, clients may encounter various errors due to protocol versions mismatch. Server Setup Example ~~~~~~~~~~~~~~~~~~~~ This example uses the APIs as defined in Python 3.5. If you are using an older version of Python you may not have access to the APIs used here. As noted above, please consult the documentation for the :mod:`ssl module ` to confirm. .. literalinclude:: ../../examples/fragments/server_https_setup_fragment.py :language: python :linenos: :encoding: utf-8 Client Setup Example ~~~~~~~~~~~~~~~~~~~~ The client example is very similar to the server example above. The :class:`SSLContext ` object requires some minor changes, as does the :class:`H2Connection `, but the bulk of the code is the same. .. literalinclude:: ../../examples/fragments/client_https_setup_fragment.py :language: python :linenos: :encoding: utf-8 .. _starting-upgrade: HTTP URLs (Upgrade) ------------------- Starting HTTP/2 for HTTP URLs is outlined in `RFC 7540 Section 3.2`_. In this case, the client and server use the HTTP Upgrade mechanism originally described in `RFC 7230 Section 6.7`_. The client sends its initial HTTP/1.1 request with two extra headers. The first is ``Upgrade: h2c``, which requests upgrade to cleartext HTTP/2. The second is a ``HTTP2-Settings`` header, which contains a specially formatted string that encodes a HTTP/2 Settings frame. To do this with h2 you have two slightly different flows: one for clients, one for servers. Clients ~~~~~~~ For a client, when sending the first request you should manually add your ``Upgrade`` header. You should then create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_upgrade_connection ` with no arguments. This method will return a bytestring to use as the value of your ``HTTP2-Settings`` header. If the server returns a ``101`` status code, it has accepted the upgrade, and you should immediately send the data returned by :meth:`H2Connection.data_to_send `. Now you should consume the entire ``101`` header block. All data after the ``101`` header block is HTTP/2 data that should be fed directly to :meth:`H2Connection.receive_data ` and handled as normal with h2. If the server does not return a ``101`` status code then it is not upgrading. Continue with HTTP/1.1 as normal: you may throw away your :class:`H2Connection ` object, as it is of no further use. The server will respond to your original request in HTTP/2. Please pay attention to the events received from h2, as they will define the server's response. Client Example ^^^^^^^^^^^^^^ The code below demonstrates how to handle a plaintext upgrade from the perspective of the client. For the purposes of keeping the example code as simple and generic as possible it uses the synchronous socket API that comes with the Python standard library: if you want to use asynchronous I/O, you will need to translate this code to the appropriate idiom. .. literalinclude:: ../../examples/fragments/client_upgrade_fragment.py :language: python :linenos: :encoding: utf-8 Servers ~~~~~~~ If the first request you receive on a connection from the client contains an ``Upgrade`` header with the ``h2c`` token in it, and you're willing to upgrade, you should create a :class:`H2Connection ` object and call :meth:`H2Connection.initiate_upgrade_connection ` with the value of the ``HTTP2-Settings`` header (as a bytestring) as the only argument. Then, you should send back a ``101`` response that contains ``h2c`` in the ``Upgrade`` header. That response will inform the client that you're switching to HTTP/2. Then, you should immediately send the data that is returned to you by :meth:`H2Connection.data_to_send ` on the connection: this is a necessary part of the HTTP/2 upgrade process. At this point, you may now respond to the original HTTP/1.1 request in HTTP/2 by calling the appropriate methods on the :class:`H2Connection ` object. No further HTTP/1.1 may be sent on this connection: from this point onward, all data sent by you and the client will be HTTP/2 data. Server Example ^^^^^^^^^^^^^^ The code below demonstrates how to handle a plaintext upgrade from the perspective of the server. For the purposes of keeping the example code as simple and generic as possible it uses the synchronous socket API that comes with the Python standard library: if you want to use asynchronous I/O, you will need to translate this code to the appropriate idiom. .. literalinclude:: ../../examples/fragments/server_upgrade_fragment.py :language: python :linenos: :encoding: utf-8 Prior Knowledge --------------- It's possible that you as a client know that a particular server supports HTTP/2, and that you do not need to perform any of the negotiations described above. In that case, you may follow the steps in :ref:`starting-alpn`, ignoring all references to ALPN: there's no need to perform the upgrade dance described in :ref:`starting-upgrade`. .. _RFC 7540: https://tools.ietf.org/html/rfc7540 .. _RFC 7540 Section 3.2: https://tools.ietf.org/html/rfc7540#section-3.2 .. _RFC 7540 Section 3.3: https://tools.ietf.org/html/rfc7540#section-3.3 .. _ALPN: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation .. _RFC 7230 Section 6.7: https://tools.ietf.org/html/rfc7230#section-6.7 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1631462011.0 h2-4.2.0/docs/source/plain-sockets-example.rst0000644000076500000240000000121614117421173020557 0ustar00kriechistaffPlain Sockets Example Client ============================ This example is a basic HTTP/2 client written using plain Python `sockets`_, and `ssl`_ TLS/SSL wrapper for socket objects. This client is *not* a complete production-ready HTTP/2 client and only intended as a demonstration sample. This example shows the bare minimum that is needed to send an HTTP/2 request to a server, and read back a response body. .. literalinclude:: ../../examples/plain_sockets/plain_sockets_client.py :language: python :linenos: :encoding: utf-8 .. _sockets: https://docs.python.org/3/library/socket.html .. _ssl: https://docs.python.org/3/library/ssl.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/release-notes.rst0000644000076500000240000001204013711524610017114 0ustar00kriechistaffRelease Notes ============= This document contains release notes for Hyper-h2. In addition to the :ref:`detailed-release-notes` found at the bottom of this document, this document also includes a high-level prose overview of each major release after 1.0.0. High Level Notes ---------------- 3.0.0: 24 March 2017 ~~~~~~~~~~~~~~~~~~~~ The Hyper-h2 team and the Hyper project are delighted to announce the release of Hyper-h2 version 3.0.0! Unlike the really notable 2.0.0 release, this release is proportionally quite small: however, it has the effect of removing a lot of cruft and complexity that has built up in the codebase over the lifetime of the v2 release series. This release was motivated primarily by discovering that applications that attempted to use both HTTP/1.1 and HTTP/2 using hyper-h2 would encounter problems with cookies, because hyper-h2 did not join together cookie headers as required by RFC 7540. Normally adding such behaviour would be a non-breaking change, but we previously had no flags to prevent normalization of received HTTP headers. Because it makes no sense for the cookie to be split *by default*, we needed to add a controlling flag and set it to true. The breaking nature of this change is very subtle, and it's possible most users would never notice, but nevertheless it *is* a breaking change and we need to treat it as such. Happily, we can take this opportunity to finalise a bunch of deprecations we'd made over the past year. The v2 release series was long-lived and successful, having had a series of releases across the past year-and-a-bit, and the Hyper team are very proud of it. However, it's time to open a new chapter, and remove the deprecated code. The past year has been enormously productive for the Hyper team. A total of 30 v2 releases were made, an enormous amount of work. A good number of people have made their first contribution in this time, more than I can thank reasonably without taking up an unreasonable amount of space in this document, so instead I invite you to check out `our awesome contributor list`_. We're looking forward to the next chapter in hyper-h2: it's been a fun ride so far, and we hope even more of you come along and join in the fun over the next year! .. _our awesome contributor list: https://github.com/python-hyper/hyper-h2/graphs/contributors 2.0.0: 25 January 2016 ~~~~~~~~~~~~~~~~~~~~~~ The Hyper-h2 team and the Hyper project are delighted to announce the release of Hyper-h2 version 2.0.0! This is an enormous release that contains a gigantic collection of new features and fixes, with the goal of making it easier than ever to use Hyper-h2 to build a compliant HTTP/2 server or client. An enormous chunk of this work has been focused on tighter enforcement of restrictions in RFC 7540, ensuring that we correctly police the actions of remote peers, and error appropriately when those peers violate the specification. Several of these constitute breaking changes, because data that was previously received and handled without obvious error now raises ``ProtocolError`` exceptions and causes the connection to be terminated. Additionally, the public API was cleaned up and had several helper methods that had been inavertently exposed removed from the public API. The team wants to stress that while Hyper-h2 follows semantic versioning, the guarantees of semver apply only to the public API as documented in :doc:`api`. Reducing the surface area of these APIs makes it easier for us to continue to ensure that the guarantees of semver are respected on our public API. We also attempted to clear up some of the warts that had appeared in the API, and add features that are helpful for implementing HTTP/2 endpoints. For example, the :class:`H2Connection ` object now exposes a method for generating the next stream ID that your client or server can use to initiate a connection (:meth:`get_next_available_stream_id `). We also removed some needless return values that were guaranteed to return empty lists, which were an attempt to make a forward-looking guarantee that was entirely unneeded. Altogether, this has been an extremely productive period for Hyper-h2, and a lot of great work has been done by the community. To that end, we'd also like to extend a great thankyou to those contributors who made their first contribution to the project between release 1.0.0 and 2.0.0. Many thanks to: `Thomas Kriechbaumer`_, `Alex Chan`_, `Maximilian Hils`_, and `Glyph`_. For a full historical list of contributors, see `contributors`_. We're looking forward to the next few months of Python HTTP/2 work, and hoping that you'll find lots of excellent HTTP/2 applications to build with Hyper-h2! .. _Thomas Kriechbaumer: https://github.com/Kriechi .. _Alex Chan: https://github.com/alexwlchan .. _Maximilian Hils: https://github.com/mhils .. _Glyph: https://github.com/glyph .. _contributors: https://github.com/python-hyper/hyper-h2/blob/b14817b79c7bb1661e1aa84ef7920c009ef1e75b/CONTRIBUTORS.rst .. _detailed-release-notes: .. include:: ../../CHANGELOG.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/docs/source/release-process.rst0000644000076500000240000000444014036557047017462 0ustar00kriechistaffRelease Process =============== Because of h2's place at the bottom of the dependency tree, it is extremely important that the project maintains a diligent release schedule. This document outlines our process for managing releases. Versioning ---------- h2 follows `semantic versioning`_ of its public API when it comes to numbering releases. The public API of h2 is strictly limited to the entities listed in the :doc:`api` documentation: anything not mentioned in that document is not considered part of the public API and is not covered by the versioning guarantees given by semantic versioning. Maintenance ----------- h2 has the notion of a "release series", given by a major and minor version number: for example, there is the 2.1 release series. When each minor release is made and a release series is born, a branch is made off the release tag: for example, for the 2.1 release series, the 2.1.X branch. All changes merged into the master branch will be evaluated for whether they can be considered 'bugfixes' only (that is, they do not affect the public API). If they can, they will also be cherry-picked back to all active maintenance branches that require the bugfix. If the bugfix is not necessary, because the branch in question is unaffected by that bug, the bugfix will not be backported. Supported Release Series' ------------------------- The developers of h2 commit to supporting the following release series: - The most recent, as identified by the first two numbers in the highest version currently released. - The immediately prior release series. The only exception to this policy is that no release series earlier than the 2.1 series will be supported. In this context, "supported" means that they will continue to receive bugfix releases. For releases other than the ones identified above, no support is guaranteed. The developers may *choose* to support such a release series, but they do not promise to. The exception here is for security vulnerabilities. If a security vulnerability is identified in an out-of-support release series, the developers will do their best to patch it and issue an emergency release. For more information, see `our security documentation`_. .. _semantic versioning: http://semver.org/ .. _our security documentation: http://python-hyper.org/en/latest/security.html ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/testimonials.rst0000644000076500000240000000072513711524610017070 0ustar00kriechistaffTestimonials ============ Glyph Lefkowitz ~~~~~~~~~~~~~~~ Frankly, Hyper-h2 is almost SURREAL in how well-factored and decoupled the implementation is from I/O. If libraries in the Python ecosystem looked like this generally, Twisted would be a much better platform than it is. (Frankly, most of Twisted's _own_ protocol implementations should aspire to such cleanliness.) (`Source `_) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/tornado-example.rst0000644000076500000240000000066713711524610017461 0ustar00kriechistaffTornado Example Server ====================== This example is a basic HTTP/2 server written using the `Tornado`_ asynchronous networking library. The server returns the request headers as a JSON document to the caller, just like the example from the :doc:`basic-usage` document. .. literalinclude:: ../../examples/tornado/tornado-server.py :language: python :linenos: :encoding: utf-8 .. _Tornado: http://www.tornadoweb.org/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/twisted-example.rst0000644000076500000240000000115413711524610017466 0ustar00kriechistaffTwisted Example Server ====================== This example is a basic HTTP/2 server written for the `Twisted`_ asynchronous networking framework. This is a relatively fleshed out example, and in particular it makes sure to obey HTTP/2 flow control rules. This server differs from some of the other example servers by serving files, rather than simply sending JSON responses. This makes the example lengthier, but also brings it closer to a real-world use-case. .. literalinclude:: ../../examples/twisted/twisted-server.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/twisted-head-example.rst0000644000076500000240000000103713711524610020365 0ustar00kriechistaffTwisted Example Client: Head Requests ===================================== This example is a basic HTTP/2 client written for the `Twisted`_ asynchronous networking framework. This client is fairly simple: it makes a hard-coded HEAD request to nghttp2.org/httpbin/ and prints out the response data. Its purpose is to demonstrate how to write a very basic HTTP/2 client implementation. .. literalinclude:: ../../examples/twisted/head_request.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369288.0 h2-4.2.0/docs/source/twisted-post-example.rst0000644000076500000240000000117413711524610020453 0ustar00kriechistaffTwisted Example Client: Post Requests ===================================== This example is a basic HTTP/2 client written for the `Twisted`_ asynchronous networking framework. This client is fairly simple: it makes a hard-coded POST request to nghttp2.org/httpbin/post and prints out the response data, sending a file that is provided on the command line or the script itself. Its purpose is to demonstrate how to write a HTTP/2 client implementation that handles flow control. .. literalinclude:: ../../examples/twisted/post_request.py :language: python :linenos: :encoding: utf-8 .. _Twisted: https://twistedmatrix.com/ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/docs/source/wsgi-example.rst0000644000076500000240000000213114744263537016767 0ustar00kriechistaffExample HTTP/2-only WSGI Server =============================== This example is a more complex HTTP/2 server that acts as a WSGI server, passing data to an arbitrary WSGI application. This example is written using `asyncio`_. The server supports most of PEP-3333, and so could in principle be used as a production WSGI server: however, that's *not recommended* as certain shortcuts have been taken to ensure ease of implementation and understanding. The main advantages of this example are: 1. It properly demonstrates HTTP/2 flow control management. 2. It demonstrates how to plug h2 into a larger, more complex application. .. literalinclude:: ../../examples/asyncio/wsgi-server.py :language: python :linenos: :encoding: utf-8 You can use ``cert.crt`` and ``cert.key`` files provided within the repository or generate your own certificates using `OpenSSL`_: .. code-block:: console $ openssl req -x509 -newkey rsa:2048 -keyout cert.key -out cert.crt -days 365 -nodes .. _asyncio: https://docs.python.org/3/library/asyncio.html .. _OpenSSL: https://openssl-library.org/source/index.html ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7409368 h2-4.2.0/examples/0000755000076500000240000000000014747620663013224 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7617738 h2-4.2.0/examples/asyncio/0000755000076500000240000000000014747620663014671 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/examples/asyncio/asyncio-server.py0000644000076500000240000001664514744263537020230 0ustar00kriechistaff# -*- coding: utf-8 -*- """ asyncio-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server using asyncio. Requires Python 3.5+. This example demonstrates handling requests with bodies, as well as handling those without. In particular, it demonstrates the fact that DataReceived may be called multiple times, and that applications must handle that possibility. """ import asyncio import io import json import ssl import collections from typing import List, Tuple from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( ConnectionTerminated, DataReceived, RemoteSettingsChanged, RequestReceived, StreamEnded, StreamReset, WindowUpdated ) from h2.errors import ErrorCodes from h2.exceptions import ProtocolError, StreamClosedError from h2.settings import SettingCodes RequestData = collections.namedtuple('RequestData', ['headers', 'data']) class H2Protocol(asyncio.Protocol): def __init__(self): config = H2Configuration(client_side=False, header_encoding='utf-8') self.conn = H2Connection(config=config) self.transport = None self.stream_data = {} self.flow_control_futures = {} def connection_made(self, transport: asyncio.Transport): self.transport = transport self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def connection_lost(self, exc): for future in self.flow_control_futures.values(): future.cancel() self.flow_control_futures = {} def data_received(self, data: bytes): try: events = self.conn.receive_data(data) except ProtocolError as e: self.transport.write(self.conn.data_to_send()) self.transport.close() else: self.transport.write(self.conn.data_to_send()) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.receive_data( event.data, event.flow_controlled_length, event.stream_id ) elif isinstance(event, StreamEnded): self.stream_complete(event.stream_id) elif isinstance(event, ConnectionTerminated): self.transport.close() elif isinstance(event, StreamReset): self.stream_reset(event.stream_id) elif isinstance(event, WindowUpdated): self.window_updated(event.stream_id, event.delta) elif isinstance(event, RemoteSettingsChanged): if SettingCodes.INITIAL_WINDOW_SIZE in event.changed_settings: self.window_updated(None, 0) self.transport.write(self.conn.data_to_send()) def request_received(self, headers: List[Tuple[str, str]], stream_id: int): headers = collections.OrderedDict(headers) method = headers[':method'] # Store off the request data. request_data = RequestData(headers, io.BytesIO()) self.stream_data[stream_id] = request_data def stream_complete(self, stream_id: int): """ When a stream is complete, we can send our response. """ try: request_data = self.stream_data[stream_id] except KeyError: # Just return, we probably 405'd this already return headers = request_data.headers body = request_data.data.getvalue().decode('utf-8') data = json.dumps( {"headers": headers, "body": body}, indent=4 ).encode("utf8") response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'asyncio-h2'), ) self.conn.send_headers(stream_id, response_headers) asyncio.ensure_future(self.send_data(data, stream_id)) def receive_data(self, data: bytes, flow_controlled_length: int, stream_id: int): """ We've received some data on a stream. If that stream is one we're expecting data on, save it off (and account for the received amount of data in flow control so that the client can send more data). Otherwise, reset the stream. """ try: stream_data = self.stream_data[stream_id] except KeyError: self.conn.reset_stream( stream_id, error_code=ErrorCodes.PROTOCOL_ERROR ) else: stream_data.data.write(data) self.conn.acknowledge_received_data(flow_controlled_length, stream_id) def stream_reset(self, stream_id): """ A stream reset was sent. Stop sending data. """ if stream_id in self.flow_control_futures: future = self.flow_control_futures.pop(stream_id) future.cancel() async def send_data(self, data, stream_id): """ Send data according to the flow control rules. """ while data: while self.conn.local_flow_control_window(stream_id) < 1: try: await self.wait_for_flow_control(stream_id) except asyncio.CancelledError: return chunk_size = min( self.conn.local_flow_control_window(stream_id), len(data), self.conn.max_outbound_frame_size, ) try: self.conn.send_data( stream_id, data[:chunk_size], end_stream=(chunk_size == len(data)) ) except (StreamClosedError, ProtocolError): # The stream got closed and we didn't get told. We're done # here. break self.transport.write(self.conn.data_to_send()) data = data[chunk_size:] async def wait_for_flow_control(self, stream_id): """ Waits for a Future that fires when the flow control window is opened. """ f = asyncio.Future() self.flow_control_futures[stream_id] = f await f def window_updated(self, stream_id, delta): """ A window update frame was received. Unblock some number of flow control Futures. """ if stream_id and stream_id in self.flow_control_futures: f = self.flow_control_futures.pop(stream_id) f.set_result(delta) elif not stream_id: for f in self.flow_control_futures.values(): f.set_result(delta) self.flow_control_futures = {} ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.load_cert_chain(certfile="cert.crt", keyfile="cert.key") ssl_context.set_alpn_protocols(["h2"]) loop = asyncio.get_event_loop() # Each client connection will create a new protocol instance coro = loop.create_server(H2Protocol, '127.0.0.1', 8443, ssl=ssl_context) server = loop.run_until_complete(coro) # Serve requests until Ctrl+C is pressed print('Serving on {}'.format(server.sockets[0].getsockname())) try: loop.run_forever() except KeyboardInterrupt: pass finally: # Close the server server.close() loop.run_until_complete(server.wait_closed()) loop.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/asyncio/cert.crt0000644000076500000240000000240113137423045016320 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJAOrxh0dOYJLdMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTA5MTkxNDE2 NDRaFw0xNTEwMTkxNDE2NDRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqt A1iu8EN00FU0eBcBGlLVmNEgV7Jkbukra+kwS8j/U2y50QPGJc/FiIVDfuBqk5dL ACTNc6A/FQcXvWmOc5ixmC3QKKasMpuofqKz0V9C6irZdYXZ9rcsW0gHQIr989yd R+N1VbIlEVW/T9FJL3B2UD9GVIkUELzm47CSOWZvAxQUlsx8CUNuUCWqyZJoqTFN j0LeJDOWGCsug1Pkj0Q1x+jMVL6l6Zf6vMkLNOMsOsWsxUk+0L3tl/OzcTgUOCsw UzY59RIi6Rudrp0oaU8NuHr91yiSqPbKFlX10M9KwEEdnIpcxhND3dacrDycj3ux eWlqKync2vOFUkhwiaMCAwEAAaNQME4wHQYDVR0OBBYEFA0PN+PGoofZ+QIys2Jy 1Zz94vBOMB8GA1UdIwQYMBaAFA0PN+PGoofZ+QIys2Jy1Zz94vBOMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEplethBoPpcP3EbR5Rz6snDDIcbtAJu Ngd0YZppGT+P0DYnPJva4vRG3bb84ZMSuppz5j67qD6DdWte8UXhK8BzWiHzwmQE QmbKyzzTMKQgTNFntpx5cgsSvTtrHpNYoMHzHOmyAOboNeM0DWiRXsYLkWTitLTN qbOpstwPubExbT9lPjLclntShT/lCupt+zsbnrR9YiqlYFY/fDzfAybZhrD5GMBY XdMPItwAc/sWvH31yztarjkLmld76AGCcO5r8cSR/cX98SicyfjOBbSco8GkjYNY 582gTPkKGYpStuN7GNT5tZmxvMq935HRa2XZvlAIe8ufp8EHVoYiF3c= -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/asyncio/cert.key0000644000076500000240000000321713137423045016326 0ustar00kriechistaff-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyq0DWK7wQ3TQVTR4FwEaUtWY0SBXsmRu6Str6TBLyP9TbLnR A8Ylz8WIhUN+4GqTl0sAJM1zoD8VBxe9aY5zmLGYLdAopqwym6h+orPRX0LqKtl1 hdn2tyxbSAdAiv3z3J1H43VVsiURVb9P0UkvcHZQP0ZUiRQQvObjsJI5Zm8DFBSW zHwJQ25QJarJkmipMU2PQt4kM5YYKy6DU+SPRDXH6MxUvqXpl/q8yQs04yw6xazF ST7Qve2X87NxOBQ4KzBTNjn1EiLpG52unShpTw24ev3XKJKo9soWVfXQz0rAQR2c ilzGE0Pd1pysPJyPe7F5aWorKdza84VSSHCJowIDAQABAoIBACp+nh4BB/VMz8Wd q7Q/EfLeQB1Q57JKpoqTBRwueSVai3ZXe4CMEi9/HkG6xiZtkiZ9njkZLq4hq9oB 2z//kzMnwV2RsIRJxI6ohGy+wR51HD4BvEdlTPpY/Yabpqe92VyfSYxidKZWaU0O QMED1EODOw4ZQ+4928iPrJu//PMB4e7TFao0b9Fk/XLWtu5/tQZz9jsrlTi1zthh 7n+oaGNhfTeIJJL4jrhTrKW1CLHXATtr9SJlfZ3wbMxQVeyj2wUlP1V0M6kBuhNj tbGbMpixD5iCNJ49Cm2PHg+wBOfS3ADGIpi3PcGw5mb8nB3N9eGBRPhLShAlq5Hi Lv4tyykCgYEA8u3b3xJ04pxWYN25ou/Sc8xzgDCK4XvDNdHVTuZDjLVA+VTVPzql lw7VvJArsx47MSPvsaX/+4hQXYtfnR7yJpx6QagvQ+z4ludnIZYrQwdUmb9pFL1s 8UNj+3j9QFRPenIiIQ8qxxNIQ9w2HsVQ8scvc9CjYop/YYAPaQyHaL8CgYEA1ZSz CR4NcpfgRSILdhb1dLcyw5Qus1VOSAx3DYkhDkMiB8XZwgMdJjwehJo9yaqRCLE8 Sw5znMnkfoZpu7+skrjK0FqmMpXMH9gIszHvFG8wSw/6+2HIWS19/wOu8dh95LuC 0zurMk8rFqxgWMWF20afhgYrUz42cvUTo10FVB0CgYEAt7mW6W3PArfUSCxIwmb4 VmXREKkl0ATHDYQl/Cb//YHzot467TgQll883QB4XF5HzBFurX9rSzO7/BN1e6I0 52i+ubtWC9xD4fUetXMaQvZfUGxIL8xXgVxDWKQXfLiG54c8Mp6C7s6xf8kjEUCP yR1F0SSA/Pzb+8RbY0p7eocCgYA+1rs+SXtHZev0KyoYGnUpW+Uxqd17ofOgOxqj /t6c5Z+TjeCdtnDTGQkZlo/rT6XQWuUUaDIXxUbW+xEMzj4mBPyXBLS1WWFvVQ5q OpzO9E/PJeqAH6rkof/aEelc+oc/zvOU1o9uA+D3kMvgEm1psIOq2RHSMhGvDPA0 NmAk+QKBgQCwd1681GagdIYSZUCBecnLtevXmIsJyDW2yR1NNcIe/ukcVQREMDvy 5DDkhnGDgnV1D5gYcXb34g9vYvbfTnBMl/JXmMAAG1kIS+3pvHyN6f1poVe3yJV1 yHVuvymnJxKnyaV0L3ntepVvV0vVNIkA3oauoUTLto6txBI+b/ImDA== -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/examples/asyncio/wsgi-server.py0000644000076500000240000007357214744263537017536 0ustar00kriechistaff# -*- coding: utf-8 -*- """ asyncio-server.py ~~~~~~~~~~~~~~~~~ A fully-functional WSGI server, written using h2. Requires asyncio. To test it, try installing httpbin from pip (``pip install httpbin``) and then running the server (``python asyncio-server.py httpbin:app``). This server does not support HTTP/1.1: it is a HTTP/2-only WSGI server. The purpose of this code is to demonstrate how to integrate h2 into a more complex application, and to demonstrate several principles of concurrent programming. The architecture looks like this: +---------------------------------+ | 1x HTTP/2 Server Thread | | (running asyncio) | +---------------------------------+ +---------------------------------+ | N WSGI Application Threads | | (no asyncio) | +---------------------------------+ Essentially, we spin up an asyncio-based event loop in the main thread. This launches one HTTP/2 Protocol instance for each inbound connection, all of which will read and write data from within the main thread in an asynchronous manner. When each HTTP request comes in, the server will build the WSGI environment dictionary and create a ``Stream`` object. This object will hold the relevant state for the request/response pair and will act as the WSGI side of the logic. That object will then be passed to a background thread pool, and when a worker is available the WSGI logic will begin to be executed. This model ensures that the asyncio web server itself is never blocked by the WSGI application. The WSGI application and the HTTP/2 server communicate via an asyncio queue, together with locks and threading events. The locks themselves are implicit in asyncio's "call_soon_threadsafe", which allows for a background thread to register an action with the main asyncio thread. When the asyncio thread eventually takes the action in question it sets as threading event, signaling to the background thread that it is free to continue its work. To make the WSGI application work with flow control, there is a very important invariant that must be observed. Any WSGI action that would cause data to be emitted to the network MUST be accompanied by a threading Event that is not set until that data has been written to the transport. This ensures that the WSGI application *blocks* until the data is actually sent. The reason we require this invariant is that the HTTP/2 server may choose to re-order some data chunks for flow control reasons: that is, the application for stream X may have actually written its data first, but the server may elect to send the data for stream Y first. This means that it's vital that there not be *two* writes for stream X active at any one point or they may get reordered, which would be particularly terrible. Thus, the server must cooperate to ensure that each threading event only fires when the *complete* data for that event has been written to the asyncio transport. Any earlier will cause untold craziness. """ import asyncio import importlib import queue import ssl import sys import threading from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( DataReceived, RequestReceived, WindowUpdated, StreamEnded, StreamReset ) # Used to signal that a request has completed. # # This is a convenient way to do "in-band" signaling of stream completion # without doing anything so heavyweight as using a class. Essentially, we can # test identity against this empty object. In fact, this is so convenient that # we use this object for all streams, for data in both directions: in and out. END_DATA_SENTINEL = object() # The WSGI callable. Stored here so that the protocol instances can get hold # of the data. APPLICATION = None class H2Protocol(asyncio.Protocol): def __init__(self): config = H2Configuration(client_side=False, header_encoding='utf-8') # Our server-side state machine. self.conn = H2Connection(config=config) # The backing transport. self.transport = None # A dictionary of ``Stream`` objects, keyed by their stream ID. This # makes it easy to route data to the correct WSGI application instance. self.streams = {} # A queue of data emitted by WSGI applications that has not yet been # sent. Each stream may only have one chunk of data in either this # queue or the flow_controlled_data dictionary at any one time. self._stream_data = asyncio.Queue() # Data that has been pulled off the queue that is for a stream blocked # behind flow control limitations. This is used to avoid spinning on # _stream_data queue when a stream cannot have its data sent. Data that # cannot be sent on the connection when it is popped off the queue gets # placed here until the stream flow control window opens up again. self._flow_controlled_data = {} # A reference to the loop in which this protocol runs. This is needed # to synchronise up with background threads. self._loop = asyncio.get_event_loop() # Any streams that have been remotely reset. We keep track of these to # ensure that we don't emit data from a WSGI application whose stream # has been cancelled. self._reset_streams = set() # Keep track of the loop sending task so we can kill it when the # connection goes away. self._send_loop_task = None def connection_made(self, transport): """ The connection has been made. Here we need to save off our transport, do basic HTTP/2 connection setup, and then start our data writing coroutine. """ self.transport = transport self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) self._send_loop_task = self._loop.create_task(self.sending_loop()) def connection_lost(self, exc): """ With the end of the connection, we just want to cancel our data sending coroutine. """ self._send_loop_task.cancel() def data_received(self, data): """ Process inbound data. """ events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event) elif isinstance(event, DataReceived): self.data_frame_received(event) elif isinstance(event, WindowUpdated): self.window_opened(event) elif isinstance(event, StreamEnded): self.end_stream(event) elif isinstance(event, StreamReset): self.reset_stream(event) outbound_data = self.conn.data_to_send() if outbound_data: self.transport.write(outbound_data) def window_opened(self, event): """ The flow control window got opened. This is important because it's possible that we were unable to send some WSGI data because the flow control window was too small. If that happens, the sending_loop coroutine starts buffering data. As the window gets opened, we need to unbuffer the data. We do that by placing the data chunks back on the back of the send queue and letting the sending loop take another shot at sending them. This system only works because we require that each stream only have *one* data chunk in the sending queue at any time. The threading events force this invariant to remain true. """ if event.stream_id: # This is specific to a single stream. if event.stream_id in self._flow_controlled_data: self._stream_data.put_nowait( self._flow_controlled_data.pop(event.stream_id) ) else: # This event is specific to the connection. Free up *all* the # streams. This is a bit tricky, but we *must not* yield the flow # of control here or it all goes wrong. for data in self._flow_controlled_data.values(): self._stream_data.put_nowait(data) self._flow_controlled_data.clear() async def sending_loop(self): """ A call that loops forever, attempting to send data. This sending loop contains most of the flow-control smarts of this class: it pulls data off of the asyncio queue and then attempts to send it. The difficulties here are all around flow control. Specifically, a chunk of data may be too large to send. In this case, what will happen is that this coroutine will attempt to send what it can and will then store the unsent data locally. When a flow control event comes in that data will be freed up and placed back onto the asyncio queue, causing it to pop back up into the sending logic of this coroutine. This method explicitly *does not* handle HTTP/2 priority. That adds an extra layer of complexity to what is already a fairly complex method, and we'll look at how to do it another time. This coroutine explicitly *does not end*. """ while True: stream_id, data, event = await self._stream_data.get() # If this stream got reset, just drop the data on the floor. Note # that we need to reset the event here to make sure that # application doesn't lock up. if stream_id in self._reset_streams: event.set() # Check if the body is done. If it is, this is really easy! Again, # we *must* set the event here or the application will lock up. if data is END_DATA_SENTINEL: self.conn.end_stream(stream_id) self.transport.write(self.conn.data_to_send()) event.set() continue # We need to send data, but not to exceed the flow control window. # For that reason, grab only the data that fits: we'll buffer the # rest. window_size = self.conn.local_flow_control_window(stream_id) chunk_size = min(window_size, len(data)) data_to_send = data[:chunk_size] data_to_buffer = data[chunk_size:] if data_to_send: # There's a maximum frame size we have to respect. Because we # aren't paying any attention to priority here, we can quite # safely just split this string up into chunks of max frame # size and blast them out. # # In a *real* application you'd want to consider priority here. max_size = self.conn.max_outbound_frame_size chunks = ( data_to_send[x:x+max_size] for x in range(0, len(data_to_send), max_size) ) for chunk in chunks: self.conn.send_data(stream_id, chunk) self.transport.write(self.conn.data_to_send()) # If there's data left to buffer, we should do that. Put it in a # dictionary and *don't set the event*: the app must not generate # any more data until we got rid of all of this data. if data_to_buffer: self._flow_controlled_data[stream_id] = ( stream_id, data_to_buffer, event ) else: # We sent everything. We can let the WSGI app progress. event.set() def request_received(self, event): """ A HTTP/2 request has been received. We need to invoke the WSGI application in a background thread to handle it. """ # First, we are going to want an object to hold all the relevant state # for this request/response. For that, we have a stream object. We # need to store the stream object somewhere reachable for when data # arrives later. s = Stream(event.stream_id, self) self.streams[event.stream_id] = s # Next, we need to build the WSGI environ dictionary. environ = _build_environ_dict(event.headers, s) # Finally, we want to throw these arguments out to a threadpool and # let it run. self._loop.run_in_executor( None, s.run_in_threadpool, APPLICATION, environ, ) def data_frame_received(self, event): """ Data has been received by WSGI server and needs to be dispatched to a running application. Note that the flow control window is not modified here. That's deliberate: see Stream.__next__ for a longer discussion of why. """ # Grab the stream in question from our dictionary and pass it on. stream = self.streams[event.stream_id] stream.receive_data(event.data, event.flow_controlled_length) def end_stream(self, event): """ The stream data is complete. """ stream = self.streams[event.stream_id] stream.request_complete() def reset_stream(self, event): """ A stream got forcefully reset. This is a tricky thing to deal with because WSGI doesn't really have a good notion for it. Essentially, you have to let the application run until completion, but not actually let it send any data. We do that by discarding any data we currently have for it, and then marking the stream as reset to allow us to spot when that stream is trying to send data and drop that data on the floor. We then *also* signal the WSGI application that no more data is incoming, to ensure that it does not attempt to do further reads of the data. """ if event.stream_id in self._flow_controlled_data: del self._flow_controlled_data[event.stream_id] self._reset_streams.add(event.stream_id) self.end_stream(event) def data_for_stream(self, stream_id, data): """ Thread-safe method called from outside the main asyncio thread in order to send data on behalf of a WSGI application. Places data being written by a stream on an asyncio queue. Returns a threading event that will fire when that data is sent. """ event = threading.Event() self._loop.call_soon_threadsafe( self._stream_data.put_nowait, (stream_id, data, event) ) return event def send_response(self, stream_id, headers): """ Thread-safe method called from outside the main asyncio thread in order to send the HTTP response headers on behalf of a WSGI application. Returns a threading event that will fire when the headers have been emitted to the network. """ event = threading.Event() def _inner_send(stream_id, headers, event): self.conn.send_headers(stream_id, headers, end_stream=False) self.transport.write(self.conn.data_to_send()) event.set() self._loop.call_soon_threadsafe( _inner_send, stream_id, headers, event ) return event def open_flow_control_window(self, stream_id, increment): """ Opens a flow control window for the given stream by the given amount. Called from a WSGI thread. Does not return an event because there's no need to block on this action, it may take place at any time. """ def _inner_open(stream_id, increment): self.conn.increment_flow_control_window(increment, stream_id) self.conn.increment_flow_control_window(increment, None) self.transport.write(self.conn.data_to_send()) self._loop.call_soon_threadsafe( _inner_open, stream_id, increment, ) class Stream: """ This class holds all of the state for a single stream. It also provides several of the callables used by the WSGI application. Finally, it provides the logic for actually interfacing with the WSGI application. For these reasons, the object has *strict* requirements on thread-safety. While the object can be initialized in the main WSGI thread, the ``run_in_threadpool`` method *must* be called from outside that thread. At that point, the main WSGI thread may only call specific methods. """ def __init__(self, stream_id, protocol): self.stream_id = stream_id self._protocol = protocol # Queue for data that has been received from the network. This is a # thread-safe queue, to allow both the WSGI application to block on # receiving more data and to allow the asyncio server to keep sending # more data. # # This queue is unbounded in size, but in practice it cannot contain # too much data because the flow control window doesn't get adjusted # unless data is removed from it. self._received_data = queue.Queue() # This buffer is used to hold partial chunks of data from # _received_data that were not returned out of ``read`` and friends. self._temp_buffer = b'' # Temporary variables that allow us to keep hold of the headers and # response status until such time as the application needs us to send # them. self._response_status = b'' self._response_headers = [] self._headers_emitted = False # Whether the application has received all the data from the network # or not. This allows us to short-circuit some reads. self._complete = False def receive_data(self, data, flow_controlled_size): """ Called by the H2Protocol when more data has been received from the network. Places the data directly on the queue in a thread-safe manner without blocking. Does not introspect or process the data. """ self._received_data.put_nowait((data, flow_controlled_size)) def request_complete(self): """ Called by the H2Protocol when all the request data has been received. This works by placing the ``END_DATA_SENTINEL`` on the queue. The reading code knows, when it sees the ``END_DATA_SENTINEL``, to expect no more data from the network. This ensures that the state of the application only changes when it has finished processing the data from the network, even though the server may have long-since finished receiving all the data for this request. """ self._received_data.put_nowait((END_DATA_SENTINEL, None)) def run_in_threadpool(self, wsgi_application, environ): """ This method should be invoked in a threadpool. At the point this method is invoked, the only safe methods to call from the original thread are ``receive_data`` and ``request_complete``: any other method is unsafe. This method handles the WSGI logic. It invokes the application callable in this thread, passing control over to the WSGI application. It then ensures that the data makes it back to the HTTP/2 connection via the thread-safe APIs provided below. """ result = wsgi_application(environ, self.start_response) try: for data in result: self.write(data) finally: # This signals that we're done with data. The server will know that # this allows it to clean up its state: we're done here. self.write(END_DATA_SENTINEL) # The next few methods are called by the WSGI application. Firstly, the # three methods provided by the input stream. def read(self, size=None): """ Called by the WSGI application to read data. This method is the one of two that explicitly pumps the input data queue, which means it deals with the ``_complete`` flag and the ``END_DATA_SENTINEL``. """ # If we've already seen the END_DATA_SENTINEL, return immediately. if self._complete: return b'' # If we've been asked to read everything, just iterate over ourselves. if size is None: return b''.join(self) # Otherwise, as long as we don't have enough data, spin looking for # another data chunk. data = b'' while len(data) < size: try: chunk = next(self) except StopIteration: break # Concatenating strings this way is slow, but that's ok, this is # just a demo. data += chunk # We have *at least* enough data to return, but we may have too much. # If we do, throw it on a buffer: we'll use it later. to_return = data[:size] self._temp_buffer = data[size:] return to_return def readline(self, hint=None): """ Called by the WSGI application to read a single line of data. This method rigorously observes the ``hint`` parameter: it will only ever read that much data. It then splits the data on a newline character and throws everything it doesn't need into a buffer. """ data = self.read(hint) first_newline = data.find(b'\n') if first_newline == -1: # No newline, return all the data return data # We want to slice the data so that the head *includes* the first # newline. Then, any data left in this line we don't care about should # be prepended to the internal buffer. head, tail = data[:first_newline + 1], data[first_newline + 1:] self._temp_buffer = tail + self._temp_buffer return head def readlines(self, hint=None): """ Called by the WSGI application to read several lines of data. """ data = self.read(hint) lines = data.splitlines(keepends=True) return lines def start_response(self, status, response_headers, exc_info=None): """ This is the PEP-3333 mandated start_response callable. All it does is store the headers for later sending, and return our ```write`` callable. """ if self._headers_emitted and exc_info is not None: raise exc_info[1].with_traceback(exc_info[2]) assert not self._response_status or exc_info is not None self._response_status = status self._response_headers = response_headers return self.write def write(self, data): """ Provides some data to write. This function *blocks* until such time as the data is allowed by HTTP/2 flow control. This allows a client to slow or pause the response as needed. This function is not supposed to be used, according to PEP-3333, but once we have it it becomes quite convenient to use it, so this app actually runs all writes through this function. """ if not self._headers_emitted: self._emit_headers() event = self._protocol.data_for_stream(self.stream_id, data) event.wait() return def _emit_headers(self): """ Sends the response headers. This is only called from the write callable and should only ever be called once. It does some minor processing (converts the status line into a status code because reason phrases are evil) and then passes the headers on to the server. This call explicitly blocks until the server notifies us that the headers have reached the network. """ assert self._response_status and self._response_headers assert not self._headers_emitted self._headers_emitted = True # We only need the status code status = self._response_status.split(" ", 1)[0] headers = [(":status", status)] headers.extend(self._response_headers) event = self._protocol.send_response(self.stream_id, headers) event.wait() return # These two methods implement the iterator protocol. This allows a WSGI # application to iterate over this Stream object to get the data. def __iter__(self): return self def __next__(self): # If the complete request has been read, abort immediately. if self._complete: raise StopIteration() # If we have data stored in a temporary buffer for any reason, return # that and clear the buffer. # # This can actually only happen when the application uses one of the # read* callables, but that's fine. if self._temp_buffer: buffered_data = self._temp_buffer self._temp_buffer = b'' return buffered_data # Otherwise, pull data off the queue (blocking as needed). If this is # the end of the request, we're done here: mark ourselves as complete # and call it time. Otherwise, open the flow control window an # appropriate amount and hand the chunk off. chunk, chunk_size = self._received_data.get() if chunk is END_DATA_SENTINEL: self._complete = True raise StopIteration() # Let's talk a little bit about why we're opening the flow control # window *here*, and not in the server thread. # # The purpose of HTTP/2 flow control is to allow for servers and # clients to avoid needing to buffer data indefinitely because their # peer is producing data faster than they can consume it. As a result, # it's important that the flow control window be opened as late in the # processing as possible. In this case, we open the flow control window # exactly when the server hands the data to the application. This means # that the flow control window essentially signals to the remote peer # how much data hasn't even been *seen* by the application yet. # # If you wanted to be really clever you could consider not opening the # flow control window until the application asks for the *next* chunk # of data. That means that any buffers at the application level are now # included in the flow control window processing. In my opinion, the # advantage of that process does not outweigh the extra logical # complexity involved in doing it, so we don't bother here. # # Another note: you'll notice that we don't include the _temp_buffer in # our flow control considerations. This means you could in principle # lead us to buffer slightly more than one connection flow control # window's worth of data. That risk is considered acceptable for the # much simpler logic available here. # # Finally, this is a pretty dumb flow control window management scheme: # it causes us to emit a *lot* of window updates. A smarter server # would want to use the content-length header to determine whether # flow control window updates need to be emitted at all, and then to be # more efficient about emitting them to avoid firing them off really # frequently. For an example like this, there's very little gained by # worrying about that. self._protocol.open_flow_control_window(self.stream_id, chunk_size) return chunk def _build_environ_dict(headers, stream): """ Build the WSGI environ dictionary for a given request. To do that, we'll temporarily create a dictionary for the headers. While this isn't actually a valid way to represent headers, we know that the special headers we need can only have one appearance in the block. This code is arguably somewhat incautious: the conversion to dictionary should only happen in a way that allows us to correctly join headers that appear multiple times. That's acceptable in a demo app: in a productised version you'd want to fix it. """ header_dict = dict(headers) path = header_dict.pop(':path') try: path, query = path.split('?', 1) except ValueError: query = "" server_name = header_dict.pop(':authority') try: server_name, port = server_name.split(':', 1) except ValueError: port = "8443" environ = { 'REQUEST_METHOD': header_dict.pop(':method'), 'SCRIPT_NAME': '', 'PATH_INFO': path, 'QUERY_STRING': query, 'SERVER_NAME': server_name, 'SERVER_PORT': port, 'SERVER_PROTOCOL': 'HTTP/2', 'HTTPS': "on", 'SSL_PROTOCOL': 'TLSv1.2', 'wsgi.version': (1, 0), 'wsgi.url_scheme': header_dict.pop(':scheme'), 'wsgi.input': stream, 'wsgi.errors': sys.stderr, 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.run_once': False, } if 'content-type' in header_dict: environ['CONTENT_TYPE'] = header_dict.pop('content-type') if 'content-length' in header_dict: environ['CONTENT_LENGTH'] = header_dict.pop('content-length') for name, value in header_dict.items(): environ['HTTP_' + name.upper()] = value return environ # Set up the WSGI app. application_string = sys.argv[1] path, func = application_string.split(':', 1) module = importlib.import_module(path) APPLICATION = getattr(module, func) # Set up TLS ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile="cert.crt", keyfile="cert.key") ssl_context.set_alpn_protocols(["h2"]) # Do the asnycio bits loop = asyncio.get_event_loop() # Each client connection will create a new protocol instance coro = loop.create_server(H2Protocol, '127.0.0.1', 8443, ssl=ssl_context) server = loop.run_until_complete(coro) # Serve requests until Ctrl+C is pressed print('Serving on {}'.format(server.sockets[0].getsockname())) try: loop.run_forever() except KeyboardInterrupt: pass finally: # Close the server server.close() loop.run_until_complete(server.wait_closed()) loop.close() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7623487 h2-4.2.0/examples/curio/0000755000076500000240000000000014747620663014345 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1579434623.0 h2-4.2.0/examples/curio/curio-server.py0000644000076500000240000001525013611041177017331 0ustar00kriechistaff#!/usr/bin/env python3.5 # -*- coding: utf-8 -*- """ curio-server.py ~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for curio. Requires Python 3.5+. """ import mimetypes import os import sys from curio import Event, spawn, socket, ssl, run import h2.config import h2.connection import h2.events # The maximum amount of a file we'll send in a single DATA frame. READ_CHUNK_SIZE = 8192 async def create_listening_ssl_socket(address, certfile, keyfile): """ Create and return a listening TLS socket on a given address. """ ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile) ssl_context.set_alpn_protocols(["h2"]) sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock = await ssl_context.wrap_socket(sock) sock.bind(address) sock.listen() return sock async def h2_server(address, root, certfile, keyfile): """ Create an HTTP/2 server at the given address. """ sock = await create_listening_ssl_socket(address, certfile, keyfile) print("Now listening on %s:%d" % address) async with sock: while True: client, _ = await sock.accept() server = H2Server(client, root) await spawn(server.run()) class H2Server: """ A basic HTTP/2 file server. This is essentially very similar to SimpleHTTPServer from the standard library, but uses HTTP/2 instead of HTTP/1.1. """ def __init__(self, sock, root): config = h2.config.H2Configuration( client_side=False, header_encoding='utf-8' ) self.sock = sock self.conn = h2.connection.H2Connection(config=config) self.root = root self.flow_control_events = {} async def run(self): """ Loop over the connection, managing it appropriately. """ self.conn.initiate_connection() await self.sock.sendall(self.conn.data_to_send()) while True: # 65535 is basically arbitrary here: this amounts to "give me # whatever data you have". data = await self.sock.recv(65535) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, h2.events.RequestReceived): await spawn( self.request_received(event.headers, event.stream_id) ) elif isinstance(event, h2.events.DataReceived): self.conn.reset_stream(event.stream_id) elif isinstance(event, h2.events.WindowUpdated): await self.window_updated(event) await self.sock.sendall(self.conn.data_to_send()) async def request_received(self, headers, stream_id): """ Handle a request by attempting to serve a suitable file. """ headers = dict(headers) assert headers[':method'] == 'GET' path = headers[':path'].lstrip('/') full_path = os.path.join(self.root, path) if not os.path.exists(full_path): response_headers = ( (':status', '404'), ('content-length', '0'), ('server', 'curio-h2'), ) self.conn.send_headers( stream_id, response_headers, end_stream=True ) await self.sock.sendall(self.conn.data_to_send()) else: await self.send_file(full_path, stream_id) async def send_file(self, file_path, stream_id): """ Send a file, obeying the rules of HTTP/2 flow control. """ filesize = os.stat(file_path).st_size content_type, content_encoding = mimetypes.guess_type(file_path) response_headers = [ (':status', '200'), ('content-length', str(filesize)), ('server', 'curio-h2'), ] if content_type: response_headers.append(('content-type', content_type)) if content_encoding: response_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(stream_id, response_headers) await self.sock.sendall(self.conn.data_to_send()) with open(file_path, 'rb', buffering=0) as f: await self._send_file_data(f, stream_id) async def _send_file_data(self, fileobj, stream_id): """ Send the data portion of a file. Handles flow control rules. """ while True: while self.conn.local_flow_control_window(stream_id) < 1: await self.wait_for_flow_control(stream_id) chunk_size = min( self.conn.local_flow_control_window(stream_id), READ_CHUNK_SIZE, ) data = fileobj.read(chunk_size) keep_reading = (len(data) == chunk_size) self.conn.send_data(stream_id, data, not keep_reading) await self.sock.sendall(self.conn.data_to_send()) if not keep_reading: break async def wait_for_flow_control(self, stream_id): """ Blocks until the flow control window for a given stream is opened. """ evt = Event() self.flow_control_events[stream_id] = evt await evt.wait() async def window_updated(self, event): """ Unblock streams waiting on flow control, if needed. """ stream_id = event.stream_id if stream_id and stream_id in self.flow_control_events: evt = self.flow_control_events.pop(stream_id) await evt.set() elif not stream_id: # Need to keep a real list here to use only the events present at # this time. blocked_streams = list(self.flow_control_events.keys()) for stream_id in blocked_streams: event = self.flow_control_events.pop(stream_id) await event.set() return if __name__ == '__main__': host = sys.argv[2] if len(sys.argv) > 2 else "localhost" print("Try GETting:") print(" On OSX after 'brew install curl --with-c-ares --with-libidn --with-nghttp2 --with-openssl':") print("/usr/local/opt/curl/bin/curl --tlsv1.2 --http2 -k https://localhost:5000/bundle.js") print("Or open a browser to: https://localhost:5000/") print(" (Accept all the warnings)") run(h2_server((host, 5000), sys.argv[1], "{}.crt.pem".format(host), "{}.key".format(host)), with_monitor=True) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/curio/localhost.crt.pem0000644000076500000240000000240113137423045017607 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDhTCCAm2gAwIBAgIJAOrxh0dOYJLdMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTA5MTkxNDE2 NDRaFw0xNTEwMTkxNDE2NDRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21l LVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV BAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqt A1iu8EN00FU0eBcBGlLVmNEgV7Jkbukra+kwS8j/U2y50QPGJc/FiIVDfuBqk5dL ACTNc6A/FQcXvWmOc5ixmC3QKKasMpuofqKz0V9C6irZdYXZ9rcsW0gHQIr989yd R+N1VbIlEVW/T9FJL3B2UD9GVIkUELzm47CSOWZvAxQUlsx8CUNuUCWqyZJoqTFN j0LeJDOWGCsug1Pkj0Q1x+jMVL6l6Zf6vMkLNOMsOsWsxUk+0L3tl/OzcTgUOCsw UzY59RIi6Rudrp0oaU8NuHr91yiSqPbKFlX10M9KwEEdnIpcxhND3dacrDycj3ux eWlqKync2vOFUkhwiaMCAwEAAaNQME4wHQYDVR0OBBYEFA0PN+PGoofZ+QIys2Jy 1Zz94vBOMB8GA1UdIwQYMBaAFA0PN+PGoofZ+QIys2Jy1Zz94vBOMAwGA1UdEwQF MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEplethBoPpcP3EbR5Rz6snDDIcbtAJu Ngd0YZppGT+P0DYnPJva4vRG3bb84ZMSuppz5j67qD6DdWte8UXhK8BzWiHzwmQE QmbKyzzTMKQgTNFntpx5cgsSvTtrHpNYoMHzHOmyAOboNeM0DWiRXsYLkWTitLTN qbOpstwPubExbT9lPjLclntShT/lCupt+zsbnrR9YiqlYFY/fDzfAybZhrD5GMBY XdMPItwAc/sWvH31yztarjkLmld76AGCcO5r8cSR/cX98SicyfjOBbSco8GkjYNY 582gTPkKGYpStuN7GNT5tZmxvMq935HRa2XZvlAIe8ufp8EHVoYiF3c= -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/curio/localhost.key0000644000076500000240000000321713137423045017035 0ustar00kriechistaff-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAyq0DWK7wQ3TQVTR4FwEaUtWY0SBXsmRu6Str6TBLyP9TbLnR A8Ylz8WIhUN+4GqTl0sAJM1zoD8VBxe9aY5zmLGYLdAopqwym6h+orPRX0LqKtl1 hdn2tyxbSAdAiv3z3J1H43VVsiURVb9P0UkvcHZQP0ZUiRQQvObjsJI5Zm8DFBSW zHwJQ25QJarJkmipMU2PQt4kM5YYKy6DU+SPRDXH6MxUvqXpl/q8yQs04yw6xazF ST7Qve2X87NxOBQ4KzBTNjn1EiLpG52unShpTw24ev3XKJKo9soWVfXQz0rAQR2c ilzGE0Pd1pysPJyPe7F5aWorKdza84VSSHCJowIDAQABAoIBACp+nh4BB/VMz8Wd q7Q/EfLeQB1Q57JKpoqTBRwueSVai3ZXe4CMEi9/HkG6xiZtkiZ9njkZLq4hq9oB 2z//kzMnwV2RsIRJxI6ohGy+wR51HD4BvEdlTPpY/Yabpqe92VyfSYxidKZWaU0O QMED1EODOw4ZQ+4928iPrJu//PMB4e7TFao0b9Fk/XLWtu5/tQZz9jsrlTi1zthh 7n+oaGNhfTeIJJL4jrhTrKW1CLHXATtr9SJlfZ3wbMxQVeyj2wUlP1V0M6kBuhNj tbGbMpixD5iCNJ49Cm2PHg+wBOfS3ADGIpi3PcGw5mb8nB3N9eGBRPhLShAlq5Hi Lv4tyykCgYEA8u3b3xJ04pxWYN25ou/Sc8xzgDCK4XvDNdHVTuZDjLVA+VTVPzql lw7VvJArsx47MSPvsaX/+4hQXYtfnR7yJpx6QagvQ+z4ludnIZYrQwdUmb9pFL1s 8UNj+3j9QFRPenIiIQ8qxxNIQ9w2HsVQ8scvc9CjYop/YYAPaQyHaL8CgYEA1ZSz CR4NcpfgRSILdhb1dLcyw5Qus1VOSAx3DYkhDkMiB8XZwgMdJjwehJo9yaqRCLE8 Sw5znMnkfoZpu7+skrjK0FqmMpXMH9gIszHvFG8wSw/6+2HIWS19/wOu8dh95LuC 0zurMk8rFqxgWMWF20afhgYrUz42cvUTo10FVB0CgYEAt7mW6W3PArfUSCxIwmb4 VmXREKkl0ATHDYQl/Cb//YHzot467TgQll883QB4XF5HzBFurX9rSzO7/BN1e6I0 52i+ubtWC9xD4fUetXMaQvZfUGxIL8xXgVxDWKQXfLiG54c8Mp6C7s6xf8kjEUCP yR1F0SSA/Pzb+8RbY0p7eocCgYA+1rs+SXtHZev0KyoYGnUpW+Uxqd17ofOgOxqj /t6c5Z+TjeCdtnDTGQkZlo/rT6XQWuUUaDIXxUbW+xEMzj4mBPyXBLS1WWFvVQ5q OpzO9E/PJeqAH6rkof/aEelc+oc/zvOU1o9uA+D3kMvgEm1psIOq2RHSMhGvDPA0 NmAk+QKBgQCwd1681GagdIYSZUCBecnLtevXmIsJyDW2yR1NNcIe/ukcVQREMDvy 5DDkhnGDgnV1D5gYcXb34g9vYvbfTnBMl/JXmMAAG1kIS+3pvHyN6f1poVe3yJV1 yHVuvymnJxKnyaV0L3ntepVvV0vVNIkA3oauoUTLto6txBI+b/ImDA== -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7628403 h2-4.2.0/examples/eventlet/0000755000076500000240000000000014747620663015052 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1547980376.0 h2-4.2.0/examples/eventlet/eventlet-server.py0000644000076500000240000000544313421047130020540 0ustar00kriechistaff# -*- coding: utf-8 -*- """ eventlet-server.py ~~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Eventlet. """ import collections import json import eventlet from eventlet.green.OpenSSL import SSL, crypto from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import RequestReceived, DataReceived class ConnectionManager(object): """ An object that manages a single HTTP/2 connection. """ def __init__(self, sock): config = H2Configuration(client_side=False) self.sock = sock self.conn = H2Connection(config=config) def run_forever(self): self.conn.initiate_connection() self.sock.sendall(self.conn.data_to_send()) while True: data = self.sock.recv(65535) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.conn.reset_stream(event.stream_id) self.sock.sendall(self.conn.data_to_send()) def request_received(self, headers, stream_id): headers = collections.OrderedDict(headers) data = json.dumps({'headers': headers}, indent=4).encode('utf-8') response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'eventlet-h2'), ) self.conn.send_headers(stream_id, response_headers) self.conn.send_data(stream_id, data, end_stream=True) def alpn_callback(conn, protos): if b'h2' in protos: return b'h2' raise RuntimeError("No acceptable protocol offered!") def npn_advertise_cb(conn): return [b'h2'] # Let's set up SSL. This is a lot of work in PyOpenSSL. options = ( SSL.OP_NO_COMPRESSION | SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_NO_TLSv1 | SSL.OP_NO_TLSv1_1 ) context = SSL.Context(SSL.SSLv23_METHOD) context.set_options(options) context.set_verify(SSL.VERIFY_NONE, lambda *args: True) context.use_privatekey_file('server.key') context.use_certificate_file('server.crt') context.set_npn_advertise_callback(npn_advertise_cb) context.set_alpn_select_callback(alpn_callback) context.set_cipher_list( "ECDHE+AESGCM" ) context.set_tmp_ecdh(crypto.get_elliptic_curve(u'prime256v1')) server = eventlet.listen(('0.0.0.0', 443)) server = SSL.Connection(context, server) pool = eventlet.GreenPool() while True: try: new_sock, _ = server.accept() manager = ConnectionManager(new_sock) pool.spawn_n(manager.run_forever) except (SystemExit, KeyboardInterrupt): break ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/eventlet/server.crt0000644000076500000240000000227413137423045017062 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/eventlet/server.key0000644000076500000240000000321713137423045017060 0ustar00kriechistaff-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7632942 h2-4.2.0/examples/fragments/0000755000076500000240000000000014747620663015212 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1579434623.0 h2-4.2.0/examples/fragments/client_https_setup_fragment.py0000644000076500000240000000745713611041177023366 0ustar00kriechistaff# -*- coding: utf-8 -*- """ Client HTTPS Setup ~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 client that negotiates HTTP/2 using NPN and ALPN. For the sake of maximum explanatory value this code uses the synchronous, low-level sockets API: however, if you're not using sockets directly (e.g. because you're using asyncio), you should focus on the set up required for the SSLContext object. For other concurrency libraries you may need to use other setup (e.g. for Twisted you'll need to use IProtocolNegotiationFactory). This code requires Python 3.5 or later. """ import h2.connection import socket import ssl def establish_tcp_connection(): """ This function establishes a client-side TCP connection. How it works isn't very important to this example. For the purpose of this example we connect to localhost. """ return socket.create_connection(('localhost', 443)) def get_http2_ssl_context(): """ This function creates an SSLContext object that is suitably configured for HTTP/2. If you're working with Python TLS directly, you'll want to do the exact same setup as this function does. """ # Get the basic context from the standard library. ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH) # RFC 7540 Section 9.2: Implementations of HTTP/2 MUST use TLS version 1.2 # or higher. Disable TLS 1.1 and lower. ctx.options |= ( ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ) # RFC 7540 Section 9.2.1: A deployment of HTTP/2 over TLS 1.2 MUST disable # compression. ctx.options |= ssl.OP_NO_COMPRESSION # RFC 7540 Section 9.2.2: "deployments of HTTP/2 that use TLS 1.2 MUST # support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". In practice, the # blocklist defined in this section allows only the AES GCM and ChaCha20 # cipher suites with ephemeral key negotiation. ctx.set_ciphers("ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20") # We want to negotiate using NPN and ALPN. ALPN is mandatory, but NPN may # be absent, so allow that. This setup allows for negotiation of HTTP/1.1. ctx.set_alpn_protocols(["h2", "http/1.1"]) try: ctx.set_npn_protocols(["h2", "http/1.1"]) except NotImplementedError: pass return ctx def negotiate_tls(tcp_conn, context): """ Given an established TCP connection and a HTTP/2-appropriate TLS context, this function: 1. wraps TLS around the TCP connection. 2. confirms that HTTP/2 was negotiated and, if it was not, throws an error. """ # Note that SNI is mandatory for HTTP/2, so you *must* pass the # server_hostname argument. tls_conn = context.wrap_socket(tcp_conn, server_hostname='localhost') # Always prefer the result from ALPN to that from NPN. # You can only check what protocol was negotiated once the handshake is # complete. negotiated_protocol = tls_conn.selected_alpn_protocol() if negotiated_protocol is None: negotiated_protocol = tls_conn.selected_npn_protocol() if negotiated_protocol != "h2": raise RuntimeError("Didn't negotiate HTTP/2!") return tls_conn def main(): # Step 1: Set up your TLS context. context = get_http2_ssl_context() # Step 2: Create a TCP connection. connection = establish_tcp_connection() # Step 3: Wrap the connection in TLS and validate that we negotiated HTTP/2 tls_connection = negotiate_tls(connection, context) # Step 4: Create a client-side H2 connection. http2_connection = h2.connection.H2Connection() # Step 5: Initiate the connection http2_connection.initiate_connection() tls_connection.sendall(http2_connection.data_to_send()) # The TCP, TLS, and HTTP/2 handshakes are now complete. You can enter your # main loop now. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/examples/fragments/client_upgrade_fragment.py0000644000076500000240000000721714744263537022443 0ustar00kriechistaff# -*- coding: utf-8 -*- """ Client Plaintext Upgrade ~~~~~~~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 client that uses the plaintext HTTP Upgrade mechanism to negotiate HTTP/2 connectivity. For maximum explanatory value it uses the synchronous socket API that comes with the Python standard library. In product code you will want to use an actual HTTP/1.1 client if possible. This code requires Python 3.5 or later. """ import h2.connection import socket def establish_tcp_connection(): """ This function establishes a client-side TCP connection. How it works isn't very important to this example. For the purpose of this example we connect to localhost. """ return socket.create_connection(('localhost', 80)) def send_initial_request(connection, settings): """ For the sake of this upgrade demonstration, we're going to issue a GET request against the root of the site. In principle the best request to issue for an upgrade is actually ``OPTIONS *``, but this is remarkably poorly supported and can break in weird ways. """ # Craft our initial request per RFC 7540 Section 3.2. This requires two # special header fields: the Upgrade headre, and the HTTP2-Settings header. # The value of the HTTP2-Settings header field comes from h2. request = ( b"GET / HTTP/1.1\r\n" + b"Host: localhost\r\n" + b"Upgrade: h2c\r\n" + b"HTTP2-Settings: " + settings + b"\r\n" + b"\r\n" ) connection.sendall(request) def get_upgrade_response(connection): """ This function reads from the socket until the HTTP/1.1 end-of-headers sequence (CRLFCRLF) is received. It then checks what the status code of the response is. This is not a substitute for proper HTTP/1.1 parsing, but it's good enough for example purposes. """ data = b'' while b'\r\n\r\n' not in data: data += connection.recv(8192) headers, rest = data.split(b'\r\n\r\n', 1) # An upgrade response begins HTTP/1.1 101 Switching Protocols. Look for the # code. In production code you should also check that the upgrade is to # h2c, but here we know we only offered one upgrade so there's only one # possible upgrade in use. split_headers = headers.split() if split_headers[1] != b'101': raise RuntimeError("Not upgrading!") # We don't care about the HTTP/1.1 data anymore, but we do care about # any other data we read from the socket: this is going to be HTTP/2 data # that must be passed to the H2Connection. return rest def main(): """ The client upgrade flow. """ # Step 1: Establish the TCP connection. connection = establish_tcp_connection() # Step 2: Create H2 Connection object, put it in upgrade mode, and get the # value of the HTTP2-Settings header we want to use. h2_connection = h2.connection.H2Connection() settings_header_value = h2_connection.initiate_upgrade_connection() # Step 3: Send the initial HTTP/1.1 request with the upgrade fields. send_initial_request(connection, settings_header_value) # Step 4: Read the HTTP/1.1 response, look for 101 response. extra_data = get_upgrade_response(connection) # Step 5: Immediately send the pending HTTP/2 data. connection.sendall(h2_connection.data_to_send()) # Step 6: Feed the body data to the connection. events = connection.receive_data(extra_data) # Now you can enter your main loop, beginning by processing the first set # of events above. These events may include ResponseReceived, which will # contain the response to the request we made in Step 3. main_loop(events) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1579434623.0 h2-4.2.0/examples/fragments/server_https_setup_fragment.py0000644000076500000240000000744313611041177023411 0ustar00kriechistaff# -*- coding: utf-8 -*- """ Server HTTPS Setup ~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 server that negotiates HTTP/2 using NPN and ALPN. For the sake of maximum explanatory value this code uses the synchronous, low-level sockets API: however, if you're not using sockets directly (e.g. because you're using asyncio), you should focus on the set up required for the SSLContext object. For other concurrency libraries you may need to use other setup (e.g. for Twisted you'll need to use IProtocolNegotiationFactory). This code requires Python 3.5 or later. """ import h2.config import h2.connection import socket import ssl def establish_tcp_connection(): """ This function establishes a server-side TCP connection. How it works isn't very important to this example. """ bind_socket = socket.socket() bind_socket.bind(('', 443)) bind_socket.listen(5) return bind_socket.accept()[0] def get_http2_ssl_context(): """ This function creates an SSLContext object that is suitably configured for HTTP/2. If you're working with Python TLS directly, you'll want to do the exact same setup as this function does. """ # Get the basic context from the standard library. ctx = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) # RFC 7540 Section 9.2: Implementations of HTTP/2 MUST use TLS version 1.2 # or higher. Disable TLS 1.1 and lower. ctx.options |= ( ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ) # RFC 7540 Section 9.2.1: A deployment of HTTP/2 over TLS 1.2 MUST disable # compression. ctx.options |= ssl.OP_NO_COMPRESSION # RFC 7540 Section 9.2.2: "deployments of HTTP/2 that use TLS 1.2 MUST # support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256". In practice, the # blocklist defined in this section allows only the AES GCM and ChaCha20 # cipher suites with ephemeral key negotiation. ctx.set_ciphers("ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20") # We want to negotiate using NPN and ALPN. ALPN is mandatory, but NPN may # be absent, so allow that. This setup allows for negotiation of HTTP/1.1. ctx.set_alpn_protocols(["h2", "http/1.1"]) try: ctx.set_npn_protocols(["h2", "http/1.1"]) except NotImplementedError: pass return ctx def negotiate_tls(tcp_conn, context): """ Given an established TCP connection and a HTTP/2-appropriate TLS context, this function: 1. wraps TLS around the TCP connection. 2. confirms that HTTP/2 was negotiated and, if it was not, throws an error. """ tls_conn = context.wrap_socket(tcp_conn, server_side=True) # Always prefer the result from ALPN to that from NPN. # You can only check what protocol was negotiated once the handshake is # complete. negotiated_protocol = tls_conn.selected_alpn_protocol() if negotiated_protocol is None: negotiated_protocol = tls_conn.selected_npn_protocol() if negotiated_protocol != "h2": raise RuntimeError("Didn't negotiate HTTP/2!") return tls_conn def main(): # Step 1: Set up your TLS context. context = get_http2_ssl_context() # Step 2: Receive a TCP connection. connection = establish_tcp_connection() # Step 3: Wrap the connection in TLS and validate that we negotiated HTTP/2 tls_connection = negotiate_tls(connection, context) # Step 4: Create a server-side H2 connection. config = h2.config.H2Configuration(client_side=False) http2_connection = h2.connection.H2Connection(config=config) # Step 5: Initiate the connection http2_connection.initiate_connection() tls_connection.sendall(http2_connection.data_to_send()) # The TCP, TLS, and HTTP/2 handshakes are now complete. You can enter your # main loop now. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/examples/fragments/server_upgrade_fragment.py0000644000076500000240000000611614744263537022470 0ustar00kriechistaff# -*- coding: utf-8 -*- """ Server Plaintext Upgrade ~~~~~~~~~~~~~~~~~~~~~~~~ This example code fragment demonstrates how to set up a HTTP/2 server that uses the plaintext HTTP Upgrade mechanism to negotiate HTTP/2 connectivity. For maximum explanatory value it uses the synchronous socket API that comes with the Python standard library. In product code you will want to use an actual HTTP/1.1 server library if possible. This code requires Python 3.5 or later. """ import h2.config import h2.connection import re import socket def establish_tcp_connection(): """ This function establishes a server-side TCP connection. How it works isn't very important to this example. """ bind_socket = socket.socket() bind_socket.bind(('', 443)) bind_socket.listen(5) return bind_socket.accept()[0] def receive_initial_request(connection): """ We're going to receive a request. For the sake of this example, we're going to assume that the first request has no body. If it doesn't have the Upgrade: h2c header field and the HTTP2-Settings header field, we'll throw errors. In production code, you should use a proper HTTP/1.1 parser and actually serve HTTP/1.1 requests! Returns the value of the HTTP2-Settings header field. """ data = b'' while not data.endswith(b'\r\n\r\n'): data += connection.recv(8192) match = re.search(b'Upgrade: h2c\r\n', data) if match is None: raise RuntimeError("HTTP/2 upgrade not requested!") # We need to look for the HTTP2-Settings header field. Again, in production # code you shouldn't use regular expressions for this, but it's good enough # for the example. match = re.search(b'HTTP2-Settings: (\\S+)\r\n', data) if match is None: raise RuntimeError("HTTP2-Settings header field not present!") return match.group(1) def send_upgrade_response(connection): """ This function writes the 101 Switching Protocols response. """ response = ( b"HTTP/1.1 101 Switching Protocols\r\n" b"Upgrade: h2c\r\n" b"\r\n" ) connection.sendall(response) def main(): """ The server upgrade flow. """ # Step 1: Establish the TCP connection. connection = establish_tcp_connection() # Step 2: Read the response. We expect this to request an upgrade. settings_header_value = receive_initial_request(connection) # Step 3: Create a H2Connection object in server mode, and pass it the # value of the HTTP2-Settings header field. config = h2.config.H2Configuration(client_side=False) h2_connection = h2.connection.H2Connection(config=config) h2_connection.initiate_upgrade_connection( settings_header=settings_header_value ) # Step 4: Send the 101 Switching Protocols response. send_upgrade_response(connection) # Step 5: Send pending HTTP/2 data. connection.sendall(h2_connection.data_to_send()) # At this point, you can enter your main loop. The first step has to be to # send the response to the initial HTTP/1.1 request you received on stream # 1. main_loop() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7637086 h2-4.2.0/examples/gevent/0000755000076500000240000000000014747620663014514 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1597496595.0 h2-4.2.0/examples/gevent/gevent-server.py0000644000076500000240000001477113715756423017672 0ustar00kriechistaff# -*- coding: utf-8 -*- """ gevent-server.py ================ A simple HTTP/2 server written for gevent serving static files from a directory specified as input. If no directory is provided, the current directory will be used. """ import mimetypes import sys from functools import partial from pathlib import Path from typing import Tuple, Dict, Optional from gevent import socket, ssl from gevent.event import Event from gevent.server import StreamServer from h2 import events from h2.config import H2Configuration from h2.connection import H2Connection def get_http2_tls_context() -> ssl.SSLContext: ctx = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) ctx.options |= ( ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ) ctx.options |= ssl.OP_NO_COMPRESSION ctx.set_ciphers('ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20') ctx.load_cert_chain(certfile='localhost.crt', keyfile='localhost.key') ctx.set_alpn_protocols(['h2']) try: ctx.set_npn_protocols(['h2']) except NotImplementedError: pass return ctx class H2Worker: def __init__(self, sock: socket, address: Tuple[str, str], source_dir: str = None): self._sock = sock self._address = address self._flow_control_events: Dict[int, Event] = {} self._server_name = 'gevent-h2' self._connection: Optional[H2Connection] = None self._read_chunk_size = 8192 # The maximum amount of a file we'll send in a single DATA frame self._check_sources_dir(source_dir) self._sources_dir = source_dir self._run() def _initiate_connection(self): config = H2Configuration(client_side=False, header_encoding='utf-8') self._connection = H2Connection(config=config) self._connection.initiate_connection() self._sock.sendall(self._connection.data_to_send()) @staticmethod def _check_sources_dir(sources_dir: str) -> None: p = Path(sources_dir) if not p.is_dir(): raise NotADirectoryError(f'{sources_dir} does not exists') def _send_error_response(self, status_code: str, event: events.RequestReceived) -> None: self._connection.send_headers( stream_id=event.stream_id, headers=[ (':status', status_code), ('content-length', '0'), ('server', self._server_name), ], end_stream=True ) self._sock.sendall(self._connection.data_to_send()) def _handle_request(self, event: events.RequestReceived) -> None: headers = dict(event.headers) if headers[':method'] != 'GET': self._send_error_response('405', event) return file_path = Path(self._sources_dir) / headers[':path'].lstrip('/') if not file_path.is_file(): self._send_error_response('404', event) return self._send_file(file_path, event.stream_id) def _send_file(self, file_path: Path, stream_id: int) -> None: """ Send a file, obeying the rules of HTTP/2 flow control. """ file_size = file_path.stat().st_size content_type, content_encoding = mimetypes.guess_type(str(file_path)) response_headers = [ (':status', '200'), ('content-length', str(file_size)), ('server', self._server_name) ] if content_type: response_headers.append(('content-type', content_type)) if content_encoding: response_headers.append(('content-encoding', content_encoding)) self._connection.send_headers(stream_id, response_headers) self._sock.sendall(self._connection.data_to_send()) with file_path.open(mode='rb', buffering=0) as f: self._send_file_data(f, stream_id) def _send_file_data(self, file_obj, stream_id: int) -> None: """ Send the data portion of a file. Handles flow control rules. """ while True: while self._connection.local_flow_control_window(stream_id) < 1: self._wait_for_flow_control(stream_id) chunk_size = min(self._connection.local_flow_control_window(stream_id), self._read_chunk_size) data = file_obj.read(chunk_size) keep_reading = (len(data) == chunk_size) self._connection.send_data(stream_id, data, not keep_reading) self._sock.sendall(self._connection.data_to_send()) if not keep_reading: break def _wait_for_flow_control(self, stream_id: int) -> None: """ Blocks until the flow control window for a given stream is opened. """ event = Event() self._flow_control_events[stream_id] = event event.wait() def _handle_window_update(self, event: events.WindowUpdated) -> None: """ Unblock streams waiting on flow control, if needed. """ stream_id = event.stream_id if stream_id and stream_id in self._flow_control_events: g_event = self._flow_control_events.pop(stream_id) g_event.set() elif not stream_id: # Need to keep a real list here to use only the events present at this time. blocked_streams = list(self._flow_control_events.keys()) for stream_id in blocked_streams: g_event = self._flow_control_events.pop(stream_id) g_event.set() def _run(self) -> None: self._initiate_connection() while True: data = self._sock.recv(65535) if not data: break h2_events = self._connection.receive_data(data) for event in h2_events: if isinstance(event, events.RequestReceived): self._handle_request(event) elif isinstance(event, events.DataReceived): self._connection.reset_stream(event.stream_id) elif isinstance(event, events.WindowUpdated): self._handle_window_update(event) data_to_send = self._connection.data_to_send() if data_to_send: self._sock.sendall(data_to_send) if __name__ == '__main__': files_dir = sys.argv[1] if len(sys.argv) > 1 else f'{Path().cwd()}' server = StreamServer(('127.0.0.1', 8080), partial(H2Worker, source_dir=files_dir), ssl_context=get_http2_tls_context()) try: server.serve_forever() except KeyboardInterrupt: server.close() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1597496595.0 h2-4.2.0/examples/gevent/localhost.crt0000644000076500000240000000227713715756423017224 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDVDCCAjwCCQC1RoAIsDX89zANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQGEwJG UjEWMBQGA1UECAwNSWxlLWRlLUZyYW5jZTEOMAwGA1UEBwwFUGFyaXMxITAfBgNV BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDESMBAGA1UEAwwJbG9jYWxob3N0 MB4XDTE5MDgzMDAzNDcwN1oXDTIwMDgyOTAzNDcwN1owbDELMAkGA1UEBhMCRlIx FjAUBgNVBAgMDUlsZS1kZS1GcmFuY2UxDjAMBgNVBAcMBVBhcmlzMSEwHwYDVQQK DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANexqhW+b7Mx2lj5csv7Uq7T St6RWEocEUtuwBUsQ3VGOUTjN0dRxGeeZdDvZYrVsKhMwT1EeoXYlleQJPSEgW1d E5Mx6t4okWtG5D8YbIDMLRqLMpOqGSH1VZDU6l9ZN2UCTBtIVZN+Mg/q36cQOkwE Rp+BBiOU4dgKKms5d5QfOi3wPNEdeU0z77qxOuI9WmnMxvxM+vySkt2mHV/ptW4w XZDZ9QC/IHhXhjkSlQuL/TUptJ2UtlEXtn5NcNAWROl7xTMVHfIiFVW4oW39KIrA zGH5qYlJG/gUhJBTU7K5N5J1c/Y3FyNIeOgHMQr6MnKugV7JyOZYxjXGgdXOUNMC AwEAATANBgkqhkiG9w0BAQsFAAOCAQEAUuGdTOWJ0SspGs6zU50lt+GxXo5xO8HE y7RiOnorJVE23dgVAyaDDcnIfsF+usobACHRlqirn2jvY5A7TIEM7Wlw5c1zrCAW bDzPJS0h6Hub05WQQmU734Ro1et7WFUrFRlDQUHJADgEAXRhXlm2Uk7Ay1PlCIz9 802neyhWErL6bb7zxV5fWTu7RA3XUAX2ZrYO3XLhcsK7SnpT0whoBI06c1GxDkgV wFeYv8PBH5iQWhIft8EeTrNvNa+dusnppuM21sWWzItRnFef+ATixdDGIpDitAfs cfIUalb3BBdn4PXamN7EhWzHJlcME1cerjQ4YoEynWmT2blk1XUg9A== -----END CERTIFICATE-----././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1597496595.0 h2-4.2.0/examples/gevent/localhost.key0000644000076500000240000000325313715756423017217 0ustar00kriechistaff-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDXsaoVvm+zMdpY +XLL+1Ku00rekVhKHBFLbsAVLEN1RjlE4zdHUcRnnmXQ72WK1bCoTME9RHqF2JZX kCT0hIFtXROTMereKJFrRuQ/GGyAzC0aizKTqhkh9VWQ1OpfWTdlAkwbSFWTfjIP 6t+nEDpMBEafgQYjlOHYCiprOXeUHzot8DzRHXlNM++6sTriPVppzMb8TPr8kpLd ph1f6bVuMF2Q2fUAvyB4V4Y5EpULi/01KbSdlLZRF7Z+TXDQFkTpe8UzFR3yIhVV uKFt/SiKwMxh+amJSRv4FISQU1OyuTeSdXP2NxcjSHjoBzEK+jJyroFeycjmWMY1 xoHVzlDTAgMBAAECggEBAKqtYIxyNAtVMJVlVmyJBAVpFv6FfpquGRVans5iR0L+ fYTAU1axIjxoP+MT/ILe0zpp+iNUE6vkFhtV6Zg/Xfc/RqUcQ+DlsyRzZVt0JS/J 4Qr3CN+GIvsXGk1P3eHzQ/0+0yBnnafnnQ+xaKbXFXpfi87dlxEC169PY/+S6see dcPYw8LB8rI+mIIPvM/V2VtobZb9BFUsN4Dq8H1tRR97ST4TRbwov66o17Fvn5ww mXUwHjhdgxaJLtxJwppMhhSuST64mwoNY8XNWE0PlaB5jxKCNuWYYurjEJLJcBa7 3lYadsRTucoiRbsTcqpivsa3KWxNRJcZERWVN4LVQvkCgYEA+E5zgVHbKfjCGs9x Xv1uVLjpdsh2S/7Zkx95vc4rBoLe8ii1uSpcLHytB7F5bPZV3Tiivu8OpW3E+8n6 8mxQHSomSioxTE+xXF4JMf5XY2l9Tvz/60mo/dxk9Yo9k79OIJDUJrnpc18iYtRp B3X2g7JfqpT/RbG0bs2YVa/R3z8CgYEA3mCIm0Y0b6mpTxQNk6fcH2YXe1mdRp5Y 9O+wVTNwmwB2vZZVm/K/wmOstsO1P+/PzwJ/WcBV9TlLlZRxxs/yNNU8NM7+7l3O e0ucCNRqhi9P19SA7l18FroOtOv2DatvXpNJTM6fXgE7dPQm5NKrNKK6nv03OUzQ BLLBBtzv/W0CgYEA6LU9cvkwGQnVgCLh8VA6UpRp2LTOiTJy3nslMUlC8Xs9Tl3w 0XRtphPCZe9iCUhj+EvX2nFYnJlff0owMXppKqwR7nfUc9xMMHDA1WW0qKp4kcpy XiROiHxA8g144DruEX8qFJEvxLxoEY9YT3GycoJ9PfUduEdu/lkYZ1W7rykCgYB0 mw/mw9hpGQDzu2MnIuUU/dagUqxaxFuHDExdUNziGkspPLRlUtPknZmKOHNJNHm2 ZevbZzRrowCUTcOfaZjqxUmNs2EQItZL5qjKJIA7HoHyfbahxxlzXVqq2fQq1NNQ N1E/WjVM+L5xpDjk0eb+cboD9mlHvZRycj0vWRjqvQKBgQDP1xotkMqYwnMnpoRQ e3bqhIQFeoqIehsl2e/F+5yZ43plvEXavxshNJS3gGr1MflexcjqEaiHdfdK84zL mJuPYn0Uz5fP336aepzVsxK78tW4ilZri2mPbpBYgJskc6Ud7ue5zhBtuQnu5rV4 zcuL1QjSQA+KW88b4DU/Usp6Eg== -----END PRIVATE KEY-----././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7638967 h2-4.2.0/examples/plain_sockets/0000755000076500000240000000000014747620663016062 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1631462011.0 h2-4.2.0/examples/plain_sockets/plain_sockets_client.py0000644000076500000240000000371514117421173022620 0ustar00kriechistaff#!/usr/bin/env python3 """ plain_sockets_client.py ~~~~~~~~~~~~~~~~~~~~~~~ Just enough code to send a GET request via h2 to an HTTP/2 server and receive a response body. This is *not* a complete production-ready HTTP/2 client! """ import socket import ssl import certifi import h2.connection import h2.events SERVER_NAME = 'http2.golang.org' SERVER_PORT = 443 # generic socket and ssl configuration socket.setdefaulttimeout(15) ctx = ssl.create_default_context(cafile=certifi.where()) ctx.set_alpn_protocols(['h2']) # open a socket to the server and initiate TLS/SSL s = socket.create_connection((SERVER_NAME, SERVER_PORT)) s = ctx.wrap_socket(s, server_hostname=SERVER_NAME) c = h2.connection.H2Connection() c.initiate_connection() s.sendall(c.data_to_send()) headers = [ (':method', 'GET'), (':path', '/reqinfo'), (':authority', SERVER_NAME), (':scheme', 'https'), ] c.send_headers(1, headers, end_stream=True) s.sendall(c.data_to_send()) body = b'' response_stream_ended = False while not response_stream_ended: # read raw data from the socket data = s.recv(65536 * 1024) if not data: break # feed raw data into h2, and process resulting events events = c.receive_data(data) for event in events: print(event) if isinstance(event, h2.events.DataReceived): # update flow control so the server doesn't starve us c.acknowledge_received_data(event.flow_controlled_length, event.stream_id) # more response body data received body += event.data if isinstance(event, h2.events.StreamEnded): # response body completed, let's exit the loop response_stream_ended = True break # send any pending data to the server s.sendall(c.data_to_send()) print("Response fully received:") print(body.decode()) # tell the server we are closing the h2 connection c.close_connection() s.sendall(c.data_to_send()) # close the socket s.close() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7643301 h2-4.2.0/examples/tornado/0000755000076500000240000000000014747620663014672 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/tornado/server.crt0000644000076500000240000000227413137423045016702 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/tornado/server.key0000644000076500000240000000321713137423045016700 0ustar00kriechistaff-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439549.0 h2-4.2.0/examples/tornado/tornado-server.py0000755000076500000240000000527513137423075020220 0ustar00kriechistaff#!/usr/bin/env python # -*- coding: utf-8 -*- """ tornado-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Tornado. """ import collections import json import ssl import tornado.gen import tornado.ioloop import tornado.iostream import tornado.tcpserver from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import RequestReceived, DataReceived def create_ssl_context(certfile, keyfile): ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.options |= ( ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 | ssl.OP_NO_COMPRESSION ) ssl_context.set_ciphers("ECDHE+AESGCM") ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile) ssl_context.set_alpn_protocols(["h2"]) return ssl_context class H2Server(tornado.tcpserver.TCPServer): @tornado.gen.coroutine def handle_stream(self, stream, address): handler = EchoHeadersHandler(stream) yield handler.handle() class EchoHeadersHandler(object): def __init__(self, stream): self.stream = stream config = H2Configuration(client_side=False) self.conn = H2Connection(config=config) @tornado.gen.coroutine def handle(self): self.conn.initiate_connection() yield self.stream.write(self.conn.data_to_send()) while True: try: data = yield self.stream.read_bytes(65535, partial=True) if not data: break events = self.conn.receive_data(data) for event in events: if isinstance(event, RequestReceived): self.request_received(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.conn.reset_stream(event.stream_id) yield self.stream.write(self.conn.data_to_send()) except tornado.iostream.StreamClosedError: break def request_received(self, headers, stream_id): headers = collections.OrderedDict(headers) data = json.dumps({'headers': headers}, indent=4).encode('utf-8') response_headers = ( (':status', '200'), ('content-type', 'application/json'), ('content-length', str(len(data))), ('server', 'tornado-h2'), ) self.conn.send_headers(stream_id, response_headers) self.conn.send_data(stream_id, data, end_stream=True) if __name__ == '__main__': ssl_context = create_ssl_context('server.crt', 'server.key') server = H2Server(ssl_options=ssl_context) server.listen(8888) io_loop = tornado.ioloop.IOLoop.current() io_loop.start() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7651286 h2-4.2.0/examples/twisted/0000755000076500000240000000000014747620663014707 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/examples/twisted/head_request.py0000644000076500000240000000640614036557047017734 0ustar00kriechistaff# -*- coding: utf-8 -*- """ head_request.py ~~~~~~~~~~~~~~~ A short example that demonstrates a client that makes HEAD requests to certain websites. This example is intended as a reproduction of nghttp2 issue 396, for the purposes of compatibility testing. """ from __future__ import print_function from twisted.internet import reactor from twisted.internet.endpoints import connectProtocol, SSL4ClientEndpoint from twisted.internet.protocol import Protocol from twisted.internet.ssl import optionsForClientTLS from hyperframe.frame import SettingsFrame from h2.connection import H2Connection from h2.events import ( ResponseReceived, DataReceived, StreamEnded, StreamReset, SettingsAcknowledged, ) AUTHORITY = u'nghttp2.org' PATH = '/httpbin/' SIZE = 4096 class H2Protocol(Protocol): def __init__(self): self.conn = H2Connection() self.known_proto = None self.request_made = False def connectionMade(self): self.conn.initiate_connection() # This reproduces the error in #396, by changing the header table size. self.conn.update_settings({SettingsFrame.HEADER_TABLE_SIZE: SIZE}) self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): if not self.known_proto: self.known_proto = self.transport.negotiatedProtocol assert self.known_proto == b'h2' events = self.conn.receive_data(data) for event in events: if isinstance(event, ResponseReceived): self.handleResponse(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.handleData(event.data, event.stream_id) elif isinstance(event, StreamEnded): self.endStream(event.stream_id) elif isinstance(event, SettingsAcknowledged): self.settingsAcked(event) elif isinstance(event, StreamReset): reactor.stop() raise RuntimeError("Stream reset: %d" % event.error_code) else: print(event) data = self.conn.data_to_send() if data: self.transport.write(data) def settingsAcked(self, event): # Having received the remote settings change, lets send our request. if not self.request_made: self.sendRequest() def handleResponse(self, response_headers, stream_id): for name, value in response_headers: print("%s: %s" % (name.decode('utf-8'), value.decode('utf-8'))) print("") def handleData(self, data, stream_id): print(data, end='') def endStream(self, stream_id): self.conn.close_connection() self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() reactor.stop() def sendRequest(self): request_headers = [ (':method', 'HEAD'), (':authority', AUTHORITY), (':scheme', 'https'), (':path', PATH), ] self.conn.send_headers(1, request_headers, end_stream=True) self.request_made = True options = optionsForClientTLS( hostname=AUTHORITY, acceptableProtocols=[b'h2'], ) connectProtocol( SSL4ClientEndpoint(reactor, AUTHORITY, 443, options), H2Protocol() ) reactor.run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/examples/twisted/post_request.py0000644000076500000240000002057114036557047020017 0ustar00kriechistaff# -*- coding: utf-8 -*- """ post_request.py ~~~~~~~~~~~~~~~ A short example that demonstrates a client that makes POST requests to certain websites. This example is intended to demonstrate how to handle uploading request bodies. In this instance, a file will be uploaded. In order to handle arbitrary files, this example also demonstrates how to obey HTTP/2 flow control rules. Takes one command-line argument: a path to a file in the filesystem to upload. If none is present, uploads this file. """ from __future__ import print_function import mimetypes import os import sys from twisted.internet import reactor, defer from twisted.internet.endpoints import connectProtocol, SSL4ClientEndpoint from twisted.internet.protocol import Protocol from twisted.internet.ssl import optionsForClientTLS from h2.connection import H2Connection from h2.events import ( ResponseReceived, DataReceived, StreamEnded, StreamReset, WindowUpdated, SettingsAcknowledged, ) AUTHORITY = u'nghttp2.org' PATH = '/httpbin/post' class H2Protocol(Protocol): def __init__(self, file_path): self.conn = H2Connection() self.known_proto = None self.request_made = False self.request_complete = False self.file_path = file_path self.flow_control_deferred = None self.fileobj = None self.file_size = None def connectionMade(self): """ Called by Twisted when the TCP connection is established. We can start sending some data now: we should open with the connection preamble. """ self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): """ Called by Twisted when data is received on the connection. We need to check a few things here. Firstly, we want to validate that we actually negotiated HTTP/2: if we didn't, we shouldn't proceed! Then, we want to pass the data to the protocol stack and check what events occurred. """ if not self.known_proto: self.known_proto = self.transport.negotiatedProtocol assert self.known_proto == b'h2' events = self.conn.receive_data(data) for event in events: if isinstance(event, ResponseReceived): self.handleResponse(event.headers) elif isinstance(event, DataReceived): self.handleData(event.data) elif isinstance(event, StreamEnded): self.endStream() elif isinstance(event, SettingsAcknowledged): self.settingsAcked(event) elif isinstance(event, StreamReset): reactor.stop() raise RuntimeError("Stream reset: %d" % event.error_code) elif isinstance(event, WindowUpdated): self.windowUpdated(event) data = self.conn.data_to_send() if data: self.transport.write(data) def settingsAcked(self, event): """ Called when the remote party ACKs our settings. We send a SETTINGS frame as part of the preamble, so if we want to be very polite we can wait until the ACK for that frame comes before we start sending our request. """ if not self.request_made: self.sendRequest() def handleResponse(self, response_headers): """ Handle the response by printing the response headers. """ for name, value in response_headers: print("%s: %s" % (name.decode('utf-8'), value.decode('utf-8'))) print("") def handleData(self, data): """ We handle data that's received by just printing it. """ print(data, end='') def endStream(self): """ We call this when the stream is cleanly ended by the remote peer. That means that the response is complete. Because this code only makes a single HTTP/2 request, once we receive the complete response we can safely tear the connection down and stop the reactor. We do that as cleanly as possible. """ self.request_complete = True self.conn.close_connection() self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() def windowUpdated(self, event): """ We call this when the flow control window for the connection or the stream has been widened. If there's a flow control deferred present (that is, if we're blocked behind the flow control), we fire it. Otherwise, we do nothing. """ if self.flow_control_deferred is None: return # Make sure we remove the flow control deferred to avoid firing it # more than once. flow_control_deferred = self.flow_control_deferred self.flow_control_deferred = None flow_control_deferred.callback(None) def connectionLost(self, reason=None): """ Called by Twisted when the connection is gone. Regardless of whether it was clean or not, we want to stop the reactor. """ if self.fileobj is not None: self.fileobj.close() if reactor.running: reactor.stop() def sendRequest(self): """ Send the POST request. A POST request is made up of one headers frame, and then 0+ data frames. This method begins by sending the headers, and then starts a series of calls to send data. """ # First, we need to work out how large the file is. self.file_size = os.stat(self.file_path).st_size # Next, we want to guess a content-type and content-encoding. content_type, content_encoding = mimetypes.guess_type(self.file_path) # Now we can build a header block. request_headers = [ (':method', 'POST'), (':authority', AUTHORITY), (':scheme', 'https'), (':path', PATH), ('content-length', str(self.file_size)), ] if content_type is not None: request_headers.append(('content-type', content_type)) if content_encoding is not None: request_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(1, request_headers) self.request_made = True # We can now open the file. self.fileobj = open(self.file_path, 'rb') # We now need to send all the relevant data. We do this by checking # what the acceptable amount of data is to send, and sending it. If we # find ourselves blocked behind flow control, we then place a deferred # and wait until that deferred fires. self.sendFileData() def sendFileData(self): """ Send some file data on the connection. """ # Firstly, check what the flow control window is for stream 1. window_size = self.conn.local_flow_control_window(stream_id=1) # Next, check what the maximum frame size is. max_frame_size = self.conn.max_outbound_frame_size # We will send no more than the window size or the remaining file size # of data in this call, whichever is smaller. bytes_to_send = min(window_size, self.file_size) # We now need to send a number of data frames. while bytes_to_send > 0: chunk_size = min(bytes_to_send, max_frame_size) data_chunk = self.fileobj.read(chunk_size) self.conn.send_data(stream_id=1, data=data_chunk) bytes_to_send -= chunk_size self.file_size -= chunk_size # We've prepared a whole chunk of data to send. If the file is fully # sent, we also want to end the stream: we're done here. if self.file_size == 0: self.conn.end_stream(stream_id=1) else: # We've still got data left to send but the window is closed. Save # a Deferred that will call us when the window gets opened. self.flow_control_deferred = defer.Deferred() self.flow_control_deferred.addCallback(self.sendFileData) self.transport.write(self.conn.data_to_send()) try: filename = sys.argv[1] except IndexError: filename = __file__ options = optionsForClientTLS( hostname=AUTHORITY, acceptableProtocols=[b'h2'], ) connectProtocol( SSL4ClientEndpoint(reactor, AUTHORITY, 443, options), H2Protocol(filename) ) reactor.run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/twisted/server.crt0000644000076500000240000000227413137423045016717 0ustar00kriechistaff-----BEGIN CERTIFICATE----- MIIDUjCCAjoCCQCQmNzzpQTCijANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQGEwJH QjEPMA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5 cGVyLWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20w HhcNMTUwOTE2MjAyOTA0WhcNMTYwOTE1MjAyOTA0WjBrMQswCQYDVQQGEwJHQjEP MA0GA1UECBMGTG9uZG9uMQ8wDQYDVQQHEwZMb25kb24xETAPBgNVBAoTCGh5cGVy LWgyMREwDwYDVQQLEwhoeXBleS1oMjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74ZeB4Jdb5cnC9KXXLJuzjwTg 45q5EeShDYQe0TbKgreiUP6clU3BR0fFAVedN1q/LOuQ1HhvrDk1l4TfGF2bpCIq K+U9CnzcQknvdpyyVeOLtSsCjOPk4xydHwkQxwJvHVdtJx4CzDDqGbHNHCF/9gpQ lsa3JZW+tIZLK0XMEPFQ4XFXgegxTStO7kBBPaVIgG9Ooqc2MG4rjMNUpxa28WF1 SyqWTICf2N8T/C+fPzbQLKCWrFrKUP7WQlOaqPNQL9bCDhSTPRTwQOc2/MzVZ9gT Xr0Z+JMTXwkSMKO52adE1pmKt00jJ1ecZBiJFyjx0X6hH+/59dLbG/7No+PzAgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAG3UhOCa0EemL2iY+C+PR6CwEHQ+n7vkBzNz gKOG+Q39spyzqU1qJAzBxLTE81bIQbDg0R8kcLWHVH2y4zViRxZ0jHUFKMgjONW+ Aj4evic/2Y/LxpLxCajECq/jeMHYrmQONszf9pbc0+exrQpgnwd8asfsM3d/FJS2 5DIWryCKs/61m9vYL8icWx/9cnfPkBoNv1ER+V1L1TH3ARvABh406SBaeqLTm/kG MNuKytKWJsQbNlxzWHVgkKzVsBKvYj0uIEJpClIhbe6XNYRDy8T8mKXVWhJuxH4p /agmCG3nxO8aCrUK/EVmbWmVIfCH3t7jlwMX1nJ8MsRE7Ydnk8I= -----END CERTIFICATE----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/twisted/server.csr0000644000076500000240000000176113137423045016716 0ustar00kriechistaff-----BEGIN CERTIFICATE REQUEST----- MIICsDCCAZgCAQAwazELMAkGA1UEBhMCR0IxDzANBgNVBAgTBkxvbmRvbjEPMA0G A1UEBxMGTG9uZG9uMREwDwYDVQQKEwhoeXBlci1oMjERMA8GA1UECxMIaHlwZXkt aDIxFDASBgNVBAMTC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+nJVN wUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7UrAozj 5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFxV4Ho MU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyglqxa ylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZirdN IydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABoAAwDQYJKoZIhvcNAQEFBQAD ggEBACZpSoZWxHU5uagpM2Vinh2E7CXiMAlBc6NXhQMD/3fycr9sX4d/+y9Gy3bL OfEOHBPlQVGrt05aiTh7m5s3HQfsH8l3RfKpfzCfoqd2ESVwgB092bJwY9fBnkw/ UzIHvSnlaKc78h+POUoATOb4faQ8P04wzJHzckbCDI8zRzBZTMVGuiWUopq7K5Ce VSesbqHHnW9ob/apigKNE0k7et/28NOXNEP90tTsz98yN3TP+Nv9puwvT9JZOOoG 0PZIQKJIaZ1NZoNQHLN9gXz012XWa99cBE0qNiBUugXlNhXjkIIM8FIhDQOREB18 0KDxEma+A0quyjnDMwPSoZsMca4= -----END CERTIFICATE REQUEST----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/examples/twisted/server.key0000644000076500000240000000321713137423045016715 0ustar00kriechistaff-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAu+GXgeCXW+XJwvSl1yybs48E4OOauRHkoQ2EHtE2yoK3olD+ nJVNwUdHxQFXnTdavyzrkNR4b6w5NZeE3xhdm6QiKivlPQp83EJJ73acslXji7Ur Aozj5OMcnR8JEMcCbx1XbSceAsww6hmxzRwhf/YKUJbGtyWVvrSGSytFzBDxUOFx V4HoMU0rTu5AQT2lSIBvTqKnNjBuK4zDVKcWtvFhdUsqlkyAn9jfE/wvnz820Cyg lqxaylD+1kJTmqjzUC/Wwg4Ukz0U8EDnNvzM1WfYE169GfiTE18JEjCjudmnRNaZ irdNIydXnGQYiRco8dF+oR/v+fXS2xv+zaPj8wIDAQABAoIBAQCsdq278+0c13d4 tViSh4k5r1w8D9IUdp9XU2/nVgckqA9nOVAvbkJc3FC+P7gsQgbUHKj0XoVbhU1S q461t8kduPH/oiGhAcKR8WurHEdE0OC6ewhLJAeCMRQwCrAorXXHh7icIt9ClCuG iSWUcXEy5Cidx3oL3r1xvIbV85fzdDtE9RC1I/kMjAy63S47YGiqh5vYmJkCa8rG Dsd1sEMDPr63XJpqJj3uHRcPvySgXTa+ssTmUH8WJlPTjvDB5hnPz+lkk2JKVPNu 8adzftZ6hSun+tsc4ZJp8XhGu/m/7MjxWh8MeupLHlXcOEsnj4uHQQsOM3zHojr3 aDCZiC1pAoGBAOAhwe1ujoS2VJ5RXJ9KMs7eBER/02MDgWZjo54Jv/jFxPWGslKk QQceuTe+PruRm41nzvk3q4iZXt8pG0bvpgigN2epcVx/O2ouRsUWWBT0JrVlEzha TIvWjtZ5tSQExXgHL3VlM9+ka40l+NldLSPn25+prizaqhalWuvTpP23AoGBANaY VhEI6yhp0BBUSATEv9lRgkwx3EbcnXNXPQjDMOthsyfq7FxbdOBEK1rwSDyuE6Ij zQGcTOfdiur5Ttg0OQilTJIXJAlpoeecOQ9yGma08c5FMXVJJvcZUuWRZWg1ocQj /hx0WVE9NwOoKwTBERv8HX7vJOFRZyvgkJwFxoulAoGAe4m/1XoZrga9z2GzNs10 AdgX7BW00x+MhH4pIiPnn1yK+nYa9jg4647Asnv3IfXZEnEEgRNxReKbi0+iDFBt aNW+lDGuHTi37AfD1EBDnpEQgO1MUcRb6rwBkTAWatsCaO00+HUmyX9cFLm4Vz7n caILyQ6CxZBlLgRIgDHxADMCgYEAtubsJGTHmZBmSCStpXLUWbOBLNQqfTM398DZ QoirP1PsUQ+IGUfSG/u+QCogR6fPEBkXeFHxsoY/Cvsm2lvYaKgK1VFn46Xm2vNq JuIH4pZCqp6LAv4weddZslT0a5eaowRSZ4o7PmTAaRuCXvD3VjTSJwhJFMo+90TV vEWn7gkCgYEAkk+unX9kYmKoUdLh22/tzQekBa8WqMxXDwzBCECTAs2GlpL/f73i zD15TnaNfLP6Q5RNb0N9tb0Gz1wSkwI1+jGAQLnh2K9X9cIVIqJn8Mf/KQa/wUDV Tb1j7FoGUEgX7vbsyWuTd8P76kNYyGqCss1XmbttcSolqpbIdlSUcO0= -----END RSA PRIVATE KEY----- ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1579434623.0 h2-4.2.0/examples/twisted/twisted-server.py0000644000076500000240000001324213611041177020234 0ustar00kriechistaff# -*- coding: utf-8 -*- """ twisted-server.py ~~~~~~~~~~~~~~~~~ A fully-functional HTTP/2 server written for Twisted. """ import functools import mimetypes import os import os.path import sys from OpenSSL import crypto from twisted.internet.defer import Deferred, inlineCallbacks from twisted.internet.protocol import Protocol, Factory from twisted.internet import endpoints, reactor, ssl from h2.config import H2Configuration from h2.connection import H2Connection from h2.events import ( RequestReceived, DataReceived, WindowUpdated ) from h2.exceptions import ProtocolError def close_file(file, d): file.close() READ_CHUNK_SIZE = 8192 class H2Protocol(Protocol): def __init__(self, root): config = H2Configuration(client_side=False) self.conn = H2Connection(config=config) self.known_proto = None self.root = root self._flow_control_deferreds = {} def connectionMade(self): self.conn.initiate_connection() self.transport.write(self.conn.data_to_send()) def dataReceived(self, data): if not self.known_proto: self.known_proto = True try: events = self.conn.receive_data(data) except ProtocolError: if self.conn.data_to_send: self.transport.write(self.conn.data_to_send()) self.transport.loseConnection() else: for event in events: if isinstance(event, RequestReceived): self.requestReceived(event.headers, event.stream_id) elif isinstance(event, DataReceived): self.dataFrameReceived(event.stream_id) elif isinstance(event, WindowUpdated): self.windowUpdated(event) if self.conn.data_to_send: self.transport.write(self.conn.data_to_send()) def requestReceived(self, headers, stream_id): headers = dict(headers) # Invalid conversion, fix later. assert headers[b':method'] == b'GET' path = headers[b':path'].lstrip(b'/') full_path = os.path.join(self.root, path) if not os.path.exists(full_path): response_headers = ( (':status', '404'), ('content-length', '0'), ('server', 'twisted-h2'), ) self.conn.send_headers( stream_id, response_headers, end_stream=True ) self.transport.write(self.conn.data_to_send()) else: self.sendFile(full_path, stream_id) return def dataFrameReceived(self, stream_id): self.conn.reset_stream(stream_id) self.transport.write(self.conn.data_to_send()) def sendFile(self, file_path, stream_id): filesize = os.stat(file_path).st_size content_type, content_encoding = mimetypes.guess_type( file_path.decode('utf-8') ) response_headers = [ (':status', '200'), ('content-length', str(filesize)), ('server', 'twisted-h2'), ] if content_type: response_headers.append(('content-type', content_type)) if content_encoding: response_headers.append(('content-encoding', content_encoding)) self.conn.send_headers(stream_id, response_headers) self.transport.write(self.conn.data_to_send()) f = open(file_path, 'rb') d = self._send_file(f, stream_id) d.addErrback(functools.partial(close_file, f)) def windowUpdated(self, event): """ Handle a WindowUpdated event by firing any waiting data sending callbacks. """ stream_id = event.stream_id if stream_id and stream_id in self._flow_control_deferreds: d = self._flow_control_deferreds.pop(stream_id) d.callback(event.delta) elif not stream_id: for d in self._flow_control_deferreds.values(): d.callback(event.delta) self._flow_control_deferreds = {} return @inlineCallbacks def _send_file(self, file, stream_id): """ This callback sends more data for a given file on the stream. """ keep_reading = True while keep_reading: while not self.conn.remote_flow_control_window(stream_id): yield self.wait_for_flow_control(stream_id) chunk_size = min( self.conn.remote_flow_control_window(stream_id), READ_CHUNK_SIZE ) data = file.read(chunk_size) keep_reading = len(data) == chunk_size self.conn.send_data(stream_id, data, not keep_reading) self.transport.write(self.conn.data_to_send()) if not keep_reading: break file.close() def wait_for_flow_control(self, stream_id): """ Returns a Deferred that fires when the flow control window is opened. """ d = Deferred() self._flow_control_deferreds[stream_id] = d return d class H2Factory(Factory): def __init__(self, root): self.root = root def buildProtocol(self, addr): print(H2Protocol) return H2Protocol(self.root) root = sys.argv[1].encode('utf-8') with open('server.crt', 'r') as f: cert_data = f.read() with open('server.key', 'r') as f: key_data = f.read() cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_data) key = crypto.load_privatekey(crypto.FILETYPE_PEM, key_data) options = ssl.CertificateOptions( privateKey=key, certificate=cert, acceptableProtocols=[b'h2'], ) endpoint = endpoints.SSL4ServerEndpoint(reactor, 8080, options, backlog=128) endpoint.listen(H2Factory(root)) reactor.run() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738407185.0 h2-4.2.0/pyproject.toml0000644000076500000240000001355214747376421014330 0ustar00kriechistaff# https://packaging.python.org/en/latest/guides/writing-pyproject-toml/ # https://packaging.python.org/en/latest/specifications/pyproject-toml/ [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [project] name = "h2" description = "Pure-Python HTTP/2 protocol implementation" readme = { file = "README.rst", content-type = "text/x-rst" } license = { file = "LICENSE" } authors = [ { name = "Cory Benfield", email = "cory@lukasa.co.uk" } ] maintainers = [ { name = "Thomas Kriechbaumer", email = "thomas@kriechbaumer.name" }, ] requires-python = ">=3.9" dependencies = [ "hyperframe>=6.1,<7", "hpack>=4.1,<5", ] dynamic = ["version"] # For a list of valid classifiers, see https://pypi.org/classifiers/ classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", ] [project.urls] "Homepage" = "https://github.com/python-hyper/h2/" "Bug Reports" = "https://github.com/python-hyper/h2/issues" "Source" = "https://github.com/python-hyper/h2/" "Documentation" = "https://python-hyper.org/" [dependency-groups] dev = [ { include-group = "testing" }, { include-group = "linting" }, { include-group = "packaging" }, { include-group = "docs" }, ] testing = [ "pytest>=8.3.3,<9", "pytest-cov>=6.0.0,<7", "pytest-xdist>=3.6.1,<4", "hypothesis>=6.119.4,<7", ] linting = [ "ruff>=0.8.0,<1", "mypy>=1.13.0,<2", "typing_extensions>=4.12.2", ] packaging = [ "check-manifest==0.50", "readme-renderer==44.0", "build>=1.2.2,<2", "twine>=5.1.1,<6", "wheel>=0.45.0,<1", ] docs = [ "sphinx>=7.4.7,<9", ] [tool.setuptools.packages.find] where = [ "src" ] [tool.setuptools.package-data] h2 = [ "py.typed" ] [tool.setuptools.dynamic] version = { attr = "h2.__version__" } [tool.ruff] line-length = 150 target-version = "py39" format.preview = true format.docstring-code-line-length = 100 format.docstring-code-format = true lint.select = [ "ALL", ] lint.ignore = [ "PYI034", # PEP 673 not yet available in Python 3.9 - only in 3.11+ "ANN001", # args with typing.Any "ANN002", # args with typing.Any "ANN003", # kwargs with typing.Any "ANN401", # kwargs with typing.Any "SLF001", # implementation detail "CPY", # not required "D101", # docs readability "D102", # docs readability "D105", # docs readability "D107", # docs readability "D200", # docs readability "D205", # docs readability "D205", # docs readability "D203", # docs readability "D212", # docs readability "D400", # docs readability "D401", # docs readability "D415", # docs readability "PLR2004", # readability "SIM108", # readability "RUF012", # readability "FBT001", # readability "FBT002", # readability "PGH003", # readability "PGH004", # readability "FIX001", # readability "FIX002", # readability "TD001", # readability "TD002", # readability "TD003", # readability "S101", # readability "PD901", # readability "ERA001", # readability "ARG001", # readability "ARG002", # readability "PLR0913", # readability ] lint.isort.required-imports = [ "from __future__ import annotations" ] [tool.mypy] show_error_codes = true strict = true [tool.pytest.ini_options] testpaths = [ "tests" ] [tool.coverage.run] branch = true source = [ "h2" ] [tool.coverage.report] fail_under = 100 show_missing = true exclude_lines = [ "pragma: no cover", "raise NotImplementedError()", 'assert False, "Should not be reachable"', # .*:.* # Python \d.* # .*:.* # Platform-specific: ] [tool.coverage.paths] source = [ "src/", ".tox/**/site-packages/", ] [tool.tox] min_version = "4.23.2" env_list = [ "py39", "py310", "py311", "py312", "py313", "pypy3", "lint", "docs", "packaging" ] [tool.tox.gh-actions] python = """ 3.9: py39, h2spec, lint, docs, packaging 3.10: py310 3.11: py311 3.12: py312 3.13: py313 pypy3: pypy3 """ [tool.tox.env_run_base] pass_env = [ "GITHUB_*", ] dependency_groups = ["testing"] commands = [ ["python", "-bb", "-m", "pytest", "--cov-report=xml", "--cov-report=term", "--cov=h2", { replace = "posargs", extend = true }] ] [tool.tox.env.pypy3] # temporarily disable coverage testing on PyPy due to performance problems commands = [ ["pytest", { replace = "posargs", extend = true }] ] [tool.tox.env.lint] dependency_groups = ["linting"] commands = [ ["ruff", "check", "src/"], ["mypy", "src/"], ] [tool.tox.env.docs] dependency_groups = ["docs"] allowlist_externals = ["make"] changedir = "{toxinidir}/docs" commands = [ ["make", "clean"], ["make", "html"], ] [tool.tox.env.packaging] base_python = ["python39"] dependency_groups = ["packaging"] allowlist_externals = ["rm"] commands = [ ["rm", "-rf", "dist/"], ["check-manifest"], ["python", "-m", "build", "--outdir", "dist/"], ["twine", "check", "dist/*"], ] [tool.tox.env.publish] base_python = ["python39"] dependency_groups = ["packaging"] commands = [ ["python", "-m", "build", "--outdir", "dist/"], ["twine", "check", "dist/*"], ["twine", "upload", "dist/*"], ] [tool.tox.env.graphs] basepython = ["python3.9"] deps = [ "graphviz==0.14.1", ] commands = [ ["python", "visualizer/visualize.py", "-i", "docs/source/_static"], ] [tool.tox.env.h2spec] basepython = ["python3.9"] deps = [ "twisted[tls]==20.3.0", ] allowlist_externals = [ "{toxinidir}/tests/h2spectest.sh" ] commands = [ ["{toxinidir}/tests/h2spectest.sh"], ] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7752614 h2-4.2.0/setup.cfg0000644000076500000240000000004614747620663013227 0ustar00kriechistaff[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7411098 h2-4.2.0/src/0000755000076500000240000000000014747620663012175 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7676241 h2-4.2.0/src/h2/0000755000076500000240000000000014747620663012506 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482064.0 h2-4.2.0/src/h2/__init__.py0000644000076500000240000000015514747620620014611 0ustar00kriechistaff""" HTTP/2 protocol implementation for Python. """ from __future__ import annotations __version__ = "4.2.0" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/config.py0000644000076500000240000002023014744265074014320 0ustar00kriechistaff""" h2/config ~~~~~~~~~ Objects for controlling the configuration of the HTTP/2 stack. """ from __future__ import annotations import sys from typing import Any class _BooleanConfigOption: """ Descriptor for handling a boolean config option. This will block attempts to set boolean config options to non-bools. """ def __init__(self, name: str) -> None: self.name = name self.attr_name = f"_{self.name}" def __get__(self, instance: Any, owner: Any) -> bool: return getattr(instance, self.attr_name) # type: ignore def __set__(self, instance: Any, value: bool) -> None: if not isinstance(value, bool): msg = f"{self.name} must be a bool" raise ValueError(msg) # noqa: TRY004 setattr(instance, self.attr_name, value) class DummyLogger: """ A Logger object that does not actual logging, hence a DummyLogger. For the class the log operation is merely a no-op. The intent is to avoid conditionals being sprinkled throughout the h2 code for calls to logging functions when no logger is passed into the corresponding object. """ def __init__(self, *vargs) -> None: # type: ignore pass def debug(self, *vargs, **kwargs) -> None: # type: ignore """ No-op logging. Only level needed for now. """ def trace(self, *vargs, **kwargs) -> None: # type: ignore """ No-op logging. Only level needed for now. """ class OutputLogger: """ A Logger object that prints to stderr or any other file-like object. This class is provided for convenience and not part of the stable API. :param file: A file-like object passed to the print function. Defaults to ``sys.stderr``. :param trace: Enables trace-level output. Defaults to ``False``. """ def __init__(self, file=None, trace_level=False) -> None: # type: ignore super().__init__() self.file = file or sys.stderr self.trace_level = trace_level def debug(self, fmtstr, *args) -> None: # type: ignore print(f"h2 (debug): {fmtstr % args}", file=self.file) def trace(self, fmtstr, *args) -> None: # type: ignore if self.trace_level: print(f"h2 (trace): {fmtstr % args}", file=self.file) class H2Configuration: """ An object that controls the way a single HTTP/2 connection behaves. This object allows the users to customize behaviour. In particular, it allows users to enable or disable optional features, or to otherwise handle various unusual behaviours. This object has very little behaviour of its own: it mostly just ensures that configuration is self-consistent. :param client_side: Whether this object is to be used on the client side of a connection, or on the server side. Affects the logic used by the state machine, the default settings values, the allowable stream IDs, and several other properties. Defaults to ``True``. :type client_side: ``bool`` :param header_encoding: Controls whether the headers emitted by this object in events are transparently decoded to ``unicode`` strings, and what encoding is used to do that decoding. This defaults to ``None``, meaning that headers will be returned as bytes. To automatically decode headers (that is, to return them as unicode strings), this can be set to the string name of any encoding, e.g. ``'utf-8'``. .. versionchanged:: 3.0.0 Changed default value from ``'utf-8'`` to ``None`` :type header_encoding: ``str``, ``False``, or ``None`` :param validate_outbound_headers: Controls whether the headers emitted by this object are validated against the rules in RFC 7540. Disabling this setting will cause outbound header validation to be skipped, and allow the object to emit headers that may be illegal according to RFC 7540. Defaults to ``True``. :type validate_outbound_headers: ``bool`` :param normalize_outbound_headers: Controls whether the headers emitted by this object are normalized before sending. Disabling this setting will cause outbound header normalization to be skipped, and allow the object to emit headers that may be illegal according to RFC 7540. Defaults to ``True``. :type normalize_outbound_headers: ``bool`` :param split_outbound_cookies: Controls whether the outbound cookie headers are split before sending or not. According to RFC 7540 - 8.1.2.5 the outbound header cookie headers may be split to improve headers compression. Default is ``False``. :type split_outbound_cookies: ``bool`` :param validate_inbound_headers: Controls whether the headers received by this object are validated against the rules in RFC 7540. Disabling this setting will cause inbound header validation to be skipped, and allow the object to receive headers that may be illegal according to RFC 7540. Defaults to ``True``. :type validate_inbound_headers: ``bool`` :param normalize_inbound_headers: Controls whether the headers received by this object are normalized according to the rules of RFC 7540. Disabling this setting may lead to h2 emitting header blocks that some RFCs forbid, e.g. with multiple cookie fields. .. versionadded:: 3.0.0 :type normalize_inbound_headers: ``bool`` :param logger: A logger that conforms to the requirements for this module, those being no I/O and no context switches, which is needed in order to run in asynchronous operation. .. versionadded:: 2.6.0 :type logger: ``logging.Logger`` """ client_side = _BooleanConfigOption("client_side") validate_outbound_headers = _BooleanConfigOption( "validate_outbound_headers", ) normalize_outbound_headers = _BooleanConfigOption( "normalize_outbound_headers", ) split_outbound_cookies = _BooleanConfigOption( "split_outbound_cookies", ) validate_inbound_headers = _BooleanConfigOption( "validate_inbound_headers", ) normalize_inbound_headers = _BooleanConfigOption( "normalize_inbound_headers", ) def __init__(self, client_side: bool = True, header_encoding: bool | str | None = None, validate_outbound_headers: bool = True, normalize_outbound_headers: bool = True, split_outbound_cookies: bool = False, validate_inbound_headers: bool = True, normalize_inbound_headers: bool = True, logger: DummyLogger | OutputLogger | None = None) -> None: self.client_side = client_side self.header_encoding = header_encoding self.validate_outbound_headers = validate_outbound_headers self.normalize_outbound_headers = normalize_outbound_headers self.split_outbound_cookies = split_outbound_cookies self.validate_inbound_headers = validate_inbound_headers self.normalize_inbound_headers = normalize_inbound_headers self.logger = logger or DummyLogger(__name__) @property def header_encoding(self) -> bool | str | None: """ Controls whether the headers emitted by this object in events are transparently decoded to ``unicode`` strings, and what encoding is used to do that decoding. This defaults to ``None``, meaning that headers will be returned as bytes. To automatically decode headers (that is, to return them as unicode strings), this can be set to the string name of any encoding, e.g. ``'utf-8'``. """ return self._header_encoding @header_encoding.setter def header_encoding(self, value: bool | str | None) -> None: """ Enforces constraints on the value of header encoding. """ if not isinstance(value, (bool, str, type(None))): msg = "header_encoding must be bool, string, or None" raise ValueError(msg) # noqa: TRY004 if value is True: msg = "header_encoding cannot be True" raise ValueError(msg) self._header_encoding = value ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/connection.py0000644000076500000240000025144014744265074015223 0ustar00kriechistaff""" h2/connection ~~~~~~~~~~~~~ An implementation of a HTTP/2 connection. """ from __future__ import annotations import base64 from enum import Enum, IntEnum from typing import TYPE_CHECKING, Any, Callable from hpack.exceptions import HPACKError, OversizedHeaderListError from hpack.hpack import Decoder, Encoder from hyperframe.exceptions import InvalidPaddingError from hyperframe.frame import ( AltSvcFrame, ContinuationFrame, DataFrame, ExtensionFrame, Frame, GoAwayFrame, HeadersFrame, PingFrame, PriorityFrame, PushPromiseFrame, RstStreamFrame, SettingsFrame, WindowUpdateFrame, ) from .config import H2Configuration from .errors import ErrorCodes, _error_code_from_int from .events import ( AlternativeServiceAvailable, ConnectionTerminated, Event, InformationalResponseReceived, PingAckReceived, PingReceived, PriorityUpdated, RemoteSettingsChanged, RequestReceived, ResponseReceived, SettingsAcknowledged, TrailersReceived, UnknownFrameReceived, WindowUpdated, ) from .exceptions import ( DenialOfServiceError, FlowControlError, FrameTooLargeError, NoAvailableStreamIDError, NoSuchStreamError, ProtocolError, RFC1122Error, StreamClosedError, StreamIDTooLowError, TooManyStreamsError, ) from .frame_buffer import FrameBuffer from .settings import ChangedSetting, SettingCodes, Settings from .stream import H2Stream, StreamClosedBy from .utilities import SizeLimitDict, guard_increment_window from .windows import WindowManager if TYPE_CHECKING: # pragma: no cover from collections.abc import Iterable from hpack.struct import Header, HeaderWeaklyTyped class ConnectionState(Enum): IDLE = 0 CLIENT_OPEN = 1 SERVER_OPEN = 2 CLOSED = 3 class ConnectionInputs(Enum): SEND_HEADERS = 0 SEND_PUSH_PROMISE = 1 SEND_DATA = 2 SEND_GOAWAY = 3 SEND_WINDOW_UPDATE = 4 SEND_PING = 5 SEND_SETTINGS = 6 SEND_RST_STREAM = 7 SEND_PRIORITY = 8 RECV_HEADERS = 9 RECV_PUSH_PROMISE = 10 RECV_DATA = 11 RECV_GOAWAY = 12 RECV_WINDOW_UPDATE = 13 RECV_PING = 14 RECV_SETTINGS = 15 RECV_RST_STREAM = 16 RECV_PRIORITY = 17 SEND_ALTERNATIVE_SERVICE = 18 # Added in 2.3.0 RECV_ALTERNATIVE_SERVICE = 19 # Added in 2.3.0 class AllowedStreamIDs(IntEnum): EVEN = 0 ODD = 1 class H2ConnectionStateMachine: """ A single HTTP/2 connection state machine. This state machine, while defined in its own class, is logically part of the H2Connection class also defined in this file. The state machine itself maintains very little state directly, instead focusing entirely on managing state transitions. """ # For the purposes of this state machine we treat HEADERS and their # associated CONTINUATION frames as a single jumbo frame. The protocol # allows/requires this by preventing other frames from being interleved in # between HEADERS/CONTINUATION frames. # # The _transitions dictionary contains a mapping of tuples of # (state, input) to tuples of (side_effect_function, end_state). This map # contains all allowed transitions: anything not in this map is invalid # and immediately causes a transition to ``closed``. _transitions = { # State: idle (ConnectionState.IDLE, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.IDLE, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.IDLE, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_PING): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_PING): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.IDLE, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.IDLE, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.IDLE), (ConnectionState.IDLE, ConnectionInputs.SEND_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.IDLE, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.CLIENT_OPEN), # State: open, client side. (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_DATA): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_PING): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PUSH_PROMISE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_DATA): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PING): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.SEND_RST_STREAM): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_RST_STREAM): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.CLIENT_OPEN), (ConnectionState.CLIENT_OPEN, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.CLIENT_OPEN), # State: open, server side. (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PUSH_PROMISE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_DATA): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_WINDOW_UPDATE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PING): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_SETTINGS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_PRIORITY): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_HEADERS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_DATA): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_WINDOW_UPDATE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_PING): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_SETTINGS): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_PRIORITY): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_RST_STREAM): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_RST_STREAM): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.SEND_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), (ConnectionState.SERVER_OPEN, ConnectionInputs.RECV_ALTERNATIVE_SERVICE): (None, ConnectionState.SERVER_OPEN), # State: closed (ConnectionState.CLOSED, ConnectionInputs.SEND_GOAWAY): (None, ConnectionState.CLOSED), (ConnectionState.CLOSED, ConnectionInputs.RECV_GOAWAY): (None, ConnectionState.CLOSED), } def __init__(self) -> None: self.state = ConnectionState.IDLE def process_input(self, input_: ConnectionInputs) -> list[Event]: """ Process a specific input in the state machine. """ if not isinstance(input_, ConnectionInputs): msg = "Input must be an instance of ConnectionInputs" raise ValueError(msg) # noqa: TRY004 try: func, target_state = self._transitions[(self.state, input_)] except KeyError as e: old_state = self.state self.state = ConnectionState.CLOSED msg = f"Invalid input {input_} in state {old_state}" raise ProtocolError(msg) from e else: self.state = target_state if func is not None: # pragma: no cover return func() return [] class H2Connection: """ A low-level HTTP/2 connection object. This handles building and receiving frames and maintains both connection and per-stream state for all streams on this connection. This wraps a HTTP/2 Connection state machine implementation, ensuring that frames can only be sent/received when the connection is in a valid state. It also builds stream state machines on demand to ensure that the constraints of those state machines are met as well. Attempts to create frames that cannot be sent will raise a ``ProtocolError``. .. versionchanged:: 2.3.0 Added the ``header_encoding`` keyword argument. .. versionchanged:: 2.5.0 Added the ``config`` keyword argument. Deprecated the ``client_side`` and ``header_encoding`` parameters. .. versionchanged:: 3.0.0 Removed deprecated parameters and properties. :param config: The configuration for the HTTP/2 connection. .. versionadded:: 2.5.0 :type config: :class:`H2Configuration ` """ # The initial maximum outbound frame size. This can be changed by receiving # a settings frame. DEFAULT_MAX_OUTBOUND_FRAME_SIZE = 65535 # The initial maximum inbound frame size. This is somewhat arbitrarily # chosen. DEFAULT_MAX_INBOUND_FRAME_SIZE = 2**24 # The highest acceptable stream ID. HIGHEST_ALLOWED_STREAM_ID = 2**31 - 1 # The largest acceptable window increment. MAX_WINDOW_INCREMENT = 2**31 - 1 # The initial default value of SETTINGS_MAX_HEADER_LIST_SIZE. DEFAULT_MAX_HEADER_LIST_SIZE = 2**16 # Keep in memory limited amount of results for streams closes MAX_CLOSED_STREAMS = 2**16 def __init__(self, config: H2Configuration | None = None) -> None: self.state_machine = H2ConnectionStateMachine() self.streams: dict[int, H2Stream] = {} self.highest_inbound_stream_id = 0 self.highest_outbound_stream_id = 0 self.encoder = Encoder() self.decoder = Decoder() # This won't always actually do anything: for versions of HPACK older # than 2.3.0 it does nothing. However, we have to try! self.decoder.max_header_list_size = self.DEFAULT_MAX_HEADER_LIST_SIZE #: The configuration for this HTTP/2 connection object. #: #: .. versionadded:: 2.5.0 self.config = config or H2Configuration(client_side=True) # Objects that store settings, including defaults. # # We set the MAX_CONCURRENT_STREAMS value to 100 because its default is # unbounded, and that's a dangerous default because it allows # essentially unbounded resources to be allocated regardless of how # they will be used. 100 should be suitable for the average # application. This default obviously does not apply to the remote # peer's settings: the remote peer controls them! # # We also set MAX_HEADER_LIST_SIZE to a reasonable value. This is to # advertise our defence against CVE-2016-6581. However, not all # versions of HPACK will let us do it. That's ok: we should at least # suggest that we're not vulnerable. self.local_settings = Settings( client=self.config.client_side, initial_values={ SettingCodes.MAX_CONCURRENT_STREAMS: 100, SettingCodes.MAX_HEADER_LIST_SIZE: self.DEFAULT_MAX_HEADER_LIST_SIZE, }, ) self.remote_settings = Settings(client=not self.config.client_side) # The current value of the connection flow control windows on the # connection. self.outbound_flow_control_window = ( self.remote_settings.initial_window_size ) #: The maximum size of a frame that can be emitted by this peer, in #: bytes. self.max_outbound_frame_size = self.remote_settings.max_frame_size #: The maximum size of a frame that can be received by this peer, in #: bytes. self.max_inbound_frame_size = self.local_settings.max_frame_size # Buffer for incoming data. self.incoming_buffer = FrameBuffer(server=not self.config.client_side) # A private variable to store a sequence of received header frames # until completion. self._header_frames: list[Frame] = [] # Data that needs to be sent. self._data_to_send = bytearray() # Keeps track of how streams are closed. # Used to ensure that we don't blow up in the face of frames that were # in flight when a RST_STREAM was sent. # Also used to determine whether we should consider a frame received # while a stream is closed as either a stream error or a connection # error. self._closed_streams: dict[int, StreamClosedBy | None] = SizeLimitDict( size_limit=self.MAX_CLOSED_STREAMS, ) # The flow control window manager for the connection. self._inbound_flow_control_window_manager = WindowManager( max_window_size=self.local_settings.initial_window_size, ) # When in doubt use dict-dispatch. self._frame_dispatch_table: dict[type[Frame], Callable] = { # type: ignore HeadersFrame: self._receive_headers_frame, PushPromiseFrame: self._receive_push_promise_frame, SettingsFrame: self._receive_settings_frame, DataFrame: self._receive_data_frame, WindowUpdateFrame: self._receive_window_update_frame, PingFrame: self._receive_ping_frame, RstStreamFrame: self._receive_rst_stream_frame, PriorityFrame: self._receive_priority_frame, GoAwayFrame: self._receive_goaway_frame, ContinuationFrame: self._receive_naked_continuation, AltSvcFrame: self._receive_alt_svc_frame, ExtensionFrame: self._receive_unknown_frame, } def _prepare_for_sending(self, frames: list[Frame]) -> None: if not frames: return self._data_to_send += b"".join(f.serialize() for f in frames) assert all(f.body_len <= self.max_outbound_frame_size for f in frames) def _open_streams(self, remainder: int) -> int: """ A common method of counting number of open streams. Returns the number of streams that are open *and* that have (stream ID % 2) == remainder. While it iterates, also deletes any closed streams. """ count = 0 to_delete = [] for stream_id, stream in self.streams.items(): if stream.open and (stream_id % 2 == remainder): count += 1 elif stream.closed: to_delete.append(stream_id) for stream_id in to_delete: stream = self.streams.pop(stream_id) self._closed_streams[stream_id] = stream.closed_by return count @property def open_outbound_streams(self) -> int: """ The current number of open outbound streams. """ outbound_numbers = int(self.config.client_side) return self._open_streams(outbound_numbers) @property def open_inbound_streams(self) -> int: """ The current number of open inbound streams. """ inbound_numbers = int(not self.config.client_side) return self._open_streams(inbound_numbers) @property def inbound_flow_control_window(self) -> int: """ The size of the inbound flow control window for the connection. This is rarely publicly useful: instead, use :meth:`remote_flow_control_window `. This shortcut is largely present to provide a shortcut to this data. """ return self._inbound_flow_control_window_manager.current_window_size def _begin_new_stream(self, stream_id: int, allowed_ids: AllowedStreamIDs) -> H2Stream: """ Initiate a new stream. .. versionchanged:: 2.0.0 Removed this function from the public API. :param stream_id: The ID of the stream to open. :param allowed_ids: What kind of stream ID is allowed. """ self.config.logger.debug( "Attempting to initiate stream ID %d", stream_id, ) outbound = self._stream_id_is_outbound(stream_id) highest_stream_id = ( self.highest_outbound_stream_id if outbound else self.highest_inbound_stream_id ) if stream_id <= highest_stream_id: raise StreamIDTooLowError(stream_id, highest_stream_id) if (stream_id % 2) != int(allowed_ids): msg = "Invalid stream ID for peer." raise ProtocolError(msg) s = H2Stream( stream_id, config=self.config, inbound_window_size=self.local_settings.initial_window_size, outbound_window_size=self.remote_settings.initial_window_size, ) self.config.logger.debug("Stream ID %d created", stream_id) s.max_outbound_frame_size = self.max_outbound_frame_size self.streams[stream_id] = s self.config.logger.debug("Current streams: %s", self.streams.keys()) if outbound: self.highest_outbound_stream_id = stream_id else: self.highest_inbound_stream_id = stream_id return s def initiate_connection(self) -> None: """ Provides any data that needs to be sent at the start of the connection. Must be called for both clients and servers. """ self.config.logger.debug("Initializing connection") self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) if self.config.client_side: preamble = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" else: preamble = b"" f = SettingsFrame(0) for setting, value in self.local_settings.items(): f.settings[setting] = value self.config.logger.debug( "Send Settings frame: %s", self.local_settings, ) self._data_to_send += preamble + f.serialize() def initiate_upgrade_connection(self, settings_header: bytes | None = None) -> bytes | None: """ Call to initialise the connection object for use with an upgraded HTTP/2 connection (i.e. a connection negotiated using the ``Upgrade: h2c`` HTTP header). This method differs from :meth:`initiate_connection ` in several ways. Firstly, it handles the additional SETTINGS frame that is sent in the ``HTTP2-Settings`` header field. When called on a client connection, this method will return a bytestring that the caller can put in the ``HTTP2-Settings`` field they send on their initial request. When called on a server connection, the user **must** provide the value they received from the client in the ``HTTP2-Settings`` header field to the ``settings_header`` argument, which will be used appropriately. Additionally, this method sets up stream 1 in a half-closed state appropriate for this side of the connection, to reflect the fact that the request is already complete. Finally, this method also prepares the appropriate preamble to be sent after the upgrade. .. versionadded:: 2.3.0 :param settings_header: (optional, server-only): The value of the ``HTTP2-Settings`` header field received from the client. :type settings_header: ``bytes`` :returns: For clients, a bytestring to put in the ``HTTP2-Settings``. For servers, returns nothing. :rtype: ``bytes`` or ``None`` """ self.config.logger.debug( "Upgrade connection. Current settings: %s", self.local_settings, ) frame_data = None # Begin by getting the preamble in place. self.initiate_connection() if self.config.client_side: f = SettingsFrame(0) for setting, value in self.local_settings.items(): f.settings[setting] = value frame_data = f.serialize_body() frame_data = base64.urlsafe_b64encode(frame_data) elif settings_header: # We have a settings header from the client. This needs to be # applied, but we want to throw away the ACK. We do this by # inserting the data into a Settings frame and then passing it to # the state machine, but ignoring the return value. settings_header = base64.urlsafe_b64decode(settings_header) f = SettingsFrame(0) f.parse_body(memoryview(settings_header)) self._receive_settings_frame(f) # Set up appropriate state. Stream 1 in a half-closed state: # half-closed(local) for clients, half-closed(remote) for servers. # Additionally, we need to set up the Connection state machine. connection_input = ( ConnectionInputs.SEND_HEADERS if self.config.client_side else ConnectionInputs.RECV_HEADERS ) self.config.logger.debug("Process input %s", connection_input) self.state_machine.process_input(connection_input) # Set up stream 1. self._begin_new_stream(stream_id=1, allowed_ids=AllowedStreamIDs.ODD) self.streams[1].upgrade(self.config.client_side) return frame_data def _get_or_create_stream(self, stream_id: int, allowed_ids: AllowedStreamIDs) -> H2Stream: """ Gets a stream by its stream ID. Will create one if one does not already exist. Use allowed_ids to circumvent the usual stream ID rules for clients and servers. .. versionchanged:: 2.0.0 Removed this function from the public API. """ try: return self.streams[stream_id] except KeyError: return self._begin_new_stream(stream_id, allowed_ids) def _get_stream_by_id(self, stream_id: int | None) -> H2Stream: """ Gets a stream by its stream ID. Raises NoSuchStreamError if the stream ID does not correspond to a known stream and is higher than the current maximum: raises if it is lower than the current maximum. .. versionchanged:: 2.0.0 Removed this function from the public API. """ if not stream_id: raise NoSuchStreamError(-1) # pragma: no cover try: return self.streams[stream_id] except KeyError as e: outbound = self._stream_id_is_outbound(stream_id) highest_stream_id = ( self.highest_outbound_stream_id if outbound else self.highest_inbound_stream_id ) if stream_id > highest_stream_id: raise NoSuchStreamError(stream_id) from e raise StreamClosedError(stream_id) from e def get_next_available_stream_id(self) -> int: """ Returns an integer suitable for use as the stream ID for the next stream created by this endpoint. For server endpoints, this stream ID will be even. For client endpoints, this stream ID will be odd. If no stream IDs are available, raises :class:`NoAvailableStreamIDError `. .. warning:: The return value from this function does not change until the stream ID has actually been used by sending or pushing headers on that stream. For that reason, it should be called as close as possible to the actual use of the stream ID. .. versionadded:: 2.0.0 :raises: :class:`NoAvailableStreamIDError ` :returns: The next free stream ID this peer can use to initiate a stream. :rtype: ``int`` """ # No streams have been opened yet, so return the lowest allowed stream # ID. if not self.highest_outbound_stream_id: next_stream_id = 1 if self.config.client_side else 2 else: next_stream_id = self.highest_outbound_stream_id + 2 self.config.logger.debug( "Next available stream ID %d", next_stream_id, ) if next_stream_id > self.HIGHEST_ALLOWED_STREAM_ID: msg = "Exhausted allowed stream IDs" raise NoAvailableStreamIDError(msg) return next_stream_id def send_headers(self, stream_id: int, headers: Iterable[HeaderWeaklyTyped], end_stream: bool = False, priority_weight: int | None = None, priority_depends_on: int | None = None, priority_exclusive: bool | None = None) -> None: """ Send headers on a given stream. This function can be used to send request or response headers: the kind that are sent depends on whether this connection has been opened as a client or server connection, and whether the stream was opened by the remote peer or not. If this is a client connection, calling ``send_headers`` will send the headers as a request. It will also implicitly open the stream being used. If this is a client connection and ``send_headers`` has *already* been called, this will send trailers instead. If this is a server connection, calling ``send_headers`` will send the headers as a response. It is a protocol error for a server to open a stream by sending headers. If this is a server connection and ``send_headers`` has *already* been called, this will send trailers instead. When acting as a server, you may call ``send_headers`` any number of times allowed by the following rules, in this order: - zero or more times with ``(':status', '1XX')`` (where ``1XX`` is a placeholder for any 100-level status code). - once with any other status header. - zero or one time for trailers. That is, you are allowed to send as many informational responses as you like, followed by one complete response and zero or one HTTP trailer blocks. Clients may send one or two header blocks: one request block, and optionally one trailer block. If it is important to send HPACK "never indexed" header fields (as defined in `RFC 7451 Section 7.1.3 `_), the user may instead provide headers using the HPACK library's :class:`HeaderTuple ` and :class:`NeverIndexedHeaderTuple ` objects. This method also allows users to prioritize the stream immediately, by sending priority information on the HEADERS frame directly. To do this, any one of ``priority_weight``, ``priority_depends_on``, or ``priority_exclusive`` must be set to a value that is not ``None``. For more information on the priority fields, see :meth:`prioritize `. .. warning:: In HTTP/2, it is mandatory that all the HTTP/2 special headers (that is, ones whose header keys begin with ``:``) appear at the start of the header block, before any normal headers. .. versionchanged:: 2.3.0 Added support for using :class:`HeaderTuple ` objects to store headers. .. versionchanged:: 2.4.0 Added the ability to provide priority keyword arguments: ``priority_weight``, ``priority_depends_on``, and ``priority_exclusive``. :param stream_id: The stream ID to send the headers on. If this stream does not currently exist, it will be created. :type stream_id: ``int`` :param headers: The request/response headers to send. :type headers: An iterable of two tuples of bytestrings or :class:`HeaderTuple ` objects. :param end_stream: Whether this headers frame should end the stream immediately (that is, whether no more data will be sent after this frame). Defaults to ``False``. :type end_stream: ``bool`` :param priority_weight: Sets the priority weight of the stream. See :meth:`prioritize ` for more about how this field works. Defaults to ``None``, which means that no priority information will be sent. :type priority_weight: ``int`` or ``None`` :param priority_depends_on: Sets which stream this one depends on for priority purposes. See :meth:`prioritize ` for more about how this field works. Defaults to ``None``, which means that no priority information will be sent. :type priority_depends_on: ``int`` or ``None`` :param priority_exclusive: Sets whether this stream exclusively depends on the stream given in ``priority_depends_on`` for priority purposes. See :meth:`prioritize ` for more about how this field workds. Defaults to ``None``, which means that no priority information will be sent. :type priority_depends_on: ``bool`` or ``None`` :returns: Nothing """ self.config.logger.debug( "Send headers on stream ID %d", stream_id, ) # Check we can open the stream. if stream_id not in self.streams: max_open_streams = self.remote_settings.max_concurrent_streams if (self.open_outbound_streams + 1) > max_open_streams: msg = f"Max outbound streams is {max_open_streams}, {self.open_outbound_streams} open" raise TooManyStreamsError(msg) self.state_machine.process_input(ConnectionInputs.SEND_HEADERS) stream = self._get_or_create_stream( stream_id, AllowedStreamIDs(self.config.client_side), ) frames: list[Frame] = [] frames.extend(stream.send_headers( headers, self.encoder, end_stream, )) # We may need to send priority information. priority_present = ( (priority_weight is not None) or (priority_depends_on is not None) or (priority_exclusive is not None) ) if priority_present: if not self.config.client_side: msg = "Servers SHOULD NOT prioritize streams." raise RFC1122Error(msg) headers_frame = frames[0] assert isinstance(headers_frame, HeadersFrame) headers_frame.flags.add("PRIORITY") frames[0] = _add_frame_priority( headers_frame, priority_weight, priority_depends_on, priority_exclusive, ) self._prepare_for_sending(frames) def send_data(self, stream_id: int, data: bytes | memoryview, end_stream: bool = False, pad_length: Any = None) -> None: """ Send data on a given stream. This method does no breaking up of data: if the data is larger than the value returned by :meth:`local_flow_control_window ` for this stream then a :class:`FlowControlError ` will be raised. If the data is larger than :data:`max_outbound_frame_size ` then a :class:`FrameTooLargeError ` will be raised. h2 does this to avoid buffering the data internally. If the user has more data to send than h2 will allow, consider breaking it up and buffering it externally. :param stream_id: The ID of the stream on which to send the data. :type stream_id: ``int`` :param data: The data to send on the stream. :type data: ``bytes`` :param end_stream: (optional) Whether this is the last data to be sent on the stream. Defaults to ``False``. :type end_stream: ``bool`` :param pad_length: (optional) Length of the padding to apply to the data frame. Defaults to ``None`` for no use of padding. Note that a value of ``0`` results in padding of length ``0`` (with the "padding" flag set on the frame). .. versionadded:: 2.6.0 :type pad_length: ``int`` :returns: Nothing """ self.config.logger.debug( "Send data on stream ID %d with len %d", stream_id, len(data), ) frame_size = len(data) if pad_length is not None: if not isinstance(pad_length, int): msg = "pad_length must be an int" raise TypeError(msg) if pad_length < 0 or pad_length > 255: msg = "pad_length must be within range: [0, 255]" raise ValueError(msg) # Account for padding bytes plus the 1-byte padding length field. frame_size += pad_length + 1 self.config.logger.debug( "Frame size on stream ID %d is %d", stream_id, frame_size, ) if frame_size > self.local_flow_control_window(stream_id): msg = f"Cannot send {frame_size} bytes, flow control window is {self.local_flow_control_window(stream_id)}" raise FlowControlError(msg) if frame_size > self.max_outbound_frame_size: msg = f"Cannot send frame size {frame_size}, max frame size is {self.max_outbound_frame_size}" raise FrameTooLargeError(msg) self.state_machine.process_input(ConnectionInputs.SEND_DATA) frames = self.streams[stream_id].send_data( data, end_stream, pad_length=pad_length, ) self._prepare_for_sending(frames) self.outbound_flow_control_window -= frame_size self.config.logger.debug( "Outbound flow control window size is %d", self.outbound_flow_control_window, ) assert self.outbound_flow_control_window >= 0 def end_stream(self, stream_id: int) -> None: """ Cleanly end a given stream. This method ends a stream by sending an empty DATA frame on that stream with the ``END_STREAM`` flag set. :param stream_id: The ID of the stream to end. :type stream_id: ``int`` :returns: Nothing """ self.config.logger.debug("End stream ID %d", stream_id) self.state_machine.process_input(ConnectionInputs.SEND_DATA) frames = self.streams[stream_id].end_stream() self._prepare_for_sending(frames) def increment_flow_control_window(self, increment: int, stream_id: int | None = None) -> None: """ Increment a flow control window, optionally for a single stream. Allows the remote peer to send more data. .. versionchanged:: 2.0.0 Rejects attempts to increment the flow control window by out of range values with a ``ValueError``. :param increment: The amount to increment the flow control window by. :type increment: ``int`` :param stream_id: (optional) The ID of the stream that should have its flow control window opened. If not present or ``None``, the connection flow control window will be opened instead. :type stream_id: ``int`` or ``None`` :returns: Nothing :raises: ``ValueError`` """ if not (1 <= increment <= self.MAX_WINDOW_INCREMENT): msg = f"Flow control increment must be between 1 and {self.MAX_WINDOW_INCREMENT}" raise ValueError(msg) self.state_machine.process_input(ConnectionInputs.SEND_WINDOW_UPDATE) if stream_id is not None: stream = self.streams[stream_id] frames = stream.increase_flow_control_window( increment, ) self.config.logger.debug( "Increase stream ID %d flow control window by %d", stream_id, increment, ) else: self._inbound_flow_control_window_manager.window_opened(increment) f = WindowUpdateFrame(0) f.window_increment = increment frames = [f] self.config.logger.debug( "Increase connection flow control window by %d", increment, ) self._prepare_for_sending(frames) def push_stream(self, stream_id: int, promised_stream_id: int, request_headers: Iterable[HeaderWeaklyTyped]) -> None: """ Push a response to the client by sending a PUSH_PROMISE frame. If it is important to send HPACK "never indexed" header fields (as defined in `RFC 7451 Section 7.1.3 `_), the user may instead provide headers using the HPACK library's :class:`HeaderTuple ` and :class:`NeverIndexedHeaderTuple ` objects. :param stream_id: The ID of the stream that this push is a response to. :type stream_id: ``int`` :param promised_stream_id: The ID of the stream that the pushed response will be sent on. :type promised_stream_id: ``int`` :param request_headers: The headers of the request that the pushed response will be responding to. :type request_headers: An iterable of two tuples of bytestrings or :class:`HeaderTuple ` objects. :returns: Nothing """ self.config.logger.debug( "Send Push Promise frame on stream ID %d", stream_id, ) if not self.remote_settings.enable_push: msg = "Remote peer has disabled stream push" raise ProtocolError(msg) self.state_machine.process_input(ConnectionInputs.SEND_PUSH_PROMISE) stream = self._get_stream_by_id(stream_id) # We need to prevent users pushing streams in response to streams that # they themselves have already pushed: see #163 and RFC 7540 § 6.6. The # easiest way to do that is to assert that the stream_id is not even: # this shortcut works because only servers can push and the state # machine will enforce this. if (stream_id % 2) == 0: msg = "Cannot recursively push streams." raise ProtocolError(msg) new_stream = self._begin_new_stream( promised_stream_id, AllowedStreamIDs.EVEN, ) self.streams[promised_stream_id] = new_stream frames = stream.push_stream_in_band( promised_stream_id, request_headers, self.encoder, ) new_frames = new_stream.locally_pushed() self._prepare_for_sending(frames + new_frames) def ping(self, opaque_data: bytes | str) -> None: """ Send a PING frame. :param opaque_data: A bytestring of length 8 that will be sent in the PING frame. :returns: Nothing """ self.config.logger.debug("Send Ping frame") if not isinstance(opaque_data, bytes) or len(opaque_data) != 8: msg = f"Invalid value for ping data: {opaque_data!r}" raise ValueError(msg) self.state_machine.process_input(ConnectionInputs.SEND_PING) f = PingFrame(0) f.opaque_data = opaque_data self._prepare_for_sending([f]) def reset_stream(self, stream_id: int, error_code: ErrorCodes | int = 0) -> None: """ Reset a stream. This method forcibly closes a stream by sending a RST_STREAM frame for a given stream. This is not a graceful closure. To gracefully end a stream, try the :meth:`end_stream ` method. :param stream_id: The ID of the stream to reset. :type stream_id: ``int`` :param error_code: (optional) The error code to use to reset the stream. Defaults to :data:`ErrorCodes.NO_ERROR `. :type error_code: ``int`` :returns: Nothing """ self.config.logger.debug("Reset stream ID %d", stream_id) self.state_machine.process_input(ConnectionInputs.SEND_RST_STREAM) stream = self._get_stream_by_id(stream_id) frames = stream.reset_stream(error_code) self._prepare_for_sending(frames) def close_connection(self, error_code: ErrorCodes | int = 0, additional_data: bytes | None = None, last_stream_id: int | None = None) -> None: """ Close a connection, emitting a GOAWAY frame. .. versionchanged:: 2.4.0 Added ``additional_data`` and ``last_stream_id`` arguments. :param error_code: (optional) The error code to send in the GOAWAY frame. :param additional_data: (optional) Additional debug data indicating a reason for closing the connection. Must be a bytestring. :param last_stream_id: (optional) The last stream which was processed by the sender. Defaults to ``highest_inbound_stream_id``. :returns: Nothing """ self.config.logger.debug("Close connection") self.state_machine.process_input(ConnectionInputs.SEND_GOAWAY) # Additional_data must be bytes if additional_data is not None: assert isinstance(additional_data, bytes) if last_stream_id is None: last_stream_id = self.highest_inbound_stream_id f = GoAwayFrame( stream_id=0, last_stream_id=last_stream_id, error_code=error_code, additional_data=(additional_data or b""), ) self._prepare_for_sending([f]) def update_settings(self, new_settings: dict[SettingCodes | int, int]) -> None: """ Update the local settings. This will prepare and emit the appropriate SETTINGS frame. :param new_settings: A dictionary of {setting: new value} """ self.config.logger.debug( "Update connection settings to %s", new_settings, ) self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) self.local_settings.update(new_settings) s = SettingsFrame(0) s.settings = new_settings self._prepare_for_sending([s]) def advertise_alternative_service(self, field_value: bytes | str, origin: bytes | None = None, stream_id: int | None = None) -> None: """ Notify a client about an available Alternative Service. An Alternative Service is defined in `RFC 7838 `_. An Alternative Service notification informs a client that a given origin is also available elsewhere. Alternative Services can be advertised in two ways. Firstly, they can be advertised explicitly: that is, a server can say "origin X is also available at Y". To advertise like this, set the ``origin`` argument and not the ``stream_id`` argument. Alternatively, they can be advertised implicitly: that is, a server can say "the origin you're contacting on stream X is also available at Y". To advertise like this, set the ``stream_id`` argument and not the ``origin`` argument. The explicit method of advertising can be done as long as the connection is active. The implicit method can only be done after the client has sent the request headers and before the server has sent the response headers: outside of those points, h2 will forbid sending the Alternative Service advertisement by raising a ProtocolError. The ``field_value`` parameter is specified in RFC 7838. h2 does not validate or introspect this argument: the user is required to ensure that it's well-formed. ``field_value`` corresponds to RFC 7838's "Alternative Service Field Value". .. note:: It is strongly preferred to use the explicit method of advertising Alternative Services. The implicit method of advertising Alternative Services has a number of subtleties and can lead to inconsistencies between the server and client. h2 allows both mechanisms, but caution is strongly advised. .. versionadded:: 2.3.0 :param field_value: The RFC 7838 Alternative Service Field Value. This argument is not introspected by h2: the user is responsible for ensuring that it is well-formed. :type field_value: ``bytes`` :param origin: The origin/authority to which the Alternative Service being advertised applies. Must not be provided at the same time as ``stream_id``. :type origin: ``bytes`` or ``None`` :param stream_id: The ID of the stream which was sent to the authority for which this Alternative Service advertisement applies. Must not be provided at the same time as ``origin``. :type stream_id: ``int`` or ``None`` :returns: Nothing. """ if not isinstance(field_value, bytes): msg = "Field must be bytestring." raise ValueError(msg) # noqa: TRY004 if origin is not None and stream_id is not None: msg = "Must not provide both origin and stream_id" raise ValueError(msg) self.state_machine.process_input( ConnectionInputs.SEND_ALTERNATIVE_SERVICE, ) if origin is not None: # This ALTSVC is sent on stream zero. f = AltSvcFrame(stream_id=0) f.origin = origin f.field = field_value frames: list[Frame] = [f] else: stream = self._get_stream_by_id(stream_id) frames = stream.advertise_alternative_service(field_value) self._prepare_for_sending(frames) def prioritize(self, stream_id: int, weight: int | None = None, depends_on: int | None = None, exclusive: bool | None = None) -> None: """ Notify a server about the priority of a stream. Stream priorities are a form of guidance to a remote server: they inform the server about how important a given response is, so that the server may allocate its resources (e.g. bandwidth, CPU time, etc.) accordingly. This exists to allow clients to ensure that the most important data arrives earlier, while less important data does not starve out the more important data. Stream priorities are explained in depth in `RFC 7540 Section 5.3 `_. This method updates the priority information of a single stream. It may be called well before a stream is actively in use, or well after a stream is closed. .. warning:: RFC 7540 allows for servers to change the priority of streams. However, h2 **does not** allow server stacks to do this. This is because most clients do not adequately know how to respond when provided conflicting priority information, and relatively little utility is provided by making that functionality available. .. note:: h2 **does not** maintain any information about the RFC 7540 priority tree. That means that h2 does not prevent incautious users from creating invalid priority trees, particularly by creating priority loops. While some basic error checking is provided by h2, users are strongly recommended to understand their prioritisation strategies before using the priority tools here. .. note:: Priority information is strictly advisory. Servers are allowed to disregard it entirely. Avoid relying on the idea that your priority signaling will definitely be obeyed. .. versionadded:: 2.4.0 :param stream_id: The ID of the stream to prioritize. :type stream_id: ``int`` :param weight: The weight to give the stream. Defaults to ``16``, the default weight of any stream. May be any value between ``1`` and ``256`` inclusive. The relative weight of a stream indicates what proportion of available resources will be allocated to that stream. :type weight: ``int`` :param depends_on: The ID of the stream on which this stream depends. This stream will only be progressed if it is impossible to progress the parent stream (the one on which this one depends). Passing the value ``0`` means that this stream does not depend on any other. Defaults to ``0``. :type depends_on: ``int`` :param exclusive: Whether this stream is an exclusive dependency of its "parent" stream (i.e. the stream given by ``depends_on``). If a stream is an exclusive dependency of another, that means that all previously-set children of the parent are moved to become children of the new exclusively-dependent stream. Defaults to ``False``. :type exclusive: ``bool`` """ if not self.config.client_side: msg = "Servers SHOULD NOT prioritize streams." raise RFC1122Error(msg) self.state_machine.process_input( ConnectionInputs.SEND_PRIORITY, ) frame = PriorityFrame(stream_id) frame_prio = _add_frame_priority(frame, weight, depends_on, exclusive) self._prepare_for_sending([frame_prio]) def local_flow_control_window(self, stream_id: int) -> int: """ Returns the maximum amount of data that can be sent on stream ``stream_id``. This value will never be larger than the total data that can be sent on the connection: even if the given stream allows more data, the connection window provides a logical maximum to the amount of data that can be sent. The maximum data that can be sent in a single data frame on a stream is either this value, or the maximum frame size, whichever is *smaller*. :param stream_id: The ID of the stream whose flow control window is being queried. :type stream_id: ``int`` :returns: The amount of data in bytes that can be sent on the stream before the flow control window is exhausted. :rtype: ``int`` """ stream = self._get_stream_by_id(stream_id) return min( self.outbound_flow_control_window, stream.outbound_flow_control_window, ) def remote_flow_control_window(self, stream_id: int) -> int: """ Returns the maximum amount of data the remote peer can send on stream ``stream_id``. This value will never be larger than the total data that can be sent on the connection: even if the given stream allows more data, the connection window provides a logical maximum to the amount of data that can be sent. The maximum data that can be sent in a single data frame on a stream is either this value, or the maximum frame size, whichever is *smaller*. :param stream_id: The ID of the stream whose flow control window is being queried. :type stream_id: ``int`` :returns: The amount of data in bytes that can be received on the stream before the flow control window is exhausted. :rtype: ``int`` """ stream = self._get_stream_by_id(stream_id) return min( self.inbound_flow_control_window, stream.inbound_flow_control_window, ) def acknowledge_received_data(self, acknowledged_size: int, stream_id: int) -> None: """ Inform the :class:`H2Connection ` that a certain number of flow-controlled bytes have been processed, and that the space should be handed back to the remote peer at an opportune time. .. versionadded:: 2.5.0 :param acknowledged_size: The total *flow-controlled size* of the data that has been processed. Note that this must include the amount of padding that was sent with that data. :type acknowledged_size: ``int`` :param stream_id: The ID of the stream on which this data was received. :type stream_id: ``int`` :returns: Nothing :rtype: ``None`` """ self.config.logger.debug( "Ack received data on stream ID %d with size %d", stream_id, acknowledged_size, ) if stream_id <= 0: msg = f"Stream ID {stream_id} is not valid for acknowledge_received_data" raise ValueError(msg) if acknowledged_size < 0: msg = "Cannot acknowledge negative data" raise ValueError(msg) frames: list[Frame] = [] conn_manager = self._inbound_flow_control_window_manager conn_increment = conn_manager.process_bytes(acknowledged_size) if conn_increment: f = WindowUpdateFrame(0) f.window_increment = conn_increment frames.append(f) try: stream = self._get_stream_by_id(stream_id) except StreamClosedError: # The stream is already gone. We're not worried about incrementing # the window in this case. pass else: # No point incrementing the windows of closed streams. if stream.open: frames.extend( stream.acknowledge_received_data(acknowledged_size), ) self._prepare_for_sending(frames) def data_to_send(self, amount: int | None = None) -> bytes: """ Returns some data for sending out of the internal data buffer. This method is analogous to ``read`` on a file-like object, but it doesn't block. Instead, it returns as much data as the user asks for, or less if that much data is not available. It does not perform any I/O, and so uses a different name. :param amount: (optional) The maximum amount of data to return. If not set, or set to ``None``, will return as much data as possible. :type amount: ``int`` :returns: A bytestring containing the data to send on the wire. :rtype: ``bytes`` """ if amount is None: data = bytes(self._data_to_send) self._data_to_send = bytearray() return data data = bytes(self._data_to_send[:amount]) self._data_to_send = self._data_to_send[amount:] return data def clear_outbound_data_buffer(self) -> None: """ Clears the outbound data buffer, such that if this call was immediately followed by a call to :meth:`data_to_send `, that call would return no data. This method should not normally be used, but is made available to avoid exposing implementation details. """ self._data_to_send = bytearray() def _acknowledge_settings(self) -> list[Frame]: """ Acknowledge settings that have been received. .. versionchanged:: 2.0.0 Removed from public API, removed useless ``event`` parameter, made automatic. :returns: Nothing """ self.state_machine.process_input(ConnectionInputs.SEND_SETTINGS) changes = self.remote_settings.acknowledge() if SettingCodes.INITIAL_WINDOW_SIZE in changes: setting = changes[SettingCodes.INITIAL_WINDOW_SIZE] self._flow_control_change_from_settings( setting.original_value, setting.new_value, ) # HEADER_TABLE_SIZE changes by the remote part affect our encoder: cf. # RFC 7540 Section 6.5.2. if SettingCodes.HEADER_TABLE_SIZE in changes: setting = changes[SettingCodes.HEADER_TABLE_SIZE] self.encoder.header_table_size = setting.new_value if SettingCodes.MAX_FRAME_SIZE in changes: setting = changes[SettingCodes.MAX_FRAME_SIZE] self.max_outbound_frame_size = setting.new_value for stream in self.streams.values(): stream.max_outbound_frame_size = setting.new_value f = SettingsFrame(0) f.flags.add("ACK") return [f] def _flow_control_change_from_settings(self, old_value: int | None, new_value: int) -> None: """ Update flow control windows in response to a change in the value of SETTINGS_INITIAL_WINDOW_SIZE. When this setting is changed, it automatically updates all flow control windows by the delta in the settings values. Note that it does not increment the *connection* flow control window, per section 6.9.2 of RFC 7540. """ delta = new_value - (old_value or 0) for stream in self.streams.values(): stream.outbound_flow_control_window = guard_increment_window( stream.outbound_flow_control_window, delta, ) def _inbound_flow_control_change_from_settings(self, old_value: int | None, new_value: int) -> None: """ Update remote flow control windows in response to a change in the value of SETTINGS_INITIAL_WINDOW_SIZE. When this setting is changed, it automatically updates all remote flow control windows by the delta in the settings values. """ delta = new_value - (old_value or 0) for stream in self.streams.values(): stream._inbound_flow_control_change_from_settings(delta) def receive_data(self, data: bytes) -> list[Event]: """ Pass some received HTTP/2 data to the connection for handling. :param data: The data received from the remote peer on the network. :type data: ``bytes`` :returns: A list of events that the remote peer triggered by sending this data. """ self.config.logger.trace( "Process received data on connection. Received data: %r", data, ) events: list[Event] = [] self.incoming_buffer.add_data(data) self.incoming_buffer.max_frame_size = self.max_inbound_frame_size try: for frame in self.incoming_buffer: events.extend(self._receive_frame(frame)) except InvalidPaddingError as e: self._terminate_connection(ErrorCodes.PROTOCOL_ERROR) msg = "Received frame with invalid padding." raise ProtocolError(msg) from e except ProtocolError as e: # For whatever reason, receiving the frame caused a protocol error. # We should prepare to emit a GoAway frame before throwing the # exception up further. No need for an event: the exception will # do fine. self._terminate_connection(e.error_code) raise return events def _receive_frame(self, frame: Frame) -> list[Event]: """ Handle a frame received on the connection. .. versionchanged:: 2.0.0 Removed from the public API. """ events: list[Event] self.config.logger.trace("Received frame: %s", repr(frame)) try: # I don't love using __class__ here, maybe reconsider it. frames, events = self._frame_dispatch_table[frame.__class__](frame) except StreamClosedError as e: # If the stream was closed by RST_STREAM, we just send a RST_STREAM # to the remote peer. Otherwise, this is a connection error, and so # we will re-raise to trigger one. if self._stream_is_closed_by_reset(e.stream_id): f = RstStreamFrame(e.stream_id) f.error_code = e.error_code self._prepare_for_sending([f]) events = e._events else: raise except StreamIDTooLowError as e: # The stream ID seems invalid. This may happen when the closed # stream has been cleaned up, or when the remote peer has opened a # new stream with a higher stream ID than this one, forcing it # closed implicitly. # # Check how the stream was closed: depending on the mechanism, it # is either a stream error or a connection error. if self._stream_is_closed_by_reset(e.stream_id): # Closed by RST_STREAM is a stream error. f = RstStreamFrame(e.stream_id) f.error_code = ErrorCodes.STREAM_CLOSED self._prepare_for_sending([f]) events = [] elif self._stream_is_closed_by_end(e.stream_id): # Closed by END_STREAM is a connection error. raise StreamClosedError(e.stream_id) from e else: # Closed implicitly, also a connection error, but of type # PROTOCOL_ERROR. raise else: self._prepare_for_sending(frames) return events def _terminate_connection(self, error_code: ErrorCodes) -> None: """ Terminate the connection early. Used in error handling blocks to send GOAWAY frames. """ f = GoAwayFrame(0) f.last_stream_id = self.highest_inbound_stream_id f.error_code = error_code self.state_machine.process_input(ConnectionInputs.SEND_GOAWAY) self._prepare_for_sending([f]) def _receive_headers_frame(self, frame: HeadersFrame) -> tuple[list[Frame], list[Event]]: """ Receive a headers frame on the connection. """ # If necessary, check we can open the stream. Also validate that the # stream ID is valid. if frame.stream_id not in self.streams: max_open_streams = self.local_settings.max_concurrent_streams if (self.open_inbound_streams + 1) > max_open_streams: msg = f"Max outbound streams is {max_open_streams}, {self.open_outbound_streams} open" raise TooManyStreamsError(msg) # Let's decode the headers. We handle headers as bytes internally up # until we hang them off the event, at which point we may optionally # convert them to unicode. headers = _decode_headers(self.decoder, frame.data) events = self.state_machine.process_input( ConnectionInputs.RECV_HEADERS, ) stream = self._get_or_create_stream( frame.stream_id, AllowedStreamIDs(not self.config.client_side), ) frames, stream_events = stream.receive_headers( headers, "END_STREAM" in frame.flags, self.config.header_encoding, ) if "PRIORITY" in frame.flags: p_frames, p_events = self._receive_priority_frame(frame) expected_frame_types = (RequestReceived, ResponseReceived, TrailersReceived, InformationalResponseReceived) assert isinstance(stream_events[0], expected_frame_types) assert isinstance(p_events[0], PriorityUpdated) stream_events[0].priority_updated = p_events[0] stream_events.extend(p_events) assert not p_frames return frames, events + stream_events def _receive_push_promise_frame(self, frame: PushPromiseFrame) -> tuple[list[Frame], list[Event]]: """ Receive a push-promise frame on the connection. """ if not self.local_settings.enable_push: msg = "Received pushed stream" raise ProtocolError(msg) pushed_headers = _decode_headers(self.decoder, frame.data) events = self.state_machine.process_input( ConnectionInputs.RECV_PUSH_PROMISE, ) try: stream = self._get_stream_by_id(frame.stream_id) except NoSuchStreamError as e: # We need to check if the parent stream was reset by us. If it was # then we presume that the PUSH_PROMISE was in flight when we reset # the parent stream. Rather than accept the new stream, just reset # it. # # If this was closed naturally, however, we should call this a # PROTOCOL_ERROR: pushing a stream on a naturally closed stream is # a real problem because it creates a brand new stream that the # remote peer now believes exists. if (self._stream_closed_by(frame.stream_id) == StreamClosedBy.SEND_RST_STREAM): f = RstStreamFrame(frame.promised_stream_id) f.error_code = ErrorCodes.REFUSED_STREAM return [f], events msg = "Attempted to push on closed stream." raise ProtocolError(msg) from e # We need to prevent peers pushing streams in response to streams that # they themselves have already pushed: see #163 and RFC 7540 § 6.6. The # easiest way to do that is to assert that the stream_id is not even: # this shortcut works because only servers can push and the state # machine will enforce this. if (frame.stream_id % 2) == 0: msg = "Cannot recursively push streams." raise ProtocolError(msg) try: frames, stream_events = stream.receive_push_promise_in_band( frame.promised_stream_id, pushed_headers, self.config.header_encoding, ) except StreamClosedError: # The parent stream was reset by us, so we presume that # PUSH_PROMISE was in flight when we reset the parent stream. # So we just reset the new stream. f = RstStreamFrame(frame.promised_stream_id) f.error_code = ErrorCodes.REFUSED_STREAM return [f], events new_stream = self._begin_new_stream( frame.promised_stream_id, AllowedStreamIDs.EVEN, ) self.streams[frame.promised_stream_id] = new_stream new_stream.remotely_pushed(pushed_headers) return frames, events + stream_events def _handle_data_on_closed_stream(self, events: list[Event], exc: StreamClosedError, frame: DataFrame) -> tuple[list[Frame], list[Event]]: # This stream is already closed - and yet we received a DATA frame. # The received DATA frame counts towards the connection flow window. # We need to manually to acknowledge the DATA frame to update the flow # window of the connection. Otherwise the whole connection stalls due # the inbound flow window being 0. frames: list[Frame] = [] conn_manager = self._inbound_flow_control_window_manager conn_increment = conn_manager.process_bytes( frame.flow_controlled_length, ) if conn_increment: window_update_frame = WindowUpdateFrame(0) window_update_frame.window_increment = conn_increment frames.append(window_update_frame) self.config.logger.debug( "Received DATA frame on closed stream %d - " "auto-emitted a WINDOW_UPDATE by %d", frame.stream_id, conn_increment, ) rst_stream_frame = RstStreamFrame(exc.stream_id) rst_stream_frame.error_code = exc.error_code frames.append(rst_stream_frame) self.config.logger.debug( "Stream %s already CLOSED or cleaned up - auto-emitted a RST_FRAME", frame.stream_id, ) return frames, events + exc._events def _receive_data_frame(self, frame: DataFrame) -> tuple[list[Frame], list[Event]]: """ Receive a data frame on the connection. """ flow_controlled_length = frame.flow_controlled_length events = self.state_machine.process_input( ConnectionInputs.RECV_DATA, ) self._inbound_flow_control_window_manager.window_consumed( flow_controlled_length, ) try: stream = self._get_stream_by_id(frame.stream_id) frames, stream_events = stream.receive_data( frame.data, "END_STREAM" in frame.flags, flow_controlled_length, ) except StreamClosedError as e: # This stream is either marked as CLOSED or already gone from our # internal state. return self._handle_data_on_closed_stream(events, e, frame) return frames, events + stream_events def _receive_settings_frame(self, frame: SettingsFrame) -> tuple[list[Frame], list[Event]]: """ Receive a SETTINGS frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_SETTINGS, ) # This is an ack of the local settings. if "ACK" in frame.flags: changed_settings = self._local_settings_acked() ack_event = SettingsAcknowledged() ack_event.changed_settings = changed_settings events.append(ack_event) return [], events # Add the new settings. self.remote_settings.update(frame.settings) events.append( RemoteSettingsChanged.from_settings( self.remote_settings, frame.settings, ), ) frames = self._acknowledge_settings() return frames, events def _receive_window_update_frame(self, frame: WindowUpdateFrame) -> tuple[list[Frame], list[Event]]: """ Receive a WINDOW_UPDATE frame on the connection. """ # hyperframe will take care of validating the window_increment. # If we reach in here, we can assume a valid value. events = self.state_machine.process_input( ConnectionInputs.RECV_WINDOW_UPDATE, ) if frame.stream_id: try: stream = self._get_stream_by_id(frame.stream_id) frames, stream_events = stream.receive_window_update( frame.window_increment, ) except StreamClosedError: return [], events else: # Increment our local flow control window. self.outbound_flow_control_window = guard_increment_window( self.outbound_flow_control_window, frame.window_increment, ) # FIXME: Should we split this into one event per active stream? window_updated_event = WindowUpdated() window_updated_event.stream_id = 0 window_updated_event.delta = frame.window_increment stream_events = [window_updated_event] frames = [] return frames, events + stream_events def _receive_ping_frame(self, frame: PingFrame) -> tuple[list[Frame], list[Event]]: """ Receive a PING frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_PING, ) frames: list[Frame] = [] evt: PingReceived | PingAckReceived if "ACK" in frame.flags: evt = PingAckReceived() else: evt = PingReceived() # automatically ACK the PING with the same 'opaque data' f = PingFrame(0) f.flags.add("ACK") f.opaque_data = frame.opaque_data frames.append(f) evt.ping_data = frame.opaque_data events.append(evt) return frames, events def _receive_rst_stream_frame(self, frame: RstStreamFrame) -> tuple[list[Frame], list[Event]]: """ Receive a RST_STREAM frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_RST_STREAM, ) try: stream = self._get_stream_by_id(frame.stream_id) except NoSuchStreamError: # The stream is missing. That's ok, we just do nothing here. stream_frames: list[Frame] = [] stream_events: list[Event] = [] else: stream_frames, stream_events = stream.stream_reset(frame) return stream_frames, events + stream_events def _receive_priority_frame(self, frame: HeadersFrame | PriorityFrame) -> tuple[list[Frame], list[Event]]: """ Receive a PRIORITY frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_PRIORITY, ) event = PriorityUpdated() event.stream_id = frame.stream_id event.depends_on = frame.depends_on event.exclusive = frame.exclusive # Weight is an integer between 1 and 256, but the byte only allows # 0 to 255: add one. event.weight = frame.stream_weight + 1 # A stream may not depend on itself. if event.depends_on == frame.stream_id: msg = f"Stream {frame.stream_id} may not depend on itself" raise ProtocolError(msg) events.append(event) return [], events def _receive_goaway_frame(self, frame: GoAwayFrame) -> tuple[list[Frame], list[Event]]: """ Receive a GOAWAY frame on the connection. """ events = self.state_machine.process_input( ConnectionInputs.RECV_GOAWAY, ) # Clear the outbound data buffer: we cannot send further data now. self.clear_outbound_data_buffer() # Fire an appropriate ConnectionTerminated event. new_event = ConnectionTerminated() new_event.error_code = _error_code_from_int(frame.error_code) new_event.last_stream_id = frame.last_stream_id new_event.additional_data = (frame.additional_data if frame.additional_data else None) events.append(new_event) return [], events def _receive_naked_continuation(self, frame: ContinuationFrame) -> None: """ A naked CONTINUATION frame has been received. This is always an error, but the type of error it is depends on the state of the stream and must transition the state of the stream, so we need to pass it to the appropriate stream. """ stream = self._get_stream_by_id(frame.stream_id) stream.receive_continuation() msg = "Should not be reachable" # pragma: no cover raise AssertionError(msg) # pragma: no cover def _receive_alt_svc_frame(self, frame: AltSvcFrame) -> tuple[list[Frame], list[Event]]: """ An ALTSVC frame has been received. This frame, specified in RFC 7838, is used to advertise alternative places where the same service can be reached. This frame can optionally be received either on a stream or on stream 0, and its semantics are different in each case. """ events = self.state_machine.process_input( ConnectionInputs.RECV_ALTERNATIVE_SERVICE, ) frames = [] if frame.stream_id: # Given that it makes no sense to receive ALTSVC on a stream # before that stream has been opened with a HEADERS frame, the # ALTSVC frame cannot create a stream. If the stream is not # present, we simply ignore the frame. try: stream = self._get_stream_by_id(frame.stream_id) except (NoSuchStreamError, StreamClosedError): pass else: stream_frames, stream_events = stream.receive_alt_svc(frame) frames.extend(stream_frames) events.extend(stream_events) else: # This frame is sent on stream 0. The origin field on the frame # must be present, though if it isn't it's not a ProtocolError # (annoyingly), we just need to ignore it. if not frame.origin: return frames, events # If we're a server, we want to ignore this (RFC 7838 says so). if not self.config.client_side: return frames, events event = AlternativeServiceAvailable() event.origin = frame.origin event.field_value = frame.field events.append(event) return frames, events def _receive_unknown_frame(self, frame: ExtensionFrame) -> tuple[list[Frame], list[Event]]: """ We have received a frame that we do not understand. This is almost certainly an extension frame, though it's impossible to be entirely sure. RFC 7540 § 5.5 says that we MUST ignore unknown frame types: so we do. We do notify the user that we received one, however. """ # All we do here is log. self.config.logger.debug( "Received unknown extension frame (ID %d)", frame.stream_id, ) event = UnknownFrameReceived() event.frame = frame return [], [event] def _local_settings_acked(self) -> dict[SettingCodes | int, ChangedSetting]: """ Handle the local settings being ACKed, update internal state. """ changes = self.local_settings.acknowledge() if SettingCodes.INITIAL_WINDOW_SIZE in changes: setting = changes[SettingCodes.INITIAL_WINDOW_SIZE] self._inbound_flow_control_change_from_settings( setting.original_value, setting.new_value, ) if SettingCodes.MAX_HEADER_LIST_SIZE in changes: setting = changes[SettingCodes.MAX_HEADER_LIST_SIZE] self.decoder.max_header_list_size = setting.new_value if SettingCodes.MAX_FRAME_SIZE in changes: setting = changes[SettingCodes.MAX_FRAME_SIZE] self.max_inbound_frame_size = setting.new_value if SettingCodes.HEADER_TABLE_SIZE in changes: setting = changes[SettingCodes.HEADER_TABLE_SIZE] # This is safe across all hpack versions: some versions just won't # respect it. self.decoder.max_allowed_table_size = setting.new_value return changes def _stream_id_is_outbound(self, stream_id: int) -> bool: """ Returns ``True`` if the stream ID corresponds to an outbound stream (one initiated by this peer), returns ``False`` otherwise. """ return (stream_id % 2 == int(self.config.client_side)) def _stream_closed_by(self, stream_id: int) -> StreamClosedBy | None: """ Returns how the stream was closed. The return value will be either a member of ``h2.stream.StreamClosedBy`` or ``None``. If ``None``, the stream was closed implicitly by the peer opening a stream with a higher stream ID before opening this one. """ if stream_id in self.streams: return self.streams[stream_id].closed_by if stream_id in self._closed_streams: return self._closed_streams[stream_id] return None def _stream_is_closed_by_reset(self, stream_id: int) -> bool: """ Returns ``True`` if the stream was closed by sending or receiving a RST_STREAM frame. Returns ``False`` otherwise. """ return self._stream_closed_by(stream_id) in ( StreamClosedBy.RECV_RST_STREAM, StreamClosedBy.SEND_RST_STREAM, ) def _stream_is_closed_by_end(self, stream_id: int) -> bool: """ Returns ``True`` if the stream was closed by sending or receiving an END_STREAM flag in a HEADERS or DATA frame. Returns ``False`` otherwise. """ return self._stream_closed_by(stream_id) in ( StreamClosedBy.RECV_END_STREAM, StreamClosedBy.SEND_END_STREAM, ) def _add_frame_priority(frame: PriorityFrame | HeadersFrame, weight: int | None = None, depends_on: int | None = None, exclusive: bool | None = None) -> PriorityFrame | HeadersFrame: """ Adds priority data to a given frame. Does not change any flags set on that frame: if the caller is adding priority information to a HEADERS frame they must set that themselves. This method also deliberately sets defaults for anything missing. This method validates the input values. """ # A stream may not depend on itself. if depends_on == frame.stream_id: msg = f"Stream {frame.stream_id} may not depend on itself" raise ProtocolError(msg) # Weight must be between 1 and 256. if weight is not None: if weight > 256 or weight < 1: msg = f"Weight must be between 1 and 256, not {weight}" raise ProtocolError(msg) # Weight is an integer between 1 and 256, but the byte only allows # 0 to 255: subtract one. weight -= 1 # Set defaults for anything not provided. weight = weight if weight is not None else 15 depends_on = depends_on if depends_on is not None else 0 exclusive = exclusive if exclusive is not None else False frame.stream_weight = weight frame.depends_on = depends_on frame.exclusive = exclusive return frame def _decode_headers(decoder: Decoder, encoded_header_block: bytes) -> Iterable[Header]: """ Decode a HPACK-encoded header block, translating HPACK exceptions into sensible h2 errors. This only ever returns bytestring headers: h2 may emit them as unicode later, but internally it processes them as bytestrings only. """ try: return decoder.decode(encoded_header_block, raw=True) except OversizedHeaderListError as e: # This is a symptom of a HPACK bomb attack: the user has # disregarded our requirements on how large a header block we'll # accept. msg = f"Oversized header block: {e}" raise DenialOfServiceError(msg) from e except (HPACKError, IndexError, TypeError, UnicodeDecodeError) as e: # We should only need HPACKError here, but versions of HPACK older # than 2.1.0 throw all three others as well. For maximum # compatibility, catch all of them. msg = f"Error decoding header block: {e}" raise ProtocolError(msg) from e ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/errors.py0000644000076500000240000000305514744265074014375 0ustar00kriechistaff""" h2/errors ~~~~~~~~~ Global error code registry containing the established HTTP/2 error codes. The current registry is available at: https://tools.ietf.org/html/rfc7540#section-11.4 """ from __future__ import annotations import enum class ErrorCodes(enum.IntEnum): """ All known HTTP/2 error codes. .. versionadded:: 2.5.0 """ #: Graceful shutdown. NO_ERROR = 0x0 #: Protocol error detected. PROTOCOL_ERROR = 0x1 #: Implementation fault. INTERNAL_ERROR = 0x2 #: Flow-control limits exceeded. FLOW_CONTROL_ERROR = 0x3 #: Settings not acknowledged. SETTINGS_TIMEOUT = 0x4 #: Frame received for closed stream. STREAM_CLOSED = 0x5 #: Frame size incorrect. FRAME_SIZE_ERROR = 0x6 #: Stream not processed. REFUSED_STREAM = 0x7 #: Stream cancelled. CANCEL = 0x8 #: Compression state not updated. COMPRESSION_ERROR = 0x9 #: TCP connection error for CONNECT method. CONNECT_ERROR = 0xa #: Processing capacity exceeded. ENHANCE_YOUR_CALM = 0xb #: Negotiated TLS parameters not acceptable. INADEQUATE_SECURITY = 0xc #: Use HTTP/1.1 for the request. HTTP_1_1_REQUIRED = 0xd def _error_code_from_int(code: int) -> ErrorCodes | int: """ Given an integer error code, returns either one of :class:`ErrorCodes ` or, if not present in the known set of codes, returns the integer directly. """ try: return ErrorCodes(code) except ValueError: return code __all__ = ["ErrorCodes"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/events.py0000644000076500000240000005435414744265074014375 0ustar00kriechistaff""" h2/events ~~~~~~~~~ Defines Event types for HTTP/2. Events are returned by the H2 state machine to allow implementations to keep track of events triggered by receiving data. Each time data is provided to the H2 state machine it processes the data and returns a list of Event objects. """ from __future__ import annotations import binascii from typing import TYPE_CHECKING from .settings import ChangedSetting, SettingCodes, Settings, _setting_code_from_int if TYPE_CHECKING: # pragma: no cover from hpack import HeaderTuple from hyperframe.frame import Frame from .errors import ErrorCodes class Event: """ Base class for h2 events. """ class RequestReceived(Event): """ The RequestReceived event is fired whenever all of a request's headers are received. This event carries the HTTP headers for the given request and the stream ID of the new stream. In HTTP/2, headers may be sent as a HEADERS frame followed by zero or more CONTINUATION frames with the final frame setting the END_HEADERS flag. This event is fired after the entire sequence is received. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self) -> None: #: The Stream ID for the stream this request was made on. self.stream_id: int | None = None #: The request headers. self.headers: list[HeaderTuple] | None = None #: If this request also ended the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended: StreamEnded | None = None #: If this request also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated: PriorityUpdated | None = None def __repr__(self) -> str: return f"" class ResponseReceived(Event): """ The ResponseReceived event is fired whenever response headers are received. This event carries the HTTP headers for the given response and the stream ID of the new stream. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self) -> None: #: The Stream ID for the stream this response was made on. self.stream_id: int | None = None #: The response headers. self.headers: list[HeaderTuple] | None = None #: If this response also ended the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended: StreamEnded | None = None #: If this response also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated: PriorityUpdated | None = None def __repr__(self) -> str: return f"" class TrailersReceived(Event): """ The TrailersReceived event is fired whenever trailers are received on a stream. Trailers are a set of headers sent after the body of the request/response, and are used to provide information that wasn't known ahead of time (e.g. content-length). This event carries the HTTP header fields that form the trailers and the stream ID of the stream on which they were received. .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``stream_ended`` and ``priority_updated`` properties. """ def __init__(self) -> None: #: The Stream ID for the stream on which these trailers were received. self.stream_id: int | None = None #: The trailers themselves. self.headers: list[HeaderTuple] | None = None #: Trailers always end streams. This property has the associated #: :class:`StreamEnded ` in it. #: #: .. versionadded:: 2.4.0 self.stream_ended: StreamEnded | None = None #: If the trailers also set associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated: PriorityUpdated | None = None def __repr__(self) -> str: return f"" class _HeadersSent(Event): """ The _HeadersSent event is fired whenever headers are sent. This is an internal event, used to determine validation steps on outgoing header blocks. """ class _ResponseSent(_HeadersSent): """ The _ResponseSent event is fired whenever response headers are sent on a stream. This is an internal event, used to determine validation steps on outgoing header blocks. """ class _RequestSent(_HeadersSent): """ The _RequestSent event is fired whenever request headers are sent on a stream. This is an internal event, used to determine validation steps on outgoing header blocks. """ class _TrailersSent(_HeadersSent): """ The _TrailersSent event is fired whenever trailers are sent on a stream. Trailers are a set of headers sent after the body of the request/response, and are used to provide information that wasn't known ahead of time (e.g. content-length). This is an internal event, used to determine validation steps on outgoing header blocks. """ class _PushedRequestSent(_HeadersSent): """ The _PushedRequestSent event is fired whenever pushed request headers are sent. This is an internal event, used to determine validation steps on outgoing header blocks. """ class InformationalResponseReceived(Event): """ The InformationalResponseReceived event is fired when an informational response (that is, one whose status code is a 1XX code) is received from the remote peer. The remote peer may send any number of these, from zero upwards. These responses are most commonly sent in response to requests that have the ``expect: 100-continue`` header field present. Most users can safely ignore this event unless you are intending to use the ``expect: 100-continue`` flow, or are for any reason expecting a different 1XX status code. .. versionadded:: 2.2.0 .. versionchanged:: 2.3.0 Changed the type of ``headers`` to :class:`HeaderTuple `. This has no effect on current users. .. versionchanged:: 2.4.0 Added ``priority_updated`` property. """ def __init__(self) -> None: #: The Stream ID for the stream this informational response was made #: on. self.stream_id: int | None = None #: The headers for this informational response. self.headers: list[HeaderTuple] | None = None #: If this response also had associated priority information, the #: associated :class:`PriorityUpdated ` #: event will be available here. #: #: .. versionadded:: 2.4.0 self.priority_updated: PriorityUpdated | None = None def __repr__(self) -> str: return f"" class DataReceived(Event): """ The DataReceived event is fired whenever data is received on a stream from the remote peer. The event carries the data itself, and the stream ID on which the data was received. .. versionchanged:: 2.4.0 Added ``stream_ended`` property. """ def __init__(self) -> None: #: The Stream ID for the stream this data was received on. self.stream_id: int | None = None #: The data itself. self.data: bytes | None = None #: The amount of data received that counts against the flow control #: window. Note that padding counts against the flow control window, so #: when adjusting flow control you should always use this field rather #: than ``len(data)``. self.flow_controlled_length: int | None = None #: If this data chunk also completed the stream, the associated #: :class:`StreamEnded ` event will be available #: here. #: #: .. versionadded:: 2.4.0 self.stream_ended: StreamEnded | None = None def __repr__(self) -> str: return ( "".format( self.stream_id, self.flow_controlled_length, _bytes_representation(self.data[:20]) if self.data else "", ) ) class WindowUpdated(Event): """ The WindowUpdated event is fired whenever a flow control window changes size. HTTP/2 defines flow control windows for connections and streams: this event fires for both connections and streams. The event carries the ID of the stream to which it applies (set to zero if the window update applies to the connection), and the delta in the window size. """ def __init__(self) -> None: #: The Stream ID of the stream whose flow control window was changed. #: May be ``0`` if the connection window was changed. self.stream_id: int | None = None #: The window delta. self.delta: int | None = None def __repr__(self) -> str: return f"" class RemoteSettingsChanged(Event): """ The RemoteSettingsChanged event is fired whenever the remote peer changes its settings. It contains a complete inventory of changed settings, including their previous values. In HTTP/2, settings changes need to be acknowledged. h2 automatically acknowledges settings changes for efficiency. However, it is possible that the caller may not be happy with the changed setting. When this event is received, the caller should confirm that the new settings are acceptable. If they are not acceptable, the user should close the connection with the error code :data:`PROTOCOL_ERROR `. .. versionchanged:: 2.0.0 Prior to this version the user needed to acknowledge settings changes. This is no longer the case: h2 now automatically acknowledges them. """ def __init__(self) -> None: #: A dictionary of setting byte to #: :class:`ChangedSetting `, representing #: the changed settings. self.changed_settings: dict[int, ChangedSetting] = {} @classmethod def from_settings(cls, old_settings: Settings | dict[int, int], new_settings: dict[int, int]) -> RemoteSettingsChanged: """ Build a RemoteSettingsChanged event from a set of changed settings. :param old_settings: A complete collection of old settings, in the form of a dictionary of ``{setting: value}``. :param new_settings: All the changed settings and their new values, in the form of a dictionary of ``{setting: value}``. """ e = cls() for setting, new_value in new_settings.items(): s = _setting_code_from_int(setting) original_value = old_settings.get(s) change = ChangedSetting(s, original_value, new_value) e.changed_settings[s] = change return e def __repr__(self) -> str: return "".format( ", ".join(repr(cs) for cs in self.changed_settings.values()), ) class PingReceived(Event): """ The PingReceived event is fired whenever a PING is received. It contains the 'opaque data' of the PING frame. A ping acknowledgment with the same 'opaque data' is automatically emitted after receiving a ping. .. versionadded:: 3.1.0 """ def __init__(self) -> None: #: The data included on the ping. self.ping_data: bytes | None = None def __repr__(self) -> str: return f"" class PingAckReceived(Event): """ The PingAckReceived event is fired whenever a PING acknowledgment is received. It contains the 'opaque data' of the PING+ACK frame, allowing the user to correlate PINGs and calculate RTT. .. versionadded:: 3.1.0 .. versionchanged:: 4.0.0 Removed deprecated but equivalent ``PingAcknowledged``. """ def __init__(self) -> None: #: The data included on the ping. self.ping_data: bytes | None = None def __repr__(self) -> str: return f"" class StreamEnded(Event): """ The StreamEnded event is fired whenever a stream is ended by a remote party. The stream may not be fully closed if it has not been closed locally, but no further data or headers should be expected on that stream. """ def __init__(self) -> None: #: The Stream ID of the stream that was closed. self.stream_id: int | None = None def __repr__(self) -> str: return f"" class StreamReset(Event): """ The StreamReset event is fired in two situations. The first is when the remote party forcefully resets the stream. The second is when the remote party has made a protocol error which only affects a single stream. In this case, h2 will terminate the stream early and return this event. .. versionchanged:: 2.0.0 This event is now fired when h2 automatically resets a stream. """ def __init__(self) -> None: #: The Stream ID of the stream that was reset. self.stream_id: int | None = None #: The error code given. Either one of :class:`ErrorCodes #: ` or ``int`` self.error_code: ErrorCodes | None = None #: Whether the remote peer sent a RST_STREAM or we did. self.remote_reset = True def __repr__(self) -> str: return f"" class PushedStreamReceived(Event): """ The PushedStreamReceived event is fired whenever a pushed stream has been received from a remote peer. The event carries on it the new stream ID, the ID of the parent stream, and the request headers pushed by the remote peer. """ def __init__(self) -> None: #: The Stream ID of the stream created by the push. self.pushed_stream_id: int | None = None #: The Stream ID of the stream that the push is related to. self.parent_stream_id: int | None = None #: The request headers, sent by the remote party in the push. self.headers: list[HeaderTuple] | None = None def __repr__(self) -> str: return ( f"" ) class SettingsAcknowledged(Event): """ The SettingsAcknowledged event is fired whenever a settings ACK is received from the remote peer. The event carries on it the settings that were acknowedged, in the same format as :class:`h2.events.RemoteSettingsChanged`. """ def __init__(self) -> None: #: A dictionary of setting byte to #: :class:`ChangedSetting `, representing #: the changed settings. self.changed_settings: dict[SettingCodes | int, ChangedSetting] = {} def __repr__(self) -> str: s = ", ".join(repr(cs) for cs in self.changed_settings.values()) return f"" class PriorityUpdated(Event): """ The PriorityUpdated event is fired whenever a stream sends updated priority information. This can occur when the stream is opened, or at any time during the stream lifetime. This event is purely advisory, and does not need to be acted on. .. versionadded:: 2.0.0 """ def __init__(self) -> None: #: The ID of the stream whose priority information is being updated. self.stream_id: int | None = None #: The new stream weight. May be the same as the original stream #: weight. An integer between 1 and 256. self.weight: int | None = None #: The stream ID this stream now depends on. May be ``0``. self.depends_on: int | None = None #: Whether the stream *exclusively* depends on the parent stream. If it #: does, this stream should inherit the current children of its new #: parent. self.exclusive: bool | None = None def __repr__(self) -> str: return ( f"" ) class ConnectionTerminated(Event): """ The ConnectionTerminated event is fired when a connection is torn down by the remote peer using a GOAWAY frame. Once received, no further action may be taken on the connection: a new connection must be established. """ def __init__(self) -> None: #: The error code cited when tearing down the connection. Should be #: one of :class:`ErrorCodes `, but may not be if #: unknown HTTP/2 extensions are being used. self.error_code: ErrorCodes | int | None = None #: The stream ID of the last stream the remote peer saw. This can #: provide an indication of what data, if any, never reached the remote #: peer and so can safely be resent. self.last_stream_id: int | None = None #: Additional debug data that can be appended to GOAWAY frame. self.additional_data: bytes | None = None def __repr__(self) -> str: return ( "".format( self.error_code, self.last_stream_id, _bytes_representation( self.additional_data[:20] if self.additional_data else None), ) ) class AlternativeServiceAvailable(Event): """ The AlternativeServiceAvailable event is fired when the remote peer advertises an `RFC 7838 `_ Alternative Service using an ALTSVC frame. This event always carries the origin to which the ALTSVC information applies. That origin is either supplied by the server directly, or inferred by h2 from the ``:authority`` pseudo-header field that was sent by the user when initiating a given stream. This event also carries what RFC 7838 calls the "Alternative Service Field Value", which is formatted like a HTTP header field and contains the relevant alternative service information. h2 does not parse or in any way modify that information: the user is required to do that. This event can only be fired on the client end of a connection. .. versionadded:: 2.3.0 """ def __init__(self) -> None: #: The origin to which the alternative service field value applies. #: This field is either supplied by the server directly, or inferred by #: h2 from the ``:authority`` pseudo-header field that was sent #: by the user when initiating the stream on which the frame was #: received. self.origin: bytes | None = None #: The ALTSVC field value. This contains information about the HTTP #: alternative service being advertised by the server. h2 does #: not parse this field: it is left exactly as sent by the server. The #: structure of the data in this field is given by `RFC 7838 Section 3 #: `_. self.field_value: bytes | None = None def __repr__(self) -> str: return ( "".format( (self.origin or b"").decode("utf-8", "ignore"), (self.field_value or b"").decode("utf-8", "ignore"), ) ) class UnknownFrameReceived(Event): """ The UnknownFrameReceived event is fired when the remote peer sends a frame that h2 does not understand. This occurs primarily when the remote peer is employing HTTP/2 extensions that h2 doesn't know anything about. RFC 7540 requires that HTTP/2 implementations ignore these frames. h2 does so. However, this event is fired to allow implementations to perform special processing on those frames if needed (e.g. if the implementation is capable of handling the frame itself). .. versionadded:: 2.7.0 """ def __init__(self) -> None: #: The hyperframe Frame object that encapsulates the received frame. self.frame: Frame | None = None def __repr__(self) -> str: return "" def _bytes_representation(data: bytes | None) -> str | None: """ Converts a bytestring into something that is safe to print on all Python platforms. This function is relatively expensive, so it should not be called on the mainline of the code. It's safe to use in things like object repr methods though. """ if data is None: return None return binascii.hexlify(data).decode("ascii") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/exceptions.py0000644000076500000240000001227414744265074015245 0ustar00kriechistaff""" h2/exceptions ~~~~~~~~~~~~~ Exceptions for the HTTP/2 module. """ from __future__ import annotations from .errors import ErrorCodes class H2Error(Exception): """ The base class for all exceptions for the HTTP/2 module. """ class ProtocolError(H2Error): """ An action was attempted in violation of the HTTP/2 protocol. """ #: The error code corresponds to this kind of Protocol Error. error_code = ErrorCodes.PROTOCOL_ERROR class FrameTooLargeError(ProtocolError): """ The frame that we tried to send or that we received was too large. """ #: The error code corresponds to this kind of Protocol Error. error_code = ErrorCodes.FRAME_SIZE_ERROR class FrameDataMissingError(ProtocolError): """ The frame that we received is missing some data. .. versionadded:: 2.0.0 """ #: The error code corresponds to this kind of Protocol Error. error_code = ErrorCodes.FRAME_SIZE_ERROR class TooManyStreamsError(ProtocolError): """ An attempt was made to open a stream that would lead to too many concurrent streams. """ class FlowControlError(ProtocolError): """ An attempted action violates flow control constraints. """ #: The error code corresponds to this kind of Protocol Error. error_code = ErrorCodes.FLOW_CONTROL_ERROR class StreamIDTooLowError(ProtocolError): """ An attempt was made to open a stream that had an ID that is lower than the highest ID we have seen on this connection. """ def __init__(self, stream_id: int, max_stream_id: int) -> None: #: The ID of the stream that we attempted to open. self.stream_id = stream_id #: The current highest-seen stream ID. self.max_stream_id = max_stream_id def __str__(self) -> str: return f"StreamIDTooLowError: {self.stream_id} is lower than {self.max_stream_id}" class NoAvailableStreamIDError(ProtocolError): """ There are no available stream IDs left to the connection. All stream IDs have been exhausted. .. versionadded:: 2.0.0 """ class NoSuchStreamError(ProtocolError): """ A stream-specific action referenced a stream that does not exist. .. versionchanged:: 2.0.0 Became a subclass of :class:`ProtocolError ` """ def __init__(self, stream_id: int) -> None: #: The stream ID corresponds to the non-existent stream. self.stream_id = stream_id class StreamClosedError(NoSuchStreamError): """ A more specific form of :class:`NoSuchStreamError `. Indicates that the stream has since been closed, and that all state relating to that stream has been removed. """ def __init__(self, stream_id: int) -> None: #: The stream ID corresponds to the nonexistent stream. self.stream_id = stream_id #: The relevant HTTP/2 error code. self.error_code = ErrorCodes.STREAM_CLOSED # Any events that internal code may need to fire. Not relevant to # external users that may receive a StreamClosedError. self._events = [] # type: ignore class InvalidSettingsValueError(ProtocolError, ValueError): """ An attempt was made to set an invalid Settings value. .. versionadded:: 2.0.0 """ def __init__(self, msg: str, error_code: ErrorCodes) -> None: super().__init__(msg) self.error_code = error_code class InvalidBodyLengthError(ProtocolError): """ The remote peer sent more or less data that the Content-Length header indicated. .. versionadded:: 2.0.0 """ def __init__(self, expected: int, actual: int) -> None: self.expected_length = expected self.actual_length = actual def __str__(self) -> str: return f"InvalidBodyLengthError: Expected {self.expected_length} bytes, received {self.actual_length}" class UnsupportedFrameError(ProtocolError): """ The remote peer sent a frame that is unsupported in this context. .. versionadded:: 2.1.0 .. versionchanged:: 4.0.0 Removed deprecated KeyError parent class. """ class RFC1122Error(H2Error): """ Emitted when users attempt to do something that is literally allowed by the relevant RFC, but is sufficiently ill-defined that it's unwise to allow users to actually do it. While there is some disagreement about whether or not we should be liberal in what accept, it is a truth universally acknowledged that we should be conservative in what emit. .. versionadded:: 2.4.0 """ # shazow says I'm going to regret naming the exception this way. If that # turns out to be true, TELL HIM NOTHING. class DenialOfServiceError(ProtocolError): """ Emitted when the remote peer exhibits a behaviour that is likely to be an attempt to perform a Denial of Service attack on the implementation. This is a form of ProtocolError that carries a different error code, and allows more easy detection of this kind of behaviour. .. versionadded:: 2.5.0 """ #: The error code corresponds to this kind of #: :class:`ProtocolError ` error_code = ErrorCodes.ENHANCE_YOUR_CALM ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/frame_buffer.py0000644000076500000240000001461114744265074015504 0ustar00kriechistaff""" h2/frame_buffer ~~~~~~~~~~~~~~~ A data structure that provides a way to iterate over a byte buffer in terms of frames. """ from __future__ import annotations from hyperframe.exceptions import InvalidDataError, InvalidFrameError from hyperframe.frame import ContinuationFrame, Frame, HeadersFrame, PushPromiseFrame from .exceptions import FrameDataMissingError, FrameTooLargeError, ProtocolError # To avoid a DOS attack based on sending loads of continuation frames, we limit # the maximum number we're perpared to receive. In this case, we'll set the # limit to 64, which means the largest encoded header block we can receive by # default is 262144 bytes long, and the largest possible *at all* is 1073741760 # bytes long. # # This value seems reasonable for now, but in future we may want to evaluate # making it configurable. CONTINUATION_BACKLOG = 64 class FrameBuffer: """ A buffer data structure for HTTP/2 data that allows iteraton in terms of H2 frames. """ def __init__(self, server: bool = False) -> None: self.data = b"" self.max_frame_size = 0 self._preamble = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" if server else b"" self._preamble_len = len(self._preamble) self._headers_buffer: list[HeadersFrame | ContinuationFrame | PushPromiseFrame] = [] def add_data(self, data: bytes) -> None: """ Add more data to the frame buffer. :param data: A bytestring containing the byte buffer. """ if self._preamble_len: data_len = len(data) of_which_preamble = min(self._preamble_len, data_len) if self._preamble[:of_which_preamble] != data[:of_which_preamble]: msg = "Invalid HTTP/2 preamble." raise ProtocolError(msg) data = data[of_which_preamble:] self._preamble_len -= of_which_preamble self._preamble = self._preamble[of_which_preamble:] self.data += data def _validate_frame_length(self, length: int) -> None: """ Confirm that the frame is an appropriate length. """ if length > self.max_frame_size: msg = f"Received overlong frame: length {length}, max {self.max_frame_size}" raise FrameTooLargeError(msg) def _update_header_buffer(self, f: Frame | None) -> Frame | None: """ Updates the internal header buffer. Returns a frame that should replace the current one. May throw exceptions if this frame is invalid. """ # Check if we're in the middle of a headers block. If we are, this # frame *must* be a CONTINUATION frame with the same stream ID as the # leading HEADERS or PUSH_PROMISE frame. Anything else is a # ProtocolError. If the frame *is* valid, append it to the header # buffer. if self._headers_buffer: stream_id = self._headers_buffer[0].stream_id valid_frame = ( f is not None and isinstance(f, ContinuationFrame) and f.stream_id == stream_id ) if not valid_frame: msg = "Invalid frame during header block." raise ProtocolError(msg) assert isinstance(f, ContinuationFrame) # Append the frame to the buffer. self._headers_buffer.append(f) if len(self._headers_buffer) > CONTINUATION_BACKLOG: msg = "Too many continuation frames received." raise ProtocolError(msg) # If this is the end of the header block, then we want to build a # mutant HEADERS frame that's massive. Use the original one we got, # then set END_HEADERS and set its data appopriately. If it's not # the end of the block, lose the current frame: we can't yield it. if "END_HEADERS" in f.flags: f = self._headers_buffer[0] f.flags.add("END_HEADERS") f.data = b"".join(x.data for x in self._headers_buffer) self._headers_buffer = [] else: f = None elif (isinstance(f, (HeadersFrame, PushPromiseFrame)) and "END_HEADERS" not in f.flags): # This is the start of a headers block! Save the frame off and then # act like we didn't receive one. self._headers_buffer.append(f) f = None return f # The methods below support the iterator protocol. def __iter__(self) -> FrameBuffer: return self def __next__(self) -> Frame: # First, check that we have enough data to successfully parse the # next frame header. If not, bail. Otherwise, parse it. if len(self.data) < 9: raise StopIteration try: f, length = Frame.parse_frame_header(memoryview(self.data[:9])) except (InvalidDataError, InvalidFrameError) as err: # pragma: no cover msg = f"Received frame with invalid header: {err!s}" raise ProtocolError(msg) from err # Next, check that we have enough length to parse the frame body. If # not, bail, leaving the frame header data in the buffer for next time. if len(self.data) < length + 9: raise StopIteration # Confirm the frame has an appropriate length. self._validate_frame_length(length) # Try to parse the frame body try: f.parse_body(memoryview(self.data[9:9+length])) except InvalidDataError as err: msg = "Received frame with non-compliant data" raise ProtocolError(msg) from err except InvalidFrameError as err: msg = "Frame data missing or invalid" raise FrameDataMissingError(msg) from err # At this point, as we know we'll use or discard the entire frame, we # can update the data. self.data = self.data[9+length:] # Pass the frame through the header buffer. new_frame = self._update_header_buffer(f) # If we got a frame we didn't understand or shouldn't yield, rather # than return None it'd be better if we just tried to get the next # frame in the sequence instead. Recurse back into ourselves to do # that. This is safe because the amount of work we have to do here is # strictly bounded by the length of the buffer. return new_frame if new_frame is not None else self.__next__() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/py.typed0000644000076500000240000000000014744265074014171 0ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/settings.py0000644000076500000240000003004314744265074014716 0ustar00kriechistaff""" h2/settings ~~~~~~~~~~~ This module contains a HTTP/2 settings object. This object provides a simple API for manipulating HTTP/2 settings, keeping track of both the current active state of the settings and the unacknowledged future values of the settings. """ from __future__ import annotations import collections import enum from collections.abc import Iterator, MutableMapping from typing import Union from hyperframe.frame import SettingsFrame from .errors import ErrorCodes from .exceptions import InvalidSettingsValueError class SettingCodes(enum.IntEnum): """ All known HTTP/2 setting codes. .. versionadded:: 2.6.0 """ #: Allows the sender to inform the remote endpoint of the maximum size of #: the header compression table used to decode header blocks, in octets. HEADER_TABLE_SIZE = SettingsFrame.HEADER_TABLE_SIZE #: This setting can be used to disable server push. To disable server push #: on a client, set this to 0. ENABLE_PUSH = SettingsFrame.ENABLE_PUSH #: Indicates the maximum number of concurrent streams that the sender will #: allow. MAX_CONCURRENT_STREAMS = SettingsFrame.MAX_CONCURRENT_STREAMS #: Indicates the sender's initial window size (in octets) for stream-level #: flow control. INITIAL_WINDOW_SIZE = SettingsFrame.INITIAL_WINDOW_SIZE #: Indicates the size of the largest frame payload that the sender is #: willing to receive, in octets. MAX_FRAME_SIZE = SettingsFrame.MAX_FRAME_SIZE #: This advisory setting informs a peer of the maximum size of header list #: that the sender is prepared to accept, in octets. The value is based on #: the uncompressed size of header fields, including the length of the name #: and value in octets plus an overhead of 32 octets for each header field. MAX_HEADER_LIST_SIZE = SettingsFrame.MAX_HEADER_LIST_SIZE #: This setting can be used to enable the connect protocol. To enable on a #: client set this to 1. ENABLE_CONNECT_PROTOCOL = SettingsFrame.ENABLE_CONNECT_PROTOCOL def _setting_code_from_int(code: int) -> SettingCodes | int: """ Given an integer setting code, returns either one of :class:`SettingCodes ` or, if not present in the known set of codes, returns the integer directly. """ try: return SettingCodes(code) except ValueError: return code class ChangedSetting: def __init__(self, setting: SettingCodes | int, original_value: int | None, new_value: int) -> None: #: The setting code given. Either one of :class:`SettingCodes #: ` or ``int`` #: #: .. versionchanged:: 2.6.0 self.setting = setting #: The original value before being changed. self.original_value = original_value #: The new value after being changed. self.new_value = new_value def __repr__(self) -> str: return ( f"ChangedSetting(setting={self.setting!s}, original_value={self.original_value}, new_value={self.new_value})" ) class Settings(MutableMapping[Union[SettingCodes, int], int]): """ An object that encapsulates HTTP/2 settings state. HTTP/2 Settings are a complex beast. Each party, remote and local, has its own settings and a view of the other party's settings. When a settings frame is emitted by a peer it cannot assume that the new settings values are in place until the remote peer acknowledges the setting. In principle, multiple settings changes can be "in flight" at the same time, all with different values. This object encapsulates this mess. It provides a dict-like interface to settings, which return the *current* values of the settings in question. Additionally, it keeps track of the stack of proposed values: each time an acknowledgement is sent/received, it updates the current values with the stack of proposed values. On top of all that, it validates the values to make sure they're allowed, and raises :class:`InvalidSettingsValueError ` if they are not. Finally, this object understands what the default values of the HTTP/2 settings are, and sets those defaults appropriately. .. versionchanged:: 2.2.0 Added the ``initial_values`` parameter. .. versionchanged:: 2.5.0 Added the ``max_header_list_size`` property. :param client: (optional) Whether these settings should be defaulted for a client implementation or a server implementation. Defaults to ``True``. :type client: ``bool`` :param initial_values: (optional) Any initial values the user would like set, rather than RFC 7540's defaults. :type initial_vales: ``MutableMapping`` """ def __init__(self, client: bool = True, initial_values: dict[SettingCodes, int] | None = None) -> None: # Backing object for the settings. This is a dictionary of # (setting: [list of values]), where the first value in the list is the # current value of the setting. Strictly this doesn't use lists but # instead uses collections.deque to avoid repeated memory allocations. # # This contains the default values for HTTP/2. self._settings: dict[SettingCodes | int, collections.deque[int]] = { SettingCodes.HEADER_TABLE_SIZE: collections.deque([4096]), SettingCodes.ENABLE_PUSH: collections.deque([int(client)]), SettingCodes.INITIAL_WINDOW_SIZE: collections.deque([65535]), SettingCodes.MAX_FRAME_SIZE: collections.deque([16384]), SettingCodes.ENABLE_CONNECT_PROTOCOL: collections.deque([0]), } if initial_values is not None: for key, value in initial_values.items(): invalid = _validate_setting(key, value) if invalid: msg = f"Setting {key} has invalid value {value}" raise InvalidSettingsValueError( msg, error_code=invalid, ) self._settings[key] = collections.deque([value]) def acknowledge(self) -> dict[SettingCodes | int, ChangedSetting]: """ The settings have been acknowledged, either by the user (remote settings) or by the remote peer (local settings). :returns: A dict of {setting: ChangedSetting} that were applied. """ changed_settings: dict[SettingCodes | int, ChangedSetting] = {} # If there is more than one setting in the list, we have a setting # value outstanding. Update them. for k, v in self._settings.items(): if len(v) > 1: old_setting = v.popleft() new_setting = v[0] changed_settings[k] = ChangedSetting( k, old_setting, new_setting, ) return changed_settings # Provide easy-access to well known settings. @property def header_table_size(self) -> int: """ The current value of the :data:`HEADER_TABLE_SIZE ` setting. """ return self[SettingCodes.HEADER_TABLE_SIZE] @header_table_size.setter def header_table_size(self, value: int) -> None: self[SettingCodes.HEADER_TABLE_SIZE] = value @property def enable_push(self) -> int: """ The current value of the :data:`ENABLE_PUSH ` setting. """ return self[SettingCodes.ENABLE_PUSH] @enable_push.setter def enable_push(self, value: int) -> None: self[SettingCodes.ENABLE_PUSH] = value @property def initial_window_size(self) -> int: """ The current value of the :data:`INITIAL_WINDOW_SIZE ` setting. """ return self[SettingCodes.INITIAL_WINDOW_SIZE] @initial_window_size.setter def initial_window_size(self, value: int) -> None: self[SettingCodes.INITIAL_WINDOW_SIZE] = value @property def max_frame_size(self) -> int: """ The current value of the :data:`MAX_FRAME_SIZE ` setting. """ return self[SettingCodes.MAX_FRAME_SIZE] @max_frame_size.setter def max_frame_size(self, value: int) -> None: self[SettingCodes.MAX_FRAME_SIZE] = value @property def max_concurrent_streams(self) -> int: """ The current value of the :data:`MAX_CONCURRENT_STREAMS ` setting. """ return self.get(SettingCodes.MAX_CONCURRENT_STREAMS, 2**32+1) @max_concurrent_streams.setter def max_concurrent_streams(self, value: int) -> None: self[SettingCodes.MAX_CONCURRENT_STREAMS] = value @property def max_header_list_size(self) -> int | None: """ The current value of the :data:`MAX_HEADER_LIST_SIZE ` setting. If not set, returns ``None``, which means unlimited. .. versionadded:: 2.5.0 """ return self.get(SettingCodes.MAX_HEADER_LIST_SIZE, None) @max_header_list_size.setter def max_header_list_size(self, value: int) -> None: self[SettingCodes.MAX_HEADER_LIST_SIZE] = value @property def enable_connect_protocol(self) -> int: """ The current value of the :data:`ENABLE_CONNECT_PROTOCOL ` setting. """ return self[SettingCodes.ENABLE_CONNECT_PROTOCOL] @enable_connect_protocol.setter def enable_connect_protocol(self, value: int) -> None: self[SettingCodes.ENABLE_CONNECT_PROTOCOL] = value # Implement the MutableMapping API. def __getitem__(self, key: SettingCodes | int) -> int: val = self._settings[key][0] # Things that were created when a setting was received should stay # KeyError'd. if val is None: raise KeyError return val def __setitem__(self, key: SettingCodes | int, value: int) -> None: invalid = _validate_setting(key, value) if invalid: msg = f"Setting {key} has invalid value {value}" raise InvalidSettingsValueError( msg, error_code=invalid, ) try: items = self._settings[key] except KeyError: items = collections.deque([None]) # type: ignore self._settings[key] = items items.append(value) def __delitem__(self, key: SettingCodes | int) -> None: del self._settings[key] def __iter__(self) -> Iterator[SettingCodes | int]: return self._settings.__iter__() def __len__(self) -> int: return len(self._settings) def __eq__(self, other: object) -> bool: if isinstance(other, Settings): return self._settings == other._settings return NotImplemented def __ne__(self, other: object) -> bool: if isinstance(other, Settings): return not self == other return NotImplemented def _validate_setting(setting: SettingCodes | int, value: int) -> ErrorCodes: """ Confirms that a specific setting has a well-formed value. If the setting is invalid, returns an error code. Otherwise, returns 0 (NO_ERROR). """ if setting == SettingCodes.ENABLE_PUSH: if value not in (0, 1): return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.INITIAL_WINDOW_SIZE: if not 0 <= value <= 2147483647: # 2^31 - 1 return ErrorCodes.FLOW_CONTROL_ERROR elif setting == SettingCodes.MAX_FRAME_SIZE: if not 16384 <= value <= 16777215: # 2^14 and 2^24 - 1 return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.MAX_HEADER_LIST_SIZE: if value < 0: return ErrorCodes.PROTOCOL_ERROR elif setting == SettingCodes.ENABLE_CONNECT_PROTOCOL and value not in (0, 1): return ErrorCodes.PROTOCOL_ERROR return ErrorCodes.NO_ERROR ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/stream.py0000644000076500000240000016115314744265074014360 0ustar00kriechistaff""" h2/stream ~~~~~~~~~ An implementation of a HTTP/2 stream. """ from __future__ import annotations from enum import Enum, IntEnum from typing import TYPE_CHECKING, Any from hpack import HeaderTuple from hyperframe.frame import AltSvcFrame, ContinuationFrame, DataFrame, Frame, HeadersFrame, PushPromiseFrame, RstStreamFrame, WindowUpdateFrame from .errors import ErrorCodes, _error_code_from_int from .events import ( AlternativeServiceAvailable, DataReceived, Event, InformationalResponseReceived, PushedStreamReceived, RequestReceived, ResponseReceived, StreamEnded, StreamReset, TrailersReceived, WindowUpdated, _PushedRequestSent, _RequestSent, _ResponseSent, _TrailersSent, ) from .exceptions import FlowControlError, InvalidBodyLengthError, ProtocolError, StreamClosedError from .utilities import ( HeaderValidationFlags, authority_from_headers, extract_method_header, guard_increment_window, is_informational_response, normalize_inbound_headers, normalize_outbound_headers, utf8_encode_headers, validate_headers, validate_outbound_headers, ) from .windows import WindowManager if TYPE_CHECKING: # pragma: no cover from collections.abc import Generator, Iterable from hpack.hpack import Encoder from hpack.struct import Header, HeaderWeaklyTyped from .config import H2Configuration class StreamState(IntEnum): IDLE = 0 RESERVED_REMOTE = 1 RESERVED_LOCAL = 2 OPEN = 3 HALF_CLOSED_REMOTE = 4 HALF_CLOSED_LOCAL = 5 CLOSED = 6 class StreamInputs(Enum): SEND_HEADERS = 0 SEND_PUSH_PROMISE = 1 SEND_RST_STREAM = 2 SEND_DATA = 3 SEND_WINDOW_UPDATE = 4 SEND_END_STREAM = 5 RECV_HEADERS = 6 RECV_PUSH_PROMISE = 7 RECV_RST_STREAM = 8 RECV_DATA = 9 RECV_WINDOW_UPDATE = 10 RECV_END_STREAM = 11 RECV_CONTINUATION = 12 # Added in 2.0.0 SEND_INFORMATIONAL_HEADERS = 13 # Added in 2.2.0 RECV_INFORMATIONAL_HEADERS = 14 # Added in 2.2.0 SEND_ALTERNATIVE_SERVICE = 15 # Added in 2.3.0 RECV_ALTERNATIVE_SERVICE = 16 # Added in 2.3.0 UPGRADE_CLIENT = 17 # Added 2.3.0 UPGRADE_SERVER = 18 # Added 2.3.0 class StreamClosedBy(Enum): SEND_END_STREAM = 0 RECV_END_STREAM = 1 SEND_RST_STREAM = 2 RECV_RST_STREAM = 3 # This array is initialized once, and is indexed by the stream states above. # It indicates whether a stream in the given state is open. The reason we do # this is that we potentially check whether a stream in a given state is open # quite frequently: given that we check so often, we should do so in the # fastest and most performant way possible. STREAM_OPEN = [False for _ in range(len(StreamState))] STREAM_OPEN[StreamState.OPEN] = True STREAM_OPEN[StreamState.HALF_CLOSED_LOCAL] = True STREAM_OPEN[StreamState.HALF_CLOSED_REMOTE] = True class H2StreamStateMachine: """ A single HTTP/2 stream state machine. This stream object implements basically the state machine described in RFC 7540 section 5.1. :param stream_id: The stream ID of this stream. This is stored primarily for logging purposes. """ def __init__(self, stream_id: int) -> None: self.state = StreamState.IDLE self.stream_id = stream_id #: Whether this peer is the client side of this stream. self.client: bool | None = None # Whether trailers have been sent/received on this stream or not. self.headers_sent: bool | None = None self.trailers_sent: bool | None = None self.headers_received: bool | None = None self.trailers_received: bool | None = None # How the stream was closed. One of StreamClosedBy. self.stream_closed_by: StreamClosedBy | None = None def process_input(self, input_: StreamInputs) -> Any: """ Process a specific input in the state machine. """ if not isinstance(input_, StreamInputs): msg = "Input must be an instance of StreamInputs" raise ValueError(msg) # noqa: TRY004 try: func, target_state = _transitions[(self.state, input_)] except KeyError as err: old_state = self.state self.state = StreamState.CLOSED msg = f"Invalid input {input_} in state {old_state}" raise ProtocolError(msg) from err else: previous_state = self.state self.state = target_state if func is not None: try: return func(self, previous_state) except ProtocolError: self.state = StreamState.CLOSED raise except AssertionError as err: # pragma: no cover self.state = StreamState.CLOSED raise ProtocolError(err) from err return [] def request_sent(self, previous_state: StreamState) -> list[Event]: """ Fires when a request is sent. """ self.client = True self.headers_sent = True event = _RequestSent() return [event] def response_sent(self, previous_state: StreamState) -> list[Event]: """ Fires when something that should be a response is sent. This 'response' may actually be trailers. """ if not self.headers_sent: if self.client is True or self.client is None: msg = "Client cannot send responses." raise ProtocolError(msg) self.headers_sent = True return [_ResponseSent()] assert not self.trailers_sent self.trailers_sent = True return [_TrailersSent()] def request_received(self, previous_state: StreamState) -> list[Event]: """ Fires when a request is received. """ assert not self.headers_received assert not self.trailers_received self.client = False self.headers_received = True event = RequestReceived() event.stream_id = self.stream_id return [event] def response_received(self, previous_state: StreamState) -> list[Event]: """ Fires when a response is received. Also disambiguates between responses and trailers. """ event: ResponseReceived | TrailersReceived if not self.headers_received: assert self.client is True self.headers_received = True event = ResponseReceived() else: assert not self.trailers_received self.trailers_received = True event = TrailersReceived() event.stream_id = self.stream_id return [event] def data_received(self, previous_state: StreamState) -> list[Event]: """ Fires when data is received. """ if not self.headers_received: msg = "cannot receive data before headers" raise ProtocolError(msg) event = DataReceived() event.stream_id = self.stream_id return [event] def window_updated(self, previous_state: StreamState) -> list[Event]: """ Fires when a window update frame is received. """ event = WindowUpdated() event.stream_id = self.stream_id return [event] def stream_half_closed(self, previous_state: StreamState) -> list[Event]: """ Fires when an END_STREAM flag is received in the OPEN state, transitioning this stream to a HALF_CLOSED_REMOTE state. """ event = StreamEnded() event.stream_id = self.stream_id return [event] def stream_ended(self, previous_state: StreamState) -> list[Event]: """ Fires when a stream is cleanly ended. """ self.stream_closed_by = StreamClosedBy.RECV_END_STREAM event = StreamEnded() event.stream_id = self.stream_id return [event] def stream_reset(self, previous_state: StreamState) -> list[Event]: """ Fired when a stream is forcefully reset. """ self.stream_closed_by = StreamClosedBy.RECV_RST_STREAM event = StreamReset() event.stream_id = self.stream_id return [event] def send_new_pushed_stream(self, previous_state: StreamState) -> list[Event]: """ Fires on the newly pushed stream, when pushed by the local peer. No event here, but definitionally this peer must be a server. """ assert self.client is None self.client = False self.headers_received = True return [] def recv_new_pushed_stream(self, previous_state: StreamState) -> list[Event]: """ Fires on the newly pushed stream, when pushed by the remote peer. No event here, but definitionally this peer must be a client. """ assert self.client is None self.client = True self.headers_sent = True return [] def send_push_promise(self, previous_state: StreamState) -> list[Event]: """ Fires on the already-existing stream when a PUSH_PROMISE frame is sent. We may only send PUSH_PROMISE frames if we're a server. """ if self.client is True: msg = "Cannot push streams from client peers." raise ProtocolError(msg) event = _PushedRequestSent() return [event] def recv_push_promise(self, previous_state: StreamState) -> list[Event]: """ Fires on the already-existing stream when a PUSH_PROMISE frame is received. We may only receive PUSH_PROMISE frames if we're a client. Fires a PushedStreamReceived event. """ if not self.client: if self.client is None: # pragma: no cover msg = "Idle streams cannot receive pushes" else: # pragma: no cover msg = "Cannot receive pushed streams as a server" raise ProtocolError(msg) event = PushedStreamReceived() event.parent_stream_id = self.stream_id return [event] def send_end_stream(self, previous_state: StreamState) -> None: """ Called when an attempt is made to send END_STREAM in the HALF_CLOSED_REMOTE state. """ self.stream_closed_by = StreamClosedBy.SEND_END_STREAM def send_reset_stream(self, previous_state: StreamState) -> None: """ Called when an attempt is made to send RST_STREAM in a non-closed stream state. """ self.stream_closed_by = StreamClosedBy.SEND_RST_STREAM def reset_stream_on_error(self, previous_state: StreamState) -> None: """ Called when we need to forcefully emit another RST_STREAM frame on behalf of the state machine. If this is the first time we've done this, we should also hang an event off the StreamClosedError so that the user can be informed. We know it's the first time we've done this if the stream is currently in a state other than CLOSED. """ self.stream_closed_by = StreamClosedBy.SEND_RST_STREAM error = StreamClosedError(self.stream_id) event = StreamReset() event.stream_id = self.stream_id event.error_code = ErrorCodes.STREAM_CLOSED event.remote_reset = False error._events = [event] raise error def recv_on_closed_stream(self, previous_state: StreamState) -> None: """ Called when an unexpected frame is received on an already-closed stream. An endpoint that receives an unexpected frame should treat it as a stream error or connection error with type STREAM_CLOSED, depending on the specific frame. The error handling is done at a higher level: this just raises the appropriate error. """ raise StreamClosedError(self.stream_id) def send_on_closed_stream(self, previous_state: StreamState) -> None: """ Called when an attempt is made to send data on an already-closed stream. This essentially overrides the standard logic by throwing a more-specific error: StreamClosedError. This is a ProtocolError, so it matches the standard API of the state machine, but provides more detail to the user. """ raise StreamClosedError(self.stream_id) def recv_push_on_closed_stream(self, previous_state: StreamState) -> None: """ Called when a PUSH_PROMISE frame is received on a full stop stream. If the stream was closed by us sending a RST_STREAM frame, then we presume that the PUSH_PROMISE was in flight when we reset the parent stream. Rathen than accept the new stream, we just reset it. Otherwise, we should call this a PROTOCOL_ERROR: pushing a stream on a naturally closed stream is a real problem because it creates a brand new stream that the remote peer now believes exists. """ assert self.stream_closed_by is not None if self.stream_closed_by == StreamClosedBy.SEND_RST_STREAM: raise StreamClosedError(self.stream_id) msg = "Attempted to push on closed stream." raise ProtocolError(msg) def send_push_on_closed_stream(self, previous_state: StreamState) -> None: """ Called when an attempt is made to push on an already-closed stream. This essentially overrides the standard logic by providing a more useful error message. It's necessary because simply indicating that the stream is closed is not enough: there is now a new stream that is not allowed to be there. The only recourse is to tear the whole connection down. """ msg = "Attempted to push on closed stream." raise ProtocolError(msg) def send_informational_response(self, previous_state: StreamState) -> list[Event]: """ Called when an informational header block is sent (that is, a block where the :status header has a 1XX value). Only enforces that these are sent *before* final headers are sent. """ if self.headers_sent: msg = "Information response after final response" raise ProtocolError(msg) event = _ResponseSent() return [event] def recv_informational_response(self, previous_state: StreamState) -> list[Event]: """ Called when an informational header block is received (that is, a block where the :status header has a 1XX value). """ if self.headers_received: msg = "Informational response after final response" raise ProtocolError(msg) event = InformationalResponseReceived() event.stream_id = self.stream_id return [event] def recv_alt_svc(self, previous_state: StreamState) -> list[Event]: """ Called when receiving an ALTSVC frame. RFC 7838 allows us to receive ALTSVC frames at any stream state, which is really absurdly overzealous. For that reason, we want to limit the states in which we can actually receive it. It's really only sensible to receive it after we've sent our own headers and before the server has sent its header block: the server can't guarantee that we have any state around after it completes its header block, and the server doesn't know what origin we're talking about before we've sent ours. For that reason, this function applies a few extra checks on both state and some of the little state variables we keep around. If those suggest an unreasonable situation for the ALTSVC frame to have been sent in, we quietly ignore it (as RFC 7838 suggests). This function is also *not* always called by the state machine. In some states (IDLE, RESERVED_LOCAL, CLOSED) we don't bother to call it, because we know the frame cannot be valid in that state (IDLE because the server cannot know what origin the stream applies to, CLOSED because the server cannot assume we still have state around, RESERVED_LOCAL because by definition if we're in the RESERVED_LOCAL state then *we* are the server). """ # Servers can't receive ALTSVC frames, but RFC 7838 tells us to ignore # them. if self.client is False: return [] # If we've received the response headers from the server they can't # guarantee we still have any state around. Other implementations # (like nghttp2) ignore ALTSVC in this state, so we will too. if self.headers_received: return [] # Otherwise, this is a sensible enough frame to have received. Return # the event and let it get populated. return [AlternativeServiceAvailable()] def send_alt_svc(self, previous_state: StreamState) -> None: """ Called when sending an ALTSVC frame on this stream. For consistency with the restrictions we apply on receiving ALTSVC frames in ``recv_alt_svc``, we want to restrict when users can send ALTSVC frames to the situations when we ourselves would accept them. That means: when we are a server, when we have received the request headers, and when we have not yet sent our own response headers. """ # We should not send ALTSVC after we've sent response headers, as the # client may have disposed of its state. if self.headers_sent: msg = "Cannot send ALTSVC after sending response headers." raise ProtocolError(msg) # STATE MACHINE # # The stream state machine is defined here to avoid the need to allocate it # repeatedly for each stream. It cannot be defined in the stream class because # it needs to be able to reference the callbacks defined on the class, but # because Python's scoping rules are weird the class object is not actually in # scope during the body of the class object. # # For the sake of clarity, we reproduce the RFC 7540 state machine here: # # +--------+ # send PP | | recv PP # ,--------| idle |--------. # / | | \ # v +--------+ v # +----------+ | +----------+ # | | | send H / | | # ,------| reserved | | recv H | reserved |------. # | | (local) | | | (remote) | | # | +----------+ v +----------+ | # | | +--------+ | | # | | recv ES | | send ES | | # | send H | ,-------| open |-------. | recv H | # | | / | | \ | | # | v v +--------+ v v | # | +----------+ | +----------+ | # | | half | | | half | | # | | closed | | send R / | closed | | # | | (remote) | | recv R | (local) | | # | +----------+ | +----------+ | # | | | | | # | | send ES / | recv ES / | | # | | send R / v send R / | | # | | recv R +--------+ recv R | | # | send R / `----------->| |<-----------' send R / | # | recv R | closed | recv R | # `----------------------->| |<----------------------' # +--------+ # # send: endpoint sends this frame # recv: endpoint receives this frame # # H: HEADERS frame (with implied CONTINUATIONs) # PP: PUSH_PROMISE frame (with implied CONTINUATIONs) # ES: END_STREAM flag # R: RST_STREAM frame # # For the purposes of this state machine we treat HEADERS and their # associated CONTINUATION frames as a single jumbo frame. The protocol # allows/requires this by preventing other frames from being interleved in # between HEADERS/CONTINUATION frames. However, if a CONTINUATION frame is # received without a prior HEADERS frame, it *will* be passed to this state # machine. The state machine should always reject that frame, either as an # invalid transition or because the stream is closed. # # There is a confusing relationship around PUSH_PROMISE frames. The state # machine above considers them to be frames belonging to the new stream, # which is *somewhat* true. However, they are sent with the stream ID of # their related stream, and are only sendable in some cases. # For this reason, our state machine implementation below allows for # PUSH_PROMISE frames both in the IDLE state (as in the diagram), but also # in the OPEN, HALF_CLOSED_LOCAL, and HALF_CLOSED_REMOTE states. # Essentially, for h2, PUSH_PROMISE frames are effectively sent on # two streams. # # The _transitions dictionary contains a mapping of tuples of # (state, input) to tuples of (side_effect_function, end_state). This # map contains all allowed transitions: anything not in this map is # invalid and immediately causes a transition to ``closed``. _transitions = { # State: idle (StreamState.IDLE, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.request_sent, StreamState.OPEN), (StreamState.IDLE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.request_received, StreamState.OPEN), (StreamState.IDLE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.IDLE, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_new_pushed_stream, StreamState.RESERVED_LOCAL), (StreamState.IDLE, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_new_pushed_stream, StreamState.RESERVED_REMOTE), (StreamState.IDLE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.IDLE), (StreamState.IDLE, StreamInputs.UPGRADE_CLIENT): (H2StreamStateMachine.request_sent, StreamState.HALF_CLOSED_LOCAL), (StreamState.IDLE, StreamInputs.UPGRADE_SERVER): (H2StreamStateMachine.request_received, StreamState.HALF_CLOSED_REMOTE), # State: reserved local (StreamState.RESERVED_LOCAL, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.HALF_CLOSED_REMOTE), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.RESERVED_LOCAL, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.RESERVED_LOCAL), (StreamState.RESERVED_LOCAL, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.RESERVED_LOCAL), # State: reserved remote (StreamState.RESERVED_REMOTE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.RESERVED_REMOTE), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.RESERVED_REMOTE), (StreamState.RESERVED_REMOTE, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.RESERVED_REMOTE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.RESERVED_REMOTE), # State: open (StreamState.OPEN, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_DATA): (None, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_DATA): (H2StreamStateMachine.data_received, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_END_STREAM): (None, StreamState.HALF_CLOSED_LOCAL), (StreamState.OPEN, StreamInputs.RECV_END_STREAM): (H2StreamStateMachine.stream_half_closed, StreamState.HALF_CLOSED_REMOTE), (StreamState.OPEN, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.OPEN, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.OPEN, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_promise, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_promise, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_INFORMATIONAL_HEADERS): (H2StreamStateMachine.send_informational_response, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_INFORMATIONAL_HEADERS): (H2StreamStateMachine.recv_informational_response, StreamState.OPEN), (StreamState.OPEN, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.OPEN), (StreamState.OPEN, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.OPEN), # State: half-closed remote (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.response_sent, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_DATA): (None, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_DATA): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_END_STREAM): (H2StreamStateMachine.send_end_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_promise, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.reset_stream_on_error, StreamState.CLOSED), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_INFORMATIONAL_HEADERS): (H2StreamStateMachine.send_informational_response, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.HALF_CLOSED_REMOTE), (StreamState.HALF_CLOSED_REMOTE, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.HALF_CLOSED_REMOTE), # State: half-closed local (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.response_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_DATA): (H2StreamStateMachine.data_received, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_END_STREAM): (H2StreamStateMachine.stream_ended, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_WINDOW_UPDATE): (None, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_WINDOW_UPDATE): (H2StreamStateMachine.window_updated, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_reset_stream, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_RST_STREAM): (H2StreamStateMachine.stream_reset, StreamState.CLOSED), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_promise, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_INFORMATIONAL_HEADERS): (H2StreamStateMachine.recv_informational_response, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.SEND_ALTERNATIVE_SERVICE): (H2StreamStateMachine.send_alt_svc, StreamState.HALF_CLOSED_LOCAL), (StreamState.HALF_CLOSED_LOCAL, StreamInputs.RECV_ALTERNATIVE_SERVICE): (H2StreamStateMachine.recv_alt_svc, StreamState.HALF_CLOSED_LOCAL), # State: closed (StreamState.CLOSED, StreamInputs.RECV_END_STREAM): (None, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_ALTERNATIVE_SERVICE): (None, StreamState.CLOSED), # RFC 7540 Section 5.1 defines how the end point should react when # receiving a frame on a closed stream with the following statements: # # > An endpoint that receives any frame other than PRIORITY after receiving # > a RST_STREAM MUST treat that as a stream error of type STREAM_CLOSED. # > An endpoint that receives any frames after receiving a frame with the # > END_STREAM flag set MUST treat that as a connection error of type # > STREAM_CLOSED. (StreamState.CLOSED, StreamInputs.RECV_HEADERS): (H2StreamStateMachine.recv_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_DATA): (H2StreamStateMachine.recv_on_closed_stream, StreamState.CLOSED), # > WINDOW_UPDATE or RST_STREAM frames can be received in this state # > for a short period after a DATA or HEADERS frame containing a # > END_STREAM flag is sent, as instructed in RFC 7540 Section 5.1. But we # > don't have access to a clock so we just always allow it. (StreamState.CLOSED, StreamInputs.RECV_WINDOW_UPDATE): (None, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.RECV_RST_STREAM): (None, StreamState.CLOSED), # > A receiver MUST treat the receipt of a PUSH_PROMISE on a stream that is # > neither "open" nor "half-closed (local)" as a connection error of type # > PROTOCOL_ERROR. (StreamState.CLOSED, StreamInputs.RECV_PUSH_PROMISE): (H2StreamStateMachine.recv_push_on_closed_stream, StreamState.CLOSED), # Also, users should be forbidden from sending on closed streams. (StreamState.CLOSED, StreamInputs.SEND_HEADERS): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_PUSH_PROMISE): (H2StreamStateMachine.send_push_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_RST_STREAM): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_DATA): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_WINDOW_UPDATE): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), (StreamState.CLOSED, StreamInputs.SEND_END_STREAM): (H2StreamStateMachine.send_on_closed_stream, StreamState.CLOSED), } class H2Stream: """ A low-level HTTP/2 stream object. This handles building and receiving frames and maintains per-stream state. This wraps a HTTP/2 Stream state machine implementation, ensuring that frames can only be sent/received when the stream is in a valid state. Attempts to create frames that cannot be sent will raise a ``ProtocolError``. """ def __init__(self, stream_id: int, config: H2Configuration, inbound_window_size: int, outbound_window_size: int) -> None: self.state_machine = H2StreamStateMachine(stream_id) self.stream_id = stream_id self.max_outbound_frame_size: int | None = None self.request_method: bytes | None = None # The current value of the outbound stream flow control window self.outbound_flow_control_window = outbound_window_size # The flow control manager. self._inbound_window_manager = WindowManager(inbound_window_size) # The expected content length, if any. self._expected_content_length: int | None = None # The actual received content length. Always tracked. self._actual_content_length = 0 # The authority we believe this stream belongs to. self._authority: bytes | None = None # The configuration for this stream. self.config = config def __repr__(self) -> str: return f"<{type(self).__name__} id:{self.stream_id} state:{self.state_machine.state!r}>" @property def inbound_flow_control_window(self) -> int: """ The size of the inbound flow control window for the stream. This is rarely publicly useful: instead, use :meth:`remote_flow_control_window `. This shortcut is largely present to provide a shortcut to this data. """ return self._inbound_window_manager.current_window_size @property def open(self) -> bool: """ Whether the stream is 'open' in any sense: that is, whether it counts against the number of concurrent streams. """ # RFC 7540 Section 5.1.2 defines 'open' for this purpose to mean either # the OPEN state or either of the HALF_CLOSED states. Perplexingly, # this excludes the reserved states. # For more detail on why we're doing this in this slightly weird way, # see the comment on ``STREAM_OPEN`` at the top of the file. return STREAM_OPEN[self.state_machine.state] @property def closed(self) -> bool: """ Whether the stream is closed. """ return self.state_machine.state == StreamState.CLOSED @property def closed_by(self) -> StreamClosedBy | None: """ Returns how the stream was closed, as one of StreamClosedBy. """ return self.state_machine.stream_closed_by def upgrade(self, client_side: bool) -> None: """ Called by the connection to indicate that this stream is the initial request/response of an upgraded connection. Places the stream into an appropriate state. """ self.config.logger.debug("Upgrading %r", self) assert self.stream_id == 1 input_ = ( StreamInputs.UPGRADE_CLIENT if client_side else StreamInputs.UPGRADE_SERVER ) # This may return events, we deliberately don't want them. self.state_machine.process_input(input_) def send_headers(self, headers: Iterable[HeaderWeaklyTyped], encoder: Encoder, end_stream: bool = False) -> list[HeadersFrame | ContinuationFrame | PushPromiseFrame]: """ Returns a list of HEADERS/CONTINUATION frames to emit as either headers or trailers. """ self.config.logger.debug("Send headers %s on %r", headers, self) # Because encoding headers makes an irreversible change to the header # compression context, we make the state transition before we encode # them. # First, check if we're a client. If we are, no problem: if we aren't, # we need to scan the header block to see if this is an informational # response. input_ = StreamInputs.SEND_HEADERS bytes_headers = utf8_encode_headers(headers) if ((not self.state_machine.client) and is_informational_response(bytes_headers)): if end_stream: msg = "Cannot set END_STREAM on informational responses." raise ProtocolError(msg) input_ = StreamInputs.SEND_INFORMATIONAL_HEADERS events = self.state_machine.process_input(input_) hf = HeadersFrame(self.stream_id) hdr_validation_flags = self._build_hdr_validation_flags(events) frames = self._build_headers_frames( bytes_headers, encoder, hf, hdr_validation_flags, ) if end_stream: # Not a bug: the END_STREAM flag is valid on the initial HEADERS # frame, not the CONTINUATION frames that follow. self.state_machine.process_input(StreamInputs.SEND_END_STREAM) frames[0].flags.add("END_STREAM") if self.state_machine.trailers_sent and not end_stream: msg = "Trailers must have END_STREAM set." raise ProtocolError(msg) if self.state_machine.client and self._authority is None: self._authority = authority_from_headers(bytes_headers) # store request method for _initialize_content_length self.request_method = extract_method_header(bytes_headers) return frames def push_stream_in_band(self, related_stream_id: int, headers: Iterable[HeaderWeaklyTyped], encoder: Encoder) -> list[HeadersFrame | ContinuationFrame | PushPromiseFrame]: """ Returns a list of PUSH_PROMISE/CONTINUATION frames to emit as a pushed stream header. Called on the stream that has the PUSH_PROMISE frame sent on it. """ self.config.logger.debug("Push stream %r", self) # Because encoding headers makes an irreversible change to the header # compression context, we make the state transition *first*. events = self.state_machine.process_input( StreamInputs.SEND_PUSH_PROMISE, ) ppf = PushPromiseFrame(self.stream_id) ppf.promised_stream_id = related_stream_id hdr_validation_flags = self._build_hdr_validation_flags(events) bytes_headers = utf8_encode_headers(headers) return self._build_headers_frames( bytes_headers, encoder, ppf, hdr_validation_flags, ) def locally_pushed(self) -> list[Frame]: """ Mark this stream as one that was pushed by this peer. Must be called immediately after initialization. Sends no frames, simply updates the state machine. """ # This does not trigger any events. events = self.state_machine.process_input( StreamInputs.SEND_PUSH_PROMISE, ) assert not events return [] def send_data(self, data: bytes | memoryview, end_stream: bool = False, pad_length: int | None = None) -> list[Frame]: """ Prepare some data frames. Optionally end the stream. .. warning:: Does not perform flow control checks. """ self.config.logger.debug( "Send data on %r with end stream set to %s", self, end_stream, ) self.state_machine.process_input(StreamInputs.SEND_DATA) df = DataFrame(self.stream_id) df.data = data if end_stream: self.state_machine.process_input(StreamInputs.SEND_END_STREAM) df.flags.add("END_STREAM") if pad_length is not None: df.flags.add("PADDED") df.pad_length = pad_length # Subtract flow_controlled_length to account for possible padding self.outbound_flow_control_window -= df.flow_controlled_length assert self.outbound_flow_control_window >= 0 return [df] def end_stream(self) -> list[Frame]: """ End a stream without sending data. """ self.config.logger.debug("End stream %r", self) self.state_machine.process_input(StreamInputs.SEND_END_STREAM) df = DataFrame(self.stream_id) df.flags.add("END_STREAM") return [df] def advertise_alternative_service(self, field_value: bytes) -> list[Frame]: """ Advertise an RFC 7838 alternative service. The semantics of this are better documented in the ``H2Connection`` class. """ self.config.logger.debug( "Advertise alternative service of %r for %r", field_value, self, ) self.state_machine.process_input(StreamInputs.SEND_ALTERNATIVE_SERVICE) asf = AltSvcFrame(self.stream_id) asf.field = field_value return [asf] def increase_flow_control_window(self, increment: int) -> list[Frame]: """ Increase the size of the flow control window for the remote side. """ self.config.logger.debug( "Increase flow control window for %r by %d", self, increment, ) self.state_machine.process_input(StreamInputs.SEND_WINDOW_UPDATE) self._inbound_window_manager.window_opened(increment) wuf = WindowUpdateFrame(self.stream_id) wuf.window_increment = increment return [wuf] def receive_push_promise_in_band(self, promised_stream_id: int, headers: Iterable[Header], header_encoding: bool | str | None) -> tuple[list[Frame], list[Event]]: """ Receives a push promise frame sent on this stream, pushing a remote stream. This is called on the stream that has the PUSH_PROMISE sent on it. """ self.config.logger.debug( "Receive Push Promise on %r for remote stream %d", self, promised_stream_id, ) events = self.state_machine.process_input( StreamInputs.RECV_PUSH_PROMISE, ) events[0].pushed_stream_id = promised_stream_id hdr_validation_flags = self._build_hdr_validation_flags(events) events[0].headers = self._process_received_headers( headers, hdr_validation_flags, header_encoding, ) return [], events def remotely_pushed(self, pushed_headers: Iterable[Header]) -> tuple[list[Frame], list[Event]]: """ Mark this stream as one that was pushed by the remote peer. Must be called immediately after initialization. Sends no frames, simply updates the state machine. """ self.config.logger.debug("%r pushed by remote peer", self) events = self.state_machine.process_input( StreamInputs.RECV_PUSH_PROMISE, ) self._authority = authority_from_headers(pushed_headers) return [], events def receive_headers(self, headers: Iterable[Header], end_stream: bool, header_encoding: bool | str | None) -> tuple[list[Frame], list[Event]]: """ Receive a set of headers (or trailers). """ if is_informational_response(headers): if end_stream: msg = "Cannot set END_STREAM on informational responses" raise ProtocolError(msg) input_ = StreamInputs.RECV_INFORMATIONAL_HEADERS else: input_ = StreamInputs.RECV_HEADERS events = self.state_machine.process_input(input_) if end_stream: es_events = self.state_machine.process_input( StreamInputs.RECV_END_STREAM, ) events[0].stream_ended = es_events[0] events += es_events self._initialize_content_length(headers) if isinstance(events[0], TrailersReceived) and not end_stream: msg = "Trailers must have END_STREAM set" raise ProtocolError(msg) hdr_validation_flags = self._build_hdr_validation_flags(events) events[0].headers = self._process_received_headers( headers, hdr_validation_flags, header_encoding, ) return [], events def receive_data(self, data: bytes, end_stream: bool, flow_control_len: int) -> tuple[list[Frame], list[Event]]: """ Receive some data. """ self.config.logger.debug( "Receive data on %r with end stream %s and flow control length " "set to %d", self, end_stream, flow_control_len, ) events = self.state_machine.process_input(StreamInputs.RECV_DATA) self._inbound_window_manager.window_consumed(flow_control_len) self._track_content_length(len(data), end_stream) if end_stream: es_events = self.state_machine.process_input( StreamInputs.RECV_END_STREAM, ) events[0].stream_ended = es_events[0] events.extend(es_events) events[0].data = data events[0].flow_controlled_length = flow_control_len return [], events def receive_window_update(self, increment: int) -> tuple[list[Frame], list[Event]]: """ Handle a WINDOW_UPDATE increment. """ self.config.logger.debug( "Receive Window Update on %r for increment of %d", self, increment, ) events = self.state_machine.process_input( StreamInputs.RECV_WINDOW_UPDATE, ) frames = [] # If we encounter a problem with incrementing the flow control window, # this should be treated as a *stream* error, not a *connection* error. # That means we need to catch the error and forcibly close the stream. if events: events[0].delta = increment try: self.outbound_flow_control_window = guard_increment_window( self.outbound_flow_control_window, increment, ) except FlowControlError: # Ok, this is bad. We're going to need to perform a local # reset. event = StreamReset() event.stream_id = self.stream_id event.error_code = ErrorCodes.FLOW_CONTROL_ERROR event.remote_reset = False events = [event] frames = self.reset_stream(event.error_code) return frames, events def receive_continuation(self) -> None: """ A naked CONTINUATION frame has been received. This is always an error, but the type of error it is depends on the state of the stream and must transition the state of the stream, so we need to handle it. """ self.config.logger.debug("Receive Continuation frame on %r", self) self.state_machine.process_input( StreamInputs.RECV_CONTINUATION, ) msg = "Should not be reachable" # pragma: no cover raise AssertionError(msg) # pragma: no cover def receive_alt_svc(self, frame: AltSvcFrame) -> tuple[list[Frame], list[Event]]: """ An Alternative Service frame was received on the stream. This frame inherits the origin associated with this stream. """ self.config.logger.debug( "Receive Alternative Service frame on stream %r", self, ) # If the origin is present, RFC 7838 says we have to ignore it. if frame.origin: return [], [] events = self.state_machine.process_input( StreamInputs.RECV_ALTERNATIVE_SERVICE, ) # There are lots of situations where we want to ignore the ALTSVC # frame. If we need to pay attention, we'll have an event and should # fill it out. if events: assert isinstance(events[0], AlternativeServiceAvailable) events[0].origin = self._authority events[0].field_value = frame.field return [], events def reset_stream(self, error_code: ErrorCodes | int = 0) -> list[Frame]: """ Close the stream locally. Reset the stream with an error code. """ self.config.logger.debug( "Local reset %r with error code: %d", self, error_code, ) self.state_machine.process_input(StreamInputs.SEND_RST_STREAM) rsf = RstStreamFrame(self.stream_id) rsf.error_code = error_code return [rsf] def stream_reset(self, frame: RstStreamFrame) -> tuple[list[Frame], list[Event]]: """ Handle a stream being reset remotely. """ self.config.logger.debug( "Remote reset %r with error code: %d", self, frame.error_code, ) events = self.state_machine.process_input(StreamInputs.RECV_RST_STREAM) if events: # We don't fire an event if this stream is already closed. events[0].error_code = _error_code_from_int(frame.error_code) return [], events def acknowledge_received_data(self, acknowledged_size: int) -> list[Frame]: """ The user has informed us that they've processed some amount of data that was received on this stream. Pass that to the window manager and potentially return some WindowUpdate frames. """ self.config.logger.debug( "Acknowledge received data with size %d on %r", acknowledged_size, self, ) increment = self._inbound_window_manager.process_bytes( acknowledged_size, ) if increment: f = WindowUpdateFrame(self.stream_id) f.window_increment = increment return [f] return [] def _build_hdr_validation_flags(self, events: Any) -> HeaderValidationFlags: """ Constructs a set of header validation flags for use when normalizing and validating header blocks. """ is_trailer = isinstance( events[0], (_TrailersSent, TrailersReceived), ) is_response_header = isinstance( events[0], ( _ResponseSent, ResponseReceived, InformationalResponseReceived, ), ) is_push_promise = isinstance( events[0], (PushedStreamReceived, _PushedRequestSent), ) return HeaderValidationFlags( is_client=self.state_machine.client or False, is_trailer=is_trailer, is_response_header=is_response_header, is_push_promise=is_push_promise, ) def _build_headers_frames(self, headers: Iterable[Header], encoder: Encoder, first_frame: HeadersFrame | PushPromiseFrame, hdr_validation_flags: HeaderValidationFlags) \ -> list[HeadersFrame | ContinuationFrame | PushPromiseFrame]: """ Helper method to build headers or push promise frames. """ # We need to lowercase the header names, and to ensure that secure # header fields are kept out of compression contexts. if self.config.normalize_outbound_headers: # also we may want to split outbound cookies to improve # headers compression should_split_outbound_cookies = self.config.split_outbound_cookies headers = normalize_outbound_headers( headers, hdr_validation_flags, should_split_outbound_cookies, ) if self.config.validate_outbound_headers: headers = validate_outbound_headers( headers, hdr_validation_flags, ) encoded_headers = encoder.encode(headers) # Slice into blocks of max_outbound_frame_size. Be careful with this: # it only works right because we never send padded frames or priority # information on the frames. Revisit this if we do. header_blocks = [ encoded_headers[i:i+(self.max_outbound_frame_size or 0)] for i in range( 0, len(encoded_headers), (self.max_outbound_frame_size or 0), ) ] frames: list[HeadersFrame | ContinuationFrame | PushPromiseFrame] = [] first_frame.data = header_blocks[0] frames.append(first_frame) for block in header_blocks[1:]: cf = ContinuationFrame(self.stream_id) cf.data = block frames.append(cf) frames[-1].flags.add("END_HEADERS") return frames def _process_received_headers(self, headers: Iterable[Header], header_validation_flags: HeaderValidationFlags, header_encoding: bool | str | None) -> Iterable[Header]: """ When headers have been received from the remote peer, run a processing pipeline on them to transform them into the appropriate form for attaching to an event. """ if self.config.normalize_inbound_headers: headers = normalize_inbound_headers( headers, header_validation_flags, ) if self.config.validate_inbound_headers: headers = validate_headers(headers, header_validation_flags) if isinstance(header_encoding, str): headers = _decode_headers(headers, header_encoding) # The above steps are all generators, so we need to concretize the # headers now. return list(headers) def _initialize_content_length(self, headers: Iterable[Header]) -> None: """ Checks the headers for a content-length header and initializes the _expected_content_length field from it. It's not an error for no Content-Length header to be present. """ if self.request_method == b"HEAD": self._expected_content_length = 0 return for n, v in headers: if n == b"content-length": try: self._expected_content_length = int(v, 10) except ValueError as err: msg = f"Invalid content-length header: {v!r}" raise ProtocolError(msg) from err return def _track_content_length(self, length: int, end_stream: bool) -> None: """ Update the expected content length in response to data being received. Validates that the appropriate amount of data is sent. Always updates the received data, but only validates the length against the content-length header if one was sent. :param length: The length of the body chunk received. :param end_stream: If this is the last body chunk received. """ self._actual_content_length += length actual = self._actual_content_length expected = self._expected_content_length if expected is not None: if expected < actual: raise InvalidBodyLengthError(expected, actual) if end_stream and expected != actual: raise InvalidBodyLengthError(expected, actual) def _inbound_flow_control_change_from_settings(self, delta: int) -> None: """ We changed SETTINGS_INITIAL_WINDOW_SIZE, which means we need to update the target window size for flow control. For our flow control strategy, this means we need to do two things: we need to adjust the current window size, but we also need to set the target maximum window size to the new value. """ new_max_size = self._inbound_window_manager.max_window_size + delta self._inbound_window_manager.window_opened(delta) self._inbound_window_manager.max_window_size = new_max_size def _decode_headers(headers: Iterable[HeaderWeaklyTyped], encoding: str) -> Generator[HeaderTuple, None, None]: """ Given an iterable of header two-tuples and an encoding, decodes those headers using that encoding while preserving the type of the header tuple. This ensures that the use of ``HeaderTuple`` is preserved. """ for header in headers: # This function expects to work on decoded headers, which are always # HeaderTuple objects. assert isinstance(header, HeaderTuple) name, value = header assert isinstance(name, bytes) assert isinstance(value, bytes) n = name.decode(encoding) v = value.decode(encoding) yield header.__class__(n, v) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/utilities.py0000644000076500000240000006260414744265074015101 0ustar00kriechistaff""" h2/utilities ~~~~~~~~~~~~ Utility functions that do not belong in a separate module. """ from __future__ import annotations import collections import re from string import whitespace from typing import TYPE_CHECKING, Any, NamedTuple from hpack.struct import HeaderTuple, NeverIndexedHeaderTuple from .exceptions import FlowControlError, ProtocolError if TYPE_CHECKING: # pragma: no cover from collections.abc import Generator, Iterable from hpack.struct import Header, HeaderWeaklyTyped UPPER_RE = re.compile(b"[A-Z]") SIGIL = ord(b":") INFORMATIONAL_START = ord(b"1") # A set of headers that are hop-by-hop or connection-specific and thus # forbidden in HTTP/2. This list comes from RFC 7540 § 8.1.2.2. CONNECTION_HEADERS = frozenset([ b"connection", b"proxy-connection", b"keep-alive", b"transfer-encoding", b"upgrade", ]) _ALLOWED_PSEUDO_HEADER_FIELDS = frozenset([ b":method", b":scheme", b":authority", b":path", b":status", b":protocol", ]) _SECURE_HEADERS = frozenset([ # May have basic credentials which are vulnerable to dictionary attacks. b"authorization", b"proxy-authorization", ]) _REQUEST_ONLY_HEADERS = frozenset([ b":scheme", b":path", b":authority", b":method", b":protocol", ]) _RESPONSE_ONLY_HEADERS = frozenset([b":status"]) # A Set of pseudo headers that are only valid if the method is # CONNECT, see RFC 8441 § 5 _CONNECT_REQUEST_ONLY_HEADERS = frozenset([b":protocol"]) _WHITESPACE = frozenset(map(ord, whitespace)) def _secure_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None) -> Generator[Header, None, None]: """ Certain headers are at risk of being attacked during the header compression phase, and so need to be kept out of header compression contexts. This function automatically transforms certain specific headers into HPACK never-indexed fields to ensure they don't get added to header compression contexts. This function currently implements two rules: - 'authorization' and 'proxy-authorization' fields are automatically made never-indexed. - Any 'cookie' header field shorter than 20 bytes long is made never-indexed. These fields are the most at-risk. These rules are inspired by Firefox and nghttp2. """ for header in headers: assert isinstance(header[0], bytes) if header[0] in _SECURE_HEADERS or (header[0] in b"cookie" and len(header[1]) < 20): yield NeverIndexedHeaderTuple(header[0], header[1]) else: yield header def extract_method_header(headers: Iterable[Header]) -> bytes | None: """ Extracts the request method from the headers list. """ for k, v in headers: if isinstance(v, bytes) and k == b":method": return v if isinstance(v, str) and k == ":method": return v.encode("utf-8") # pragma: no cover return None def is_informational_response(headers: Iterable[Header]) -> bool: """ Searches headers list for a :status header to confirm that a given collection of headers are an informational response. Assumes the header are well formed and encoded as bytes: that is, that the HTTP/2 special headers are first in the block, and so that it can stop looking when it finds the first header field whose name does not begin with a colon. :param headers: The HTTP/2 headers. :returns: A boolean indicating if this is an informational response. """ for n, v in headers: if not n.startswith(b":"): return False if n != b":status": # If we find a non-special header, we're done here: stop looping. continue # If the first digit is a 1, we've got informational headers. return v.startswith(b"1") return False def guard_increment_window(current: int, increment: int) -> int: """ Increments a flow control window, guarding against that window becoming too large. :param current: The current value of the flow control window. :param increment: The increment to apply to that window. :returns: The new value of the window. :raises: ``FlowControlError`` """ # The largest value the flow control window may take. LARGEST_FLOW_CONTROL_WINDOW = 2**31 - 1 # noqa: N806 new_size = current + increment if new_size > LARGEST_FLOW_CONTROL_WINDOW: msg = f"May not increment flow control window past {LARGEST_FLOW_CONTROL_WINDOW}" raise FlowControlError(msg) return new_size def authority_from_headers(headers: Iterable[Header]) -> bytes | None: """ Given a header set, searches for the authority header and returns the value. Note that this doesn't use indexing, so should only be called if the headers are for a client request. Otherwise, will loop over the entire header set, which is potentially unwise. :param headers: The HTTP header set. :returns: The value of the authority header, or ``None``. :rtype: ``bytes`` or ``None``. """ for n, v in headers: if n == b":authority": return v return None # Flags used by the validate_headers pipeline to determine which checks # should be applied to a given set of headers. class HeaderValidationFlags(NamedTuple): is_client: bool is_trailer: bool is_response_header: bool is_push_promise: bool def validate_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Iterable[Header]: """ Validates a header sequence against a set of constraints from RFC 7540. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. """ # This validation logic is built on a sequence of generators that are # iterated over to provide the final header list. This reduces some of the # overhead of doing this checking. However, it's worth noting that this # checking remains somewhat expensive, and attempts should be made wherever # possible to reduce the time spent doing them. # # For example, we avoid tuple unpacking in loops because it represents a # fixed cost that we don't want to spend, instead indexing into the header # tuples. headers = _reject_empty_header_names( headers, hdr_validation_flags, ) headers = _reject_uppercase_header_fields( headers, hdr_validation_flags, ) headers = _reject_surrounding_whitespace( headers, hdr_validation_flags, ) headers = _reject_te( headers, hdr_validation_flags, ) headers = _reject_connection_header( headers, hdr_validation_flags, ) headers = _reject_pseudo_header_fields( headers, hdr_validation_flags, ) headers = _check_host_authority_header( headers, hdr_validation_flags, ) return _check_path_header(headers, hdr_validation_flags) def _reject_empty_header_names(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if any header names are empty (length 0). While hpack decodes such headers without errors, they are semantically forbidden in HTTP, see RFC 7230, stating that they must be at least one character long. """ for header in headers: if len(header[0]) == 0: msg = "Received header name with zero length." raise ProtocolError(msg) yield header def _reject_uppercase_header_fields(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if any uppercase character is found in a header block. """ for header in headers: if UPPER_RE.search(header[0]): msg = f"Received uppercase header name {header[0]!r}." raise ProtocolError(msg) yield header def _reject_surrounding_whitespace(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if any header name or value is surrounded by whitespace characters. """ # For compatibility with RFC 7230 header fields, we need to allow the field # value to be an empty string. This is ludicrous, but technically allowed. # The field name may not be empty, though, so we can safely assume that it # must have at least one character in it and throw exceptions if it # doesn't. for header in headers: if header[0][0] in _WHITESPACE or header[0][-1] in _WHITESPACE: msg = f"Received header name surrounded by whitespace {header[0]!r}" raise ProtocolError(msg) if header[1] and ((header[1][0] in _WHITESPACE) or (header[1][-1] in _WHITESPACE)): msg = f"Received header value surrounded by whitespace {header[1]!r}" raise ProtocolError(msg) yield header def _reject_te(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if the TE header is present in a header block and its value is anything other than "trailers". """ for header in headers: if header[0] == b"te" and header[1].lower() != b"trailers": msg = f"Invalid value for TE header: {header[1]!r}" raise ProtocolError(msg) yield header def _reject_connection_header(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if the Connection header is present in a header block. """ for header in headers: if header[0] in CONNECTION_HEADERS: msg = f"Connection-specific header field present: {header[0]!r}." raise ProtocolError(msg) yield header def _assert_header_in_set(bytes_header: bytes, header_set: set[bytes | str] | set[bytes] | set[str]) -> None: """ Given a set of header names, checks whether the string or byte version of the header name is present. Raises a Protocol error with the appropriate error if it's missing. """ if bytes_header not in header_set: msg = f"Header block missing mandatory {bytes_header!r} header" raise ProtocolError(msg) def _reject_pseudo_header_fields(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if duplicate pseudo-header fields are found in a header block or if a pseudo-header field appears in a block after an ordinary header field. Raises a ProtocolError if pseudo-header fields are found in trailers. """ seen_pseudo_header_fields = set() seen_regular_header = False method = None for header in headers: if header[0][0] == SIGIL: if header[0] in seen_pseudo_header_fields: msg = f"Received duplicate pseudo-header field {header[0]!r}" raise ProtocolError(msg) seen_pseudo_header_fields.add(header[0]) if seen_regular_header: msg = f"Received pseudo-header field out of sequence: {header[0]!r}" raise ProtocolError(msg) if header[0] not in _ALLOWED_PSEUDO_HEADER_FIELDS: msg = f"Received custom pseudo-header field {header[0]!r}" raise ProtocolError(msg) if header[0] in b":method": method = header[1] else: seen_regular_header = True yield header # Check the pseudo-headers we got to confirm they're acceptable. _check_pseudo_header_field_acceptability( seen_pseudo_header_fields, method, hdr_validation_flags, ) def _check_pseudo_header_field_acceptability(pseudo_headers: set[bytes | str] | set[bytes] | set[str], method: bytes | None, hdr_validation_flags: HeaderValidationFlags) -> None: """ Given the set of pseudo-headers present in a header block and the validation flags, confirms that RFC 7540 allows them. """ # Pseudo-header fields MUST NOT appear in trailers - RFC 7540 § 8.1.2.1 if hdr_validation_flags.is_trailer and pseudo_headers: msg = f"Received pseudo-header in trailer {pseudo_headers}" raise ProtocolError(msg) # If ':status' pseudo-header is not there in a response header, reject it. # Similarly, if ':path', ':method', or ':scheme' are not there in a request # header, reject it. Additionally, if a response contains any request-only # headers or vice-versa, reject it. # Relevant RFC section: RFC 7540 § 8.1.2.4 # https://tools.ietf.org/html/rfc7540#section-8.1.2.4 if hdr_validation_flags.is_response_header: _assert_header_in_set(b":status", pseudo_headers) invalid_response_headers = pseudo_headers & _REQUEST_ONLY_HEADERS if invalid_response_headers: msg = f"Encountered request-only headers {invalid_response_headers}" raise ProtocolError(msg) elif (not hdr_validation_flags.is_response_header and not hdr_validation_flags.is_trailer): # This is a request, so we need to have seen :path, :method, and # :scheme. _assert_header_in_set(b":path", pseudo_headers) _assert_header_in_set(b":method", pseudo_headers) _assert_header_in_set(b":scheme", pseudo_headers) invalid_request_headers = pseudo_headers & _RESPONSE_ONLY_HEADERS if invalid_request_headers: msg = f"Encountered response-only headers {invalid_request_headers}" raise ProtocolError(msg) if method != b"CONNECT": invalid_headers = pseudo_headers & _CONNECT_REQUEST_ONLY_HEADERS if invalid_headers: msg = f"Encountered connect-request-only headers {invalid_headers!r}" raise ProtocolError(msg) def _validate_host_authority_header(headers: Iterable[Header]) -> Generator[Header, None, None]: """ Given the :authority and Host headers from a request block that isn't a trailer, check that: 1. At least one of these headers is set. 2. If both headers are set, they match. :param headers: The HTTP header set. :raises: ``ProtocolError`` """ # We use None as a sentinel value. Iterate over the list of headers, # and record the value of these headers (if present). We don't need # to worry about receiving duplicate :authority headers, as this is # enforced by the _reject_pseudo_header_fields() pipeline. # # TODO: We should also guard against receiving duplicate Host headers, # and against sending duplicate headers. authority_header_val = None host_header_val = None for header in headers: if header[0] == b":authority": authority_header_val = header[1] elif header[0] == b"host": host_header_val = header[1] yield header # If we have not-None values for these variables, then we know we saw # the corresponding header. authority_present = (authority_header_val is not None) host_present = (host_header_val is not None) # It is an error for a request header block to contain neither # an :authority header nor a Host header. if not authority_present and not host_present: msg = "Request header block does not have an :authority or Host header." raise ProtocolError(msg) # If we receive both headers, they should definitely match. if authority_present and host_present and authority_header_val != host_header_val: msg = ( "Request header block has mismatched :authority and " f"Host headers: {authority_header_val!r} / {host_header_val!r}" ) raise ProtocolError(msg) def _check_host_authority_header(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises a ProtocolError if a header block arrives that does not contain an :authority or a Host header, or if a header block contains both fields, but their values do not match. """ # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return (h for h in headers) return _validate_host_authority_header(headers) def _check_path_header(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raise a ProtocolError if a header block arrives or is sent that contains an empty :path header. """ def inner() -> Generator[Header, None, None]: for header in headers: if header[0] == b":path" and not header[1]: msg = "An empty :path header is forbidden" raise ProtocolError(msg) yield header # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return (h for h in headers) return inner() def _to_bytes(v: bytes | str) -> bytes: """ Given an assumed `str` (or anything that supports `.encode()`), encodes it using utf-8 into bytes. Returns the unmodified object if it is already a `bytes` object. """ return v if isinstance(v, bytes) else v.encode("utf-8") def utf8_encode_headers(headers: Iterable[HeaderWeaklyTyped]) -> list[Header]: """ Given an iterable of header two-tuples, rebuilds that as a list with the header names and values encoded as utf-8 bytes. This function produces tuples that preserve the original type of the header tuple for tuple and any ``HeaderTuple``. """ encoded_headers: list[Header] = [] for header in headers: h = (_to_bytes(header[0]), _to_bytes(header[1])) if isinstance(header, HeaderTuple): encoded_headers.append(header.__class__(h[0], h[1])) else: encoded_headers.append(h) return encoded_headers def _lowercase_header_names(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None) -> Generator[Header, None, None]: """ Given an iterable of header two-tuples, rebuilds that iterable with the header names lowercased. This generator produces tuples that preserve the original type of the header tuple for tuple and any ``HeaderTuple``. """ for header in headers: if isinstance(header, HeaderTuple): yield header.__class__(header[0].lower(), header[1]) else: yield (header[0].lower(), header[1]) def _strip_surrounding_whitespace(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None) -> Generator[Header, None, None]: """ Given an iterable of header two-tuples, strip both leading and trailing whitespace from both header names and header values. This generator produces tuples that preserve the original type of the header tuple for tuple and any ``HeaderTuple``. """ for header in headers: if isinstance(header, HeaderTuple): yield header.__class__(header[0].strip(), header[1].strip()) else: yield (header[0].strip(), header[1].strip()) def _strip_connection_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None) -> Generator[Header, None, None]: """ Strip any connection headers as per RFC7540 § 8.1.2.2. """ for header in headers: if header[0] not in CONNECTION_HEADERS: yield header def _check_sent_host_authority_header(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Raises an InvalidHeaderBlockError if we try to send a header block that does not contain an :authority or a Host header, or if the header block contains both fields, but their values do not match. """ # We only expect to see :authority and Host headers on request header # blocks that aren't trailers, so skip this validation if this is a # response header or we're looking at trailer blocks. skip_validation = ( hdr_validation_flags.is_response_header or hdr_validation_flags.is_trailer ) if skip_validation: return (h for h in headers) return _validate_host_authority_header(headers) def _combine_cookie_fields(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ RFC 7540 § 8.1.2.5 allows HTTP/2 clients to split the Cookie header field, which must normally appear only once, into multiple fields for better compression. However, they MUST be joined back up again when received. This normalization step applies that transform. The side-effect is that all cookie fields now appear *last* in the header block. """ # There is a problem here about header indexing. Specifically, it's # possible that all these cookies are sent with different header indexing # values. At this point it shouldn't matter too much, so we apply our own # logic and make them never-indexed. cookies: list[bytes] = [] for header in headers: if header[0] == b"cookie": cookies.append(header[1]) else: yield header if cookies: cookie_val = b"; ".join(cookies) yield NeverIndexedHeaderTuple(b"cookie", cookie_val) def _split_outbound_cookie_fields(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None) -> Generator[Header, None, None]: """ RFC 7540 § 8.1.2.5 allows for better compression efficiency, to split the Cookie header field into separate header fields We want to do it for outbound requests, as we are doing for inbound. """ for header in headers: assert isinstance(header[0], bytes) assert isinstance(header[1], bytes) if header[0] == b"cookie": for cookie_val in header[1].split(b"; "): if isinstance(header, HeaderTuple): yield header.__class__(header[0], cookie_val) else: yield header[0], cookie_val else: yield header def normalize_outbound_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags | None, should_split_outbound_cookies: bool=False) -> Generator[Header, None, None]: """ Normalizes a header sequence that we are about to send. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. :param should_split_outbound_cookies: boolean flag """ headers = _lowercase_header_names(headers, hdr_validation_flags) if should_split_outbound_cookies: headers = _split_outbound_cookie_fields(headers, hdr_validation_flags) headers = _strip_surrounding_whitespace(headers, hdr_validation_flags) headers = _strip_connection_headers(headers, hdr_validation_flags) return _secure_headers(headers, hdr_validation_flags) def normalize_inbound_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Normalizes a header sequence that we have received. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags """ return _combine_cookie_fields(headers, hdr_validation_flags) def validate_outbound_headers(headers: Iterable[Header], hdr_validation_flags: HeaderValidationFlags) -> Generator[Header, None, None]: """ Validates and normalizes a header sequence that we are about to send. :param headers: The HTTP header set. :param hdr_validation_flags: An instance of HeaderValidationFlags. """ headers = _reject_te( headers, hdr_validation_flags, ) headers = _reject_connection_header( headers, hdr_validation_flags, ) headers = _reject_pseudo_header_fields( headers, hdr_validation_flags, ) headers = _check_sent_host_authority_header( headers, hdr_validation_flags, ) return _check_path_header(headers, hdr_validation_flags) class SizeLimitDict(collections.OrderedDict[int, Any]): def __init__(self, *args: dict[int, int], **kwargs: Any) -> None: self._size_limit = kwargs.pop("size_limit", None) super().__init__(*args, **kwargs) self._check_size_limit() def __setitem__(self, key: int, value: Any | int) -> None: super().__setitem__(key, value) self._check_size_limit() def _check_size_limit(self) -> None: if self._size_limit is not None: while len(self) > self._size_limit: self.popitem(last=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/src/h2/windows.py0000644000076500000240000001256414744265074014560 0ustar00kriechistaff""" h2/windows ~~~~~~~~~~ Defines tools for managing HTTP/2 flow control windows. The objects defined in this module are used to automatically manage HTTP/2 flow control windows. Specifically, they keep track of what the size of the window is, how much data has been consumed from that window, and how much data the user has already used. It then implements a basic algorithm that attempts to manage the flow control window without user input, trying to ensure that it does not emit too many WINDOW_UPDATE frames. """ from __future__ import annotations from .exceptions import FlowControlError # The largest acceptable value for a HTTP/2 flow control window. LARGEST_FLOW_CONTROL_WINDOW = 2**31 - 1 class WindowManager: """ A basic HTTP/2 window manager. :param max_window_size: The maximum size of the flow control window. :type max_window_size: ``int`` """ def __init__(self, max_window_size: int) -> None: assert max_window_size <= LARGEST_FLOW_CONTROL_WINDOW self.max_window_size = max_window_size self.current_window_size = max_window_size self._bytes_processed = 0 def window_consumed(self, size: int) -> None: """ We have received a certain number of bytes from the remote peer. This necessarily shrinks the flow control window! :param size: The number of flow controlled bytes we received from the remote peer. :type size: ``int`` :returns: Nothing. :rtype: ``None`` """ self.current_window_size -= size if self.current_window_size < 0: msg = "Flow control window shrunk below 0" raise FlowControlError(msg) def window_opened(self, size: int) -> None: """ The flow control window has been incremented, either because of manual flow control management or because of the user changing the flow control settings. This can have the effect of increasing what we consider to be the "maximum" flow control window size. This does not increase our view of how many bytes have been processed, only of how much space is in the window. :param size: The increment to the flow control window we received. :type size: ``int`` :returns: Nothing :rtype: ``None`` """ self.current_window_size += size if self.current_window_size > LARGEST_FLOW_CONTROL_WINDOW: msg = f"Flow control window mustn't exceed {LARGEST_FLOW_CONTROL_WINDOW}" raise FlowControlError(msg) self.max_window_size = max(self.current_window_size, self.max_window_size) def process_bytes(self, size: int) -> int | None: """ The application has informed us that it has processed a certain number of bytes. This may cause us to want to emit a window update frame. If we do want to emit a window update frame, this method will return the number of bytes that we should increment the window by. :param size: The number of flow controlled bytes that the application has processed. :type size: ``int`` :returns: The number of bytes to increment the flow control window by, or ``None``. :rtype: ``int`` or ``None`` """ self._bytes_processed += size return self._maybe_update_window() def _maybe_update_window(self) -> int | None: """ Run the algorithm. Our current algorithm can be described like this. 1. If no bytes have been processed, we immediately return 0. There is no meaningful way for us to hand space in the window back to the remote peer, so let's not even try. 2. If there is no space in the flow control window, and we have processed at least 1024 bytes (or 1/4 of the window, if the window is smaller), we will emit a window update frame. This is to avoid the risk of blocking a stream altogether. 3. If there is space in the flow control window, and we have processed at least 1/2 of the window worth of bytes, we will emit a window update frame. This is to minimise the number of window update frames we have to emit. In a healthy system with large flow control windows, this will irregularly emit WINDOW_UPDATE frames. This prevents us starving the connection by emitting eleventy bajillion WINDOW_UPDATE frames, especially in situations where the remote peer is sending a lot of very small DATA frames. """ # TODO: Can the window be smaller than 1024 bytes? If not, we can # streamline this algorithm. if not self._bytes_processed: return None max_increment = (self.max_window_size - self.current_window_size) increment = 0 # Note that, even though we may increment less than _bytes_processed, # we still want to set it to zero whenever we emit an increment. This # is because we'll always increment up to the maximum we can. if ((self.current_window_size == 0) and ( self._bytes_processed > min(1024, self.max_window_size // 4))) or self._bytes_processed >= (self.max_window_size // 2): increment = min(self._bytes_processed, max_increment) self._bytes_processed = 0 self.current_window_size += increment return increment ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7744427 h2-4.2.0/src/h2.egg-info/0000755000076500000240000000000014747620663014200 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482098.0 h2-4.2.0/src/h2.egg-info/PKG-INFO0000644000076500000240000001177414747620662015306 0ustar00kriechistaffMetadata-Version: 2.2 Name: h2 Version: 4.2.0 Summary: Pure-Python HTTP/2 protocol implementation Author-email: Cory Benfield Maintainer-email: Thomas Kriechbaumer License: The MIT License (MIT) Copyright (c) 2015-2020 Cory Benfield and contributors 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. Project-URL: Homepage, https://github.com/python-hyper/h2/ Project-URL: Bug Reports, https://github.com/python-hyper/h2/issues Project-URL: Source, https://github.com/python-hyper/h2/ Project-URL: Documentation, https://python-hyper.org/ Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 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: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Requires-Python: >=3.9 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: hyperframe<7,>=6.1 Requires-Dist: hpack<5,>=4.1 ========================= h2: HTTP/2 Protocol Stack ========================= .. image:: https://github.com/python-hyper/h2/workflows/CI/badge.svg :target: https://github.com/python-hyper/h2/actions :alt: Build Status .. image:: https://codecov.io/gh/python-hyper/h2/branch/master/graph/badge.svg :target: https://codecov.io/gh/python-hyper/h2 :alt: Code Coverage .. image:: https://readthedocs.org/projects/h2/badge/?version=latest :target: https://h2.readthedocs.io/en/latest/ :alt: Documentation Status .. image:: https://img.shields.io/badge/chat-join_now-brightgreen.svg :target: https://gitter.im/python-hyper/community :alt: Chat community .. image:: https://raw.github.com/python-hyper/documentation/master/source/logo/hyper-black-bg-white.png This repository contains a pure-Python implementation of a HTTP/2 protocol stack. It's written from the ground up to be embeddable in whatever program you choose to use, ensuring that you can speak HTTP/2 regardless of your programming paradigm. You use it like this: .. code-block:: python import h2.connection import h2.config config = h2.config.H2Configuration() conn = h2.connection.H2Connection(config=config) conn.send_headers(stream_id=stream_id, headers=headers) conn.send_data(stream_id, data) socket.sendall(conn.data_to_send()) events = conn.receive_data(socket_data) This repository does not provide a parsing layer, a network layer, or any rules about concurrency. Instead, it's a purely in-memory solution, defined in terms of data actions and HTTP/2 frames. This is one building block of a full Python HTTP implementation. To install it, just run: .. code-block:: console $ python -m pip install h2 Documentation ============= Documentation is available at https://h2.readthedocs.io . Contributing ============ ``h2`` welcomes contributions from anyone! Unlike many other projects we are happy to accept cosmetic contributions and small contributions, in addition to large feature requests and changes. Before you contribute (either by opening an issue or filing a pull request), please `read the contribution guidelines`_. .. _read the contribution guidelines: http://python-hyper.org/en/latest/contributing.html License ======= ``h2`` is made available under the MIT License. For more details, see the ``LICENSE`` file in the repository. Authors ======= ``h2`` was authored by Cory Benfield and is maintained by the members of `python-hyper `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482098.0 h2-4.2.0/src/h2.egg-info/SOURCES.txt0000644000076500000240000000571614747620662016074 0ustar00kriechistaffCHANGELOG.rst LICENSE MANIFEST.in README.rst pyproject.toml docs/Makefile docs/make.bat docs/source/advanced-usage.rst docs/source/api.rst docs/source/asyncio-example.rst docs/source/basic-usage.rst docs/source/conf.py docs/source/curio-example.rst docs/source/eventlet-example.rst docs/source/examples.rst docs/source/gevent-example.rst docs/source/index.rst docs/source/installation.rst docs/source/low-level.rst docs/source/negotiating-http2.rst docs/source/plain-sockets-example.rst docs/source/release-notes.rst docs/source/release-process.rst docs/source/testimonials.rst docs/source/tornado-example.rst docs/source/twisted-example.rst docs/source/twisted-head-example.rst docs/source/twisted-post-example.rst docs/source/wsgi-example.rst docs/source/_static/.gitkeep docs/source/_static/h2.connection.H2ConnectionStateMachine.dot.png docs/source/_static/h2.stream.H2StreamStateMachine.dot.png docs/source/_templates/.gitkeep examples/asyncio/asyncio-server.py examples/asyncio/cert.crt examples/asyncio/cert.key examples/asyncio/wsgi-server.py examples/curio/curio-server.py examples/curio/localhost.crt.pem examples/curio/localhost.key examples/eventlet/eventlet-server.py examples/eventlet/server.crt examples/eventlet/server.key examples/fragments/client_https_setup_fragment.py examples/fragments/client_upgrade_fragment.py examples/fragments/server_https_setup_fragment.py examples/fragments/server_upgrade_fragment.py examples/gevent/gevent-server.py examples/gevent/localhost.crt examples/gevent/localhost.key examples/plain_sockets/plain_sockets_client.py examples/tornado/server.crt examples/tornado/server.key examples/tornado/tornado-server.py examples/twisted/head_request.py examples/twisted/post_request.py examples/twisted/server.crt examples/twisted/server.csr examples/twisted/server.key examples/twisted/twisted-server.py src/h2/__init__.py src/h2/config.py src/h2/connection.py src/h2/errors.py src/h2/events.py src/h2/exceptions.py src/h2/frame_buffer.py src/h2/py.typed src/h2/settings.py src/h2/stream.py src/h2/utilities.py src/h2/windows.py src/h2.egg-info/PKG-INFO src/h2.egg-info/SOURCES.txt src/h2.egg-info/dependency_links.txt src/h2.egg-info/requires.txt src/h2.egg-info/top_level.txt tests/__init__.py tests/conftest.py tests/coroutine_tests.py tests/h2spectest.sh tests/helpers.py tests/test_basic_logic.py tests/test_closed_streams.py tests/test_complex_logic.py tests/test_config.py tests/test_events.py tests/test_exceptions.py tests/test_flow_control_window.py tests/test_h2_upgrade.py tests/test_head_request.py tests/test_header_indexing.py tests/test_informational_responses.py tests/test_interacting_stacks.py tests/test_invalid_content_lengths.py tests/test_invalid_frame_sequences.py tests/test_invalid_headers.py tests/test_priority.py tests/test_related_events.py tests/test_rfc7838.py tests/test_rfc8441.py tests/test_settings.py tests/test_state_machines.py tests/test_stream_reset.py tests/test_utility_functions.py visualizer/NOTICES.visualizer visualizer/visualize.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482098.0 h2-4.2.0/src/h2.egg-info/dependency_links.txt0000644000076500000240000000000114747620662020245 0ustar00kriechistaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482098.0 h2-4.2.0/src/h2.egg-info/requires.txt0000644000076500000240000000004114747620662016572 0ustar00kriechistaffhyperframe<7,>=6.1 hpack<5,>=4.1 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1738482098.0 h2-4.2.0/src/h2.egg-info/top_level.txt0000644000076500000240000000000314747620662016722 0ustar00kriechistaffh2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7737546 h2-4.2.0/tests/0000755000076500000240000000000014747620663012550 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737582431.0 h2-4.2.0/tests/__init__.py0000644000076500000240000000000014744263537014647 0ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/conftest.py0000644000076500000240000000022214744265074014741 0ustar00kriechistafffrom __future__ import annotations import pytest from . import helpers @pytest.fixture def frame_factory(): return helpers.FrameFactory() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/coroutine_tests.py0000644000076500000240000000515614744265074016360 0ustar00kriechistaff""" This file gives access to a coroutine-based test class. This allows each test case to be defined as a pair of interacting coroutines, sending data to each other by yielding the flow of control. The advantage of this method is that we avoid the difficulty of using threads in Python, as well as the pain of using sockets and events to communicate and organise the communication. This makes the tests entirely deterministic and makes them behave identically on all platforms, as well as ensuring they both succeed and fail quickly. """ from __future__ import annotations import functools import itertools import pytest class CoroutineTestCase: """ A base class for tests that use interacting coroutines. The run_until_complete method takes a number of coroutines as arguments. Each one is, in order, passed the output of the previous coroutine until one is exhausted. If a coroutine does not initially yield data (that is, its first action is to receive data), the calling code should prime it by using the 'server' decorator on this class. """ def run_until_complete(self, *coroutines) -> None: """ Executes a set of coroutines that communicate between each other. Each one is, in order, passed the output of the previous coroutine until one is exhausted. If a coroutine does not initially yield data (that is, its first action is to receive data), the calling code should prime it by using the 'server' decorator on this class. Once a coroutine is exhausted, the method performs a final check to ensure that all other coroutines are exhausted. This ensures that all assertions in those coroutines got executed. """ looping_coroutines = itertools.cycle(coroutines) data = None for coro in looping_coroutines: try: data = coro.send(data) except StopIteration: break for coro in coroutines: try: next(coro) except StopIteration: continue else: pytest.fail(f"Coroutine {coro} not exhausted") def server(self, func): """ A decorator that marks a test coroutine as a 'server' coroutine: that is, one whose first action is to consume data, rather than one that initially emits data. The effect of this decorator is simply to prime the coroutine. """ @functools.wraps(func) def wrapper(*args, **kwargs): c = func(*args, **kwargs) next(c) return c return wrapper ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/h2spectest.sh0000755000076500000240000000070114744265074015167 0ustar00kriechistaff#!/usr/bin/env bash # A test script that runs the example Python Twisted server and then runs # h2spec against it. Prints the output of h2spec. This script does not expect # to be run directly, but instead via `tox -e h2spec`. set -x # Kill all background jobs on exit. trap 'kill $(jobs -p)' EXIT pushd examples/asyncio python asyncio-server.py & popd # Wait briefly to let the server start up sleep 2 # Go go go! h2spec -k -t -v -p 8443 $@ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/helpers.py0000644000076500000240000001170014744265074014561 0ustar00kriechistaff""" Helper module for the h2 tests. """ from __future__ import annotations from hpack.hpack import Encoder from hyperframe.frame import ( AltSvcFrame, ContinuationFrame, DataFrame, GoAwayFrame, HeadersFrame, PingFrame, PriorityFrame, PushPromiseFrame, RstStreamFrame, SettingsFrame, WindowUpdateFrame, ) SAMPLE_SETTINGS = { SettingsFrame.HEADER_TABLE_SIZE: 4096, SettingsFrame.ENABLE_PUSH: 1, SettingsFrame.MAX_CONCURRENT_STREAMS: 2, } class FrameFactory: """ A class containing lots of helper methods and state to build frames. This allows test cases to easily build correct HTTP/2 frames to feed to hyper-h2. """ def __init__(self) -> None: self.encoder = Encoder() def refresh_encoder(self) -> None: self.encoder = Encoder() def preamble(self) -> bytes: return b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" def build_headers_frame(self, headers, flags=None, stream_id=1, **priority_kwargs): """ Builds a single valid headers frame out of the contained headers. """ if flags is None: flags = [] f = HeadersFrame(stream_id) f.data = self.encoder.encode(headers) f.flags.add("END_HEADERS") for flag in flags: f.flags.add(flag) for k, v in priority_kwargs.items(): setattr(f, k, v) return f def build_continuation_frame(self, header_block, flags=None, stream_id=1): """ Builds a single continuation frame out of the binary header block. """ if flags is None: flags = [] f = ContinuationFrame(stream_id) f.data = header_block f.flags = set(flags) return f def build_data_frame(self, data, flags=None, stream_id=1, padding_len=0): """ Builds a single data frame out of a chunk of data. """ flags = set(flags) if flags is not None else set() f = DataFrame(stream_id) f.data = data f.flags = flags if padding_len: flags.add("PADDED") f.pad_length = padding_len return f def build_settings_frame(self, settings, ack=False): """ Builds a single settings frame. """ f = SettingsFrame(0) if ack: f.flags.add("ACK") f.settings = settings return f def build_window_update_frame(self, stream_id, increment): """ Builds a single WindowUpdate frame. """ f = WindowUpdateFrame(stream_id) f.window_increment = increment return f def build_ping_frame(self, ping_data, flags=None): """ Builds a single Ping frame. """ f = PingFrame(0) f.opaque_data = ping_data if flags: f.flags = set(flags) return f def build_goaway_frame(self, last_stream_id, error_code=0, additional_data=b""): """ Builds a single GOAWAY frame. """ f = GoAwayFrame(0) f.error_code = error_code f.last_stream_id = last_stream_id f.additional_data = additional_data return f def build_rst_stream_frame(self, stream_id, error_code=0): """ Builds a single RST_STREAM frame. """ f = RstStreamFrame(stream_id) f.error_code = error_code return f def build_push_promise_frame(self, stream_id, promised_stream_id, headers, flags=None): """ Builds a single PUSH_PROMISE frame. """ if flags is None: flags = [] f = PushPromiseFrame(stream_id) f.promised_stream_id = promised_stream_id f.data = self.encoder.encode(headers) f.flags = set(flags) f.flags.add("END_HEADERS") return f def build_priority_frame(self, stream_id, weight, depends_on=0, exclusive=False): """ Builds a single priority frame. """ f = PriorityFrame(stream_id) f.depends_on = depends_on f.stream_weight = weight f.exclusive = exclusive return f def build_alt_svc_frame(self, stream_id, origin, field): """ Builds a single ALTSVC frame. """ f = AltSvcFrame(stream_id) f.origin = origin f.field = field return f def change_table_size(self, new_size) -> None: """ Causes the encoder to send a dynamic size update in the next header block it sends. """ self.encoder.header_table_size = new_size ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_basic_logic.py0000644000076500000240000020352214744265074016421 0ustar00kriechistaff""" Test the basic logic of the h2 state machines. """ from __future__ import annotations import random import hyperframe import pytest from hpack import HeaderTuple from hypothesis import HealthCheck, given, settings from hypothesis.strategies import integers import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.frame_buffer import h2.settings import h2.stream from . import helpers class TestBasicClient: """ Basic client-side tests. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] bytes_example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] bytes_example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] def test_begin_connection(self, frame_factory) -> None: """ Client connections emit the HTTP/2 preamble. """ c = h2.connection.H2Connection() expected_settings = frame_factory.build_settings_frame( c.local_settings, ) expected_data = ( b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + expected_settings.serialize() ) events = c.initiate_connection() assert not events assert c.data_to_send() == expected_data def test_sending_headers(self) -> None: """ Single headers frames are correctly encoded. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() events = c.send_headers(1, self.example_request_headers) assert not events assert c.data_to_send() == ( b"\x00\x00\r\x01\x04\x00\x00\x00\x01" b"A\x88/\x91\xd3]\x05\\\x87\xa7\x84\x87\x82" ) def test_sending_data(self) -> None: """ Single data frames are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b"some data") assert not events data_to_send = c.data_to_send() assert ( data_to_send == b"\x00\x00\t\x00\x00\x00\x00\x00\x01some data" ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = next(iter(buffer)) sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b"some data"), expect_padded_flag=False, expected_data_frame_pad_length=0, ) def test_sending_data_in_memoryview(self) -> None: """ Support memoryview for sending data. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, memoryview(b"some data")) assert not events data_to_send = c.data_to_send() assert ( data_to_send == b"\x00\x00\t\x00\x00\x00\x00\x00\x01some data" ) def test_sending_data_with_padding(self) -> None: """ Single data frames with padding are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b"some data", pad_length=5) assert not events data_to_send = c.data_to_send() assert data_to_send == ( b"\x00\x00\x0f\x00\x08\x00\x00\x00\x01" b"\x05some data\x00\x00\x00\x00\x00" ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = next(iter(buffer)) sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b"some data") + 1 + 5, expect_padded_flag=True, expected_data_frame_pad_length=5, ) def test_sending_data_with_zero_length_padding(self) -> None: """ Single data frames with zero-length padding are encoded correctly. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b"some data", pad_length=0) assert not events data_to_send = c.data_to_send() assert data_to_send == ( b"\x00\x00\x0a\x00\x08\x00\x00\x00\x01" b"\x00some data" ) buffer = h2.frame_buffer.FrameBuffer(server=False) buffer.max_frame_size = 65535 buffer.add_data(data_to_send) data_frame = next(iter(buffer)) sanity_check_data_frame( data_frame=data_frame, expected_flow_controlled_length=len(b"some data") + 1, expect_padded_flag=True, expected_data_frame_pad_length=0, ) @pytest.mark.parametrize(("expected_error", "pad_length"), [ (None, 0), (None, 255), (None, None), (ValueError, -1), (ValueError, 256), (TypeError, "invalid"), (TypeError, ""), (TypeError, "10"), (TypeError, {}), (TypeError, ["1", "2", "3"]), (TypeError, []), (TypeError, 1.5), (TypeError, 1.0), (TypeError, -1.0), ]) def test_sending_data_with_invalid_padding_length(self, expected_error, pad_length) -> None: """ ``send_data`` with a ``pad_length`` parameter that is an integer outside the range of [0, 255] throws a ``ValueError``, and a ``pad_length`` parameter which is not an ``integer`` type throws a ``TypeError``. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) c.clear_outbound_data_buffer() if expected_error is not None: with pytest.raises(expected_error): c.send_data(1, b"some data", pad_length=pad_length) else: c.send_data(1, b"some data", pad_length=pad_length) def test_closing_stream_sending_data(self, frame_factory) -> None: """ We can close a stream with a data frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_data_frame( data=b"some data", flags=["END_STREAM"], ) # Clear the data, then send some data. c.clear_outbound_data_buffer() events = c.send_data(1, b"some data", end_stream=True) assert not events assert c.data_to_send() == f.serialize() def test_receiving_a_response(self, frame_factory) -> None: """ When receiving a response, the ResponseReceived event fires. """ config = h2.config.H2Configuration(header_encoding="utf-8") c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) # Clear the data f = frame_factory.build_headers_frame( self.example_response_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.example_response_headers def test_receiving_a_response_bytes(self, frame_factory) -> None: """ When receiving a response, the ResponseReceived event fires with bytes headers if the encoding is set appropriately. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) # Clear the data f = frame_factory.build_headers_frame( self.example_response_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_response_headers def test_receiving_a_response_change_encoding(self, frame_factory) -> None: """ When receiving a response, the ResponseReceived event fires with bytes headers if the encoding is set appropriately, but if this changes then the change reflects it. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_response_headers c.send_headers(3, self.example_request_headers, end_stream=True) c.config.header_encoding = "utf-8" f = frame_factory.build_headers_frame( self.example_response_headers, stream_id=3, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 3 assert event.headers == self.example_response_headers def test_end_stream_without_data(self, frame_factory) -> None: """ Ending a stream without data emits a zero-length DATA frame with END_STREAM set. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) # Clear the data c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(b"", flags=["END_STREAM"]) events = c.end_stream(1) assert not events assert c.data_to_send() == f.serialize() def test_cannot_send_headers_on_lower_stream_id(self) -> None: """ Once stream ID x has been used, cannot use stream ID y where y < x. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(3, self.example_request_headers, end_stream=False) with pytest.raises(h2.exceptions.StreamIDTooLowError) as e: c.send_headers(1, self.example_request_headers, end_stream=True) assert e.value.stream_id == 1 assert e.value.max_stream_id == 3 def test_receiving_pushed_stream(self, frame_factory) -> None: """ Pushed streams fire a PushedStreamReceived event, followed by ResponseReceived when the response headers are received. """ config = h2.config.H2Configuration(header_encoding="utf-8") c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_headers_frame( self.example_response_headers, ) f2 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=["END_HEADERS"], ) f3 = frame_factory.build_headers_frame( self.example_response_headers, stream_id=2, ) data = b"".join(x.serialize() for x in [f1, f2, f3]) events = c.receive_data(data) assert len(events) == 3 stream_push_event = events[1] response_event = events[2] assert isinstance(stream_push_event, h2.events.PushedStreamReceived) assert isinstance(response_event, h2.events.ResponseReceived) assert stream_push_event.pushed_stream_id == 2 assert stream_push_event.parent_stream_id == 1 assert ( stream_push_event.headers == self.example_request_headers ) assert response_event.stream_id == 2 assert response_event.headers == self.example_response_headers def test_receiving_pushed_stream_bytes(self, frame_factory) -> None: """ Pushed headers are not decoded if the header encoding is set to False. """ config = h2.config.H2Configuration(header_encoding=False) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_headers_frame( self.example_response_headers, ) f2 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=["END_HEADERS"], ) f3 = frame_factory.build_headers_frame( self.example_response_headers, stream_id=2, ) data = b"".join(x.serialize() for x in [f1, f2, f3]) events = c.receive_data(data) assert len(events) == 3 stream_push_event = events[1] response_event = events[2] assert isinstance(stream_push_event, h2.events.PushedStreamReceived) assert isinstance(response_event, h2.events.ResponseReceived) assert stream_push_event.pushed_stream_id == 2 assert stream_push_event.parent_stream_id == 1 assert ( stream_push_event.headers == self.bytes_example_request_headers ) assert response_event.stream_id == 2 assert response_event.headers == self.bytes_example_response_headers def test_cannot_receive_pushed_stream_when_enable_push_is_0(self, frame_factory) -> None: """ If we have set SETTINGS_ENABLE_PUSH to 0, receiving PUSH_PROMISE frames triggers the connection to be closed. """ c = h2.connection.H2Connection() c.initiate_connection() c.local_settings.enable_push = 0 c.send_headers(1, self.example_request_headers, end_stream=False) f1 = frame_factory.build_settings_frame({}, ack=True) f2 = frame_factory.build_headers_frame( self.example_response_headers, ) f3 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=["END_HEADERS"], ) c.receive_data(f1.serialize()) c.receive_data(f2.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f3.serialize()) expected_frame = frame_factory.build_goaway_frame( 0, h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_receiving_response_no_body(self, frame_factory) -> None: """ Receiving a response without a body fires two events, ResponseReceived and StreamEnded. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=["END_STREAM"], ) events = c.receive_data(f.serialize()) assert len(events) == 2 response_event = events[0] end_stream = events[1] assert isinstance(response_event, h2.events.ResponseReceived) assert isinstance(end_stream, h2.events.StreamEnded) def test_oversize_headers(self) -> None: """ Sending headers that are oversized generates a stream of CONTINUATION frames. """ all_bytes = [chr(x).encode("latin1") for x in range(256)] large_binary_string = b"".join( random.choice(all_bytes) for _ in range(256) ) test_headers = [ (":authority", "example.com"), (":path", "/"), (":method", "GET"), (":scheme", "https"), ("key", large_binary_string), ] c = h2.connection.H2Connection() # Greatly shrink the max frame size to force us over. c.max_outbound_frame_size = 48 c.initiate_connection() c.send_headers(1, test_headers, end_stream=True) # Use the frame buffer here, because we don't care about decoding # the headers. Don't send all the data in because that will force the # frame buffer to stop caching the CONTINUATION frames, so instead # send all but one byte. buffer = h2.frame_buffer.FrameBuffer(server=True) buffer.max_frame_size = 65535 data = c.data_to_send() buffer.add_data(data[:-1]) # Drain the buffer, confirming that it only provides a single frame # (the settings frame) assert len(list(buffer)) == 1 # Get the cached frames. frames = buffer._headers_buffer # Split the frames up. headers_frame = frames[0] continuation_frames = frames[1:] assert isinstance(headers_frame, hyperframe.frame.HeadersFrame) assert all( (isinstance(f, hyperframe.frame.ContinuationFrame) for f in continuation_frames), ) assert all( (len(f.data) <= c.max_outbound_frame_size for f in frames), ) assert frames[0].flags == {"END_STREAM"} buffer.add_data(data[-1:]) headers = next(iter(buffer)) assert isinstance(headers, hyperframe.frame.HeadersFrame) def test_handle_stream_reset(self, frame_factory) -> None: """ Streams being remotely reset fires a StreamReset event. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code is h2.errors.ErrorCodes.STREAM_CLOSED assert isinstance(event.error_code, h2.errors.ErrorCodes) assert event.remote_reset def test_handle_stream_reset_with_unknown_erorr_code(self, frame_factory) -> None: """ Streams being remotely reset with unknown error codes behave exactly as they do with known error codes, but the error code on the event is an int, instead of being an ErrorCodes. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame(stream_id=1, error_code=0xFA) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == 250 assert not isinstance(event.error_code, h2.errors.ErrorCodes) assert event.remote_reset def test_can_consume_partial_data_from_connection(self) -> None: """ We can do partial reads from the connection. """ c = h2.connection.H2Connection() c.initiate_connection() assert len(c.data_to_send(2)) == 2 assert len(c.data_to_send(3)) == 3 assert 0 < len(c.data_to_send(500)) < 500 assert len(c.data_to_send(10)) == 0 assert len(c.data_to_send()) == 0 def test_we_can_update_settings(self, frame_factory) -> None: """ Updating the settings emits a SETTINGS frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 52, h2.settings.SettingCodes.ENABLE_PUSH: 0, } events = c.update_settings(new_settings) assert not events f = frame_factory.build_settings_frame(new_settings) assert c.data_to_send() == f.serialize() def test_settings_get_acked_correctly(self, frame_factory) -> None: """ When settings changes are ACKed, they contain the changed settings. """ c = h2.connection.H2Connection() c.initiate_connection() new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 52, h2.settings.SettingCodes.ENABLE_PUSH: 0, } c.update_settings(new_settings) f = frame_factory.build_settings_frame({}, ack=True) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.SettingsAcknowledged) assert len(event.changed_settings) == len(new_settings) for setting, value in new_settings.items(): assert event.changed_settings[setting].new_value == value def test_cannot_create_new_outbound_stream_over_limit(self, frame_factory) -> None: """ When the number of outbound streams exceeds the remote peer's MAX_CONCURRENT_STREAMS setting, attempting to open new streams fails. """ c = h2.connection.H2Connection() c.initiate_connection() f = frame_factory.build_settings_frame( {h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 1}, ) c.receive_data(f.serialize())[0] c.send_headers(1, self.example_request_headers) with pytest.raises(h2.exceptions.TooManyStreamsError): c.send_headers(3, self.example_request_headers) def test_can_receive_trailers(self, frame_factory) -> None: """ When two HEADERS blocks are received in the same stream from a server, the second set are trailers. """ config = h2.config.H2Configuration(header_encoding="utf-8") c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) c.receive_data(f.serialize()) # Send in trailers. trailers = [("content-length", "0")] f = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"], ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert event.headers == trailers assert event.stream_id == 1 def test_reject_trailers_not_ending_stream(self, frame_factory) -> None: """ When trailers are received without the END_STREAM flag being present, this is a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) c.receive_data(f.serialize()) # Send in trailers. c.clear_outbound_data_buffer() trailers = [("content-length", "0")] f = frame_factory.build_headers_frame( trailers, flags=[], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_send_trailers(self, frame_factory) -> None: """ When a second set of headers are sent, they are properly trailers. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers(1, self.example_request_headers) # Now send trailers. trailers = [("content-length", "0")] c.send_headers(1, trailers, end_stream=True) frame_factory.refresh_encoder() f1 = frame_factory.build_headers_frame( self.example_request_headers, ) f2 = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"], ) assert c.data_to_send() == f1.serialize() + f2.serialize() def test_trailers_must_have_end_stream(self, frame_factory) -> None: """ A set of trailers must carry the END_STREAM flag. """ c = h2.connection.H2Connection() c.initiate_connection() # Send headers. c.send_headers(1, self.example_request_headers) # Now send trailers. trailers = [("content-length", "0")] with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, trailers) def test_headers_are_lowercase(self, frame_factory) -> None: """ When headers are sent, they are forced to lower-case. """ weird_headers = [*self.example_request_headers, ("ChAnGiNg-CaSe", "AlsoHere"), ("alllowercase", "alllowercase"), ("ALLCAPS", "ALLCAPS")] expected_headers = [*self.example_request_headers, ("changing-case", "AlsoHere"), ("alllowercase", "alllowercase"), ("allcaps", "ALLCAPS")] c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers(1, weird_headers) expected_frame = frame_factory.build_headers_frame( headers=expected_headers, ) assert c.data_to_send() == expected_frame.serialize() def test_outbound_cookie_headers_are_split(self) -> None: """ We should split outbound cookie headers according to RFC 7540 - 8.1.2.5 """ cookie_headers = [ HeaderTuple("cookie", "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1; test2=val2"), ] expected_cookie_headers = [ HeaderTuple("cookie", "username=John Doe"), HeaderTuple("cookie", "expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1"), ("cookie", "test2=val2"), ] client_config = h2.config.H2Configuration( client_side=True, header_encoding="utf-8", split_outbound_cookies=True, ) server_config = h2.config.H2Configuration( client_side=False, normalize_inbound_headers=False, header_encoding="utf-8", ) client = h2.connection.H2Connection(config=client_config) server = h2.connection.H2Connection(config=server_config) client.initiate_connection() client.send_headers(1, self.example_request_headers + cookie_headers, end_stream=True) e = server.receive_data(client.data_to_send()) cookie_fields = [(n, v) for n, v in e[1].headers if n == "cookie"] assert cookie_fields == expected_cookie_headers @given(frame_size=integers(min_value=2**14, max_value=(2**24 - 1))) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_changing_max_frame_size(self, frame_factory, frame_size) -> None: """ When the user changes the max frame size and the change is ACKed, the remote peer is now bound by the new frame size. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() c = h2.connection.H2Connection() c.initiate_connection() # Set up the stream. c.send_headers(1, self.example_request_headers, end_stream=True) headers_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(headers_frame.serialize()) # Change the max frame size. c.update_settings( {h2.settings.SettingCodes.MAX_FRAME_SIZE: frame_size}, ) settings_ack = frame_factory.build_settings_frame({}, ack=True) c.receive_data(settings_ack.serialize()) # Greatly increase the flow control windows: we're not here to test # flow control today. c.increment_flow_control_window(increment=(2 * frame_size) + 1) c.increment_flow_control_window( increment=(2 * frame_size) + 1, stream_id=1, ) # Send one DATA frame that is exactly the max frame size: confirm it's # fine. data = frame_factory.build_data_frame( data=(b"\x00" * frame_size), ) events = c.receive_data(data.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.DataReceived) assert events[0].flow_controlled_length == frame_size # Send one that is one byte too large: confirm a protocol error is # raised. data.data += b"\x00" with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data.serialize()) def test_cookies_are_joined_on_push(self, frame_factory) -> None: """ RFC 7540 Section 8.1.2.5 requires that we join multiple Cookie headers in a header block together when they're received on a push. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ("cookie", "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1; test2=val2"), ] expected = ( "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; " "path=1; test1=val1; test2=val2" ) config = h2.config.H2Configuration(header_encoding="utf-8") c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers + cookie_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] cookie_fields = [(n, v) for n, v in e.headers if n == "cookie"] assert len(cookie_fields) == 1 _, v = cookie_fields[0] assert v == expected def test_cookies_arent_joined_without_normalization(self, frame_factory) -> None: """ If inbound header normalization is disabled, cookie headers aren't joined. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ("cookie", "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1; test2=val2"), ] config = h2.config.H2Configuration( client_side=True, normalize_inbound_headers=False, header_encoding="utf-8", ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers + cookie_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] received_cookies = [(n, v) for n, v in e.headers if n == "cookie"] assert len(received_cookies) == 3 assert cookie_headers == received_cookies class TestBasicServer: """ Basic server-side tests. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] bytes_example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "hyper-h2/0.1.0"), ] server_config = h2.config.H2Configuration( client_side=False, header_encoding="utf-8", ) def test_ignores_preamble(self) -> None: """ The preamble does not cause any events or frames to be written. """ c = h2.connection.H2Connection(config=self.server_config) preamble = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" events = c.receive_data(preamble) assert not events assert not c.data_to_send() @pytest.mark.parametrize("chunk_size", range(1, 24)) def test_drip_feed_preamble(self, chunk_size) -> None: """ The preamble can be sent in in less than a single buffer. """ c = h2.connection.H2Connection(config=self.server_config) preamble = b"PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" events = [] for i in range(0, len(preamble), chunk_size): events += c.receive_data(preamble[i:i+chunk_size]) assert not events assert not c.data_to_send() def test_initiate_connection_sends_server_preamble(self, frame_factory) -> None: """ For server-side connections, initiate_connection sends a server preamble. """ c = h2.connection.H2Connection(config=self.server_config) expected_settings = frame_factory.build_settings_frame( c.local_settings, ) expected_data = expected_settings.serialize() events = c.initiate_connection() assert not events assert c.data_to_send() == expected_data def test_headers_event(self, frame_factory) -> None: """ When a headers frame is received a RequestReceived event fires. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == self.example_request_headers def test_headers_event_bytes(self, frame_factory) -> None: """ When a headers frame is received a RequestReceived event fires with bytes headers if the encoding is set appropriately. """ config = h2.config.H2Configuration( client_side=False, header_encoding=False, ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == self.bytes_example_request_headers def test_data_event(self, frame_factory) -> None: """ Test that data received on a stream fires a DataReceived event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) f2 = frame_factory.build_data_frame( b"some request data", stream_id=3, ) data = b"".join(f.serialize() for f in [f1, f2]) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.DataReceived) assert event.stream_id == 3 assert event.data == b"some request data" assert event.flow_controlled_length == 17 def test_data_event_with_padding(self, frame_factory) -> None: """ Test that data received on a stream fires a DataReceived event that accounts for padding. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) f2 = frame_factory.build_data_frame( b"some request data", stream_id=3, padding_len=20, ) data = b"".join(f.serialize() for f in [f1, f2]) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.DataReceived) assert event.stream_id == 3 assert event.data == b"some request data" assert event.flow_controlled_length == 17 + 20 + 1 def test_receiving_ping_frame(self, frame_factory) -> None: """ Ping frames should be immediately ACKed. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) ping_data = b"\x01" * 8 sent_frame = frame_factory.build_ping_frame(ping_data) expected_frame = frame_factory.build_ping_frame( ping_data, flags=["ACK"], ) expected_data = expected_frame.serialize() c.clear_outbound_data_buffer() events = c.receive_data(sent_frame.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PingReceived) assert event.ping_data == ping_data assert c.data_to_send() == expected_data def test_receiving_settings_frame_event(self, frame_factory) -> None: """ Settings frames should cause a RemoteSettingsChanged event to fire. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame( settings=helpers.SAMPLE_SETTINGS, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RemoteSettingsChanged) assert len(event.changed_settings) == len(helpers.SAMPLE_SETTINGS) def test_acknowledging_settings(self, frame_factory) -> None: """ Acknowledging settings causes appropriate Settings frame to be emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) received_frame = frame_factory.build_settings_frame( settings=helpers.SAMPLE_SETTINGS, ) expected_frame = frame_factory.build_settings_frame( settings={}, ack=True, ) expected_data = expected_frame.serialize() c.clear_outbound_data_buffer() events = c.receive_data(received_frame.serialize()) assert len(events) == 1 assert c.data_to_send() == expected_data def test_close_connection(self, frame_factory) -> None: """ Closing the connection with no error code emits a GOAWAY frame with error code 0. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame(last_stream_id=0) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection() assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("error_code", h2.errors.ErrorCodes) def test_close_connection_with_error_code(self, frame_factory, error_code) -> None: """ Closing the connection with an error code emits a GOAWAY frame with that error code. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( error_code=error_code, last_stream_id=0, ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(error_code) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize(("last_stream_id", "output"), [ (None, 23), (0, 0), (42, 42), ]) def test_close_connection_with_last_stream_id(self, frame_factory, last_stream_id, output) -> None: """ Closing the connection with last_stream_id set emits a GOAWAY frame with that value. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) headers_frame = frame_factory.build_headers_frame( [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ], stream_id=23) c.receive_data(headers_frame.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=output, ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(last_stream_id=last_stream_id) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize(("additional_data", "output"), [ (None, b""), (b"", b""), (b"foobar", b"foobar"), ]) def test_close_connection_with_additional_data(self, frame_factory, additional_data, output) -> None: """ Closing the connection with additional debug data emits a GOAWAY frame with that data attached. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=0, additional_data=output, ) expected_data = f.serialize() c.clear_outbound_data_buffer() events = c.close_connection(additional_data=additional_data) assert not events assert c.data_to_send() == expected_data def test_reset_stream(self, frame_factory) -> None: """ Resetting a stream with no error code emits a RST_STREAM frame with error code 0. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_rst_stream_frame(stream_id=1) expected_data = expected_frame.serialize() events = c.reset_stream(stream_id=1) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize("error_code", h2.errors.ErrorCodes) def test_reset_stream_with_error_code(self, frame_factory, error_code) -> None: """ Resetting a stream with an error code emits a RST_STREAM frame with that error code. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_rst_stream_frame( stream_id=3, error_code=error_code, ) expected_data = expected_frame.serialize() events = c.reset_stream(stream_id=3, error_code=error_code) assert not events assert c.data_to_send() == expected_data def test_cannot_reset_nonexistent_stream(self, frame_factory) -> None: """ Resetting nonexistent streams raises NoSuchStreamError. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.NoSuchStreamError) as e: c.reset_stream(stream_id=1) assert e.value.stream_id == 1 with pytest.raises(h2.exceptions.NoSuchStreamError) as e: c.reset_stream(stream_id=5) assert e.value.stream_id == 5 def test_basic_sending_ping_frame_logic(self, frame_factory) -> None: """ Sending ping frames serializes a ping frame on stream 0 with appropriate opaque data. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() ping_data = b"\x01\x02\x03\x04\x05\x06\x07\x08" expected_frame = frame_factory.build_ping_frame(ping_data) expected_data = expected_frame.serialize() events = c.ping(ping_data) assert not events assert c.data_to_send() == expected_data @pytest.mark.parametrize( "opaque_data", [ b"", b"\x01\x02\x03\x04\x05\x06\x07", "abcdefgh", b"too many bytes", ], ) def test_ping_frame_opaque_data_must_be_length_8_bytestring(self, frame_factory, opaque_data) -> None: """ Sending a ping frame only works with 8-byte bytestrings. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) with pytest.raises(ValueError): c.ping(opaque_data) def test_receiving_ping_acknowledgement(self, frame_factory) -> None: """ Receiving a PING acknowledgement fires a PingAckReceived event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) ping_data = b"\x01\x02\x03\x04\x05\x06\x07\x08" f = frame_factory.build_ping_frame( ping_data, flags=["ACK"], ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PingAckReceived) assert event.ping_data == ping_data def test_stream_ended_remotely(self, frame_factory) -> None: """ When the remote stream ends with a non-empty data frame a DataReceived event and a StreamEnded event are fired. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) f2 = frame_factory.build_data_frame( b"some request data", flags=["END_STREAM"], stream_id=3, ) data = b"".join(f.serialize() for f in [f1, f2]) events = c.receive_data(data) assert len(events) == 3 data_event = events[1] stream_ended_event = events[2] assert isinstance(data_event, h2.events.DataReceived) assert isinstance(stream_ended_event, h2.events.StreamEnded) stream_ended_event.stream_id == 3 def test_can_push_stream(self, frame_factory) -> None: """ Pushing a stream causes a PUSH_PROMISE frame to be emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, flags=["END_HEADERS"], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers, ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_push_streams_when_disabled(self, frame_factory) -> None: """ When the remote peer has disabled stream pushing, we should fail. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame( {h2.settings.SettingCodes.ENABLE_PUSH: 0}, ) c.receive_data(f.serialize()) f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=1, promised_stream_id=2, request_headers=self.example_request_headers, ) def test_settings_remote_change_header_table_size(self, frame_factory) -> None: """ Acknowledging a remote HEADER_TABLE_SIZE settings change causes us to change the header table size of our encoder. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) assert c.encoder.header_table_size == 4096 received_frame = frame_factory.build_settings_frame( {h2.settings.SettingCodes.HEADER_TABLE_SIZE: 80}, ) c.receive_data(received_frame.serialize())[0] assert c.encoder.header_table_size == 80 def test_settings_local_change_header_table_size(self, frame_factory) -> None: """ The remote peer acknowledging a local HEADER_TABLE_SIZE settings change does not cause us to change the header table size of our decoder. For an explanation of why this test is this way around, see issue #37. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) assert c.decoder.header_table_size == 4096 expected_frame = frame_factory.build_settings_frame({}, ack=True) c.update_settings( {h2.settings.SettingCodes.HEADER_TABLE_SIZE: 80}, ) c.receive_data(expected_frame.serialize()) c.clear_outbound_data_buffer() assert c.decoder.header_table_size == 4096 def test_restricting_outbound_frame_size_by_settings(self, frame_factory) -> None: """ The remote peer can shrink the maximum outbound frame size using settings. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.FrameTooLargeError): c.send_data(1, b"\x01" * 17000) received_frame = frame_factory.build_settings_frame( {h2.settings.SettingCodes.MAX_FRAME_SIZE: 17001}, ) c.receive_data(received_frame.serialize()) c.send_data(1, b"\x01" * 17000) assert c.data_to_send() def test_restricting_inbound_frame_size_by_settings(self, frame_factory) -> None: """ We throw ProtocolErrors and tear down connections if oversize frames are received. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) h = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(h.serialize()) c.clear_outbound_data_buffer() data_frame = frame_factory.build_data_frame(b"\x01" * 17000) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.FRAME_SIZE_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_receive_new_streams_over_limit(self, frame_factory) -> None: """ When the number of inbound streams exceeds our MAX_CONCURRENT_STREAMS setting, their attempt to open new streams fails. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.update_settings( {h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 1}, ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.TooManyStreamsError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_receive_trailers(self, frame_factory) -> None: """ When two HEADERS blocks are received in the same stream from a client, the second set are trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send in trailers. trailers = [("content-length", "0")] f = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"], ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert event.headers == trailers assert event.stream_id == 1 def test_reject_trailers_not_ending_stream(self, frame_factory) -> None: """ When trailers are received without the END_STREAM flag being present, this is a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send in trailers. c.clear_outbound_data_buffer() trailers = [("content-length", "0")] f = frame_factory.build_headers_frame( trailers, flags=[], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_can_send_trailers(self, frame_factory) -> None: """ When a second set of headers are sent, they are properly trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send headers. c.clear_outbound_data_buffer() c.send_headers(1, self.example_response_headers) # Now send trailers. trailers = [("content-length", "0")] c.send_headers(1, trailers, end_stream=True) frame_factory.refresh_encoder() f1 = frame_factory.build_headers_frame( self.example_response_headers, ) f2 = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"], ) assert c.data_to_send() == f1.serialize() + f2.serialize() def test_trailers_must_have_end_stream(self, frame_factory) -> None: """ A set of trailers must carry the END_STREAM flag. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Send headers. c.send_headers(1, self.example_response_headers) # Now send trailers. trailers = [("content-length", "0")] with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, trailers) @pytest.mark.parametrize("frame_id", range(12, 256)) def test_unknown_frames_are_ignored(self, frame_factory, frame_id) -> None: c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(data=b"abcdefghtdst") f.type = frame_id events = c.receive_data(f.serialize()) assert not c.data_to_send() assert len(events) == 1 assert isinstance(events[0], h2.events.UnknownFrameReceived) assert isinstance(events[0].frame, hyperframe.frame.ExtensionFrame) def test_can_send_goaway_repeatedly(self, frame_factory) -> None: """ We can send a GOAWAY frame as many times as we like. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() c.close_connection() c.close_connection() c.close_connection() f = frame_factory.build_goaway_frame(last_stream_id=0) assert c.data_to_send() == (f.serialize() * 3) def test_receiving_goaway_frame(self, frame_factory) -> None: """ Receiving a GOAWAY frame causes a ConnectionTerminated event to be fired and transitions the connection to the CLOSED state, and clears the outbound data buffer. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=5, error_code=h2.errors.ErrorCodes.SETTINGS_TIMEOUT, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.error_code == h2.errors.ErrorCodes.SETTINGS_TIMEOUT assert isinstance(event.error_code, h2.errors.ErrorCodes) assert event.last_stream_id == 5 assert event.additional_data is None assert c.state_machine.state == h2.connection.ConnectionState.CLOSED assert not c.data_to_send() def test_receiving_multiple_goaway_frames(self, frame_factory) -> None: """ Multiple GOAWAY frames can be received at once, and are allowed. Each one fires a ConnectionTerminated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_goaway_frame(last_stream_id=0) events = c.receive_data(f.serialize() * 3) assert len(events) == 3 assert all( isinstance(event, h2.events.ConnectionTerminated) for event in events ) def test_receiving_goaway_frame_with_additional_data(self, frame_factory) -> None: """ GOAWAY frame can contain additional data, it should be available via ConnectionTerminated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) additional_data = b"debug data" f = frame_factory.build_goaway_frame(last_stream_id=0, additional_data=additional_data) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.additional_data == additional_data def test_receiving_goaway_frame_with_unknown_error(self, frame_factory) -> None: """ Receiving a GOAWAY frame with an unknown error code behaves exactly the same as receiving one we know about, but the code is reported as an integer instead of as an ErrorCodes. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_goaway_frame( last_stream_id=5, error_code=0xFA, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ConnectionTerminated) assert event.error_code == 250 assert not isinstance(event.error_code, h2.errors.ErrorCodes) assert event.last_stream_id == 5 assert event.additional_data is None assert c.state_machine.state == h2.connection.ConnectionState.CLOSED assert not c.data_to_send() def test_cookies_are_joined(self, frame_factory) -> None: """ RFC 7540 Section 8.1.2.5 requires that we join multiple Cookie headers in a header block together. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ("cookie", "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1; test2=val2"), ] expected = ( "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; " "path=1; test1=val1; test2=val2" ) c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers + cookie_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] cookie_fields = [(n, v) for n, v in e.headers if n == "cookie"] assert len(cookie_fields) == 1 _, v = cookie_fields[0] assert v == expected def test_cookies_arent_joined_without_normalization(self, frame_factory) -> None: """ If inbound header normalization is disabled, cookie headers aren't joined. """ # This is a moderately varied set of cookie headers: some combined, # some split. cookie_headers = [ ("cookie", "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"), ("cookie", "path=1"), ("cookie", "test1=val1; test2=val2"), ] config = h2.config.H2Configuration( client_side=False, normalize_inbound_headers=False, header_encoding="utf-8", ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( self.example_request_headers + cookie_headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 e = events[0] received_cookies = [(n, v) for n, v in e.headers if n == "cookie"] assert len(received_cookies) == 3 assert cookie_headers == received_cookies def test_stream_repr(self) -> None: """ Ensure stream string representation is appropriate. """ s = h2.stream.H2Stream(4, None, 12, 14) assert repr(s) == ">" def sanity_check_data_frame(data_frame, expected_flow_controlled_length, expect_padded_flag, expected_data_frame_pad_length) -> None: """ ``data_frame`` is a frame of type ``hyperframe.frame.DataFrame``, and the ``flags`` and ``flow_controlled_length`` of ``data_frame`` match expectations. """ assert isinstance(data_frame, hyperframe.frame.DataFrame) assert data_frame.flow_controlled_length == expected_flow_controlled_length if expect_padded_flag: assert "PADDED" in data_frame.flags else: assert "PADDED" not in data_frame.flags assert data_frame.pad_length == expected_data_frame_pad_length ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_closed_streams.py0000644000076500000240000004565414744265074017204 0ustar00kriechistaff""" Tests that we handle closed streams correctly. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestClosedStreams: example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) def test_can_receive_multiple_rst_stream_frames(self, frame_factory) -> None: """ Multiple RST_STREAM frames can be received, either at once or well after one another. Only the first fires an event. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) f = frame_factory.build_rst_stream_frame(stream_id=1) events = c.receive_data(f.serialize() * 3) # Force an iteration over all the streams to remove them. c.open_outbound_streams # Receive more data. events += c.receive_data(f.serialize() * 3) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) def test_receiving_low_stream_id_causes_goaway(self, frame_factory) -> None: """ The remote peer creating a stream with a lower ID than one we've seen causes a GOAWAY frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.example_request_headers, stream_id=1, ) with pytest.raises(h2.exceptions.StreamIDTooLowError) as e: c.receive_data(f.serialize()) assert e.value.stream_id == 1 assert e.value.max_stream_id == 3 f = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == f.serialize() def test_closed_stream_not_present_in_streams_dict(self, frame_factory) -> None: """ When streams have been closed, they get removed from the streams dictionary the next time we count the open streams. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) c.push_stream(1, 2, self.example_request_headers) c.reset_stream(1) c.clear_outbound_data_buffer() f = frame_factory.build_rst_stream_frame(stream_id=2) c.receive_data(f.serialize()) # Force a count of the streams. assert not c.open_outbound_streams # The streams dictionary should be empty. assert not c.streams def test_receive_rst_stream_on_closed_stream(self, frame_factory) -> None: """ RST_STREAM frame should be ignored if stream is in a closed state. See RFC 7540 Section 5.1 (closed state) """ c = h2.connection.H2Connection() c.initiate_connection() # Client sends request c.send_headers(1, self.example_request_headers) # Some time passes and client sends DATA frame and closes stream, # so it is in a half-closed state c.send_data(1, b"some data", end_stream=True) # Server received HEADERS frame but DATA frame is still on the way. # Stream is in open state on the server-side. In this state server is # allowed to end stream and reset it - this trick helps immediately # close stream on the server-side. headers_frame = frame_factory.build_headers_frame( [(":status", "200")], flags=["END_STREAM"], stream_id=1, ) events = c.receive_data(headers_frame.serialize()) assert len(events) == 2 response_received, stream_ended = events assert isinstance(response_received, h2.events.ResponseReceived) assert isinstance(stream_ended, h2.events.StreamEnded) rst_stream_frame = frame_factory.build_rst_stream_frame(stream_id=1) events = c.receive_data(rst_stream_frame.serialize()) assert not events def test_receive_window_update_on_closed_stream(self, frame_factory) -> None: """ WINDOW_UPDATE frame should be ignored if stream is in a closed state. See RFC 7540 Section 5.1 (closed state) """ c = h2.connection.H2Connection() c.initiate_connection() # Client sends request c.send_headers(1, self.example_request_headers) # Some time passes and client sends DATA frame and closes stream, # so it is in a half-closed state c.send_data(1, b"some data", end_stream=True) # Server received HEADERS frame but DATA frame is still on the way. # Stream is in open state on the server-side. In this state server is # allowed to end stream and after that acknowledge received data by # sending WINDOW_UPDATE frames. headers_frame = frame_factory.build_headers_frame( [(":status", "200")], flags=["END_STREAM"], stream_id=1, ) events = c.receive_data(headers_frame.serialize()) assert len(events) == 2 response_received, stream_ended = events assert isinstance(response_received, h2.events.ResponseReceived) assert isinstance(stream_ended, h2.events.StreamEnded) window_update_frame = frame_factory.build_window_update_frame( stream_id=1, increment=1, ) events = c.receive_data(window_update_frame.serialize()) assert not events # Getting open_inbound_streams property will trigger stream accounting # which results in removing closed streams. c.open_inbound_streams # Another window_update_frame is received for stream 1 events = c.receive_data(window_update_frame.serialize()) assert not events class TestStreamsClosedByEndStream: example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=["END_STREAM"]), lambda self, ff: ff.build_headers_frame( self.example_request_headers), ], ) @pytest.mark.parametrize("clear_streams", [True, False]) def test_frames_after_recv_end_will_error(self, frame_factory, frame, clear_streams) -> None: """ A stream that is closed by receiving END_STREAM raises ProtocolError when it receives an unexpected frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=True, ) if clear_streams: # Call open_inbound_streams to force the connection to clean # closed streams. c.open_inbound_streams c.clear_outbound_data_buffer() f = frame(self, frame_factory) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_response_headers, flags=["END_STREAM"]), lambda self, ff: ff.build_headers_frame( self.example_response_headers), ], ) @pytest.mark.parametrize("clear_streams", [True, False]) def test_frames_after_send_end_will_error(self, frame_factory, frame, clear_streams) -> None: """ A stream that is closed by sending END_STREAM raises ProtocolError when it receives an unexpected frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) if clear_streams: # Call open_outbound_streams to force the connection to clean # closed streams. c.open_outbound_streams c.clear_outbound_data_buffer() f = frame(self, frame_factory) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_window_update_frame(1, 1), lambda self, ff: ff.build_rst_stream_frame(1), ], ) def test_frames_after_send_end_will_be_ignored(self, frame_factory, frame) -> None: """ A stream that is closed by sending END_STREAM will raise ProtocolError when received unexpected frame. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() f = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=True, ) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) assert not events class TestStreamsClosedByRstStream: example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_request_headers), lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=["END_STREAM"]), ], ) def test_resets_further_frames_after_recv_reset(self, frame_factory, frame) -> None: """ A stream that is closed by receive RST_STREAM can receive further frames: it simply sends RST_STREAM for it, and additionally WINDOW_UPDATE for DATA frames. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False, ) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) c.receive_data(rst_frame.serialize()) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) assert not events assert c.data_to_send() == rst_frame.serialize() events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 def test_resets_further_data_frames_after_recv_reset(self, frame_factory) -> None: """ A stream that is closed by receive RST_STREAM can receive further DATA frames: it simply sends WINDOW_UPDATE for the connection flow window, and RST_STREAM for the stream. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False, ) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) c.receive_data(rst_frame.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( data=b"some data", ) events = c.receive_data(f.serialize()) assert not events expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == expected * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == expected * 3 @pytest.mark.parametrize( "frame", [ lambda self, ff: ff.build_headers_frame( self.example_request_headers), lambda self, ff: ff.build_headers_frame( self.example_request_headers, flags=["END_STREAM"]), ], ) def test_resets_further_frames_after_send_reset(self, frame_factory, frame) -> None: """ A stream that is closed by sent RST_STREAM can receive further frames: it simply sends RST_STREAM for it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False, ) c.reset_stream(1, h2.errors.ErrorCodes.INTERNAL_ERROR) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) c.clear_outbound_data_buffer() f = frame(self, frame_factory) events = c.receive_data(f.serialize()) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) assert not events assert c.data_to_send() == rst_frame.serialize() events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == rst_frame.serialize() * 3 def test_resets_further_data_frames_after_send_reset(self, frame_factory) -> None: """ A stream that is closed by sent RST_STREAM can receive further data frames: it simply sends WINDOW_UPDATE and RST_STREAM for it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.initiate_connection() header_frame = frame_factory.build_headers_frame( self.example_request_headers, flags=["END_STREAM"], ) c.receive_data(header_frame.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, end_stream=False, ) c.reset_stream(1, h2.errors.ErrorCodes.INTERNAL_ERROR) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( data=b"some data", ) events = c.receive_data(f.serialize()) assert not events expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == expected * 3 # Iterate over the streams to make sure it's gone, then confirm the # behaviour is unchanged. c.open_outbound_streams events = c.receive_data(f.serialize() * 3) assert not events assert c.data_to_send() == expected * 3 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_complex_logic.py0000644000076500000240000005174514744265074017017 0ustar00kriechistaff""" More complex tests that try to do more. Certain tests don't really eliminate incorrect behaviour unless they do quite a bit. These tests should live here, to keep the pain in once place rather than hide it in the other parts of the test suite. """ from __future__ import annotations import pytest import h2 import h2.config import h2.connection class TestComplexClient: """ Complex tests for client-side stacks. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] def test_correctly_count_server_streams(self, frame_factory) -> None: """ We correctly count the number of server streams, both inbound and outbound. """ # This test makes no sense unless you do both inbound and outbound, # because it's important to confirm that we count them correctly. c = h2.connection.H2Connection() c.initiate_connection() expected_inbound_streams = expected_outbound_streams = 0 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(1, 15, 2): # Open an outbound stream c.send_headers(stream_id, self.example_request_headers) expected_outbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Receive a pushed stream (to create an inbound one). This doesn't # open until we also receive headers. f = frame_factory.build_push_promise_frame( stream_id=stream_id, promised_stream_id=stream_id+1, headers=self.example_request_headers, ) c.receive_data(f.serialize()) assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams f = frame_factory.build_headers_frame( stream_id=stream_id+1, headers=self.example_response_headers, ) c.receive_data(f.serialize()) expected_inbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(13, 0, -2): # Close an outbound stream. c.end_stream(stream_id) # Stream doesn't close until both sides close it. assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams f = frame_factory.build_headers_frame( stream_id=stream_id, headers=self.example_response_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) expected_outbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Pushed streams can only be closed remotely. f = frame_factory.build_data_frame( stream_id=stream_id+1, data=b"the content", flags=["END_STREAM"], ) c.receive_data(f.serialize()) expected_inbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams assert c.open_inbound_streams == 0 assert c.open_outbound_streams == 0 class TestComplexServer: """ Complex tests for server-side stacks. """ example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) def test_correctly_count_server_streams(self, frame_factory) -> None: """ We correctly count the number of server streams, both inbound and outbound. """ # This test makes no sense unless you do both inbound and outbound, # because it's important to confirm that we count them correctly. c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) expected_inbound_streams = expected_outbound_streams = 0 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(1, 15, 2): # Receive an inbound stream. f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id, ) c.receive_data(f.serialize()) expected_inbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Push a stream (to create a outbound one). This doesn't open # until we send our response headers. c.push_stream(stream_id, stream_id+1, self.example_request_headers) assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams c.send_headers(stream_id+1, self.example_response_headers) expected_outbound_streams += 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams for stream_id in range(13, 0, -2): # Close an inbound stream. f = frame_factory.build_data_frame( data=b"", flags=["END_STREAM"], stream_id=stream_id, ) c.receive_data(f.serialize()) # Stream doesn't close until both sides close it. assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams c.send_data(stream_id, b"", end_stream=True) expected_inbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams # Pushed streams, however, we can close ourselves. c.send_data( stream_id=stream_id+1, data=b"", end_stream=True, ) expected_outbound_streams -= 1 assert c.open_inbound_streams == expected_inbound_streams assert c.open_outbound_streams == expected_outbound_streams assert c.open_inbound_streams == 0 assert c.open_outbound_streams == 0 class TestContinuationFrames: """ Tests for the relatively complex CONTINUATION frame logic. """ example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] server_config = h2.config.H2Configuration(client_side=False) def _build_continuation_sequence(self, headers, block_size, frame_factory): f = frame_factory.build_headers_frame(headers) header_data = f.data chunks = [ header_data[x:x+block_size] for x in range(0, len(header_data), block_size) ] f.data = chunks.pop(0) frames = [ frame_factory.build_continuation_frame(c) for c in chunks ] f.flags = {"END_STREAM"} frames[-1].flags.add("END_HEADERS") frames.insert(0, f) return frames def test_continuation_frame_basic(self, frame_factory) -> None: """ Test that we correctly decode a header block split across continuation frames. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) data = b"".join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 2 first_event, second_event = events assert isinstance(first_event, h2.events.RequestReceived) assert first_event.headers == self.example_request_headers assert first_event.stream_id == 1 assert isinstance(second_event, h2.events.StreamEnded) assert second_event.stream_id == 1 @pytest.mark.parametrize("stream_id", [3, 1]) def test_continuation_cannot_interleave_headers(self, frame_factory, stream_id) -> None: """ We cannot interleave a new headers block with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id, flags=["END_STREAM"], ) frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_data(self, frame_factory) -> None: """ We cannot interleave a data frame with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b"hello", stream_id=1, ) frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_unknown_frame(self, frame_factory) -> None: """ We cannot interleave an unknown frame with a CONTINUATION sequence. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b"hello", stream_id=1, ) bogus_frame.type = 88 frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_frame_multiple_blocks(self, frame_factory) -> None: """ Test that we correctly decode several header blocks split across continuation frames. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) for stream_id in range(1, 7, 2): frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=2, frame_factory=frame_factory, ) for frame in frames: frame.stream_id = stream_id data = b"".join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 2 first_event, second_event = events assert isinstance(first_event, h2.events.RequestReceived) assert first_event.headers == self.example_request_headers assert first_event.stream_id == stream_id assert isinstance(second_event, h2.events.StreamEnded) assert second_event.stream_id == stream_id class TestContinuationFramesPushPromise: """ Tests for the relatively complex CONTINUATION frame logic working with PUSH_PROMISE frames. """ example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] def _build_continuation_sequence(self, headers, block_size, frame_factory): f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) header_data = f.data chunks = [ header_data[x:x+block_size] for x in range(0, len(header_data), block_size) ] f.data = chunks.pop(0) frames = [ frame_factory.build_continuation_frame(c) for c in chunks ] f.flags = {"END_STREAM"} frames[-1].flags.add("END_HEADERS") frames.insert(0, f) return frames def test_continuation_frame_basic_push_promise(self, frame_factory) -> None: """ Test that we correctly decode a header block split across continuation frames when that header block is initiated with a PUSH_PROMISE. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) data = b"".join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert event.headers == self.example_request_headers assert event.parent_stream_id == 1 assert event.pushed_stream_id == 2 @pytest.mark.parametrize("stream_id", [3, 1, 2]) def test_continuation_cannot_interleave_headers_pp(self, frame_factory, stream_id) -> None: """ We cannot interleave a new headers block with a CONTINUATION sequence when the headers block is based on a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=stream_id, flags=["END_STREAM"], ) frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_data(self, frame_factory) -> None: """ We cannot interleave a data frame with a CONTINUATION sequence when that sequence began with a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b"hello", stream_id=1, ) frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() def test_continuation_cannot_interleave_unknown_frame(self, frame_factory) -> None: """ We cannot interleave an unknown frame with a CONTINUATION sequence when that sequence began with a PUSH_PROMISE frame. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=5, frame_factory=frame_factory, ) assert len(frames) > 2 # This is mostly defensive. bogus_frame = frame_factory.build_data_frame( data=b"hello", stream_id=1, ) bogus_frame.type = 88 frames.insert(len(frames) - 2, bogus_frame) data = b"".join(f.serialize() for f in frames) with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(data) assert "invalid frame" in str(e.value).lower() @pytest.mark.parametrize("evict", [True, False]) def test_stream_remotely_closed_disallows_push_promise(self, evict, frame_factory) -> None: """ Streams closed normally by the remote peer disallow PUSH_PROMISE frames, and cause a GOAWAY. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=True, ) f = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() if evict: # This is annoyingly stateful, but enumerating the list of open # streams will force us to flush state. assert not c.open_outbound_streams f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) f = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == f.serialize() def test_continuation_frame_multiple_push_promise(self, frame_factory) -> None: """ Test that we correctly decode header blocks split across continuation frames when those header block is initiated with a PUSH_PROMISE, for more than one pushed stream. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) for promised_stream_id in range(2, 8, 2): frames = self._build_continuation_sequence( headers=self.example_request_headers, block_size=2, frame_factory=frame_factory, ) frames[0].promised_stream_id = promised_stream_id data = b"".join(f.serialize() for f in frames) events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert event.headers == self.example_request_headers assert event.parent_stream_id == 1 assert event.pushed_stream_id == promised_stream_id ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_config.py0000644000076500000240000001236014744265074015426 0ustar00kriechistaff""" Test the configuration object. """ from __future__ import annotations import logging import pytest import h2.config class TestH2Config: """ Tests of the H2 config object. """ def test_defaults(self) -> None: """ The default values of the HTTP/2 config object are sensible. """ config = h2.config.H2Configuration() assert config.client_side assert config.header_encoding is None assert isinstance(config.logger, h2.config.DummyLogger) boolean_config_options = [ "client_side", "validate_outbound_headers", "normalize_outbound_headers", "validate_inbound_headers", "normalize_inbound_headers", ] @pytest.mark.parametrize("option_name", boolean_config_options) @pytest.mark.parametrize("value", [None, "False", 1]) def test_boolean_config_options_reject_non_bools_init( self, option_name, value, ) -> None: """ The boolean config options raise an error if you try to set a value that isn't a boolean via the initializer. """ with pytest.raises(ValueError): h2.config.H2Configuration(**{option_name: value}) @pytest.mark.parametrize("option_name", boolean_config_options) @pytest.mark.parametrize("value", [None, "False", 1]) def test_boolean_config_options_reject_non_bools_attr( self, option_name, value, ) -> None: """ The boolean config options raise an error if you try to set a value that isn't a boolean via attribute setter. """ config = h2.config.H2Configuration() with pytest.raises(ValueError): setattr(config, option_name, value) @pytest.mark.parametrize("option_name", boolean_config_options) @pytest.mark.parametrize("value", [True, False]) def test_boolean_config_option_is_reflected_init(self, option_name, value) -> None: """ The value of the boolean config options, when set, is reflected in the value via the initializer. """ config = h2.config.H2Configuration(**{option_name: value}) assert getattr(config, option_name) == value @pytest.mark.parametrize("option_name", boolean_config_options) @pytest.mark.parametrize("value", [True, False]) def test_boolean_config_option_is_reflected_attr(self, option_name, value) -> None: """ The value of the boolean config options, when set, is reflected in the value via attribute setter. """ config = h2.config.H2Configuration() setattr(config, option_name, value) assert getattr(config, option_name) == value @pytest.mark.parametrize("header_encoding", [True, 1, object()]) def test_header_encoding_must_be_false_str_none_init( self, header_encoding, ) -> None: """ The value of the ``header_encoding`` setting must be False, a string, or None via the initializer. """ with pytest.raises(ValueError): h2.config.H2Configuration(header_encoding=header_encoding) @pytest.mark.parametrize("header_encoding", [True, 1, object()]) def test_header_encoding_must_be_false_str_none_attr( self, header_encoding, ) -> None: """ The value of the ``header_encoding`` setting must be False, a string, or None via attribute setter. """ config = h2.config.H2Configuration() with pytest.raises(ValueError): config.header_encoding = header_encoding @pytest.mark.parametrize("header_encoding", [False, "ascii", None]) def test_header_encoding_is_reflected_init(self, header_encoding) -> None: """ The value of ``header_encoding``, when set, is reflected in the value via the initializer. """ config = h2.config.H2Configuration(header_encoding=header_encoding) assert config.header_encoding == header_encoding @pytest.mark.parametrize("header_encoding", [False, "ascii", None]) def test_header_encoding_is_reflected_attr(self, header_encoding) -> None: """ The value of ``header_encoding``, when set, is reflected in the value via the attribute setter. """ config = h2.config.H2Configuration() config.header_encoding = header_encoding assert config.header_encoding == header_encoding def test_logger_instance_is_reflected(self) -> None: """ The value of ``logger``, when set, is reflected in the value. """ logger = logging.getLogger("hyper-h2.test") config = h2.config.H2Configuration() config.logger = logger assert config.logger is logger @pytest.mark.parametrize("trace_level", [False, True]) def test_output_logger(self, capsys, trace_level) -> None: logger = h2.config.OutputLogger(trace_level=trace_level) logger.debug("This is a debug message %d.", 123) logger.trace("This is a trace message %d.", 123) captured = capsys.readouterr() assert "h2 (debug): This is a debug message 123.\n" in captured.err if trace_level: assert "h2 (trace): This is a trace message 123.\n" in captured.err else: assert "h2 (trace): This is a trace message 123.\n" not in captured.err ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_events.py0000644000076500000240000003115614744265074015471 0ustar00kriechistaff""" Specific tests for any function that is logically self-contained as part of events.py. """ from __future__ import annotations import inspect import sys import pytest from hypothesis import given from hypothesis.strategies import integers, lists, tuples import h2.errors import h2.events import h2.settings # We define a fairly complex Hypothesis strategy here. We want to build a list # of two tuples of (Setting, value). For Setting we want to make sure we can # handle settings that the rest of hyper knows nothing about, so we want to # use integers from 0 to (2**16-1). For values, they're from 0 to (2**32-1). # Define that strategy here for clarity. SETTINGS_STRATEGY = lists( tuples( integers(min_value=0, max_value=2**16-1), integers(min_value=0, max_value=2**32-1), ), ) class TestRemoteSettingsChanged: """ Validate the function of the RemoteSettingsChanged event. """ @given(SETTINGS_STRATEGY) def test_building_settings_from_scratch(self, settings_list) -> None: """ Missing old settings are defaulted to None. """ settings_dict = dict(settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings={}, new_settings=settings_dict, ) for setting, new_value in settings_dict.items(): assert e.changed_settings[setting].setting == setting assert e.changed_settings[setting].original_value is None assert e.changed_settings[setting].new_value == new_value @given(SETTINGS_STRATEGY, SETTINGS_STRATEGY) def test_only_reports_changed_settings(self, old_settings_list, new_settings_list) -> None: """ Settings that were not changed are not reported. """ old_settings_dict = dict(old_settings_list) new_settings_dict = dict(new_settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings=old_settings_dict, new_settings=new_settings_dict, ) assert len(e.changed_settings) == len(new_settings_dict) assert ( sorted(e.changed_settings.keys()) == sorted(new_settings_dict.keys()) ) @given(SETTINGS_STRATEGY, SETTINGS_STRATEGY) def test_correctly_reports_changed_settings(self, old_settings_list, new_settings_list) -> None: """ Settings that are changed are correctly reported. """ old_settings_dict = dict(old_settings_list) new_settings_dict = dict(new_settings_list) e = h2.events.RemoteSettingsChanged.from_settings( old_settings=old_settings_dict, new_settings=new_settings_dict, ) for setting, new_value in new_settings_dict.items(): original_value = old_settings_dict.get(setting) assert e.changed_settings[setting].setting == setting assert e.changed_settings[setting].original_value == original_value assert e.changed_settings[setting].new_value == new_value class TestEventReprs: """ Events have useful representations. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_informational_headers = [ (":status", "100"), ("server", "fake-serv/0.1.0"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] def test_requestreceived_repr(self) -> None: """ RequestReceived has a useful debug representation. """ e = h2.events.RequestReceived() e.stream_id = 5 e.headers = self.example_request_headers assert repr(e) == ( "" ) def test_responsereceived_repr(self) -> None: """ ResponseReceived has a useful debug representation. """ e = h2.events.ResponseReceived() e.stream_id = 500 e.headers = self.example_response_headers assert repr(e) == ( "" ) def test_trailersreceived_repr(self) -> None: """ TrailersReceived has a useful debug representation. """ e = h2.events.TrailersReceived() e.stream_id = 62 e.headers = self.example_response_headers assert repr(e) == ( "" ) def test_informationalresponsereceived_repr(self) -> None: """ InformationalResponseReceived has a useful debug representation. """ e = h2.events.InformationalResponseReceived() e.stream_id = 62 e.headers = self.example_informational_headers assert repr(e) == ( "" ) def test_datareceived_repr(self) -> None: """ DataReceived has a useful debug representation. """ e = h2.events.DataReceived() e.stream_id = 888 e.data = b"abcdefghijklmnopqrstuvwxyz" e.flow_controlled_length = 88 assert repr(e) == ( "" ) def test_windowupdated_repr(self) -> None: """ WindowUpdated has a useful debug representation. """ e = h2.events.WindowUpdated() e.stream_id = 0 e.delta = 2**16 assert repr(e) == "" def test_remotesettingschanged_repr(self) -> None: """ RemoteSettingsChanged has a useful debug representation. """ e = h2.events.RemoteSettingsChanged() e.changed_settings = { h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: h2.settings.ChangedSetting( h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15, ), } if sys.version_info >= (3, 11): assert repr(e) == ( "" ) else: assert repr(e) == ( "" ) def test_pingreceived_repr(self) -> None: """ PingReceived has a useful debug representation. """ e = h2.events.PingReceived() e.ping_data = b"abcdefgh" assert repr(e) == "" def test_pingackreceived_repr(self) -> None: """ PingAckReceived has a useful debug representation. """ e = h2.events.PingAckReceived() e.ping_data = b"abcdefgh" assert repr(e) == "" def test_streamended_repr(self) -> None: """ StreamEnded has a useful debug representation. """ e = h2.events.StreamEnded() e.stream_id = 99 assert repr(e) == "" def test_streamreset_repr(self) -> None: """ StreamEnded has a useful debug representation. """ e = h2.events.StreamReset() e.stream_id = 919 e.error_code = h2.errors.ErrorCodes.ENHANCE_YOUR_CALM e.remote_reset = False if sys.version_info >= (3, 11): assert repr(e) == ( "" ) else: assert repr(e) == ( "" ) def test_pushedstreamreceived_repr(self) -> None: """ PushedStreamReceived has a useful debug representation. """ e = h2.events.PushedStreamReceived() e.pushed_stream_id = 50 e.parent_stream_id = 11 e.headers = self.example_request_headers assert repr(e) == ( "" ) def test_settingsacknowledged_repr(self) -> None: """ SettingsAcknowledged has a useful debug representation. """ e = h2.events.SettingsAcknowledged() e.changed_settings = { h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: h2.settings.ChangedSetting( h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**16, 2**15, ), } if sys.version_info >= (3, 11): assert repr(e) == ( "" ) else: assert repr(e) == ( "" ) def test_priorityupdated_repr(self) -> None: """ PriorityUpdated has a useful debug representation. """ e = h2.events.PriorityUpdated() e.stream_id = 87 e.weight = 32 e.depends_on = 8 e.exclusive = True assert repr(e) == ( "" ) @pytest.mark.parametrize(("additional_data", "data_repr"), [ (None, "None"), (b"some data", "736f6d652064617461"), ]) def test_connectionterminated_repr(self, additional_data, data_repr) -> None: """ ConnectionTerminated has a useful debug representation. """ e = h2.events.ConnectionTerminated() e.error_code = h2.errors.ErrorCodes.INADEQUATE_SECURITY e.last_stream_id = 33 e.additional_data = additional_data if sys.version_info >= (3, 11): assert repr(e) == ( "" ) else: assert repr(e) == ( "" ) def test_alternativeserviceavailable_repr(self) -> None: """ AlternativeServiceAvailable has a useful debug representation. """ e = h2.events.AlternativeServiceAvailable() e.origin = b"example.com" e.field_value = b'h2=":8000"; ma=60' assert repr(e) == ( '' ) def test_unknownframereceived_repr(self) -> None: """ UnknownFrameReceived has a useful debug representation. """ e = h2.events.UnknownFrameReceived() assert repr(e) == "" def all_events(): """ Generates all the classes (i.e., events) defined in h2.events. """ for _, obj in inspect.getmembers(sys.modules["h2.events"]): # We are only interested in objects that are defined in h2.events; # objects that are imported from other modules are not of interest. if hasattr(obj, "__module__") and (obj.__module__ != "h2.events"): continue if inspect.isclass(obj): yield obj @pytest.mark.parametrize("event", all_events()) def test_all_events_subclass_from_event(event) -> None: """ Every event defined in h2.events subclasses from h2.events.Event. """ assert (event is h2.events.Event) or issubclass(event, h2.events.Event) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_exceptions.py0000644000076500000240000000047514744265074016346 0ustar00kriechistaff""" Tests that verify logic local to exceptions. """ from __future__ import annotations import h2.exceptions class TestExceptions: def test_stream_id_too_low_prints_properly(self) -> None: x = h2.exceptions.StreamIDTooLowError(5, 10) assert str(x) == "StreamIDTooLowError: 5 is lower than 10" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_flow_control_window.py0000644000076500000240000010623714744265074020266 0ustar00kriechistaff""" test_flow_control ~~~~~~~~~~~~~~~~~ Tests of the flow control management in h2 """ from __future__ import annotations import pytest from hypothesis import HealthCheck, given, settings from hypothesis.strategies import integers import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.settings class TestFlowControl: """ Tests of the flow control management in the connection objects. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] server_config = h2.config.H2Configuration(client_side=False) DEFAULT_FLOW_WINDOW = 65535 def test_flow_control_initializes_properly(self) -> None: """ The flow control window for a stream should initially be the default flow control value. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == self.DEFAULT_FLOW_WINDOW assert c.remote_flow_control_window(1) == self.DEFAULT_FLOW_WINDOW def test_flow_control_decreases_with_sent_data(self) -> None: """ When data is sent on a stream, the flow control window should drop. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b"some data") remaining_length = self.DEFAULT_FLOW_WINDOW - len(b"some data") assert (c.local_flow_control_window(1) == remaining_length) @pytest.mark.parametrize("pad_length", [5, 0]) def test_flow_control_decreases_with_sent_data_with_padding(self, pad_length) -> None: """ When padded data is sent on a stream, the flow control window drops by the length of the padding plus 1 for the 1-byte padding length field. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b"some data", pad_length=pad_length) remaining_length = ( self.DEFAULT_FLOW_WINDOW - len(b"some data") - pad_length - 1 ) assert c.local_flow_control_window(1) == remaining_length def test_flow_control_decreases_with_received_data(self, frame_factory) -> None: """ When data is received on a stream, the remote flow control window should drop. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b"some data") c.receive_data(f1.serialize() + f2.serialize()) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b"some data") assert (c.remote_flow_control_window(1) == remaining_length) def test_flow_control_decreases_with_padded_data(self, frame_factory) -> None: """ When padded data is received on a stream, the remote flow control window drops by an amount that includes the padding. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b"some data", padding_len=10) c.receive_data(f1.serialize() + f2.serialize()) remaining_length = ( self.DEFAULT_FLOW_WINDOW - len(b"some data") - 10 - 1 ) assert (c.remote_flow_control_window(1) == remaining_length) def test_flow_control_is_limited_by_connection(self) -> None: """ The flow control window is limited by the flow control of the connection. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.send_data(1, b"some data") c.send_headers(3, self.example_request_headers) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b"some data") assert (c.local_flow_control_window(3) == remaining_length) def test_remote_flow_control_is_limited_by_connection(self, frame_factory) -> None: """ The remote flow control window is limited by the flow control of the connection. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_data_frame(b"some data") f3 = frame_factory.build_headers_frame( self.example_request_headers, stream_id=3, ) c.receive_data(f1.serialize() + f2.serialize() + f3.serialize()) remaining_length = self.DEFAULT_FLOW_WINDOW - len(b"some data") assert (c.remote_flow_control_window(3) == remaining_length) def test_cannot_send_more_data_than_window(self) -> None: """ Sending more data than the remaining flow control window raises a FlowControlError. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b"some data") def test_increasing_connection_window_allows_sending(self, frame_factory) -> None: """ Confirm that sending a WindowUpdate frame on the connection frees up space for further frames. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c.outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b"some data") f = frame_factory.build_window_update_frame( stream_id=0, increment=5, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.send_data(1, b"some data") assert c.data_to_send() def test_increasing_stream_window_allows_sending(self, frame_factory) -> None: """ Confirm that sending a WindowUpdate frame on the connection frees up space for further frames. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) c._get_stream_by_id(1).outbound_flow_control_window = 5 with pytest.raises(h2.exceptions.FlowControlError): c.send_data(1, b"some data") f = frame_factory.build_window_update_frame( stream_id=1, increment=5, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.send_data(1, b"some data") assert c.data_to_send() def test_flow_control_shrinks_in_response_to_settings(self, frame_factory) -> None: """ Acknowledging SETTINGS_INITIAL_WINDOW_SIZE shrinks the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 1280}, ) c.receive_data(f.serialize()) assert c.local_flow_control_window(1) == 1280 def test_flow_control_grows_in_response_to_settings(self, frame_factory) -> None: """ Acknowledging SETTINGS_INITIAL_WINDOW_SIZE grows the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) # Greatly increase the connection flow control window. f = frame_factory.build_window_update_frame( stream_id=0, increment=128000, ) c.receive_data(f.serialize()) # The stream flow control window is the bottleneck here. assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000}, ) c.receive_data(f.serialize()) # The stream window is still the bottleneck, but larger now. assert c.local_flow_control_window(1) == 128000 def test_flow_control_settings_blocked_by_conn_window(self, frame_factory) -> None: """ Changing SETTINGS_INITIAL_WINDOW_SIZE does not affect the effective flow control window if the connection window isn't changed. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 65535 f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000}, ) c.receive_data(f.serialize()) assert c.local_flow_control_window(1) == 65535 def test_new_streams_have_flow_control_per_settings(self, frame_factory) -> None: """ After a SETTINGS_INITIAL_WINDOW_SIZE change is received, new streams have appropriate new flow control windows. """ c = h2.connection.H2Connection() f = frame_factory.build_settings_frame( settings={h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000}, ) c.receive_data(f.serialize()) # Greatly increase the connection flow control window. f = frame_factory.build_window_update_frame( stream_id=0, increment=128000, ) c.receive_data(f.serialize()) c.send_headers(1, self.example_request_headers) assert c.local_flow_control_window(1) == 128000 def test_window_update_no_stream(self, frame_factory) -> None: """ WindowUpdate frames received without streams fire an appropriate WindowUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_window_update_frame( stream_id=0, increment=5, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.WindowUpdated) assert event.stream_id == 0 assert event.delta == 5 def test_window_update_with_stream(self, frame_factory) -> None: """ WindowUpdate frames received with streams fire an appropriate WindowUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f1 = frame_factory.build_headers_frame(self.example_request_headers) f2 = frame_factory.build_window_update_frame( stream_id=1, increment=66, ) data = b"".join(f.serialize() for f in [f1, f2]) events = c.receive_data(data) assert len(events) == 2 event = events[1] assert isinstance(event, h2.events.WindowUpdated) assert event.stream_id == 1 assert event.delta == 66 def test_we_can_increment_stream_flow_control(self, frame_factory) -> None: """ It is possible for the user to increase the flow control window for streams. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_window_update_frame( stream_id=1, increment=5, ) events = c.increment_flow_control_window(increment=5, stream_id=1) assert not events assert c.data_to_send() == expected_frame.serialize() def test_we_can_increment_connection_flow_control(self, frame_factory) -> None: """ It is possible for the user to increase the flow control window for the entire connection. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() expected_frame = frame_factory.build_window_update_frame( stream_id=0, increment=5, ) events = c.increment_flow_control_window(increment=5) assert not events assert c.data_to_send() == expected_frame.serialize() def test_we_enforce_our_flow_control_window(self, frame_factory) -> None: """ The user can set a low flow control window, which leads to connection teardown if violated. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # Change the flow control window to 80 bytes. c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 80}, ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) # Receive a new stream. f = frame_factory.build_headers_frame(self.example_request_headers) c.receive_data(f.serialize()) # Attempt to violate the flow control window. c.clear_outbound_data_buffer() f = frame_factory.build_data_frame(b"\x01" * 100) with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) # Verify we tear down appropriately. expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_shrink_remote_flow_control_settings(self, frame_factory) -> None: """ The remote peer acknowledging our SETTINGS_INITIAL_WINDOW_SIZE shrinks the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) assert c.remote_flow_control_window(1) == 65535 c.update_settings({h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 1280}) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) assert c.remote_flow_control_window(1) == 1280 def test_grow_remote_flow_control_settings(self, frame_factory) -> None: """ The remote peer acknowledging our SETTINGS_INITIAL_WINDOW_SIZE grows the flow control window. """ c = h2.connection.H2Connection() c.send_headers(1, self.example_request_headers) # Increase the connection flow control window greatly. c.increment_flow_control_window(increment=128000) assert c.remote_flow_control_window(1) == 65535 c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000}, ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) assert c.remote_flow_control_window(1) == 128000 def test_new_streams_have_remote_flow_control(self, frame_factory) -> None: """ After a SETTINGS_INITIAL_WINDOW_SIZE change is acknowledged by the remote peer, new streams have appropriate new flow control windows. """ c = h2.connection.H2Connection() c.update_settings( {h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 128000}, ) f = frame_factory.build_settings_frame({}, ack=True) c.receive_data(f.serialize()) # Increase the connection flow control window greatly. c.increment_flow_control_window(increment=128000) c.send_headers(1, self.example_request_headers) assert c.remote_flow_control_window(1) == 128000 @pytest.mark.parametrize( "increment", [0, -15, 2**31], ) def test_reject_bad_attempts_to_increment_flow_control(self, increment) -> None: """ Attempting to increment a flow control increment outside the valid range causes a ValueError to be raised. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() # Fails both on and off streams. with pytest.raises(ValueError): c.increment_flow_control_window(increment=increment, stream_id=1) with pytest.raises(ValueError): c.increment_flow_control_window(increment=increment) @pytest.mark.parametrize("stream_id", [0, 1]) def test_reject_bad_remote_increments(self, frame_factory, stream_id) -> None: """ Remote peers attempting to increment flow control outside the valid range cause connection errors of type PROTOCOL_ERROR. """ # The only number that can be encoded in a WINDOW_UPDATE frame but # isn't valid is 0. c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers, end_stream=True) c.clear_outbound_data_buffer() f = frame_factory.build_window_update_frame( stream_id=stream_id, increment=0, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_increasing_connection_window_too_far(self, frame_factory) -> None: """ Attempts by the remote peer to increase the connection flow control window beyond 2**31 - 1 are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() increment = 2**31 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=0, increment=increment, ) with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_increasing_stream_window_too_far(self, frame_factory) -> None: """ Attempts by the remote peer to increase the stream flow control window beyond 2**31 - 1 are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) c.clear_outbound_data_buffer() increment = 2**31 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=1, increment=increment, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR assert not event.remote_reset expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_overlarge_conn_window_settings(self, frame_factory) -> None: """ SETTINGS frames cannot change the size of the connection flow control window. """ c = h2.connection.H2Connection() c.initiate_connection() # Go one byte smaller than the limit. increment = 2**31 - 1 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=0, increment=increment, ) c.receive_data(f.serialize()) # Receive an increment to the initial window size. f = frame_factory.build_settings_frame( settings={ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: self.DEFAULT_FLOW_WINDOW + 1, }, ) c.clear_outbound_data_buffer() # No error is encountered. events = c.receive_data(f.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.RemoteSettingsChanged) expected_frame = frame_factory.build_settings_frame( settings={}, ack=True, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_overlarge_stream_window_settings(self, frame_factory) -> None: """ Remote attempts to create overlarge stream windows via SETTINGS frames are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) # Go one byte smaller than the limit. increment = 2**31 - 1 - c.outbound_flow_control_window f = frame_factory.build_window_update_frame( stream_id=1, increment=increment, ) c.receive_data(f.serialize()) # Receive an increment to the initial window size. f = frame_factory.build_settings_frame( settings={ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: self.DEFAULT_FLOW_WINDOW + 1, }, ) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.FlowControlError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FLOW_CONTROL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_local_overlarge_increase_connection_window(self) -> None: """ Local attempts to increase the connection window too far are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() increment = 2**31 - c.inbound_flow_control_window with pytest.raises(h2.exceptions.FlowControlError): c.increment_flow_control_window(increment=increment) def test_reject_local_overlarge_increase_stream_window(self) -> None: """ Local attempts to increase the connection window too far are rejected. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) increment = 2**31 - c.inbound_flow_control_window with pytest.raises(h2.exceptions.FlowControlError): c.increment_flow_control_window(increment=increment, stream_id=1) def test_send_update_on_closed_streams(self, frame_factory) -> None: c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, self.example_request_headers) c.reset_stream(1) c.clear_outbound_data_buffer() c.open_outbound_streams c.open_inbound_streams f = frame_factory.build_data_frame(b"some data"*1500) events = c.receive_data(f.serialize()*3) assert not events expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() * 2 + frame_factory.build_window_update_frame( stream_id=0, increment=40500, ).serialize() + frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected f = frame_factory.build_data_frame(b"") events = c.receive_data(f.serialize()) assert not events expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected class TestAutomaticFlowControl: """ Tests for the automatic flow control logic. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] server_config = h2.config.H2Configuration(client_side=False) DEFAULT_FLOW_WINDOW = 65535 def _setup_connection_and_send_headers(self, frame_factory): """ Setup a server-side H2Connection and send a headers frame, and then clear the outbound data buffer. Also increase the maximum frame size. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.update_settings( {h2.settings.SettingCodes.MAX_FRAME_SIZE: self.DEFAULT_FLOW_WINDOW}, ) settings_frame = frame_factory.build_settings_frame( settings={}, ack=True, ) c.receive_data(settings_frame.serialize()) c.clear_outbound_data_buffer() headers_frame = frame_factory.build_headers_frame( headers=self.example_request_headers, ) c.receive_data(headers_frame.serialize()) c.clear_outbound_data_buffer() return c @given(stream_id=integers(max_value=0)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_must_acknowledge_for_stream(self, frame_factory, stream_id) -> None: """ Flow control acknowledgements must be done on a stream ID that is greater than zero. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Create a connection in a state that might actually accept # data acknolwedgement. c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b"some data", flags=["END_STREAM"], ) c.receive_data(data_frame.serialize()) with pytest.raises(ValueError): c.acknowledge_received_data( acknowledged_size=5, stream_id=stream_id, ) @given(size=integers(max_value=-1)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_cannot_acknowledge_less_than_zero(self, frame_factory, size) -> None: """ The user must acknowledge at least 0 bytes. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Create a connection in a state that might actually accept # data acknolwedgement. c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b"some data", flags=["END_STREAM"], ) c.receive_data(data_frame.serialize()) with pytest.raises(ValueError): c.acknowledge_received_data(acknowledged_size=size, stream_id=1) def test_acknowledging_small_chunks_does_nothing(self, frame_factory) -> None: """ When a small amount of data is received and acknowledged, no window update is emitted. """ c = self._setup_connection_and_send_headers(frame_factory) data_frame = frame_factory.build_data_frame( b"some data", flags=["END_STREAM"], ) data_event = c.receive_data(data_frame.serialize())[0] c.acknowledge_received_data( data_event.flow_controlled_length, stream_id=1, ) assert not c.data_to_send() def test_acknowledging_no_data_does_nothing(self, frame_factory) -> None: """ If a user accidentally acknowledges no data, nothing happens. """ c = self._setup_connection_and_send_headers(frame_factory) # Send an empty data frame, just to give the user impetus to ack the # data. data_frame = frame_factory.build_data_frame(b"") c.receive_data(data_frame.serialize()) c.acknowledge_received_data(0, stream_id=1) assert not c.data_to_send() @pytest.mark.parametrize("force_cleanup", [True, False]) def test_acknowledging_data_on_closed_stream(self, frame_factory, force_cleanup) -> None: """ When acknowledging data on a stream that has just been closed, no acknowledgement is given for that stream, only for the connection. """ c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b"\x00" * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) rst_frame = frame_factory.build_rst_stream_frame( stream_id=1, ) c.receive_data(rst_frame.serialize()) c.clear_outbound_data_buffer() if force_cleanup: # Check how many streams are open to force the old one to be # cleaned up. assert c.open_outbound_streams == 0 c.acknowledge_received_data(2048, stream_id=1) expected = frame_factory.build_window_update_frame( stream_id=0, increment=2048, ) assert c.data_to_send() == expected.serialize() def test_acknowledging_streams_we_never_saw(self, frame_factory) -> None: """ If the user acknowledges a stream ID we've never seen, that raises a NoSuchStreamError. """ c = self._setup_connection_and_send_headers(frame_factory) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.NoSuchStreamError): c.acknowledge_received_data(2048, stream_id=101) @given(integers(min_value=1025, max_value=DEFAULT_FLOW_WINDOW)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_acknowledging_1024_bytes_when_empty_increments(self, frame_factory, increment) -> None: """ If the flow control window is empty and we acknowledge 1024 bytes or more, we will emit a WINDOW_UPDATE frame just to move the connection forward. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b"\x00" * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) c.acknowledge_received_data(increment, stream_id=1) first_expected = frame_factory.build_window_update_frame( stream_id=0, increment=increment, ) second_expected = frame_factory.build_window_update_frame( stream_id=1, increment=increment, ) expected_data = b"".join( [first_expected.serialize(), second_expected.serialize()], ) assert c.data_to_send() == expected_data # This test needs to use a lower cap, because otherwise the algo will # increment the stream window anyway. @given(integers(min_value=1025, max_value=(DEFAULT_FLOW_WINDOW // 4) - 1)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_connection_only_empty(self, frame_factory, increment) -> None: """ If the connection flow control window is empty, but the stream flow control windows aren't, and 1024 bytes or more are acknowledged by the user, we increment the connection window only. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Here we'll use 4 streams. Set them up. c = self._setup_connection_and_send_headers(frame_factory) for stream_id in [3, 5, 7]: f = frame_factory.build_headers_frame( headers=self.example_request_headers, stream_id=stream_id, ) c.receive_data(f.serialize()) # Now we send 1/4 of the connection window per stream. Annoyingly, # that's an odd number, so we need to round the last frame up. data_to_send = b"\x00" * (self.DEFAULT_FLOW_WINDOW // 4) for stream_id in [1, 3, 5]: f = frame_factory.build_data_frame( data_to_send, stream_id=stream_id, ) c.receive_data(f.serialize()) data_to_send = b"\x00" * c.remote_flow_control_window(7) data_frame = frame_factory.build_data_frame(data_to_send, stream_id=7) c.receive_data(data_frame.serialize()) # Ok, now the actual test. c.acknowledge_received_data(increment, stream_id=1) expected_data = frame_factory.build_window_update_frame( stream_id=0, increment=increment, ).serialize() assert c.data_to_send() == expected_data @given(integers(min_value=1025, max_value=DEFAULT_FLOW_WINDOW)) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_mixing_update_forms(self, frame_factory, increment) -> None: """ If the user mixes acknowledging data with manually incrementing windows, we still keep track of what's going on. """ # We need to refresh the encoder because hypothesis has a problem with # integrating with py.test, meaning that we use the same frame factory # for all tests. # See https://github.com/HypothesisWorks/hypothesis-python/issues/377 frame_factory.refresh_encoder() # Empty the flow control window. c = self._setup_connection_and_send_headers(frame_factory) data_to_send = b"\x00" * self.DEFAULT_FLOW_WINDOW data_frame = frame_factory.build_data_frame(data_to_send) c.receive_data(data_frame.serialize()) # Manually increment the connection flow control window back to fully # open, but leave the stream window closed. c.increment_flow_control_window( stream_id=None, increment=self.DEFAULT_FLOW_WINDOW, ) c.clear_outbound_data_buffer() # Now, acknowledge the receipt of that data. This should cause the # stream window to be widened, but not the connection window, because # it is already open. c.acknowledge_received_data(increment, stream_id=1) # We expect to see one window update frame only, for the stream. expected_data = frame_factory.build_window_update_frame( stream_id=1, increment=increment, ).serialize() assert c.data_to_send() == expected_data ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_h2_upgrade.py0000644000076500000240000002444014744265074016203 0ustar00kriechistaff""" Tests that exercise the HTTP Upgrade functionality of hyper-h2, ensuring that clients and servers can upgrade their plaintext HTTP/1.1 connections to HTTP/2. """ from __future__ import annotations import base64 import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions from h2.utilities import utf8_encode_headers EXAMPLE_REQUEST_HEADERS = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] EXAMPLE_REQUEST_HEADERS_BYTES = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] class TestClientUpgrade: """ Tests of the client-side of the HTTP/2 upgrade dance. """ example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] def test_returns_http2_settings(self, frame_factory) -> None: """ Calling initiate_upgrade_connection returns a base64url encoded Settings frame with the settings used by the connection. """ conn = h2.connection.H2Connection() data = conn.initiate_upgrade_connection() # The base64 encoding must not be padded. assert not data.endswith(b"=") # However, SETTINGS frames should never need to be padded. decoded_frame = base64.urlsafe_b64decode(data) expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings, ) assert decoded_frame == expected_frame.serialize_body() def test_emits_preamble(self, frame_factory) -> None: """ Calling initiate_upgrade_connection emits the connection preamble. """ conn = h2.connection.H2Connection() conn.initiate_upgrade_connection() data = conn.data_to_send() assert data.startswith(frame_factory.preamble()) data = data[len(frame_factory.preamble()):] expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings, ) assert data == expected_frame.serialize() def test_can_receive_response(self, frame_factory) -> None: """ After upgrading, we can safely receive a response. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() f1 = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, ) f2 = frame_factory.build_data_frame( stream_id=1, data=b"some data", flags=["END_STREAM"], ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 3 assert isinstance(events[0], h2.events.ResponseReceived) assert isinstance(events[1], h2.events.DataReceived) assert isinstance(events[2], h2.events.StreamEnded) assert events[0].headers == self.example_response_headers assert events[1].data == b"some data" assert all(e.stream_id == 1 for e in events) assert not c.data_to_send() @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_can_receive_pushed_stream(self, frame_factory, headers) -> None: """ After upgrading, we can safely receive a pushed stream. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) events = c.receive_data(f.serialize()) assert len(events) == 1 assert isinstance(events[0], h2.events.PushedStreamReceived) assert events[0].headers == utf8_encode_headers(headers) assert events[0].parent_stream_id == 1 assert events[0].pushed_stream_id == 2 @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_cannot_send_headers_stream_1(self, frame_factory, headers) -> None: """ After upgrading, we cannot send headers on stream 1. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(stream_id=1, headers=headers) def test_cannot_send_data_stream_1(self, frame_factory) -> None: """ After upgrading, we cannot send data on stream 1. """ c = h2.connection.H2Connection() c.initiate_upgrade_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_data(stream_id=1, data=b"some data") class TestServerUpgrade: """ Tests of the server-side of the HTTP/2 upgrade dance. """ example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) def test_returns_nothing(self, frame_factory) -> None: """ Calling initiate_upgrade_connection returns nothing. """ conn = h2.connection.H2Connection(config=self.server_config) curl_header = b"AAMAAABkAAQAAP__" data = conn.initiate_upgrade_connection(curl_header) assert data is None def test_emits_preamble(self, frame_factory) -> None: """ Calling initiate_upgrade_connection emits the connection preamble. """ conn = h2.connection.H2Connection(config=self.server_config) conn.initiate_upgrade_connection() data = conn.data_to_send() expected_frame = frame_factory.build_settings_frame( settings=conn.local_settings, ) assert data == expected_frame.serialize() def test_can_send_response(self, frame_factory) -> None: """ After upgrading, we can safely send a response. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.clear_outbound_data_buffer() c.send_headers(stream_id=1, headers=self.example_response_headers) c.send_data(stream_id=1, data=b"some data", end_stream=True) f1 = frame_factory.build_headers_frame( stream_id=1, headers=self.example_response_headers, ) f2 = frame_factory.build_data_frame( stream_id=1, data=b"some data", flags=["END_STREAM"], ) expected_data = f1.serialize() + f2.serialize() assert c.data_to_send() == expected_data @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_can_push_stream(self, frame_factory, headers) -> None: """ After upgrading, we can safely push a stream. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers, ) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_cannot_receive_headers_stream_1(self, frame_factory, headers) -> None: """ After upgrading, we cannot receive headers on stream 1. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=headers, ) c.receive_data(f.serialize()) expected_frame = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ) assert c.data_to_send() == expected_frame.serialize() def test_cannot_receive_data_stream_1(self, frame_factory) -> None: """ After upgrading, we cannot receive data on stream 1. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_upgrade_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( stream_id=1, data=b"some data", ) c.receive_data(f.serialize()) expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected def test_client_settings_are_applied(self, frame_factory) -> None: """ The settings provided by the client are applied and immediately ACK'ed. """ server = h2.connection.H2Connection(config=self.server_config) client = h2.connection.H2Connection() # As a precaution, let's confirm that the server and client, at the # start of the connection, do not agree on their initial settings # state. assert ( client.local_settings != server.remote_settings ) # Get the client header data and pass it to the server. header_data = client.initiate_upgrade_connection() server.initiate_upgrade_connection(header_data) # This gets complex, but here we go. # RFC 7540 § 3.2.1 says that "explicit acknowledgement" of the settings # in the header is "not necessary". That's annoyingly vague, but we # interpret that to mean "should not be sent". So to test that this # worked we need to test that the server has only sent the preamble, # and has not sent a SETTINGS ack, and also that the server has the # correct settings. expected_frame = frame_factory.build_settings_frame( server.local_settings, ) assert server.data_to_send() == expected_frame.serialize() assert ( client.local_settings == server.remote_settings ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_head_request.py0000644000076500000240000000347314744265074016637 0ustar00kriechistafffrom __future__ import annotations import pytest import h2.connection EXAMPLE_REQUEST_HEADERS_BYTES = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"HEAD"), ] EXAMPLE_REQUEST_HEADERS = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "HEAD"), ] class TestHeadRequest: example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), (b"content_length", b"1"), ] @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_non_zero_content_and_no_body(self, frame_factory, headers) -> None: c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, headers, end_stream=True) f = frame_factory.build_headers_frame( self.example_response_headers, flags=["END_STREAM"], ) events = c.receive_data(f.serialize()) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 1 assert event.headers == self.example_response_headers @pytest.mark.parametrize("headers", [EXAMPLE_REQUEST_HEADERS, EXAMPLE_REQUEST_HEADERS_BYTES]) def test_reject_non_zero_content_and_body(self, frame_factory, headers) -> None: c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, headers) headers = frame_factory.build_headers_frame( self.example_response_headers, ) data = frame_factory.build_data_frame(data=b"\x01") c.receive_data(headers.serialize()) with pytest.raises(h2.exceptions.InvalidBodyLengthError): c.receive_data(data.serialize()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_header_indexing.py0000644000076500000240000005613714744265074017310 0ustar00kriechistaff""" This module contains tests that use HPACK header tuples that provide additional metadata to the hpack module about how to encode the headers. """ from __future__ import annotations import pytest from hpack import HeaderTuple, NeverIndexedHeaderTuple import h2.config import h2.connection def assert_header_blocks_actually_equal(block_a, block_b) -> None: """ Asserts that two header bocks are really, truly equal, down to the types of their tuples. Doesn't return anything. """ assert len(block_a) == len(block_b) for a, b in zip(block_a, block_b): assert a == b assert a.__class__ is b.__class__ class TestHeaderIndexing: """ Test that Hyper-h2 can correctly handle never indexed header fields using the appropriate hpack data structures. """ example_request_headers = [ HeaderTuple(":authority", "example.com"), HeaderTuple(":path", "/"), HeaderTuple(":scheme", "https"), HeaderTuple(":method", "GET"), ] bytes_example_request_headers = [ HeaderTuple(b":authority", b"example.com"), HeaderTuple(b":path", b"/"), HeaderTuple(b":scheme", b"https"), HeaderTuple(b":method", b"GET"), ] extended_request_headers = [ HeaderTuple(":authority", "example.com"), HeaderTuple(":path", "/"), HeaderTuple(":scheme", "https"), HeaderTuple(":method", "GET"), NeverIndexedHeaderTuple("authorization", "realpassword"), ] bytes_extended_request_headers = [ HeaderTuple(b":authority", b"example.com"), HeaderTuple(b":path", b"/"), HeaderTuple(b":scheme", b"https"), HeaderTuple(b":method", b"GET"), NeverIndexedHeaderTuple(b"authorization", b"realpassword"), ] example_response_headers = [ HeaderTuple(":status", "200"), HeaderTuple("server", "fake-serv/0.1.0"), ] bytes_example_response_headers = [ HeaderTuple(b":status", b"200"), HeaderTuple(b"server", b"fake-serv/0.1.0"), ] extended_response_headers = [ HeaderTuple(":status", "200"), HeaderTuple("server", "fake-serv/0.1.0"), NeverIndexedHeaderTuple("secure", "you-bet"), ] bytes_extended_response_headers = [ HeaderTuple(b":status", b"200"), HeaderTuple(b"server", b"fake-serv/0.1.0"), NeverIndexedHeaderTuple(b"secure", b"you-bet"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "headers", [ example_request_headers, bytes_example_request_headers, extended_request_headers, bytes_extended_request_headers, ], ) def test_sending_header_tuples(self, headers, frame_factory) -> None: """ Providing HeaderTuple and HeaderTuple subclasses preserves the metadata about indexing. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) f = frame_factory.build_headers_frame(headers=headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "headers", [ example_request_headers, bytes_example_request_headers, extended_request_headers, bytes_extended_request_headers, ], ) def test_header_tuples_in_pushes(self, headers, frame_factory) -> None: """ Providing HeaderTuple and HeaderTuple subclasses to push promises preserves metadata about indexing. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, flags=["END_HEADERS"], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( ("headers", "encoding"), [ (example_request_headers, "utf-8"), (bytes_example_request_headers, None), (extended_request_headers, "utf-8"), (bytes_extended_request_headers, None), ], ) def test_header_tuples_are_decoded_request(self, headers, encoding, frame_factory) -> None: """ The indexing status of the header is preserved when emitting RequestReceived events. """ config = h2.config.H2Configuration( client_side=False, header_encoding=encoding, ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.RequestReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( ("headers", "encoding"), [ (example_response_headers, "utf-8"), (bytes_example_response_headers, None), (extended_response_headers, "utf-8"), (bytes_extended_response_headers, None), ], ) def test_header_tuples_are_decoded_response(self, headers, encoding, frame_factory) -> None: """ The indexing status of the header is preserved when emitting ResponseReceived events. """ config = h2.config.H2Configuration( header_encoding=encoding, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.ResponseReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( ("headers", "encoding"), [ (example_response_headers, "utf-8"), (bytes_example_response_headers, None), (extended_response_headers, "utf-8"), (bytes_extended_response_headers, None), ], ) def test_header_tuples_are_decoded_info_response(self, headers, encoding, frame_factory) -> None: """ The indexing status of the header is preserved when emitting InformationalResponseReceived events. """ # Manipulate the headers to send 100 Continue. We need to copy the list # to avoid breaking the example headers. headers = headers[:] if encoding: headers[0] = HeaderTuple(":status", "100") else: headers[0] = HeaderTuple(b":status", b"100") config = h2.config.H2Configuration( header_encoding=encoding, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.InformationalResponseReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( ("headers", "encoding"), [ (example_response_headers, "utf-8"), (bytes_example_response_headers, None), (extended_response_headers, "utf-8"), (bytes_extended_response_headers, None), ], ) def test_header_tuples_are_decoded_trailers(self, headers, encoding, frame_factory) -> None: """ The indexing status of the header is preserved when emitting TrailersReceived events. """ # Manipulate the headers to remove the status, which shouldn't be in # the trailers. We need to copy the list to avoid breaking the example # headers. headers = headers[1:] config = h2.config.H2Configuration( header_encoding=encoding, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_headers_frame(self.example_response_headers) data = f.serialize() c.receive_data(data) f = frame_factory.build_headers_frame(headers, flags=["END_STREAM"]) data = f.serialize() events = c.receive_data(data) assert len(events) == 2 event = events[0] assert isinstance(event, h2.events.TrailersReceived) assert_header_blocks_actually_equal(headers, event.headers) @pytest.mark.parametrize( ("headers", "encoding"), [ (example_request_headers, "utf-8"), (bytes_example_request_headers, None), (extended_request_headers, "utf-8"), (bytes_extended_request_headers, None), ], ) def test_header_tuples_are_decoded_push_promise(self, headers, encoding, frame_factory) -> None: """ The indexing status of the header is preserved when emitting PushedStreamReceived events. """ config = h2.config.H2Configuration( header_encoding=encoding, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, flags=["END_HEADERS"], ) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.PushedStreamReceived) assert_header_blocks_actually_equal(headers, event.headers) class TestSecureHeaders: """ Certain headers should always be transformed to their never-indexed form. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] bytes_example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] possible_auth_headers = [ ("authorization", "test"), ("Authorization", "test"), ("authorization", "really long test"), HeaderTuple("authorization", "test"), HeaderTuple("Authorization", "test"), HeaderTuple("authorization", "really long test"), NeverIndexedHeaderTuple("authorization", "test"), NeverIndexedHeaderTuple("Authorization", "test"), NeverIndexedHeaderTuple("authorization", "really long test"), (b"authorization", b"test"), (b"Authorization", b"test"), (b"authorization", b"really long test"), HeaderTuple(b"authorization", b"test"), HeaderTuple(b"Authorization", b"test"), HeaderTuple(b"authorization", b"really long test"), NeverIndexedHeaderTuple(b"authorization", b"test"), NeverIndexedHeaderTuple(b"Authorization", b"test"), NeverIndexedHeaderTuple(b"authorization", b"really long test"), ("proxy-authorization", "test"), ("Proxy-Authorization", "test"), ("proxy-authorization", "really long test"), HeaderTuple("proxy-authorization", "test"), HeaderTuple("Proxy-Authorization", "test"), HeaderTuple("proxy-authorization", "really long test"), NeverIndexedHeaderTuple("proxy-authorization", "test"), NeverIndexedHeaderTuple("Proxy-Authorization", "test"), NeverIndexedHeaderTuple("proxy-authorization", "really long test"), (b"proxy-authorization", b"test"), (b"Proxy-Authorization", b"test"), (b"proxy-authorization", b"really long test"), HeaderTuple(b"proxy-authorization", b"test"), HeaderTuple(b"Proxy-Authorization", b"test"), HeaderTuple(b"proxy-authorization", b"really long test"), NeverIndexedHeaderTuple(b"proxy-authorization", b"test"), NeverIndexedHeaderTuple(b"Proxy-Authorization", b"test"), NeverIndexedHeaderTuple(b"proxy-authorization", b"really long test"), ] secured_cookie_headers = [ ("cookie", "short"), ("Cookie", "short"), ("cookie", "nineteen byte cooki"), HeaderTuple("cookie", "short"), HeaderTuple("Cookie", "short"), HeaderTuple("cookie", "nineteen byte cooki"), NeverIndexedHeaderTuple("cookie", "short"), NeverIndexedHeaderTuple("Cookie", "short"), NeverIndexedHeaderTuple("cookie", "nineteen byte cooki"), NeverIndexedHeaderTuple("cookie", "longer manually secured cookie"), (b"cookie", b"short"), (b"Cookie", b"short"), (b"cookie", b"nineteen byte cooki"), HeaderTuple(b"cookie", b"short"), HeaderTuple(b"Cookie", b"short"), HeaderTuple(b"cookie", b"nineteen byte cooki"), NeverIndexedHeaderTuple(b"cookie", b"short"), NeverIndexedHeaderTuple(b"Cookie", b"short"), NeverIndexedHeaderTuple(b"cookie", b"nineteen byte cooki"), NeverIndexedHeaderTuple(b"cookie", b"longer manually secured cookie"), ] unsecured_cookie_headers = [ ("cookie", "twenty byte cookie!!"), ("Cookie", "twenty byte cookie!!"), ("cookie", "substantially longer than 20 byte cookie"), HeaderTuple("cookie", "twenty byte cookie!!"), HeaderTuple("cookie", "twenty byte cookie!!"), HeaderTuple("Cookie", "twenty byte cookie!!"), (b"cookie", b"twenty byte cookie!!"), (b"Cookie", b"twenty byte cookie!!"), (b"cookie", b"substantially longer than 20 byte cookie"), HeaderTuple(b"cookie", b"twenty byte cookie!!"), HeaderTuple(b"cookie", b"twenty byte cookie!!"), HeaderTuple(b"Cookie", b"twenty byte cookie!!"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("auth_header", possible_auth_headers) def test_authorization_headers_never_indexed(self, headers, auth_header, frame_factory) -> None: """ Authorization and Proxy-Authorization headers are always forced to be never-indexed, regardless of their form. """ # Regardless of what we send, we expect it to be never indexed. send_headers = [*headers, auth_header] expected_headers = [*headers, NeverIndexedHeaderTuple(auth_header[0].lower(), auth_header[1])] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("auth_header", possible_auth_headers) def test_authorization_headers_never_indexed_push(self, headers, auth_header, frame_factory) -> None: """ Authorization and Proxy-Authorization headers are always forced to be never-indexed, regardless of their form, when pushed by a server. """ # Regardless of what we send, we expect it to be never indexed. send_headers = [*headers, auth_header] expected_headers = [*headers, NeverIndexedHeaderTuple(auth_header[0].lower(), auth_header[1])] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=["END_HEADERS"], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("cookie_header", secured_cookie_headers) def test_short_cookie_headers_never_indexed(self, headers, cookie_header, frame_factory) -> None: """ Short cookie headers, and cookies provided as NeverIndexedHeaderTuple, are never indexed. """ # Regardless of what we send, we expect it to be never indexed. send_headers = [*headers, cookie_header] expected_headers = [*headers, NeverIndexedHeaderTuple(cookie_header[0].lower(), cookie_header[1])] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("cookie_header", secured_cookie_headers) def test_short_cookie_headers_never_indexed_push(self, headers, cookie_header, frame_factory) -> None: """ Short cookie headers, and cookies provided as NeverIndexedHeaderTuple, are never indexed when pushed by servers. """ # Regardless of what we send, we expect it to be never indexed. send_headers = [*headers, cookie_header] expected_headers = [*headers, NeverIndexedHeaderTuple(cookie_header[0].lower(), cookie_header[1])] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=["END_HEADERS"], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("cookie_header", unsecured_cookie_headers) def test_long_cookie_headers_can_be_indexed(self, headers, cookie_header, frame_factory) -> None: """ Longer cookie headers can be indexed. """ # Regardless of what we send, we expect it to be indexed. send_headers = [*headers, cookie_header] expected_headers = [*headers, HeaderTuple(cookie_header[0].lower(), cookie_header[1])] c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, send_headers) f = frame_factory.build_headers_frame(headers=expected_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("cookie_header", unsecured_cookie_headers) def test_long_cookie_headers_can_be_indexed_push(self, headers, cookie_header, frame_factory) -> None: """ Longer cookie headers can be indexed. """ # Regardless of what we send, we expect it to be never indexed. send_headers = [*headers, cookie_header] expected_headers = [*headers, HeaderTuple(cookie_header[0].lower(), cookie_header[1])] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) # We can use normal headers for the request. f = frame_factory.build_headers_frame( self.example_request_headers, ) c.receive_data(f.serialize()) frame_factory.refresh_encoder() expected_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=expected_headers, flags=["END_HEADERS"], ) c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=send_headers, ) assert c.data_to_send() == expected_frame.serialize() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_informational_responses.py0000644000076500000240000003662014744265074021131 0ustar00kriechistaff""" Tests that validate that hyper-h2 correctly handles informational (1XX) responses in its state machine. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.events import h2.exceptions class TestReceivingInformationalResponses: """ Tests for receiving informational responses. """ example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), (b"expect", b"100-continue"), ] example_informational_headers = [ (b":status", b"100"), (b"server", b"fake-serv/0.1.0"), ] example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] example_trailers = [ (b"trailer", b"you-bet"), ] @pytest.mark.parametrize("end_stream", [True, False]) def test_single_informational_response(self, frame_factory, end_stream) -> None: """ When receiving a informational response, the appropriate event is signaled. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream, ) f = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.InformationalResponseReceived) assert event.headers == self.example_informational_headers assert event.stream_id == 1 @pytest.mark.parametrize("end_stream", [True, False]) def test_receiving_multiple_header_blocks(self, frame_factory, end_stream) -> None: """ At least three header blocks can be received: informational, headers, trailers. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream, ) f1 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f3 = frame_factory.build_headers_frame( headers=self.example_trailers, stream_id=1, flags=["END_STREAM"], ) events = c.receive_data( f1.serialize() + f2.serialize() + f3.serialize(), ) assert len(events) == 4 assert isinstance(events[0], h2.events.InformationalResponseReceived) assert events[0].headers == self.example_informational_headers assert events[0].stream_id == 1 assert isinstance(events[1], h2.events.ResponseReceived) assert events[1].headers == self.example_response_headers assert events[1].stream_id == 1 assert isinstance(events[2], h2.events.TrailersReceived) assert events[2].headers == self.example_trailers assert events[2].stream_id == 1 @pytest.mark.parametrize("end_stream", [True, False]) def test_receiving_multiple_informational_responses(self, frame_factory, end_stream) -> None: """ More than one informational response is allowed. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream, ) f1 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=[(":status", "101")], stream_id=1, ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 2 assert isinstance(events[0], h2.events.InformationalResponseReceived) assert events[0].headers == self.example_informational_headers assert events[0].stream_id == 1 assert isinstance(events[1], h2.events.InformationalResponseReceived) assert events[1].headers == [(b":status", b"101")] assert events[1].stream_id == 1 @pytest.mark.parametrize("end_stream", [True, False]) def test_receive_provisional_response_with_end_stream(self, frame_factory, end_stream) -> None: """ Receiving provisional responses with END_STREAM set causes ProtocolErrors. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream, ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, flags=["END_STREAM"], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected = frame_factory.build_goaway_frame( last_stream_id=0, error_code=1, ) assert c.data_to_send() == expected.serialize() @pytest.mark.parametrize("end_stream", [True, False]) def test_receiving_out_of_order_headers(self, frame_factory, end_stream) -> None: """ When receiving a informational response after the actual response headers we consider it a ProtocolError and raise it. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.example_request_headers, end_stream=end_stream, ) f1 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_informational_headers, stream_id=1, ) c.receive_data(f1.serialize()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f2.serialize()) expected = frame_factory.build_goaway_frame( last_stream_id=0, error_code=1, ) assert c.data_to_send() == expected.serialize() class TestSendingInformationalResponses: """ Tests for sending informational responses. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ("expect", "100-continue"), ] bytes_example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), (b"expect", b"100-continue"), ] informational_headers = [ (":status", "100"), ("server", "fake-serv/0.1.0"), ] bytes_informational_headers = [ (b":status", b"100"), (b"server", b"fake-serv/0.1.0"), ] example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), ] example_trailers = [ (b"trailer", b"you-bet"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize( "hdrs", [informational_headers, bytes_informational_headers], ) @pytest.mark.parametrize( "request_headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("end_stream", [True, False]) def test_single_informational_response(self, frame_factory, hdrs, request_headers, end_stream) -> None: """ When sending a informational response, the appropriate frames are emitted. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ["END_STREAM"] if end_stream else [] f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() c.send_headers( stream_id=1, headers=hdrs, ) f = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize( "hdrs", [informational_headers, bytes_informational_headers], ) @pytest.mark.parametrize( "request_headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("end_stream", [True, False]) def test_sending_multiple_header_blocks(self, frame_factory, hdrs, request_headers, end_stream) -> None: """ At least three header blocks can be sent: informational, headers, trailers. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ["END_STREAM"] if end_stream else [] f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() # Send the three header blocks. c.send_headers( stream_id=1, headers=hdrs, ) c.send_headers( stream_id=1, headers=self.example_response_headers, ) c.send_headers( stream_id=1, headers=self.example_trailers, end_stream=True, ) # Check that we sent them properly. f1 = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) f3 = frame_factory.build_headers_frame( headers=self.example_trailers, stream_id=1, flags=["END_STREAM"], ) assert ( c.data_to_send() == f1.serialize() + f2.serialize() + f3.serialize() ) @pytest.mark.parametrize( "hdrs", [informational_headers, bytes_informational_headers], ) @pytest.mark.parametrize( "request_headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("end_stream", [True, False]) def test_sending_multiple_informational_responses(self, frame_factory, hdrs, request_headers, end_stream) -> None: """ More than one informational response is allowed. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ["END_STREAM"] if end_stream else [] f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() frame_factory.refresh_encoder() # Send two informational responses. c.send_headers( stream_id=1, headers=hdrs, ) c.send_headers( stream_id=1, headers=[(b":status", b"101")], ) # Check we sent them both. f1 = frame_factory.build_headers_frame( headers=hdrs, stream_id=1, ) f2 = frame_factory.build_headers_frame( headers=[(":status", "101")], stream_id=1, ) assert c.data_to_send() == f1.serialize() + f2.serialize() @pytest.mark.parametrize( "hdrs", [informational_headers, bytes_informational_headers], ) @pytest.mark.parametrize( "request_headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("end_stream", [True, False]) def test_send_provisional_response_with_end_stream(self, frame_factory, hdrs, request_headers, end_stream) -> None: """ Sending provisional responses with END_STREAM set causes ProtocolErrors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ["END_STREAM"] if end_stream else [] f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=hdrs, end_stream=True, ) @pytest.mark.parametrize( "hdrs", [informational_headers, bytes_informational_headers], ) @pytest.mark.parametrize( "request_headers", [example_request_headers, bytes_example_request_headers], ) @pytest.mark.parametrize("end_stream", [True, False]) def test_reject_sending_out_of_order_headers(self, frame_factory, hdrs, request_headers, end_stream) -> None: """ When sending an informational response after the actual response headers we consider it a ProtocolError and raise it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) flags = ["END_STREAM"] if end_stream else [] f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=flags, ) c.receive_data(f.serialize()) c.send_headers( stream_id=1, headers=self.example_response_headers, ) with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=hdrs, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_interacting_stacks.py0000644000076500000240000001063214744265074020040 0ustar00kriechistaff""" These tests run two entities, a client and a server, in parallel threads. These two entities talk to each other, running what amounts to a number of carefully controlled simulations of real flows. This is to ensure that the stack as a whole behaves intelligently in both client and server cases. These tests are long, complex, and somewhat brittle, so they aren't in general recommended for writing the majority of test cases. Their purposes is primarily to validate that the top-level API of the library behaves as described. We should also consider writing helper functions to reduce the complexity of these tests, so that they can be written more easily, as they are remarkably useful. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.events import h2.settings from . import coroutine_tests class TestCommunication(coroutine_tests.CoroutineTestCase): """ Test that two communicating state machines can work together. """ server_config = h2.config.H2Configuration(client_side=False) request_headers = [ (":method", "GET"), (":path", "/"), (":authority", "example.com"), (":scheme", "https"), ("user-agent", "test-client/0.1.0"), ] request_headers_bytes = [ (b":method", b"GET"), (b":path", b"/"), (b":authority", b"example.com"), (b":scheme", b"https"), (b"user-agent", b"test-client/0.1.0"), ] response_headers = [ (b":status", b"204"), (b"server", b"test-server/0.1.0"), (b"content-length", b"0"), ] @pytest.mark.parametrize("request_headers", [request_headers, request_headers_bytes]) def test_basic_request_response(self, request_headers) -> None: """ A request issued by hyper-h2 can be responded to by hyper-h2. """ def client(): c = h2.connection.H2Connection() # Do the handshake. First send the preamble. c.initiate_connection() data = yield c.data_to_send() # Next, handle the remote preamble. events = c.receive_data(data) assert len(events) == 2 assert isinstance(events[0], h2.events.SettingsAcknowledged) assert isinstance(events[1], h2.events.RemoteSettingsChanged) changed = events[1].changed_settings assert ( changed[ h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS ].new_value == 100 ) # Send a request. events = c.send_headers(1, request_headers, end_stream=True) assert not events data = yield c.data_to_send() # Validate the response. events = c.receive_data(data) assert len(events) == 2 assert isinstance(events[0], h2.events.ResponseReceived) assert events[0].stream_id == 1 assert events[0].headers == self.response_headers assert isinstance(events[1], h2.events.StreamEnded) assert events[1].stream_id == 1 @self.server def server(): c = h2.connection.H2Connection(config=self.server_config) # First, read for the preamble. data = yield events = c.receive_data(data) assert len(events) == 1 assert isinstance(events[0], h2.events.RemoteSettingsChanged) changed = events[0].changed_settings assert ( changed[ h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS ].new_value == 100 ) # Send our preamble back. c.initiate_connection() data = yield c.data_to_send() # Listen for the request. events = c.receive_data(data) assert len(events) == 3 assert isinstance(events[0], h2.events.SettingsAcknowledged) assert isinstance(events[1], h2.events.RequestReceived) assert events[1].stream_id == 1 assert events[1].headers == self.request_headers_bytes assert isinstance(events[2], h2.events.StreamEnded) assert events[2].stream_id == 1 # Send our response. events = c.send_headers(1, self.response_headers, end_stream=True) assert not events yield c.data_to_send() self.run_until_complete(client(), server()) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_invalid_content_lengths.py0000644000076500000240000001207514744265074021070 0ustar00kriechistaff""" This module contains tests that use invalid content lengths, and validates that they fail appropriately. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestInvalidContentLengths: """ Hyper-h2 raises Protocol Errors when the content-length sent by a remote peer is not valid. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "POST"), ("content-length", "15"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"POST"), (b"content-length", b"15"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_too_much_data(self, frame_factory, request_headers) -> None: """ Remote peers sending data in excess of content-length causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=request_headers, ) first_data = frame_factory.build_data_frame(data=b"\x01"*15) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame(data=b"\x01") with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 16 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 16" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_insufficient_data(self, frame_factory, request_headers) -> None: """ Remote peers sending less data than content-length causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=request_headers, ) first_data = frame_factory.build_data_frame(data=b"\x01"*13) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame( data=b"\x01", flags=["END_STREAM"], ) with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 14 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 14" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_insufficient_data_empty_frame(self, frame_factory, request_headers) -> None: """ Remote peers sending less data than content-length where the last data frame is empty causes Protocol Errors. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) headers = frame_factory.build_headers_frame( headers=request_headers, ) first_data = frame_factory.build_data_frame(data=b"\x01"*14) c.receive_data(headers.serialize() + first_data.serialize()) c.clear_outbound_data_buffer() second_data = frame_factory.build_data_frame( data=b"", flags=["END_STREAM"], ) with pytest.raises(h2.exceptions.InvalidBodyLengthError) as exp: c.receive_data(second_data.serialize()) assert exp.value.expected_length == 15 assert exp.value.actual_length == 14 assert str(exp.value) == ( "InvalidBodyLengthError: Expected 15 bytes, received 14" ) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_invalid_frame_sequences.py0000644000076500000240000004611714744265074021043 0ustar00kriechistaff""" Tests invalid frame sequences, and validates that they fail appropriately. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions class TestInvalidFrameSequences: """ Invalid frame sequences, either sent or received, cause ProtocolErrors to be thrown. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) client_config = h2.config.H2Configuration(client_side=True) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_send_on_closed_stream(self, request_headers) -> None: """ When we've closed a stream locally, we cannot send further data. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, request_headers, end_stream=True) with pytest.raises(h2.exceptions.ProtocolError): c.send_data(1, b"some data") def test_missing_preamble_errors(self) -> None: """ Server side connections require the preamble. """ c = h2.connection.H2Connection(config=self.server_config) encoded_headers_frame = ( b"\x00\x00\r\x01\x04\x00\x00\x00\x01" b"A\x88/\x91\xd3]\x05\\\x87\xa7\x84\x87\x82" ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(encoded_headers_frame) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_server_connections_reject_even_streams(self, frame_factory, request_headers) -> None: """ Servers do not allow clients to initiate even-numbered streams. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, stream_id=2, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_clients_reject_odd_stream_pushes(self, frame_factory, request_headers) -> None: """ Clients do not allow servers to push odd numbered streams. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(1, request_headers, end_stream=True) f = frame_factory.build_push_promise_frame( stream_id=1, headers=request_headers, promised_stream_id=3, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_can_handle_frames_with_invalid_padding(self, frame_factory, request_headers) -> None: """ Frames with invalid padding cause connection teardown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(request_headers) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() invalid_data_frame = ( b"\x00\x00\x05\x00\x0b\x00\x00\x00\x01\x06\x54\x65\x73\x74" ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(invalid_data_frame) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=1, ) assert c.data_to_send() == expected_frame.serialize() def test_receiving_frames_with_insufficent_size(self, frame_factory) -> None: """ Frames with not enough data cause connection teardown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() invalid_window_update_frame = ( b"\x00\x00\x03\x08\x00\x00\x00\x00\x00\x00\x00\x02" ) with pytest.raises(h2.exceptions.FrameDataMissingError): c.receive_data(invalid_window_update_frame) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.FRAME_SIZE_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_reject_data_on_closed_streams(self, frame_factory, request_headers) -> None: """ When a stream is not open to the remote peer, we reject receiving data frames from them. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame( data=b"some data", ) c.receive_data(bad_frame.serialize()) expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_unexpected_continuation_on_closed_stream(self, frame_factory, request_headers) -> None: """ CONTINUATION frames received on closed streams cause connection errors of type PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_continuation_frame( header_block=b"hello", ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(bad_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, last_stream_id=1, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_prevent_continuation_dos(self, frame_factory, request_headers) -> None: """ Receiving too many CONTINUATION frames in one block causes a protocol error. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, ) f.flags = {"END_STREAM"} c.receive_data(f.serialize()) c.clear_outbound_data_buffer() # Send 63 additional frames. for _ in range(63): extra_frame = frame_factory.build_continuation_frame( header_block=b"hello", ) c.receive_data(extra_frame.serialize()) # The final continuation frame should cause a protocol error. extra_frame = frame_factory.build_continuation_frame( header_block=b"hello", ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(extra_frame.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=0x1, ) assert c.data_to_send() == expected_frame.serialize() # These settings are a bit annoyingly anonymous, but trust me, they're bad. @pytest.mark.parametrize( "settings", [ {0x2: 5}, {0x4: 2**31}, {0x5: 5}, {0x5: 2**24}, ], ) def test_reject_invalid_settings_values(self, frame_factory, settings) -> None: """ When a SETTINGS frame is received with invalid settings values it causes connection teardown with the appropriate error code. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_settings_frame(settings=settings) with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: c.receive_data(f.serialize()) assert e.value.error_code == ( h2.errors.ErrorCodes.FLOW_CONTROL_ERROR if 0x4 in settings else h2.errors.ErrorCodes.PROTOCOL_ERROR ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_invalid_frame_headers_are_protocol_errors(self, frame_factory, request_headers) -> None: """ When invalid frame headers are received they cause ProtocolErrors to be raised. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=request_headers, ) # Do some annoying bit twiddling here: the stream ID is currently set # to '1', change it to '0'. Grab the first 9 bytes (the frame header), # replace any instances of the byte '\x01', and then graft it onto the # remaining bytes. frame_data = f.serialize() frame_data = frame_data[:9].replace(b"\x01", b"\x00") + frame_data[9:] with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(frame_data) assert "Received frame with invalid header" in str(e.value) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_data_before_headers(self, frame_factory, request_headers) -> None: """ When data frames are received before headers they cause ProtocolErrors to be raised. """ c = h2.connection.H2Connection(config=self.client_config) c.initiate_connection() # transition stream into OPEN c.send_headers(1, request_headers) f = frame_factory.build_data_frame(b"hello") with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(f.serialize()) assert "cannot receive data before headers" in str(e.value) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_get_stream_reset_event_on_auto_reset(self, frame_factory, request_headers) -> None: """ When hyper-h2 resets a stream automatically, a StreamReset event fires. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame( data=b"some data", ) events = c.receive_data(bad_frame.serialize()) expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.STREAM_CLOSED assert not event.remote_reset @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_one_one_stream_reset(self, frame_factory, request_headers) -> None: """ When hyper-h2 resets a stream automatically, a StreamReset event fires, but only for the first reset: the others are silent. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( request_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() bad_frame = frame_factory.build_data_frame( data=b"some data", ) # Receive 5 frames. events = c.receive_data(bad_frame.serialize() * 5) expected = frame_factory.build_rst_stream_frame( stream_id=1, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected * 5 assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.StreamReset) assert event.stream_id == 1 assert event.error_code == h2.errors.ErrorCodes.STREAM_CLOSED assert not event.remote_reset @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) @pytest.mark.parametrize("value", ["", "twelve"]) def test_error_on_invalid_content_length(self, frame_factory, value, request_headers) -> None: """ When an invalid content-length is received, a ProtocolError is thrown. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=[*request_headers, ("content-length", value)], ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_invalid_header_data_protocol_error(self, frame_factory, request_headers) -> None: """ If an invalid header block is received, we raise a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=request_headers, ) f.data = b"\x00\x00\x00\x00" with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_invalid_push_promise_data_protocol_error(self, frame_factory, request_headers) -> None: """ If an invalid header block is received on a PUSH_PROMISE, we raise a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=request_headers, ) f.data = b"\x00\x00\x00\x00" with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_receive_push_on_pushed_stream(self, frame_factory, request_headers) -> None: """ If a PUSH_PROMISE frame is received with the parent stream ID being a pushed stream, this is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=request_headers, end_stream=True, ) f1 = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=request_headers, ) f2 = frame_factory.build_headers_frame( stream_id=2, headers=self.example_response_headers, ) c.receive_data(f1.serialize() + f2.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=2, promised_stream_id=4, headers=request_headers, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=2, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_send_push_on_pushed_stream(self, frame_factory, request_headers) -> None: """ If a user tries to send a PUSH_PROMISE frame with the parent stream ID being a pushed stream, this is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( stream_id=1, headers=request_headers, ) c.receive_data(f.serialize()) c.push_stream( stream_id=1, promised_stream_id=2, request_headers=request_headers, ) c.send_headers(stream_id=2, headers=self.example_response_headers) with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=2, promised_stream_id=4, request_headers=request_headers, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_invalid_headers.py0000644000076500000240000010341514744265074017304 0ustar00kriechistaff""" Tests invalid header blocks, and validates that they fail appropriately. """ from __future__ import annotations import itertools import hyperframe.frame import pytest from hypothesis import given from hypothesis.strategies import binary, lists, tuples import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.settings import h2.utilities HEADERS_STRATEGY = lists(tuples(binary(min_size=1), binary())) class TestInvalidFrameSequences: """ Invalid header sequences cause ProtocolErrors to be thrown when received. """ base_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ("user-agent", "someua/0.0.1"), ] base_invalid_header_blocks = [ [*base_request_headers, ("Uppercase", "name")], [*base_request_headers, (":late", "pseudo-header")], [(":path", "duplicate-pseudo-header"), *base_request_headers], [*base_request_headers, ("connection", "close")], [*base_request_headers, ("proxy-connection", "close")], [*base_request_headers, ("keep-alive", "close")], [*base_request_headers, ("transfer-encoding", "gzip")], [*base_request_headers, ("upgrade", "super-protocol/1.1")], [*base_request_headers, ("te", "chunked")], [*base_request_headers, ("host", "notexample.com")], [*base_request_headers, (" name", "name with leading space")], [*base_request_headers, ("name ", "name with trailing space")], [*base_request_headers, ("name", " value with leading space")], [*base_request_headers, ("name", "value with trailing space ")], [header for header in base_request_headers if header[0] != ":authority"], [(":protocol", "websocket"), *base_request_headers], ] invalid_header_blocks = base_invalid_header_blocks + [ h2.utilities.utf8_encode_headers(headers) for headers in base_invalid_header_blocks ] server_config = h2.config.H2Configuration( client_side=False, header_encoding="utf-8", ) @pytest.mark.parametrize("headers", invalid_header_blocks) def test_headers_event(self, frame_factory, headers) -> None: """ Test invalid headers are rejected with PROTOCOL_ERROR. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame(headers) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("headers", invalid_header_blocks) def test_push_promise_event(self, frame_factory, headers) -> None: """ If a PUSH_PROMISE header frame is received with an invalid header block it is rejected with a PROTOCOL_ERROR. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.base_request_headers, end_stream=True, ) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("headers", invalid_header_blocks) def test_push_promise_skipping_validation(self, frame_factory, headers) -> None: """ If we have ``validate_inbound_headers`` disabled, then invalid header blocks in push promise frames are allowed to pass. """ config = h2.config.H2Configuration( client_side=True, validate_inbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.send_headers( stream_id=1, headers=self.base_request_headers, end_stream=True, ) c.clear_outbound_data_buffer() f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 pp_event = events[0] assert pp_event.headers == h2.utilities.utf8_encode_headers(headers) @pytest.mark.parametrize("headers", invalid_header_blocks) def test_headers_event_skipping_validation(self, frame_factory, headers) -> None: """ If we have ``validate_inbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( client_side=False, validate_inbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 request_event = events[0] assert request_event.headers == h2.utilities.utf8_encode_headers(headers) def test_te_trailers_is_valid(self, frame_factory) -> None: """ `te: trailers` is allowed by the filter. """ headers = ( [*self.base_request_headers, ("te", "trailers")] ) c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame(headers) data = f.serialize() events = c.receive_data(data) assert len(events) == 1 request_event = events[0] assert request_event.headers == headers def test_pseudo_headers_rejected_in_trailer(self, frame_factory) -> None: """ Ensure we reject pseudo headers included in trailers """ trailers = [(":path", "/"), ("extra", "value")] c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() header_frame = frame_factory.build_headers_frame( self.base_request_headers, ) trailer_frame = frame_factory.build_headers_frame( trailers, flags=["END_STREAM"], ) head = header_frame.serialize() trailer = trailer_frame.serialize() c.receive_data(head) # Raise exception if pseudo header in trailer with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(trailer) assert "pseudo-header in trailer" in str(e.value) # Test appropriate response frame is generated expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() class TestSendingInvalidFrameSequences: """ Trying to send invalid header sequences cause ProtocolErrors to be thrown. """ base_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ("user-agent", "someua/0.0.1"), ] invalid_header_blocks = [ [*base_request_headers, (":late", "pseudo-header")], [(":path", "duplicate-pseudo-header"), *base_request_headers], [*base_request_headers, ("te", "chunked")], [*base_request_headers, ("host", "notexample.com")], [header for header in base_request_headers if header[0] != ":authority"], ] strippable_header_blocks = [ [*base_request_headers, ("connection", "close")], [*base_request_headers, ("proxy-connection", "close")], [*base_request_headers, ("keep-alive", "close")], [*base_request_headers, ("transfer-encoding", "gzip")], [*base_request_headers, ("upgrade", "super-protocol/1.1")], ] all_header_blocks = invalid_header_blocks + strippable_header_blocks server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize("headers", invalid_header_blocks) def test_headers_event(self, frame_factory, headers) -> None: """ Test sending invalid headers raise a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then try to send headers. c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers(1, headers) @pytest.mark.parametrize("headers", invalid_header_blocks) def test_send_push_promise(self, frame_factory, headers) -> None: """ Sending invalid headers in a push promise raises a ProtocolError. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers, ) c.receive_data(header_frame.serialize()) # Clear the data, then try to send a push promise. c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers, ) @pytest.mark.parametrize("headers", all_header_blocks) def test_headers_event_skipping_validation(self, frame_factory, headers) -> None: """ If we have ``validate_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( validate_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) # Ensure headers are still normalized. headers = h2.utilities.utf8_encode_headers(headers) norm_headers = h2.utilities.normalize_outbound_headers( headers, None, False, ) f = frame_factory.build_headers_frame(norm_headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("headers", all_header_blocks) def test_push_promise_skipping_validation(self, frame_factory, headers) -> None: """ If we have ``validate_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass. """ config = h2.config.H2Configuration( client_side=False, validate_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers, ) c.receive_data(header_frame.serialize()) frame_factory.refresh_encoder() # Create push promise frame with normalized headers. headers = h2.utilities.utf8_encode_headers(headers) norm_headers = h2.utilities.normalize_outbound_headers( headers, None, False, ) pp_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=norm_headers, ) # Clear the data, then send a push promise. c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers, ) assert c.data_to_send() == pp_frame.serialize() @pytest.mark.parametrize("headers", all_header_blocks) def test_headers_event_skip_normalization(self, frame_factory, headers) -> None: """ If we have ``normalize_outbound_headers`` disabled, then all of these invalid header blocks are sent through unmodified. """ config = h2.config.H2Configuration( validate_outbound_headers=False, normalize_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() f = frame_factory.build_headers_frame( headers, stream_id=1, ) # Clear the data, then send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("headers", all_header_blocks) def test_push_promise_skip_normalization(self, frame_factory, headers) -> None: """ If we have ``normalize_outbound_headers`` disabled, then all of these invalid header blocks are allowed to pass unmodified. """ config = h2.config.H2Configuration( client_side=False, validate_outbound_headers=False, normalize_outbound_headers=False, ) c = h2.connection.H2Connection(config=config) c.initiate_connection() c.receive_data(frame_factory.preamble()) header_frame = frame_factory.build_headers_frame( self.base_request_headers, ) c.receive_data(header_frame.serialize()) frame_factory.refresh_encoder() pp_frame = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=headers, ) # Clear the data, then send a push promise. c.clear_outbound_data_buffer() c.push_stream( stream_id=1, promised_stream_id=2, request_headers=headers, ) assert c.data_to_send() == pp_frame.serialize() @pytest.mark.parametrize("headers", strippable_header_blocks) def test_strippable_headers(self, frame_factory, headers) -> None: """ Test connection related headers are removed before sending. """ c = h2.connection.H2Connection() c.initiate_connection() # Clear the data, then try to send headers. c.clear_outbound_data_buffer() c.send_headers(1, headers) f = frame_factory.build_headers_frame(self.base_request_headers) assert c.data_to_send() == f.serialize() class TestFilter: """ Test the filter function directly. These tests exists to confirm the behaviour of the filter function in a wide range of scenarios. Many of these scenarios may not be legal for HTTP/2 and so may never hit the function, but it's worth validating that it behaves as expected anyway. """ validation_functions = [ h2.utilities.validate_headers, h2.utilities.validate_outbound_headers, ] hdr_validation_combos = [ h2.utilities.HeaderValidationFlags( is_client, is_trailer, is_response_header, is_push_promise, ) for is_client, is_trailer, is_response_header, is_push_promise in ( itertools.product([True, False], repeat=4) ) ] hdr_validation_response_headers = [ flags for flags in hdr_validation_combos if flags.is_response_header ] hdr_validation_request_headers_no_trailer = [ flags for flags in hdr_validation_combos if not (flags.is_trailer or flags.is_response_header) ] invalid_request_header_blocks_bytes = ( # First, missing :method ( (b":authority", b"google.com"), (b":path", b"/"), (b":scheme", b"https"), ), # Next, missing :path ( (b":authority", b"google.com"), (b":method", b"GET"), (b":scheme", b"https"), ), # Next, missing :scheme ( (b":authority", b"google.com"), (b":method", b"GET"), (b":path", b"/"), ), # Finally, path present but empty. ( (b":authority", b"google.com"), (b":method", b"GET"), (b":scheme", b"https"), (b":path", b""), ), ) # All headers that are forbidden from either request or response blocks. forbidden_request_headers_bytes = (b":status",) forbidden_response_headers_bytes = (b":path", b":scheme", b":authority", b":method") @pytest.mark.parametrize("validation_function", validation_functions) @pytest.mark.parametrize("hdr_validation_flags", hdr_validation_combos) @given(headers=HEADERS_STRATEGY) def test_range_of_acceptable_outputs(self, headers, validation_function, hdr_validation_flags) -> None: """ The header validation functions either return the data unchanged or throw a ProtocolError. """ try: assert headers == list(validation_function( headers, hdr_validation_flags)) except h2.exceptions.ProtocolError: assert True @pytest.mark.parametrize("hdr_validation_flags", hdr_validation_combos) def test_invalid_pseudo_headers(self, hdr_validation_flags) -> None: headers = [(b":custom", b"value")] with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize("validation_function", validation_functions) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_request_headers_no_trailer, ) def test_matching_authority_host_headers(self, validation_function, hdr_validation_flags) -> None: """ If a header block has :authority and Host headers and they match, the headers should pass through unchanged. """ headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), (b"host", b"example.com"), ] assert headers == list(h2.utilities.validate_headers( headers, hdr_validation_flags, )) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_response_headers, ) def test_response_header_without_status(self, hdr_validation_flags) -> None: headers = [(b"content-length", b"42")] with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_request_headers_no_trailer, ) @pytest.mark.parametrize( "header_block", (invalid_request_header_blocks_bytes), ) def test_outbound_req_header_missing_pseudo_headers(self, hdr_validation_flags, header_block) -> None: with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( header_block, hdr_validation_flags, ), ) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_request_headers_no_trailer, ) @pytest.mark.parametrize( "header_block", invalid_request_header_blocks_bytes, ) def test_inbound_req_header_missing_pseudo_headers(self, hdr_validation_flags, header_block) -> None: with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_headers( header_block, hdr_validation_flags, ), ) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_request_headers_no_trailer, ) @pytest.mark.parametrize( "invalid_header", forbidden_request_headers_bytes, ) def test_outbound_req_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header) -> None: """ Outbound request header blocks containing the forbidden request headers fail validation. """ headers = [ (b":path", b"/"), (b":scheme", b"https"), (b":authority", b"google.com"), (b":method", b"GET"), ] headers.append((invalid_header, b"some value")) with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( headers, hdr_validation_flags, ), ) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_request_headers_no_trailer, ) @pytest.mark.parametrize( "invalid_header", forbidden_request_headers_bytes, ) def test_inbound_req_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header) -> None: """ Inbound request header blocks containing the forbidden request headers fail validation. """ headers = [ (b":path", b"/"), (b":scheme", b"https"), (b":authority", b"google.com"), (b":method", b"GET"), ] headers.append((invalid_header, b"some value")) with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_response_headers, ) @pytest.mark.parametrize( "invalid_header", forbidden_response_headers_bytes, ) def test_outbound_resp_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header) -> None: """ Outbound response header blocks containing the forbidden response headers fail validation. """ headers = [(b":status", b"200")] headers.append((invalid_header, b"some value")) with pytest.raises(h2.exceptions.ProtocolError): list( h2.utilities.validate_outbound_headers( headers, hdr_validation_flags, ), ) @pytest.mark.parametrize( "hdr_validation_flags", hdr_validation_response_headers, ) @pytest.mark.parametrize( "invalid_header", forbidden_response_headers_bytes, ) def test_inbound_resp_header_extra_pseudo_headers(self, hdr_validation_flags, invalid_header) -> None: """ Inbound response header blocks containing the forbidden response headers fail validation. """ headers = [(b":status", b"200")] headers.append((invalid_header, b"some value")) with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers(headers, hdr_validation_flags)) @pytest.mark.parametrize("hdr_validation_flags", hdr_validation_combos) def test_inbound_header_name_length(self, hdr_validation_flags) -> None: with pytest.raises(h2.exceptions.ProtocolError): list(h2.utilities.validate_headers([(b"", b"foobar")], hdr_validation_flags)) def test_inbound_header_name_length_full_frame_decode(self, frame_factory) -> None: f = frame_factory.build_headers_frame([]) f.data = b"\x00\x00\x05\x00\x00\x00\x00\x04" data = f.serialize() c = h2.connection.H2Connection(config=h2.config.H2Configuration(client_side=False)) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError, match="Received header name with zero length."): c.receive_data(data) class TestOversizedHeaders: """ Tests that oversized header blocks are correctly rejected. This replicates the "HPACK Bomb" attack, and confirms that we're resistant against it. """ request_header_block = [ (b":method", b"GET"), (b":authority", b"example.com"), (b":scheme", b"https"), (b":path", b"/"), ] response_header_block = [ (b":status", b"200"), ] # The first header block contains a single header that fills the header # table. To do that, we'll give it a single-character header name and a # 4063 byte header value. This will make it exactly the size of the header # table. It must come last, so that it evicts all other headers. # This block must be appended to either a request or response block. first_header_block = [ (b"a", b"a" * 4063), ] # The second header "block" is actually a custom HEADERS frame body that # simply repeatedly refers to the first entry for 16kB. Each byte has the # high bit set (0x80), and then uses the remaining 7 bits to encode the # number 62 (0x3e), leading to a repeat of the byte 0xbe. second_header_block = b"\xbe" * 2**14 server_config = h2.config.H2Configuration(client_side=False) def test_hpack_bomb_request(self, frame_factory) -> None: """ A HPACK bomb request causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.request_header_block + self.first_header_block, ) data = f.serialize() c.receive_data(data) # Build the attack payload. attack_frame = hyperframe.frame.HeadersFrame(stream_id=3) attack_frame.data = self.second_header_block attack_frame.flags.add("END_HEADERS") data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM, ) assert c.data_to_send() == expected_frame.serialize() def test_hpack_bomb_response(self, frame_factory) -> None: """ A HPACK bomb response causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.request_header_block, ) c.send_headers( stream_id=3, headers=self.request_header_block, ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.response_header_block + self.first_header_block, ) data = f.serialize() c.receive_data(data) # Build the attack payload. attack_frame = hyperframe.frame.HeadersFrame(stream_id=3) attack_frame.data = self.second_header_block attack_frame.flags.add("END_HEADERS") data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM, ) assert c.data_to_send() == expected_frame.serialize() def test_hpack_bomb_push(self, frame_factory) -> None: """ A HPACK bomb push causes the connection to be torn down with the error code ENHANCE_YOUR_CALM. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=self.request_header_block, ) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( self.response_header_block + self.first_header_block, ) data = f.serialize() c.receive_data(data) # Build the attack payload. We need to shrink it by four bytes because # the promised_stream_id consumes four bytes of body. attack_frame = hyperframe.frame.PushPromiseFrame(stream_id=3) attack_frame.promised_stream_id = 2 attack_frame.data = self.second_header_block[:-4] attack_frame.flags.add("END_HEADERS") data = attack_frame.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=0, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_when_list_size_shrunk(self, frame_factory) -> None: """ When we've shrunk the header list size, we reject new header blocks that violate the new size. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block, ) data = f.serialize() c.receive_data(data) # Now, send a settings change. It's un-ACKed at this time. A new # request arrives, also without incident. c.update_settings({h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 50}) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.request_header_block, ) data = f.serialize() c.receive_data(data) # We get a SETTINGS ACK. f = frame_factory.build_settings_frame({}, ack=True) data = f.serialize() c.receive_data(data) # Now a third request comes in. This explodes. f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block, ) data = f.serialize() with pytest.raises(h2.exceptions.DenialOfServiceError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.ENHANCE_YOUR_CALM, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_when_table_size_shrunk(self, frame_factory) -> None: """ When we've shrunk the header table size, we reject header blocks that do not respect the change. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block, ) data = f.serialize() c.receive_data(data) # Now, send a settings change. It's un-ACKed at this time. A new # request arrives, also without incident. c.update_settings({h2.settings.SettingCodes.HEADER_TABLE_SIZE: 128}) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=3, headers=self.request_header_block, ) data = f.serialize() c.receive_data(data) # We get a SETTINGS ACK. f = frame_factory.build_settings_frame({}, ack=True) data = f.serialize() c.receive_data(data) # Now a third request comes in. This explodes, as it does not contain # a dynamic table size update. f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block, ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() def test_reject_headers_exceeding_table_size(self, frame_factory) -> None: """ When the remote peer sends a dynamic table size update that exceeds our setting, we reject it. """ c = h2.connection.H2Connection(config=self.server_config) c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() # Receive the first request, which causes no problem. f = frame_factory.build_headers_frame( stream_id=1, headers=self.request_header_block, ) data = f.serialize() c.receive_data(data) # Now a second request comes in that sets the table size too high. # This explodes. frame_factory.change_table_size(c.local_settings.header_table_size + 1) f = frame_factory.build_headers_frame( stream_id=5, headers=self.request_header_block, ) data = f.serialize() with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(data) expected_frame = frame_factory.build_goaway_frame( last_stream_id=1, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_priority.py0000644000076500000240000002775114744265074016054 0ustar00kriechistafffrom __future__ import annotations import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions import h2.stream class TestPriority: """ Basic priority tests. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "pytest-h2"), ] server_config = h2.config.H2Configuration(client_side=False) def test_receiving_priority_emits_priority_update(self, frame_factory) -> None: """ Receiving a priority frame emits a PriorityUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_priority_frame( stream_id=1, weight=255, ) events = c.receive_data(f.serialize()) assert len(events) == 1 assert not c.data_to_send() event = events[0] assert isinstance(event, h2.events.PriorityUpdated) assert event.stream_id == 1 assert event.depends_on == 0 assert event.weight == 256 assert event.exclusive is False @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_headers_with_priority_info(self, frame_factory, request_headers) -> None: """ Receiving a HEADERS frame with priority information on it emits a PriorityUpdated event. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=request_headers, stream_id=3, flags=["PRIORITY"], stream_weight=15, depends_on=1, exclusive=True, ) events = c.receive_data(f.serialize()) assert len(events) == 2 assert not c.data_to_send() event = events[1] assert isinstance(event, h2.events.PriorityUpdated) assert event.stream_id == 3 assert event.depends_on == 1 assert event.weight == 16 assert event.exclusive is True @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_streams_may_not_depend_on_themselves(self, frame_factory, request_headers) -> None: """ A stream adjusted to depend on itself causes a Protocol Error. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=request_headers, stream_id=3, flags=["PRIORITY"], stream_weight=15, depends_on=1, exclusive=True, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_priority_frame( stream_id=3, depends_on=3, weight=15, ) with pytest.raises(h2.exceptions.ProtocolError): c.receive_data(f.serialize()) expected_frame = frame_factory.build_goaway_frame( last_stream_id=3, error_code=h2.errors.ErrorCodes.PROTOCOL_ERROR, ) assert c.data_to_send() == expected_frame.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) @pytest.mark.parametrize( ("depends_on", "weight", "exclusive"), [ (0, 256, False), (3, 128, False), (3, 128, True), ], ) def test_can_prioritize_stream(self, depends_on, weight, exclusive, frame_factory, request_headers) -> None: """ hyper-h2 can emit priority frames. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(headers=request_headers, stream_id=1) c.send_headers(headers=request_headers, stream_id=3) c.clear_outbound_data_buffer() c.prioritize( stream_id=1, depends_on=depends_on, weight=weight, exclusive=exclusive, ) f = frame_factory.build_priority_frame( stream_id=1, weight=weight - 1, depends_on=depends_on, exclusive=exclusive, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) @pytest.mark.parametrize( ("depends_on", "weight", "exclusive"), [ (0, 256, False), (1, 128, False), (1, 128, True), ], ) def test_emit_headers_with_priority_info(self, depends_on, weight, exclusive, frame_factory, request_headers) -> None: """ It is possible to send a headers frame with priority information on it. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers( headers=request_headers, stream_id=3, priority_weight=weight, priority_depends_on=depends_on, priority_exclusive=exclusive, ) f = frame_factory.build_headers_frame( headers=request_headers, stream_id=3, flags=["PRIORITY"], stream_weight=weight - 1, depends_on=depends_on, exclusive=exclusive, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_may_not_prioritize_stream_to_depend_on_self(self, frame_factory, request_headers) -> None: """ A stream adjusted to depend on itself causes a Protocol Error. """ c = h2.connection.H2Connection() c.initiate_connection() c.receive_data(frame_factory.preamble()) c.send_headers( headers=request_headers, stream_id=3, priority_weight=255, priority_depends_on=0, priority_exclusive=False, ) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.prioritize( stream_id=3, depends_on=3, ) assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_may_not_initially_set_stream_depend_on_self(self, frame_factory, request_headers) -> None: """ A stream that starts by depending on itself causes a Protocol Error. """ c = h2.connection.H2Connection() c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( headers=request_headers, stream_id=3, priority_depends_on=3, ) assert not c.data_to_send() @pytest.mark.parametrize("weight", [0, -15, 257]) def test_prioritize_requires_valid_weight(self, weight) -> None: """ A call to prioritize with an invalid weight causes a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.prioritize(stream_id=1, weight=weight) assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) @pytest.mark.parametrize("weight", [0, -15, 257]) def test_send_headers_requires_valid_weight(self, weight, request_headers) -> None: """ A call to send_headers with an invalid weight causes a ProtocolError. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.send_headers( stream_id=1, headers=request_headers, priority_weight=weight, ) assert not c.data_to_send() def test_prioritize_defaults(self, frame_factory) -> None: """ When prioritize() is called with no explicit arguments, it emits a weight of 16, depending on stream zero non-exclusively. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.prioritize(stream_id=1) f = frame_factory.build_priority_frame( stream_id=1, weight=15, depends_on=0, exclusive=False, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) @pytest.mark.parametrize( "priority_kwargs", [ {"priority_weight": 16}, {"priority_depends_on": 0}, {"priority_exclusive": False}, ], ) def test_send_headers_defaults(self, priority_kwargs, frame_factory, request_headers) -> None: """ When send_headers() is called with only one explicit argument, it emits default values for everything else. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() c.send_headers( stream_id=1, headers=request_headers, **priority_kwargs, ) f = frame_factory.build_headers_frame( headers=request_headers, stream_id=1, flags=["PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_servers_cannot_prioritize(self, frame_factory, request_headers) -> None: """ Server stacks are not allowed to call ``prioritize()``. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=request_headers, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.RFC1122Error): c.prioritize(stream_id=1) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_servers_cannot_prioritize_with_headers(self, frame_factory, request_headers) -> None: """ Server stacks are not allowed to prioritize on headers either. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( stream_id=1, headers=request_headers, ) c.receive_data(f.serialize()) with pytest.raises(h2.exceptions.RFC1122Error): c.send_headers( stream_id=1, headers=self.example_response_headers, priority_weight=16, ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_related_events.py0000644000076500000240000003356414744265074017176 0ustar00kriechistaff""" Specific tests to validate the "related events" logic used by certain events inside hyper-h2. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.events class TestRelatedEvents: """ Related events correlate all those events that happen on a single frame. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] informational_response_headers = [ (":status", "100"), ("server", "fake-serv/0.1.0"), ] example_trailers = [ ("another", "field"), ] server_config = h2.config.H2Configuration(client_side=False) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_request_received_related_all(self, frame_factory, request_headers) -> None: """ RequestReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=request_headers, flags=["END_STREAM", "PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_request_received_related_priority(self, frame_factory, request_headers) -> None: """ RequestReceived can be related to PriorityUpdated. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=request_headers, flags=["PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert base_event.stream_ended is None assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_request_received_related_stream_ended(self, frame_factory, request_headers) -> None: """ RequestReceived can be related to StreamEnded. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) input_frame = frame_factory.build_headers_frame( headers=request_headers, flags=["END_STREAM"], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_response_received_related_nothing(self, frame_factory, request_headers) -> None: """ ResponseReceived is ordinarily related to no events. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.stream_ended is None assert base_event.priority_updated is None @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_response_received_related_all(self, frame_factory, request_headers) -> None: """ ResponseReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=["END_STREAM", "PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_response_received_related_priority(self, frame_factory, request_headers) -> None: """ ResponseReceived can be related to PriorityUpdated. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=["PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert base_event.stream_ended is None assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_response_received_related_stream_ended(self, frame_factory, request_headers) -> None: """ ResponseReceived can be related to StreamEnded. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=["END_STREAM"], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_trailers_received_related_all(self, frame_factory, request_headers) -> None: """ TrailersReceived has two possible related events: PriorityUpdated and StreamEnded, all fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_headers_frame( headers=self.example_trailers, flags=["END_STREAM", "PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 3 base_event = events[0] other_events = events[1:] assert base_event.stream_ended in other_events assert isinstance(base_event.stream_ended, h2.events.StreamEnded) assert base_event.priority_updated in other_events assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_trailers_received_related_stream_ended(self, frame_factory, request_headers) -> None: """ TrailersReceived can be related to StreamEnded by itself. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_headers_frame( headers=self.example_trailers, flags=["END_STREAM"], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert base_event.priority_updated is None assert isinstance(base_event.stream_ended, h2.events.StreamEnded) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_informational_response_related_nothing(self, frame_factory, request_headers) -> None: """ InformationalResponseReceived in the standard case is related to nothing. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.informational_response_headers, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.priority_updated is None @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_informational_response_received_related_all(self, frame_factory, request_headers) -> None: """ InformationalResponseReceived has one possible related event: PriorityUpdated, fired when a single HEADERS frame is received. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) input_frame = frame_factory.build_headers_frame( headers=self.informational_response_headers, flags=["PRIORITY"], stream_weight=15, depends_on=0, exclusive=False, ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] priority_updated_event = events[1] assert base_event.priority_updated is priority_updated_event assert isinstance( base_event.priority_updated, h2.events.PriorityUpdated, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_data_received_normally_relates_to_nothing(self, frame_factory, request_headers) -> None: """ A plain DATA frame leads to DataReceieved with no related events. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_data_frame( data=b"some data", ) events = c.receive_data(input_frame.serialize()) assert len(events) == 1 base_event = events[0] assert base_event.stream_ended is None @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_data_received_related_stream_ended(self, frame_factory, request_headers) -> None: """ DataReceived can be related to StreamEnded by itself. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) input_frame = frame_factory.build_data_frame( data=b"some data", flags=["END_STREAM"], ) events = c.receive_data(input_frame.serialize()) assert len(events) == 2 base_event = events[0] stream_ended_event = events[1] assert base_event.stream_ended is stream_ended_event assert isinstance(base_event.stream_ended, h2.events.StreamEnded) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_rfc7838.py0000644000076500000240000004061114744265074015265 0ustar00kriechistaff""" Test the RFC 7838 ALTSVC support. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.events import h2.exceptions class TestRFC7838Client: """ Tests that the client supports receiving the RFC 7838 AltSvc frame. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] def test_receiving_altsvc_stream_zero(self, frame_factory) -> None: """ An ALTSVC frame received on stream zero correctly transposes all the fields from the frames. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() def test_receiving_altsvc_stream_zero_no_origin(self, frame_factory) -> None: """ An ALTSVC frame received on stream zero without an origin field is ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert not events assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_on_stream(self, frame_factory, request_headers) -> None: """ An ALTSVC frame received on a stream correctly transposes all the fields from the frame and attaches the expected origin. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_on_stream_with_origin(self, frame_factory, request_headers) -> None: """ An ALTSVC frame received on a stream with an origin field present gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"example.com", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_on_stream_not_yet_opened(self, frame_factory) -> None: """ When an ALTSVC frame is received on a stream the client hasn't yet opened, the frame is ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.clear_outbound_data_buffer() # We'll test this twice, once on a client-initiated stream ID and once # on a server initiated one. f1 = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) f2 = frame_factory.build_alt_svc_frame( stream_id=2, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f1.serialize() + f2.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_receiving_altsvc_before_sending_headers(self, frame_factory) -> None: """ When an ALTSVC frame is received but the client hasn't sent headers yet it gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() # We need to create the idle stream. We have to do it by calling # a private API. While this can't naturally happen in hyper-h2 (we # don't currently have a mechanism by which this could occur), it could # happen in the future and we defend against it. c._begin_new_stream( stream_id=1, allowed_ids=h2.connection.AllowedStreamIDs.ODD, ) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_after_receiving_headers(self, frame_factory, request_headers) -> None: """ When an ALTSVC frame is received but the server has already sent headers it gets ignored. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_headers_frame( headers=self.example_response_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_on_closed_stream(self, frame_factory, request_headers) -> None: """ When an ALTSVC frame is received on a closed stream, we ignore it. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers( stream_id=1, headers=request_headers, end_stream=True, ) f = frame_factory.build_headers_frame( headers=self.example_response_headers, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_on_pushed_stream(self, frame_factory, request_headers) -> None: """ When an ALTSVC frame is received on a stream that the server pushed, the frame is accepted. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=request_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=2, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 1 event = events[0] assert isinstance(event, h2.events.AlternativeServiceAvailable) assert event.origin == b"example.com" assert event.field_value == b'h2=":8000"; ma=60' # No data gets sent. assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_send_explicit_alternative_service(self, frame_factory, request_headers) -> None: """ A client cannot send an explicit alternative service. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_send_implicit_alternative_service(self, frame_factory, request_headers) -> None: """ A client cannot send an implicit alternative service. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=request_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) class TestRFC7838Server: """ Tests that the server supports sending the RFC 7838 AltSvc frame. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_request_headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) def test_receiving_altsvc_as_server_stream_zero(self, frame_factory) -> None: """ When an ALTSVC frame is received on stream zero and we are a server, we ignore it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_receiving_altsvc_as_server_on_stream(self, frame_factory, request_headers) -> None: """ When an ALTSVC frame is received on a stream and we are a server, we ignore it. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=request_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) events = c.receive_data(f.serialize()) assert len(events) == 0 assert not c.data_to_send() def test_sending_explicit_alternative_service(self, frame_factory) -> None: """ A server can send an explicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", ) f = frame_factory.build_alt_svc_frame( stream_id=0, origin=b"example.com", field=b'h2=":8000"; ma=60', ) assert c.data_to_send() == f.serialize() @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_sending_implicit_alternative_service(self, frame_factory, request_headers) -> None: """ A server can send an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=request_headers, ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) f = frame_factory.build_alt_svc_frame( stream_id=1, origin=b"", field=b'h2=":8000"; ma=60', ) assert c.data_to_send() == f.serialize() def test_no_implicit_alternative_service_before_headers(self, frame_factory) -> None: """ If headers haven't been received yet, the server forbids sending an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_no_implicit_alternative_service_after_response(self, frame_factory, request_headers) -> None: """ If the server has sent response headers, hyper-h2 forbids sending an implicit alternative service. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=request_headers, ) c.receive_data(f.serialize()) c.send_headers(stream_id=1, headers=self.example_response_headers) c.clear_outbound_data_buffer() with pytest.raises(h2.exceptions.ProtocolError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', stream_id=1, ) @pytest.mark.parametrize("request_headers", [example_request_headers, example_request_headers_bytes]) def test_cannot_provide_origin_and_stream_id(self, frame_factory, request_headers) -> None: """ The user cannot provide both the origin and stream_id arguments when advertising alternative services. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=request_headers, ) c.receive_data(f.serialize()) with pytest.raises(ValueError): c.advertise_alternative_service( field_value=b'h2=":8000"; ma=60', origin=b"example.com", stream_id=1, ) def test_cannot_provide_unicode_altsvc_field(self, frame_factory) -> None: """ The user cannot provide the field value for alternative services as a unicode string. """ c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) with pytest.raises(ValueError): c.advertise_alternative_service( field_value='h2=":8000"; ma=60', origin=b"example.com", ) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_rfc8441.py0000644000076500000240000000267414744265074015263 0ustar00kriechistaff""" Test the RFC 8441 extended connect request support. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.events from h2.utilities import utf8_encode_headers class TestRFC8441: """ Tests that the client supports sending an extended connect request and the server supports receiving it. """ headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "CONNECT"), (":protocol", "websocket"), ("user-agent", "someua/0.0.1"), ] headers_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"CONNECT"), (b":protocol", b"websocket"), (b"user-agent", b"someua/0.0.1"), ] @pytest.mark.parametrize("headers", [headers, headers_bytes]) def test_can_send_headers(self, frame_factory, headers) -> None: client = h2.connection.H2Connection() client.initiate_connection() client.send_headers(stream_id=1, headers=headers) server = h2.connection.H2Connection( config=h2.config.H2Configuration(client_side=False), ) events = server.receive_data(client.data_to_send()) event = events[1] assert isinstance(event, h2.events.RequestReceived) assert event.stream_id == 1 assert event.headers == utf8_encode_headers(headers) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_settings.py0000644000076500000240000004064714744265074016032 0ustar00kriechistaff""" Test the Settings object. """ from __future__ import annotations import pytest from hypothesis import assume, given from hypothesis.strategies import booleans, builds, fixed_dictionaries, integers import h2.errors import h2.exceptions import h2.settings class TestSettings: """ Test the Settings object behaves as expected. """ def test_settings_defaults_client(self) -> None: """ The Settings object begins with the appropriate defaults for clients. """ s = h2.settings.Settings(client=True) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 def test_settings_defaults_server(self) -> None: """ The Settings object begins with the appropriate defaults for servers. """ s = h2.settings.Settings(client=False) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 0 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 @pytest.mark.parametrize("client", [True, False]) def test_can_set_initial_values(self, client) -> None: """ The Settings object can be provided initial values that override the defaults. """ overrides = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 8080, h2.settings.SettingCodes.MAX_FRAME_SIZE: 16388, h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 2**16, h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL: 1, } s = h2.settings.Settings(client=client, initial_values=overrides) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8080 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == bool(client) assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16388 assert s[h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS] == 100 assert s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] == 2**16 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 1 @pytest.mark.parametrize( ("setting", "value"), [ (h2.settings.SettingCodes.ENABLE_PUSH, 2), (h2.settings.SettingCodes.ENABLE_PUSH, -1), (h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, -1), (h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, 2**34), (h2.settings.SettingCodes.MAX_FRAME_SIZE, 1), (h2.settings.SettingCodes.MAX_FRAME_SIZE, 2**30), (h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE, -1), (h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL, -1), ], ) def test_cannot_set_invalid_initial_values(self, setting, value) -> None: """ The Settings object can be provided initial values that override the defaults. """ overrides = {setting: value} with pytest.raises(h2.exceptions.InvalidSettingsValueError): h2.settings.Settings(initial_values=overrides) def test_applying_value_doesnt_take_effect_immediately(self) -> None: """ When a value is applied to the settings object, it doesn't immediately take effect. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 def test_acknowledging_values(self) -> None: """ When we acknowledge settings, the values change. """ s = h2.settings.Settings(client=True) old_settings = dict(s) new_settings = { h2.settings.SettingCodes.HEADER_TABLE_SIZE: 4000, h2.settings.SettingCodes.ENABLE_PUSH: 0, h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: 60, h2.settings.SettingCodes.MAX_FRAME_SIZE: 16385, h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL: 1, } s.update(new_settings) assert dict(s) == old_settings s.acknowledge() assert dict(s) == new_settings def test_acknowledging_returns_the_changed_settings(self) -> None: """ Acknowledging settings returns the changes. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] = 8000 s[h2.settings.SettingCodes.ENABLE_PUSH] = 0 changes = s.acknowledge() assert len(changes) == 2 table_size_change = ( changes[h2.settings.SettingCodes.HEADER_TABLE_SIZE] ) push_change = changes[h2.settings.SettingCodes.ENABLE_PUSH] assert table_size_change.setting == ( h2.settings.SettingCodes.HEADER_TABLE_SIZE ) assert table_size_change.original_value == 4096 assert table_size_change.new_value == 8000 assert push_change.setting == h2.settings.SettingCodes.ENABLE_PUSH assert push_change.original_value == 1 assert push_change.new_value == 0 def test_acknowledging_only_returns_changed_settings(self) -> None: """ Acknowledging settings does not return unchanged settings. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] = 70 changes = s.acknowledge() assert len(changes) == 1 assert list(changes.keys()) == [ h2.settings.SettingCodes.INITIAL_WINDOW_SIZE, ] def test_deleting_values_deletes_all_of_them(self) -> None: """ When we delete a key we lose all state about it. """ s = h2.settings.Settings(client=True) s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 del s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] with pytest.raises(KeyError): s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] def test_length_correctly_reported(self) -> None: """ Length is related only to the number of keys. """ s = h2.settings.Settings(client=True) assert len(s) == 5 s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 8000 assert len(s) == 5 s.acknowledge() assert len(s) == 5 del s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] assert len(s) == 4 def test_new_values_work(self) -> None: """ New values initially don't appear """ s = h2.settings.Settings(client=True) s[80] = 81 with pytest.raises(KeyError): s[80] def test_new_values_follow_basic_acknowledgement_rules(self) -> None: """ A new value properly appears when acknowledged. """ s = h2.settings.Settings(client=True) s[80] = 81 changed_settings = s.acknowledge() assert s[80] == 81 assert len(changed_settings) == 1 changed = changed_settings[80] assert changed.setting == 80 assert changed.original_value is None assert changed.new_value == 81 def test_single_values_arent_affected_by_acknowledgement(self) -> None: """ When acknowledged, unchanged settings remain unchanged. """ s = h2.settings.Settings(client=True) assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 s.acknowledge() assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 4096 def test_settings_getters(self) -> None: """ Getters exist for well-known settings. """ s = h2.settings.Settings(client=True) assert s.header_table_size == ( s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] ) assert s.enable_push == s[h2.settings.SettingCodes.ENABLE_PUSH] assert s.initial_window_size == ( s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] ) assert s.max_frame_size == s[h2.settings.SettingCodes.MAX_FRAME_SIZE] assert s.max_concurrent_streams == 2**32 + 1 # A sensible default. assert s.max_header_list_size is None assert s.enable_connect_protocol == s[ h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL ] def test_settings_setters(self) -> None: """ Setters exist for well-known settings. """ s = h2.settings.Settings(client=True) s.header_table_size = 0 s.enable_push = 1 s.initial_window_size = 2 s.max_frame_size = 16385 s.max_concurrent_streams = 4 s.max_header_list_size = 2**16 s.enable_connect_protocol = 1 s.acknowledge() assert s[h2.settings.SettingCodes.HEADER_TABLE_SIZE] == 0 assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 2 assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16385 assert s[h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS] == 4 assert s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] == 2**16 assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 1 @given(integers()) def test_cannot_set_invalid_values_for_enable_push(self, val) -> None: """ SETTINGS_ENABLE_PUSH only allows two values: 0, 1. """ assume(val not in (0, 1)) s = h2.settings.Settings() with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.enable_push = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.enable_push == 1 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.ENABLE_PUSH] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.ENABLE_PUSH] == 1 @given(integers()) def test_cannot_set_invalid_vals_for_initial_window_size(self, val) -> None: """ SETTINGS_INITIAL_WINDOW_SIZE only allows values between 0 and 2**32 - 1 inclusive. """ s = h2.settings.Settings() if 0 <= val <= 2**31 - 1: s.initial_window_size = val s.acknowledge() assert s.initial_window_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.initial_window_size = val s.acknowledge() assert ( e.value.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR ) assert s.initial_window_size == 65535 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] = val s.acknowledge() assert ( e.value.error_code == h2.errors.ErrorCodes.FLOW_CONTROL_ERROR ) assert s[h2.settings.SettingCodes.INITIAL_WINDOW_SIZE] == 65535 @given(integers()) def test_cannot_set_invalid_values_for_max_frame_size(self, val) -> None: """ SETTINGS_MAX_FRAME_SIZE only allows values between 2**14 and 2**24 - 1. """ s = h2.settings.Settings() if 2**14 <= val <= 2**24 - 1: s.max_frame_size = val s.acknowledge() assert s.max_frame_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.max_frame_size = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.max_frame_size == 16384 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.MAX_FRAME_SIZE] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.MAX_FRAME_SIZE] == 16384 @given(integers()) def test_cannot_set_invalid_values_for_max_header_list_size(self, val) -> None: """ SETTINGS_MAX_HEADER_LIST_SIZE only allows non-negative values. """ s = h2.settings.Settings() if val >= 0: s.max_header_list_size = val s.acknowledge() assert s.max_header_list_size == val else: with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.max_header_list_size = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.max_header_list_size is None with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR with pytest.raises(KeyError): s[h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE] @given(integers()) def test_cannot_set_invalid_values_for_enable_connect_protocol(self, val) -> None: """ SETTINGS_ENABLE_CONNECT_PROTOCOL only allows two values: 0, 1. """ assume(val not in (0, 1)) s = h2.settings.Settings() with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s.enable_connect_protocol = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s.enable_connect_protocol == 0 with pytest.raises(h2.exceptions.InvalidSettingsValueError) as e: s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] = val s.acknowledge() assert e.value.error_code == h2.errors.ErrorCodes.PROTOCOL_ERROR assert s[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] == 0 class TestSettingsEquality: """ A class defining tests for the standard implementation of == and != . """ SettingsStrategy = builds( h2.settings.Settings, client=booleans(), initial_values=fixed_dictionaries({ h2.settings.SettingCodes.HEADER_TABLE_SIZE: integers(0, 2**32 - 1), h2.settings.SettingCodes.ENABLE_PUSH: integers(0, 1), h2.settings.SettingCodes.INITIAL_WINDOW_SIZE: integers(0, 2**31 - 1), h2.settings.SettingCodes.MAX_FRAME_SIZE: integers(2**14, 2**24 - 1), h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: integers(0, 2**32 - 1), h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: integers(0, 2**32 - 1), }), ) @given(settings=SettingsStrategy) def test_equality_reflexive(self, settings) -> None: """ An object compares equal to itself using the == operator and the != operator. """ assert (settings == settings) assert settings == settings @given(settings=SettingsStrategy, o_settings=SettingsStrategy) def test_equality_multiple(self, settings, o_settings) -> None: """ Two objects compare themselves using the == operator and the != operator. """ if settings == o_settings: assert settings == o_settings assert settings == o_settings else: assert settings != o_settings assert settings != o_settings @given(settings=SettingsStrategy) def test_another_type_equality(self, settings) -> None: """ The object does not compare equal to an object of an unrelated type (which does not implement the comparison) using the == operator. """ obj = object() assert (settings != obj) assert settings != obj @given(settings=SettingsStrategy) def test_delegated_eq(self, settings) -> None: """ The result of comparison is delegated to the right-hand operand if it is of an unrelated type. """ class Delegate: def __eq__(self, other): return [self] def __ne__(self, other): return [self] delg = Delegate() assert (settings == delg) == [delg] assert (settings != delg) == [delg] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_state_machines.py0000644000076500000240000001312514744265074017150 0ustar00kriechistaff""" These tests validate the state machines directly. Writing meaningful tests for this case can be tricky, so the majority of these tests use Hypothesis to try to talk about general behaviours rather than specific cases. """ from __future__ import annotations import pytest from hypothesis import given from hypothesis.strategies import sampled_from import h2.connection import h2.exceptions import h2.stream class TestConnectionStateMachine: """ Tests of the connection state machine. """ @given(state=sampled_from(h2.connection.ConnectionState), input_=sampled_from(h2.connection.ConnectionInputs)) def test_state_transitions(self, state, input_) -> None: c = h2.connection.H2ConnectionStateMachine() c.state = state try: c.process_input(input_) except h2.exceptions.ProtocolError: assert c.state == h2.connection.ConnectionState.CLOSED else: assert c.state in h2.connection.ConnectionState def test_state_machine_only_allows_connection_states(self) -> None: """ The Connection state machine only allows ConnectionState inputs. """ c = h2.connection.H2ConnectionStateMachine() with pytest.raises(ValueError): c.process_input(1) @pytest.mark.parametrize( "state", ( s for s in h2.connection.ConnectionState if s != h2.connection.ConnectionState.CLOSED ), ) @pytest.mark.parametrize( "input_", [ h2.connection.ConnectionInputs.RECV_PRIORITY, h2.connection.ConnectionInputs.SEND_PRIORITY, ], ) def test_priority_frames_allowed_in_all_states(self, state, input_) -> None: """ Priority frames can be sent/received in all connection states except closed. """ c = h2.connection.H2ConnectionStateMachine() c.state = state c.process_input(input_) class TestStreamStateMachine: """ Tests of the stream state machine. """ @given(state=sampled_from(h2.stream.StreamState), input_=sampled_from(h2.stream.StreamInputs)) def test_state_transitions(self, state, input_) -> None: s = h2.stream.H2StreamStateMachine(stream_id=1) s.state = state try: s.process_input(input_) except h2.exceptions.StreamClosedError: # This can only happen for streams that started in the closed # state OR where the input was RECV_DATA and the state was not # OPEN or HALF_CLOSED_LOCAL OR where the state was # HALF_CLOSED_REMOTE and a frame was received. if state == h2.stream.StreamState.CLOSED: assert s.state == h2.stream.StreamState.CLOSED elif input_ == h2.stream.StreamInputs.RECV_DATA: assert s.state == h2.stream.StreamState.CLOSED assert state not in ( h2.stream.StreamState.OPEN, h2.stream.StreamState.HALF_CLOSED_LOCAL, ) elif state == h2.stream.StreamState.HALF_CLOSED_REMOTE: assert input_ in ( h2.stream.StreamInputs.RECV_HEADERS, h2.stream.StreamInputs.RECV_PUSH_PROMISE, h2.stream.StreamInputs.RECV_DATA, h2.stream.StreamInputs.RECV_CONTINUATION, ) except h2.exceptions.ProtocolError: assert s.state == h2.stream.StreamState.CLOSED else: assert s.state in h2.stream.StreamState def test_state_machine_only_allows_stream_states(self) -> None: """ The Stream state machine only allows StreamState inputs. """ s = h2.stream.H2StreamStateMachine(stream_id=1) with pytest.raises(ValueError): s.process_input(1) def test_stream_state_machine_forbids_pushes_on_server_streams(self) -> None: """ Streams where this peer is a server do not allow receiving pushed frames. """ s = h2.stream.H2StreamStateMachine(stream_id=1) s.process_input(h2.stream.StreamInputs.RECV_HEADERS) with pytest.raises(h2.exceptions.ProtocolError): s.process_input(h2.stream.StreamInputs.RECV_PUSH_PROMISE) def test_stream_state_machine_forbids_sending_pushes_from_clients(self) -> None: """ Streams where this peer is a client do not allow sending pushed frames. """ s = h2.stream.H2StreamStateMachine(stream_id=1) s.process_input(h2.stream.StreamInputs.SEND_HEADERS) with pytest.raises(h2.exceptions.ProtocolError): s.process_input(h2.stream.StreamInputs.SEND_PUSH_PROMISE) @pytest.mark.parametrize( "input_", [ h2.stream.StreamInputs.SEND_HEADERS, h2.stream.StreamInputs.SEND_PUSH_PROMISE, h2.stream.StreamInputs.SEND_RST_STREAM, h2.stream.StreamInputs.SEND_DATA, h2.stream.StreamInputs.SEND_WINDOW_UPDATE, h2.stream.StreamInputs.SEND_END_STREAM, ], ) def test_cannot_send_on_closed_streams(self, input_) -> None: """ Sending anything but a PRIORITY frame is forbidden on closed streams. """ c = h2.stream.H2StreamStateMachine(stream_id=1) c.state = h2.stream.StreamState.CLOSED expected_error = ( h2.exceptions.ProtocolError if input_ == h2.stream.StreamInputs.SEND_PUSH_PROMISE else h2.exceptions.StreamClosedError ) with pytest.raises(expected_error): c.process_input(input_) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_stream_reset.py0000644000076500000240000001145314744265074016660 0ustar00kriechistaff""" More complex tests that exercise stream resetting functionality to validate that connection state is appropriately maintained. Specifically, these tests validate that streams that have been reset accurately keep track of connection-level state. """ from __future__ import annotations import pytest import h2.connection import h2.errors import h2.events class TestStreamReset: """ Tests for resetting streams. """ example_request_headers = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] example_response_headers = [ (b":status", b"200"), (b"server", b"fake-serv/0.1.0"), (b"content-length", b"0"), ] def test_reset_stream_keeps_header_state_correct(self, frame_factory) -> None: """ A stream that has been reset still affects the header decoder. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.reset_stream(stream_id=1) c.send_headers(stream_id=3, headers=self.example_request_headers) c.clear_outbound_data_buffer() f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=1, ) rst_frame = frame_factory.build_rst_stream_frame( 1, h2.errors.ErrorCodes.STREAM_CLOSED, ) events = c.receive_data(f.serialize()) assert not events assert c.data_to_send() == rst_frame.serialize() # This works because the header state should be intact from the headers # frame that was send on stream 1, so they should decode cleanly. f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=3, ) event = c.receive_data(f.serialize())[0] assert isinstance(event, h2.events.ResponseReceived) assert event.stream_id == 3 assert event.headers == self.example_response_headers @pytest.mark.parametrize(("close_id", "other_id"), [(1, 3), (3, 1)]) def test_reset_stream_keeps_flow_control_correct(self, close_id, other_id, frame_factory) -> None: """ A stream that has been reset does not affect the connection flow control window. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.send_headers(stream_id=3, headers=self.example_request_headers) # Record the initial window size. initial_window = c.remote_flow_control_window(stream_id=other_id) f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=close_id, ) c.receive_data(f.serialize()) c.reset_stream(stream_id=close_id) c.clear_outbound_data_buffer() f = frame_factory.build_data_frame( data=b"some data", stream_id=close_id, ) c.receive_data(f.serialize()) expected = frame_factory.build_rst_stream_frame( stream_id=close_id, error_code=h2.errors.ErrorCodes.STREAM_CLOSED, ).serialize() assert c.data_to_send() == expected new_window = c.remote_flow_control_window(stream_id=other_id) assert initial_window - len(b"some data") == new_window @pytest.mark.parametrize("clear_streams", [True, False]) def test_reset_stream_automatically_resets_pushed_streams(self, frame_factory, clear_streams) -> None: """ Resetting a stream causes RST_STREAM frames to be automatically emitted to close any streams pushed after the reset. """ c = h2.connection.H2Connection() c.initiate_connection() c.send_headers(stream_id=1, headers=self.example_request_headers) c.reset_stream(stream_id=1) c.clear_outbound_data_buffer() if clear_streams: # Call open_outbound_streams to force the connection to clean # closed streams. c.open_outbound_streams f = frame_factory.build_push_promise_frame( stream_id=1, promised_stream_id=2, headers=self.example_request_headers, ) events = c.receive_data(f.serialize()) assert not events f = frame_factory.build_rst_stream_frame( stream_id=2, error_code=h2.errors.ErrorCodes.REFUSED_STREAM, ) assert c.data_to_send() == f.serialize() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1737583164.0 h2-4.2.0/tests/test_utility_functions.py0000644000076500000240000001442514744265074017760 0ustar00kriechistaff""" Tests for the various utility functions provided by hyper-h2. """ from __future__ import annotations import pytest import h2.config import h2.connection import h2.errors import h2.events import h2.exceptions from h2.utilities import SizeLimitDict, extract_method_header class TestGetNextAvailableStreamID: """ Tests for the ``H2Connection.get_next_available_stream_id`` method. """ example_request_headers = [ (":authority", "example.com"), (":path", "/"), (":scheme", "https"), (":method", "GET"), ] example_response_headers = [ (":status", "200"), ("server", "fake-serv/0.1.0"), ] server_config = h2.config.H2Configuration(client_side=False) def test_returns_correct_sequence_for_clients(self, frame_factory) -> None: """ For a client connection, the correct sequence of stream IDs is returned. """ # Running the exhaustive version of this test (all 1 billion available # stream IDs) is too painful. For that reason, we validate that the # original sequence is right for the first few thousand, and then just # check that it terminates properly. # # Make sure that the streams get cleaned up: 8k streams floating # around would make this test memory-hard, and it's not supposed to be # a test of how much RAM your machine has. c = h2.connection.H2Connection() c.initiate_connection() initial_sequence = range(1, 2**13, 2) for expected_stream_id in initial_sequence: stream_id = c.get_next_available_stream_id() assert stream_id == expected_stream_id c.send_headers( stream_id=stream_id, headers=self.example_request_headers, end_stream=True, ) f = frame_factory.build_headers_frame( headers=self.example_response_headers, stream_id=stream_id, flags=["END_STREAM"], ) c.receive_data(f.serialize()) c.clear_outbound_data_buffer() # Jump up to the last available stream ID. Don't clean up the stream # here because who cares about one stream. last_client_id = 2**31 - 1 c.send_headers( stream_id=last_client_id, headers=self.example_request_headers, end_stream=True, ) with pytest.raises(h2.exceptions.NoAvailableStreamIDError): c.get_next_available_stream_id() def test_returns_correct_sequence_for_servers(self, frame_factory) -> None: """ For a server connection, the correct sequence of stream IDs is returned. """ # Running the exhaustive version of this test (all 1 billion available # stream IDs) is too painful. For that reason, we validate that the # original sequence is right for the first few thousand, and then just # check that it terminates properly. # # Make sure that the streams get cleaned up: 8k streams floating # around would make this test memory-hard, and it's not supposed to be # a test of how much RAM your machine has. c = h2.connection.H2Connection(config=self.server_config) c.initiate_connection() c.receive_data(frame_factory.preamble()) f = frame_factory.build_headers_frame( headers=self.example_request_headers, ) c.receive_data(f.serialize()) initial_sequence = range(2, 2**13, 2) for expected_stream_id in initial_sequence: stream_id = c.get_next_available_stream_id() assert stream_id == expected_stream_id c.push_stream( stream_id=1, promised_stream_id=stream_id, request_headers=self.example_request_headers, ) c.send_headers( stream_id=stream_id, headers=self.example_response_headers, end_stream=True, ) c.clear_outbound_data_buffer() # Jump up to the last available stream ID. Don't clean up the stream # here because who cares about one stream. last_server_id = 2**31 - 2 c.push_stream( stream_id=1, promised_stream_id=last_server_id, request_headers=self.example_request_headers, ) with pytest.raises(h2.exceptions.NoAvailableStreamIDError): c.get_next_available_stream_id() def test_does_not_increment_without_stream_send(self) -> None: """ If a new stream isn't actually created, the next stream ID doesn't change. """ c = h2.connection.H2Connection() c.initiate_connection() first_stream_id = c.get_next_available_stream_id() second_stream_id = c.get_next_available_stream_id() assert first_stream_id == second_stream_id c.send_headers( stream_id=first_stream_id, headers=self.example_request_headers, ) third_stream_id = c.get_next_available_stream_id() assert third_stream_id == (first_stream_id + 2) class TestExtractHeader: example_headers_with_bytes = [ (b":authority", b"example.com"), (b":path", b"/"), (b":scheme", b"https"), (b":method", b"GET"), ] def test_extract_header_method(self) -> None: assert extract_method_header( self.example_headers_with_bytes, ) == b"GET" def test_size_limit_dict_limit() -> None: dct = SizeLimitDict(size_limit=2) dct[1] = 1 dct[2] = 2 assert len(dct) == 2 assert dct[1] == 1 assert dct[2] == 2 dct[3] = 3 assert len(dct) == 2 assert dct[2] == 2 assert dct[3] == 3 assert 1 not in dct def test_size_limit_dict_limit_init() -> None: initial_dct = { 1: 1, 2: 2, 3: 3, } dct = SizeLimitDict(initial_dct, size_limit=2) assert len(dct) == 2 def test_size_limit_dict_no_limit() -> None: dct = SizeLimitDict(size_limit=None) dct[1] = 1 dct[2] = 2 assert len(dct) == 2 assert dct[1] == 1 assert dct[2] == 2 dct[3] = 3 assert len(dct) == 3 assert dct[1] == 1 assert dct[2] == 2 assert dct[3] == 3 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1738482098.7741978 h2-4.2.0/visualizer/0000755000076500000240000000000014747620663013603 5ustar00kriechistaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1501439525.0 h2-4.2.0/visualizer/NOTICES.visualizer0000644000076500000240000000223113137423045017007 0ustar00kriechistaffThis module contains code inspired by and borrowed from Automat. That code was made available under the following license: Copyright (c) 2014 Rackspace Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1618664999.0 h2-4.2.0/visualizer/visualize.py0000644000076500000240000001661614036557047016176 0ustar00kriechistaff# -*- coding: utf-8 -*- """ State Machine Visualizer ~~~~~~~~~~~~~~~~~~~~~~~~ This code provides a module that can use graphviz to visualise the state machines included in h2. These visualisations can be used as part of the documentation of h2, and as a reference material to understand how the state machines function. The code in this module is heavily inspired by code in Automat, which can be found here: https://github.com/glyph/automat. For details on the licensing of Automat, please see the NOTICES.visualizer file in this folder. This module is very deliberately not shipped with the rest of h2. This is because it is of minimal value to users who are installing h2: its use is only really for the developers of h2. """ import argparse import collections import sys import graphviz import graphviz.files import h2.connection import h2.stream StateMachine = collections.namedtuple( 'StateMachine', ['fqdn', 'machine', 'states', 'inputs', 'transitions'] ) # This is all the state machines we currently know about and will render. # If any new state machines are added, they should be inserted here. STATE_MACHINES = [ StateMachine( fqdn='h2.connection.H2ConnectionStateMachine', machine=h2.connection.H2ConnectionStateMachine, states=h2.connection.ConnectionState, inputs=h2.connection.ConnectionInputs, transitions=h2.connection.H2ConnectionStateMachine._transitions, ), StateMachine( fqdn='h2.stream.H2StreamStateMachine', machine=h2.stream.H2StreamStateMachine, states=h2.stream.StreamState, inputs=h2.stream.StreamInputs, transitions=h2.stream._transitions, ), ] def quote(s): return '"{}"'.format(s.replace('"', r'\"')) def html(s): return '<{}>'.format(s) def element(name, *children, **attrs): """ Construct a string from the HTML element description. """ formatted_attributes = ' '.join( '{}={}'.format(key, quote(str(value))) for key, value in sorted(attrs.items()) ) formatted_children = ''.join(children) return u'<{name} {attrs}>{children}'.format( name=name, attrs=formatted_attributes, children=formatted_children ) def row_for_output(event, side_effect): """ Given an output tuple (an event and its side effect), generates a table row from it. """ point_size = {'point-size': '9'} event_cell = element( "td", element("font", enum_member_name(event), **point_size) ) side_effect_name = ( function_name(side_effect) if side_effect is not None else "None" ) side_effect_cell = element( "td", element("font", side_effect_name, **point_size) ) return element("tr", event_cell, side_effect_cell) def table_maker(initial_state, final_state, outputs, port): """ Construct an HTML table to label a state transition. """ header = "{} -> {}".format( enum_member_name(initial_state), enum_member_name(final_state) ) header_row = element( "tr", element( "td", element( "font", header, face="menlo-italic" ), port=port, colspan="2", ) ) rows = [header_row] rows.extend(row_for_output(*output) for output in outputs) return element("table", *rows) def enum_member_name(state): """ All enum member names have the form .. For our rendering we only want the member name, so we take their representation and split it. """ return str(state).split('.', 1)[1] def function_name(func): """ Given a side-effect function, return its string name. """ return func.__name__ def build_digraph(state_machine): """ Produce a L{graphviz.Digraph} object from a state machine. """ digraph = graphviz.Digraph(node_attr={'fontname': 'Menlo'}, edge_attr={'fontname': 'Menlo'}, graph_attr={'dpi': '200'}) # First, add the states as nodes. seen_first_state = False for state in state_machine.states: if not seen_first_state: state_shape = "bold" font_name = "Menlo-Bold" else: state_shape = "" font_name = "Menlo" digraph.node(enum_member_name(state), fontame=font_name, shape="ellipse", style=state_shape, color="blue") seen_first_state = True # We frequently have vary many inputs that all trigger the same state # transition, and only differ in terms of their input and side-effect. It # would be polite to say that graphviz does not handle this very well. So # instead we *collapse* the state transitions all into the one edge, and # then provide a label that displays a table of all the inputs and their # associated side effects. transitions = collections.defaultdict(list) for transition in state_machine.transitions.items(): initial_state, event = transition[0] side_effect, final_state = transition[1] transition_key = (initial_state, final_state) transitions[transition_key].append((event, side_effect)) for n, (transition_key, outputs) in enumerate(transitions.items()): this_transition = "t{}".format(n) initial_state, final_state = transition_key port = "tableport" table = table_maker( initial_state=initial_state, final_state=final_state, outputs=outputs, port=port ) digraph.node(this_transition, label=html(table), margin="0.2", shape="none") digraph.edge(enum_member_name(initial_state), '{}:{}:w'.format(this_transition, port), arrowhead="none") digraph.edge('{}:{}:e'.format(this_transition, port), enum_member_name(final_state)) return digraph def main(): """ Renders all the state machines in h2 into images. """ program_name = sys.argv[0] argv = sys.argv[1:] description = """ Visualize h2 state machines as graphs. """ epilog = """ You must have the graphviz tool suite installed. Please visit http://www.graphviz.org for more information. """ argument_parser = argparse.ArgumentParser( prog=program_name, description=description, epilog=epilog ) argument_parser.add_argument( '--image-directory', '-i', help="Where to write out image files.", default=".h2_visualize" ) argument_parser.add_argument( '--view', '-v', help="View rendered graphs with default image viewer", default=False, action="store_true" ) args = argument_parser.parse_args(argv) for state_machine in STATE_MACHINES: print(state_machine.fqdn, '...discovered') digraph = build_digraph(state_machine) if args.image_directory: digraph.format = "png" digraph.render(filename="{}.dot".format(state_machine.fqdn), directory=args.image_directory, view=args.view, cleanup=True) print(state_machine.fqdn, "...wrote image into", args.image_directory) if __name__ == '__main__': main()

Z tpYN#@@@@@@T@_1ߧO< Jv-n| #I__yf dggg'?jnpY1cd޼y@79      :6|ppVƷv _v__5mҪzmަ$p~f۴ip#   %;O# O0AIBBB}q4KڿK% 7      @hK=L6 P#G.G3ܹ3o!a   ,PߊW\q?fÆ u7x  PM z5wSVۑE@@@@@@ObP퐾ݯ-]k^·:޴>   &oӧ_?#k%{}\]S~$??j_JxZa#x#xՆ       4C0ķv^4)==F5ߩS'i׮DGG7R   @ +++}棏>*oĉui(yꩧ䗿ͬC^       PZZj`ݻ/ݎ55A|;oyZZ    !#%[ni<={uIBBBק}R_믿^'[8 @@@@@@@rr4oviBt{YYSV+{ڠ~]M+2!   l g| 5-ZȜ9s/=XB@@@@@@InL4ʷ|Ϟ=V 6m2k;;vuk; @@@U ;;[,XP>Q\pA;'x߲eKy?} @ p@@@@@@_u֢m^EEE&o]v! Ŧ_;t`v@ 2@@hZ)!!A?ֵvsena&@a~      A]t1K=zη_m4S!WwI4A~&@@@#ѣG]m'x-", @QUT^      Vߵk|_}^W@W-Z0~k߾zZC@@QZrssk׮/I-##C8~h~1G %'B@@@@@@H8|[8_v\RRۍmۚ`퀾ݷjL   )r'''{[o%]v6ݻWڵkiۺ:K{=޾ xPNN      Fȷ"}'&&P=׹VgB@@h\N:_uܸqGU_]ŋeѵwEɜ9sDfdB Ԝ@@@@@@`bسgOj͊ ٽ{3oSIYYlٲŴZw6ʷiĸNv@@@kgg}ևkRPPPs˚I&+"D]X"˂I@@@@@@@,233Mw |_\\,6lPeu&o~eBR@@0g/YM;u.뮻d?1!@ߘ+       > h^[~j߮A|o=-z* ׺9Zj%Ճv|;}hѢ@@4}3ԱcGy]W׿_bghq4       T/++~iii!}ʯ(-- }@@@P8yRRĞk_GG8Svv5'|RRSSP=xc]xƌ2eNþ (#U8@@@@@@@s PBRhu| !}i޶m[ч@@@[1%փŽ?|XD_\=*?k^ְ?DbcW͡gI߾%9Y}ͦ[/=3-#ý:.IIIV1f͒K/ԟ/F }` 9        Ь쐾߳g~jelժ3_=oWַק @@Ozj/[z\1?V^$ ?1_ุ֭T4i}XELt?;G @=C@@@@@@@(// 5l'~]:Vɷv1џ6ξx7p6m\v[U;KQΝ"֩M۱T.G}_/:~njncB=@@@@@@@ "Ye65!|׹k޶o>fJozs!6ViN׹k?*R^j@@|[+EVp̿Qݗ㭗M{;=zح[7X_TUUYA|֭"}'oЦEъL"Æ9y׮>4 c&@@@@@@@Аv|׹5DѠMVj W'''qvE@@72G~?w4??OO;Md}{w:g/(p|֯^ Vo5J3m:c"Q}$~       @ hPTw ?~xP*a|@mOz&('E@YTDC |VYΝu4bCp WVl]lRk}KV3F?9 ڏa+"@>B>Hn@@@@@@@ JJJA}!}{ڷ:t(hw 뻆۶m>##,nZbcc6N  Z/DoGdٲڃȑ"*ҡC㏛+NPdJG[5`u VyYxbCx Ϗ#      4' pNٿ(==] ~m󸸸# /k"| Gb9qGַ/!kZE+['玦o@غk'r";sLDH$@@@@@@@< >|ַC?xTj&HSZZ׾kC 1kJ@IDAT" S ?_wM{z3FdXG7~6ljL(2aHVX@a"       ('O4{pz]Eub,EnBvX_Gk҇ @@Z%2{#lqg?s˵jyfXw9ޚ" n=8PKERDߞ@ "       r?p@pk@zp_fX_C[RRRBΗ! Ѐo:چ 2`%/2bHLX/"Kȼy"~EZ䪫Dtk1!0@@@@@@@@UU|f]׹;Txg5}{.'%%u\@Uz /"+WV?t}s2e#ߥ6hd @@@@@@@@ ķC?x3ێTO)!! ]OlllFi@@ExBd\>nر""2aH\& 2ٳEg+܇_\#_羍%I}#As@@@@@@@@Va| WA~{}qqTVVz@mLII1!};<`>΃ .yaEo>-Q~Tm,!+W<ȬY"ǎ(.yaN@#od.       MJ:da|]ʾ|rr[h߮ns W'&&͏# }&r5"?7h HػWUsK.y!\,!$A        @ U]vH^纬v̵h4!!F߮okp_ץYi # XkE~+?t?o~"ȕW2w"[LdL'ٶԽjXEz8A xTN       D2MN5e4|o5o~m)))4R. Ȟ="/F 'N|VEyD+z˩h_DDNik~ "Z  &B@@@@@@@@ee:tkHεo7 7ca|o};:j$-#Z @ \)rM"Wt֎*j==p(->]䩧DoOg- "}k#` &        a#PVV UP~]˺sJ| ܢE2BQ$oE}VIAZrm"o'b70U+78 r"~o1!@ p@@@@@@@@f$PRRb*a}Osm}EEEk9֯OKLLlqsA@ VZSw9bȌ"ZG}S9R> x_4A@@@@@@@@^5Zi5׊M1ixz`?--ͯ@RRRS k"!%PU%S*X"O>)r-"֋N@5mg))KpCOY}sw@@@@@@@@ЊZMvVrlll~0zzh_nOMM- ?2iȼyH%'"\"ֿ=;tyM1c: ( O,oЩS'E p, @$vA@@@@@@@@ ;vFx 6M/))E[e5oWwW_ix/̞ QRb|Mo%ru"Ǐ;u"o-H/~]t]Cu;v={7tRݻwɓ}vٴihsΦjժ [/)(peKsyahf@@@@@@@@  k^Aˮ+[)'^zs=Sc{m+aӧٳ[+ݭ'yرr\ wq[3g<n]߿_s]e0nZڵk'#F0/F{1kPW^n֯_w6l`Xvm-5[XOFhn}C۶m7|S*;<#v_6 >\/_~Cq\+DT'}FE7α"E *"j@@@@@@@@hZ7==ݴܱ \\ѣpT;oeV8RN:&ؓ>Y/1o#P [D>HdԨp;L         l4U5tpV7_}'N{8@նwz>P}RRRA~vdBE5xZ NLAU"^+RY8o+;}駟֭ ߿uիeҥRVV֤c֋۷o/e*/X@4`:M:SNNjg_է!CzVVYn/_~|wwkYZѣJڑqN:U~%_x z^M&L "ݻ0 x8\@@@@@@@@Y@Ú|5U=Uא/>!8 կձa| aumpS x w_M;MJm %Vapxc<(yyy5t݃>Xc(,,49sx+/^,.-˖-s1xǝC=$oskgɢؓĉUn*yw1w˂5iرolٲE6m$?d&]ѷ|.k÷Ry}2b?!/F<         @ $&&6I!|_>9rUʂc`:V=d*{ {ZUum-ZxVGU[e*_kk8y̘Q߳q<޷G%>~.]ٳ[o5k+|IhEn{{ kuz;iӦIJo^{k^%\b> ~ڤoӧi]t\~;w:cJO2Ź.;11b}-o^`}]w؃%@>X@@@@@@@@02ߺukqkG5~׹5tU2x޽!qc%:5\k4eCe~'[G?;'Za% 6̄j9s.+.8kWGvI4d:tM]=]_ ,p-"}u[g/h0;uS4mٻEܖ  ^zۺ'3` eՒ#w}秬]d b\|o=w@vO,         Vjzʯku@NjVྦྷt]BBB $⽧\Ru]r5טСC=n&ƱJgϚ%KX/v~ ks6t+ٳro3pZ^ojP[~(>&11QxcL c_4mӟt=b[W0w̙3݇.VX6,u[iaȑncI#yQ7o^D2IXϝ0! x鸞         ) [˵j 44^}rm<<} СC5d.'нk{ }/>>J7ªUdU\}զ k*.VL]w_.B8ylݺmD?OܖCuaƍnC;$F_IP4h =k/Zl\߫W/g_;|IGB6mOK:oz0<{P^xAM1 %'B@@@@@@@@@v-Z6 jptm| g{ WUUk=wK8ϧM`7,^{}z}o1k֬2 L&k[}0@yŲI\_E\|qĂ1`pH @ @ @ @@AAA4l0gJ-[><,\c}vk.՘id6ڨJb|ݺuK͙qa⮻ ץ*uO>5jkՃ}E*ZV]n{{g}v|_n)SrK<ѹsԐnesZNl_J=W|aUa#s"Ǝ81#Z \V/ALm @ @ @ @ @@"h{=>8g0(C**?я]/v=[pa6ŋg˺39w1jԨ㩧ofOݻwϬptA6m3Jb|i#:5j;gyf<#_m͚5+6LJ~]w]\>W I&+Ueo~Y|Pxw] @ @ @ @ @ X4լY3wW_}u1eʔkb=LM~mYDfjO?*i9sJX4RSN9%&MnaxwԿq ҋX*I5P @ @ @ @ 7j(w}wz1cvۭ*E,1/ԩe˖ ?Y0u*6lS,O>VUx a]2Oi 84+;coVUKz8X*|o|֬*MVd" @ @ @ @ @@%>YN?=z:uuG _֭͛78s>'O\W<ǖ]amƌ1o޼HV-z狅ءCb`ܹ5CyE@}Y%@ @ @ @ @rN`dv--ӧO$sז֮paD>ݫW;|O?tL6-ry[Wֿ[㋝o׮]u9hРAᅙ'8g{,}@`{a_7޸qMQbeQ @ @ @ @ @rN`Μ9Q?Sjm'|ƍ /\&ޤI7,mf͚b 'rlgG}tÕgeG]=y𠼶I&*)oذa\;H 0`@6d8蠃U׃MV Ueҗ @ @ @ @9N:E8Sy5֭>=bzJM6qG믏_|Xbg{RޡCbSo˼`VVv?C3g\,YrKݻw/PC9p{>iyC|7[$i ȝν  @ @ @ @ 7NW_k5'?)xq믯Uj\PlxgϞSO6n)v_~į~bӿCIl+n=P\r%Św}u]%n*>W|… 1r#Y?_' /P,v!?bmזe.@M] @ @ @ @ @ $ط^4.KҥsTm۶:* {Μ9ѧO8#?iƠK4i$&Oyx7/NR̞|x+k׮1mڴxo¥A;^`޼yq7~d8} 6W"L0!暘:ujM6]M:pAf;l֒4h|nKKVo gϞ=?[2j~پ(#Q_9 @ @ @ @ @`I uftԜNj/qHx1z2vz뭫zifҘ1eʔ;6kH˲׿NW5楗^d5 K=W7GVwNցN:餸뮻{-aÆŎ;X1UcR]ݪUČuF|eDÆU9#0) @ @ @ @ @y#;\n;-έ'+?㑬"_d%dV}_1du뮻nqL%v͚5ep Ӈ–ࢋ.Jb/E}Yz}WjEĨ"] @ @ @ @V}*&s=1jԨw}VZ훜e]U㯺]jϕDFV'+̗sjw.1]w5fΜ?9B5m7A|zꚺgVY_kdV甬ߴi̛as9'~>}z\|ULWme-[_b/_ 3[&/o @ @ @ @ @|UD˖sFdjU|ھ=zt|'Fmj*fvms#3yp?>,6lni@ǎ*~!Lιtf͚Eu'1SZoP |ad~Ghu{rj @ @ @ @ gqE1_5 |dP".`c yq%I @ @ @ @@f̪s=yrD6~ PA/ѭ[Ś7̛ "5L  @ @ @ @ mѿQd DXgWڽe" @ @ @ @ @RwzO?q5k9aT@ͤIE!tqI@AafD @ @ @ @cFtxqD=ѹs]dA# bx_ @ @ @ @ @l\P4fˆCò͡7#0aBı.+_aoyk'@ @ @ @ @T4"z۵*L`ƌ~(GrJ]ޅ*vÄK @ @ @ @@LE}ESQlo~sN@GEw'Wč7!zq @ @ @ @ PjF" hݺh={F|MБ HV#..CFԮ]w*+: @ @ @ @ @&вeĨQo^+&k|7ߌ=bqLj##5D s @ @ @ @b[nYT|EFD&TDK DL:'P>*;G\|qĢEEs1qbD^s 䧀&@ @ @ @ @*Amۈq"*gy爋.7rI@`֬_:S S'⪫"y&b-ARTV8 @ @ @ @ @ >"zkY[m?E z%K"+#>lYdnhnY= 0Ȋg( @ @ @ @ @`mu81#-";,"9Kk;qC`]v/7jq/>?~v% @ @ @ @ @@1:u".(7":h٩^}"䜍eǾF1iRQ{AAıA׿Jzr*F @ @ @ @ @^`m#{,bt?pъ}$P=3IR7.{"6lY=)<5E @ @ @ @Xd "n=U #-*'bذ**e mCIAn-kG`}f19  @ @ @ @ @^`##><:E?yD͚9"PϏވkxi1p`D~5,C^~}њ @ @ @ @ PEqGQp#N;-S"Z(~(0uj-x;[Tp6ֻN @ @ @ @ @rX8bȐ8kGgEE{m:r]`ˆa"n5b%KGܽ{Q}9"PA +e @ @ @ @ @&0ztč7F_IA[˖q m,>xވ/([ݺGqY;?@%(t$@ @ @ @ @GE|sG|SEѢhS#|0b~ŭUO8Ԉ6Zc&] @ @ @ @ PNEnp @ @ @ @ @$wqoT2Es爟,C"n> ^xBԭC̛E'n|2-c8f&! sΈ @ @ @ @ o1xp=Ӧ&3]fYH:)?^Vů_?{R |}ĨQO=1lXGof((h[)yslf8  s @ @ @ @ P.gώ/<ژ?~:g]cW9z{{1-xբb#^|1bQd|2%lI}RӱchРA #"P +  @ @ @ @ @ 08}?^-)pӟ;Gx챈^X8ۥΏ~TT^=zDcDź8~Ĉѣ#}6"UWխѽ{D>]vXxWum5kv'm۶V "Wk @ @ @ @ @*J`b:Fg*TBO\p+$#GF8zuaaE+DXzÒȷ>2+/KDL $+׿Z+Dj{E$m?qD&>iE#F޽{m?y֍O":u}-X8餓⮻*MuSy2ॗ^Jy2什|ȟ @ @ @ @z?dhx4㎋*7o^aI͛W^?>b„ KBB~Rԝ/luDVEoIdV,/\+3gF̘|EG$o+(V^D۶n;`}= 1?T@=bر oz i  (K @ @ @ @ @T%G}4:裏aTNr-ѽ{l[e,XPT|oQyQXXȒ6|BM7Hg nQVεމۗ_F|Yħ}/䓢B>)N!yx!y!)yOF$?Ti& 'ӶFeV'~+6 . @ @ @ @ PEM?c ׯ Q{}-QںdC'ҕgZ7LuOӦi "Y=ԭ[|?)DO>III{ߋEdrd~Ir|?uݒ7$o ~e+q]/d^<(2/AZk@IDAT۝w'xzٔy*>Oo  @ @ @ @ @*"(S}uŠAbΜ9٨8[ne*|ղ"S>}z~RnVorwH O&UGc9֭[3& }n歀'@ @ @ @ @r^`رqiŤInq 7D߾}m3{vG|iϖ}'I"d%/*X~dM6h޼wm[֗+ctZjkڵ+9MD #π @ @ @ @ k 믿>,YWfկ~]vY4j(BΩx #?e~(O Ϗ7o'9N>/$oCdnCԨžu+^zܠAdʟƍ V&>}O,YfqwSO=[lE9_t7ߜ\_fkcر?1ԩK`ҥK\p`L 3[=$@ @ @ @ @(gy&]{ƌ=и馛y6;]O?v->)_ɓOW_}5۶N;w۷϶!PFAV/ @ @ @ @ @ ̛7/=ٳg,-oڴi~X}YAɃ(>hԯ_~ŊI}e]]>)ܹs\uUdɒx_s @ @ @ @ @uHV>⭷δƝwoy+ <8>N4j(lV:!)?^[{G}VmvB@҅ @ @ @ @ Pfŋǥ^]t'wp 1bEe5 WJ/KW?Fcƌw9瞕@$+ޗ @ @ @ @ @`-L|7.;cǎiomC,YrHyDZ<=orԩ1~xr-(fjx @ @ @ @ @;}٢8.^z)ݯAy.V;q7>֭[q'f5 ~OgX@;VwV; @ @ @ @ @@8O9scvx/.sp.<hܸq;/v}ʺQF<Cņn~-Zy ̖ʒ @ @ @ @ ~^y8ꨣ^O?ϱd 3gLW1bD6.]u6;+0Ȋ~  @ @ @ @ @H?k7m4 rt5hѢE v}tӝ{F-6&@ vyxWCI]dI 80<@@{ @ @ @ @ @rOdt1&M/ y'@ @ @ @ @|p|ivmƍ#:.(,,LGva1~h۶m)fЅ|k^v-M~ߋK.$GXS n˕ @ @ @ @XI`̙{s5jԈ+"zhԨJ5 @`61c1b$ 80?={6j(T) @ @ @ @ @xWU퓭aÆ#My+P^?W_}u$$СCk׮1mڴu+wV^ @ @ @ @ @@<@kݺuѧO9I?x4i$m~ףcǎ_W'z @ @ @ @ @1p8ꨣbܹnݺ/ڵ+l @ qŶnr|ѳgϸ{TFJ @ @ @ @X9sK.$Ogy&~g @m]Z|߫Wt ㏏/S韃 s @ @ @ @(/"{:th:y͚5ko=ԩS4#y'дix㗿e6A 'I! d^RXu9 @ @ @ @ @`~$P{iƍpA%K{?p4kl-f3); @ @ @ @ @?~|tA矧l'vڭ xGcso} 6,r˼bjTK @ @ @ @(O<{W~w^zI}u$@`]==ztl&4ovt%lUK@}պ_%@ @ @ @ @J)pm!gNG#hٲe)gЍ.ЩS;vld7FW  @ @ @ @ @%0p8b%<>|x4mڴBpdZn/b$%[@Az?/>  @ @ @ @ @R $'|r\r%w^ <8ԩmCHyꩧK/p8ckEzk!~- !@ @ @ @ @rO`qGĝwޙWFk XD@ݺuLȑ$dɒ8묳⢋.;vK @ @ @ @$0wӧO<鹤s9g PCAzk\x0.83Bl((l9` @ @ @ @ @e㠃1cƤ6`xGgϞeEWT7ޘ> {7j׮]bIx_s @ @ @ @ @@N |ױ>d7nÇWtwMp,8묳2$;찘?.sD@}a @ @ @ @ @eϢG1~tnFnݺm"  P{,ׯFr!1o޼JʥWPxc @ @ @ @ @ f̘ݻwI&h"Dr>v @`E?  4HO%o8c+vu\I + e  @ @ @ @ @xӢw}7UVsŎ;vEH7n8&yG^ρ脠o @ @ @ @2SN+MƼۦE[ouAX@׮]cȑѬY?={ovuCW v @ @ @ @ @`O{w̘1#]v1f̘hٲMl4rHSN3ĆnF5nܸw}W=Rx_7  @ @ @ @ @5 |i~vn۶m<ӱ&yb۷ѣGg{WceR}Ux_}L @ @ @ @ @@9sfZtmvjoqWRHvib/r;fϞ WK @ @ @ @ @c})Sf5jT4o޼tE*,ۧoh,ӧƠ7 gU5CWx_5  @ @ @ @ @@/Ӣz+u-L7tj  T Y~ĈѬY)yC ,WK @ @ @ @ @ec}ɓ'bxge˖eHoTSO=7NI8XhQ5Ȯjj'Q @ @ @ @ @={v;^47<-oժUH+ t)  4HO_c9&,YbWA@z@5% @ @ @ @ v ,C=4ƍNТE5jTlVk7QF]v{,ׯfYgU2T @ @ @ @+dc=6FݬY>|xi&$Kk:thԮ];vM7ť^ZA@}9  @ @ @ @Xw_1dȐt 6 h׮ݺOlT38 (((H3袋{52Qx[C4 @ @ @ @ @ /.첸[ܓU՜w}4J#!kvM^zGvW@}z @ @ @ @(]w HG%7'ǽz*, @ '&xׯ_3& * c @ @ @ @ @zjW_G}t,pUWv7o^r!1y9[fVQ @ @ @ @ @Q_nݺ?tg 7ܰNXhQZp?lذ4-"^~dMcd<Ȋ֬ @ @ @ @ @@ 3gΌ:([t߷o߸JNVZ1dȐԩSei!~|ޗY @ @ @ @ @R ̙3'>裏]t{'jPXJB l׿"Y>ƍ'xbWCfF @ @ @ @ @k)s1ꫯ3n:-WZh,h޼y`\~,5k֌m۶8 ^{mEc;ePx_v3# @ @ @ @ @2 L0!N:쨤 t!@8s3H'?~?O>|/G)ϣ-U @ @ @ @ P_|Eg?9s椗O 95  W7xciΟ}Y7.\W啬4 @ @ @ @ ŋ㨣ӧ~ӟ7߼R?  PjՊ?ZjNK/E nf @ @ @ @ PJ . FnѢE}mUx6j @ @ @ @ @xҶ֭[-R-ڵkaÆi`wqG<dESPr( @ @ @ @ @UL`ǢEf͚'vZŲ.S{?>MI&1qHdb @ @ @ @ @̝;7;>w(/ dc=6b֬Yq'W) W6B @ @ @ @RϏwy'ݹs0`@)GF"pM7eWg#9(aWe˖qE .^8<(,, Y9E @ @ @ @+2>Twq衇R!@<o~;cqn˓̋Yy ?9( @ @ @ @XibyE:u7ߌz=5 @@u3fLizmQ{ѤIdUh#@ @ @ @ @Rwi}rp9( @@ qGqW䝂K @ @ @ @N矏ݻ7d2eJ4nܸt"@j%0}n҇ի?e˖*} 8N @ @ @ @ @o.StհCb-N7o^\py`ݒ%@ @ @ @ @:th7ܮ]8qbԨQt"@j)0k֬z㫯xW}2   @ @ @ @ @@ ,Z(?ÕW^>a+ФI袋RX(]ţgˏ @ @ @ @Qo)SsݻwgНglMިQbذa5byd4(, @ @ @ @[y[o|Ij0nܸԩSzHV:th7=.k+w>-x_}nL @ @ @ @ @: tM٢C=T:Ov-Mlĉ1dȐ Y~ @ @ @ @ @ _~j/5jo;crțJ9rd~i>&O5k,aD>e*}O @ @ @ @QO)mME&гgc}KU ^бX("`O{{IbC&715I,G%U]{]`DQA)o=9N/fWw7dk/_>b @ @ @ @f |GiWN~aj߾}zS>}>5J`ԨQi7/ ߐZ n[do[n  @ @ @ @ @@s9Y}̾~ of @`2dHz뭳+/x|Fb u @ @ @ @ lӦMK:tH&LȎ>2QGI FJ_q]~ @ @ @ @4Yg"> 辩OH` 6Ho}^}t_￶P#@ @ @ @ @8?0Eرcz饗 +s  @?xַMf_#  @ @ @ @ @@8s *_R.d˚}MM-l~ @ @ @ @ J"+>Ծ}/fǭtEX`̘1i{^xԮ]V:mM:qL @ @ @ @ ÇgAw_A еQ  J[mU/B'} @ @ @ @NO>$ wǏO}i+hFJoq׾}qƥ6lR9M @ @ @ @H?O)?t@^e+0dȐfe ꫯn 4j27!  @ @ @ @ @@k1cF2GFL @ 92m4 Hꨣn!3 @7^CiذaC?3۴m< @ @ @ @>\sͬs^҄ Rvj7X/ P?8?L:uJzZfe1S/  @ @ @ @ @f8 DbAh"EY$r!3gL_hV7 @ @ @ @hQ?3}giEM'ON /p 8qbZeUٳr-eСC[2޷+f @ @ @ @ @#FȂc 辮 @@VXaN;eNzՒeoI}k @ @ @ @ @& ý{2 WTT &>}4'@_ <iM7 FɶQm\'$@ @ @ @ @曳 Q M6$Z cƌI?xfk-U  @ @ @ @ @8 (U @@s z衅;BT*~Yf @ @ @ @ R߾}z7n\z @F1cFٳgzRΝӔ)SRni&D @ @ @ @ @e.t 4@ٲW4 3 @ @ @ @NYfezԱc4yԽ{ֹY"@oرcӀϺZkz|nʕO @ @ @ @ P[o5E}wQ}]%@&߿4hP6O?x&Y)&lII @ @ @ @^XX @\X~ĈzkTM @ @ @ @ P{)SW\1͞=;{WSe\ԓJ`iKbյkצZ=_Ƣ4 @ @ @ @h%_~yt:tVr]lRZxӞ{Q|G馛nj,eI @ @ @ @ P{+y.U @@k(T75쭦=TtR; @ @ @ @ жƎ mzK?xvK 9sRϞ=ԩSSݻ}bּ;{#@ @ @ @ @&0`*ԋ+ƍ+>T'@M&СCꪫ_YYctYf믿>|%}Zہ @ @ @ @h@~SEEEz +Pe8 @'NԘ1c*u]U+[fl @ @ @ @hرcb 76JM`РAiV9rdzm}SLjN @ @ @ @ @n¢{g^Se饗Nj:[ફJ~<3HfJv[w}ٿ%OVM @ @ @ @4@d~G^{B&+**?zӎ  @@VXa4iҤԳg4qj{衇Ґ!Cskk Ol @ @ @ @ @oVzGYZk @Zjl+}6wcO$EG @ @ @ @Z@NsVaZ`$@uLm]6?N?p&hR @ @ @ @ @"KV@IDATSp^fj޺eVRxJ.m @ @ @ @ @s=EY$ } u ЖV]uv_{BT޷+a @ @ @ @ @'OFUTT={cC @@ M "\[ @ @ @ @ @ȃZjԩSNchQxx,"2iҤKuQ @ @ @ @ 6{lݻwo.}4eʔ4u4wܴ*W^><0s,4AOV[mԻwTY89̙xK/ٳg+^M]W]ܧU{Ict1-"iڴioimFi" @ @ @ @ }Yh+ckI'Ntk8 i^</#ںvZЃx ]pKu>g.]RI'f:/",2ivH;Swby{eg*[lE裏^k|Ye" F}ZR4>j~ij+|Jlnٍ @ @ @ @ @5kVСC?Z( JG2f=ȂDٳJ4;KW]uUu)=#i֪v̩;¹[.ˠ_hh`eƌiذa/|g ϣ>:wK?'rGoyswX~ɓJg٢KNo[:蠃 bͺ|Zr)iKw0JpV4Mq.(1c3ϮTU_67M0!-/TקNl7i[ @ @ @ @|̙*)FW G5~?%]wݒ|iȐ! u"}:siek}LbsȚ?mڴyuY[ujN6`oTCSkpV"MuOZ̞=;;,V|%%wgm @ @ @ @ @Fvڥ;?< Tc `~O?-ATF0Fmoӧ{,=Yv+ݻ+>(ox?Az'K.h:SGpwߝ>x_"EW_9*bł޽{gW^IcǎMO>dz  '[)7 pK (S>o.]dow/F;SЦܧUISޫ?EڵkVp$\[ @ @ @ @ @Xht^=T7G6>_xᅩU}g裏NÇO ӫZ2~^K:7MJzmnHK.d'?I:s^h K.$ /4A7ziw.n.~KO=TZ{KΕ>[ޭDZ[o4cƌziĈ/(뮻_BJpVM}O|Gak ,ި: @ @ @ @ ж_~l'Nl59sfodc=ҨQ G&;/qiDܹsK7F}~%z~zhRSvO>#2 yn;~=`^<1Lby3w9ˀ?)=U2Uq)PZj>:dCd=zD+ o%6 @ @ @ @ @@}z `{>S4?~yftWۗWwwuNem偫 -"{{^ڵk.*ʴnIJ 指 M7ݔYfiwςk;:5o~l>}(І>4k֬6㚷>j{RK&Jj޷Ka# @ @ @ @ @{챺O#Ǝ8㌒Y_|tdoRx_>k[+(7wϞ=KTxO>Яwi.7F7HnT{Iʃۼa /I'=_: >L\æWݧS}Bmo `y @ @ @ @ 6ڨ0|ԨQzKU^%#ԣGFRyke]Ve߇z|v֭ϛoYezK<@>#z饗ҥK> J}<@1ut)x"~kI -i4_S߫y%=PÐ!C RxZ} @ @ @ @ @zDpbeW^{m=fh!ӦMK_~yɄkfoJrA܍xElkK.i8}3g,:cƌǧٳg5<@O>iEi贩|Z%kO0xA8;wnS2BGtVw}7ߜ5] _TI @ @ @ @Z\{i6dg% =xӜ9sJm0xɠ7n\QKJ{wqM}Qɩ[d|/.Ja?Q6$p}- 8$V]ywҙgݏW\qE ƵD4eߧq-^4I}mMiGe]|^z @ @ @ @ @@ &on]g_|k^%d`_tESdnH vmUאZj/men>|x뮻a~nݺ^xKgysExW^)cu)97(9Ud:8cӮ.t饗ɓ'W}|u衇}'tAiUT4ӸM}OǯGtI75[U' @ @ @ @ P+و_o'd=3uڵO>d([QQQV׃xdH%m5%]vْ8;Sȴr˥Y0_z4eʔnZkUG]2>zť6#o]E7n\6lX#jiE}k2E @ @ @ @ A[mU6"2+G{y:LWYcM6٤k@;:Sr\׃^{-Exqm0 P^筭ud//x+cyTr%'?IcƌIH|QGeA%<6mZ߱OҮ>MuO }K/e_ c7'@ @ @ @ @^"]zY0ɓ?eX?o75V_}2˔5 ˗6H}* P^x!}%6tӒvڥ;.qkM#FH=wny睗];3i]v{e/妑~Vvݦju]G>}ҋ/8n~N;-Ev_|qS<8R\x_"tAMZw~;4z4ŽZ~?};#w.Jÿ@_ @ @ @ @@djfmN^}4dȐ??׿uZj:eGk6Jdɩ:?KzRی.ޡC⩚{4|[ߪtg?/4t޺yO~ '?tjs=ii᳕-  @ @ @ @ @FXmҨQz뭗=ܴ+gمF\yK/W<>2FGpsCJy r9 (LË.hfmuzwK5dp  aBsyK,Q87̙3W4?9ϭZiȑ5Ly0aBH޾}հ,11˭ѷo|K5q?.97Ai֨㎵>K7pC\Y#踺ҭ[Wwܧڇ[ ^{p.qߚӧ'(SLI;s s_2UV\U.H @ @ @ @ @(бctꩧgW\>裒ٯ#1/Y'?7`ҥK#g)13/%kt#lŇWTT#8"ǯD*Re:ٳg~um(7k{,SzWs}WiӦո&l:蠴nΝ;دOOm4f˽Z~?-i}o_5C#<2-ߚ:oMW^ @ @ @ @ @@# DtYgo9 1bDҩS?¼'O.2~,s\xߵk)% 5iqYveӶn[T",R2]v)毮6FXKQ{~Ưur!_ݯw4lC7 @ @ @ @ @@ Df=#{LoRd}lőU>%2?驧* W ƨFF4xӧO/bIF>oR_(wM矧{Ν~|\D A<`ruץ/8N٫+q_lYN;;ے}ڸi\ޫ߄48䓳⁦eY&|魷x>|xK~emh @ @ @ @ "K;(_mJPG>裴b5偫=z(ߔ)SJ;8SK#{s6V[J)>T/tM{;/* ܫߔ4;/~~P? @ @ @ @ @-/>HgyfqSȰ^X_޹t\^K/rMȑ#E]Tr>Sp 'dٞKNNwygI_8?ls/̞=;WJGydޔGN;mA8x Lm]ĉ)Z[}OK0i{} Fx`\G @ @ @ @ԡC=Du]WV|A_|q۷o\q}ܹ%\cޯ%@N:xBNK8*.h`_رco,J^yx T8K 8'̫ /V]uՒʯ￟򗿤Av_\"P+L;w.n^ +Bv_}+N)~i+y[miwv[o @ @ @ @ ׯ_:JivKY#3<~tקgZoyj/bKΟ{+iz뭗;n/|`K.zyVYeofYG"@>//OK/tTxσ3ȂckW_={ _z,HsI]\Ydtצ]7y36K-T*** =FViӦe{-G^\sͼi{v!tAY>z{Sݫ\W|ܶm;&@ @ @ @ @+YGѣGW&į暬}ĉgϞUTꑽ~ԩ՝g[?suivm^eȸqRdukHed6lXCMÇ\m}bC-N,riʔ)+gj[իW:S!m߳>w­ik{uAOnjaay_4iR7$rbyĦK> @ @ @ @X"`w2dH?k]5vω# Yg"ymB -.c_6SUg뭷N?,G?EyMK.i}}^nHsO: "? ;3z2y4k֬yryY/袩O>i 7L;Sկ~~!3<3-YRV >"4>yAU|(s3 @ @ @ @ @:4(=ʠ=#]s5YĉSϞ=MC(YfȤof#}WLcǎ̙3'+gVP{tMS׵D /rҤI)qXb;+m?y Oq~m1ژ1cng]eHߐk(mS> @ @ @ @ J+eۮ7P+++}w UD@}WճZkjU*6i!@ @ @ @ @ @rw @ @ @ @ @ PjP4 @ @ @ @ @ @\@}. @ @ @ @ @T# M @ @ @ @ @ @ xKx'@ @ @ @ @ @E @ @ @ @ @  @ @ @ @ @ @@5AD @ @ @ @ @rw @ @ @ @ @ PjP4 @ @ @ @ @ @\@}. @ @ @ @ @T# M @ @ @ @ @ @ xKx'@ @ @ @ @ @E @ @ @ @ @  @ @ @ @ @ @@5AD @ @ @ @ @rw @ @ @ @ @ P@j4 @ @ @ @ @2;uܙ(|ᇅ7"r}N @ @ @ @ P￿ !@ @q| @ @ @ @ @ и27 @ @ @ @ @@K҈# @:u􋴂޷`  @ @ @ @ @5 t%K!@x@ @ @ @ @L4)M6 @Ϟ=Ӣ.} &Yf-XЧi6%\2-2Ͷ^K-$K @ @ @ @ZGV;"@1gSm)QG`ذaϮ65Mf  @ @ @ @ @ @@3 x#@ @ @ @ @mI`J -P[ڲ Ps=yΦ^{^!0?~;r-@x@]N @ @ @ @4gzٸ8sx߭[4bĈٛEۖ1cqm- @ @ @ @ @h^m5 @ @ @ @ @hc] @ @ @ @ @h^m5 @ @ @ @ @hc] @ @ @ @ @h^m5 @ @ @ @ @hc] @ @ @ @ @h^ͻ @ @ @ @ @M#0{t%~8M0!}iO+rwz袋,>qݻ;,=;,taR~ ŕ?NڵKÆ +~>K.훽bM[yڴi_Wz'?>ԧO릃>8-WΝnCGy$͙3'mii]vޯ4~lUVY%pKdo9=cYcM]vҧa֬Y7Mִkw߽tV:ujӟTh?G῕믿>=Ѯ^{.{.̎XcpNq)f֭[W])G7xY]?m" .Z @ @ @ @ @R wA%pDnNҌ3O^{-tI%m5+ 5jT:# t-+y睬8>,/b3<3?.nn?vikI'|r袋nV|: =.K:t(9_|a,G?Qv}Ŝ~zִ^{R2eJZ?6k- t钎;*sŞ=ܓF]Oۅえ[pW|=z' a7Hj &@ @ @ @ @[wM A9CM@޽{g̜9sEjV+WWn3Twjm0@G6D:(mV)>[c$ Q3:4~iM6I;wNӧOOcǎt< /i.rY>ĞǠXkȑU֊똗7x#^ܧxlȢ_\ʏs2f̘a\{σr,y8Sv(h_TW%@ @ @ @ @9?iҤl߿կԮ];wnB[u\g9N=tUWͫK{܇~"(>x7 '?V;>g?Y㏳GuT:J//'OβG{?iVʺM:5}ήCd}ӪZ>Ev|M7e_収 ѶۖRT) _d!]vټ[JwqG{lqSǎ g͚98o~4 7ܐhs@M2$ @ @ @ @h{o_> "/iw.]7ŇkK/Ԡ_|neWXal . k xpd3Gp}y}QFeY^z)|Ʌ8D^.袼Z=2[~[n%ť8x_/>Um}~~{l>lX3֮/ 6,;/?O%F}GO4`V ~-"_^_ c>H]hl[ouv|=O?4szY￟ex⭷cݺui>:*γfJgqFlI:묳Rd/.~Y@}ߓg̘1){wvaKtP}ݳ_LjgC$kvzʇ:n%[Ʌ  @ @ @ @ @~믿~a;.Bf‰ZT"cU]x>:%Gf(y{C8qb3gN6M߾}4]dϳ/5E0r裏[Vy䑼ZN|Yy σ3f{I}+G k7|V 0%Q"}Yh'ӹjKܓov1bD0eb^veY0w2#?{Ɛߧ.޷  @ @ @ @ @ -P6kRK 6 EP>[e"NՕu]Sһ[]:E})S6yΏAyYljsyFSq ă2q}s9g {gСC4x0).>`{,J_A'?I޷kbG @ @ @ @ @@Zk#+,>XO뭷^Iy~.OƎ[CɻVy_guvm>^c"?/,H^{dg}W{/]q%/9vZo߾M7ݔuwS8曧;fydq}d (u~6Kyh(}n<83:}Yy)3cƌt]we4Ayx@xUW]5. /( ϳG-ܲny)GtݻwOŞԛWv:{O>qŁ,\^ܿ_/FMfϞ7e&L(Ϝ93~O导Sy~e޷  @ @ @ @ @&Xj w}wؕ!Cr96oBɃ#]{kwϛ ߡC80῕- >FIDATces|+|;l)C(#}>3G@qt+WX3֮K}̥Ngո9sUTTŕ5)n^tg~W5;wnz9#s΅oB}~򾫭Z6dԨQYf;g^ x "1eʔ|?~|*L>N*-"mٞ:Y+RdomۊaJ{+~]Ai}[5# @ @ @ @ @z TemM뮻n6gQmzm> kB=3"o:M6'2JN>hР[( {AΑ{֬Yy0Z 70k˃X7PDup yF6!?2yt饗V;'xjs-[6޷f @ @ @ @ @3ydh衇kfرc{]?Zp6vmٸNs̫s]vYN:) ?Z81bDW.=|vqֽM@.쒊3\׸'"O{n^{#3du }2,Yg->[rA'^jq׮]/t\7ʛog8qjKn'/B@/;w56g}R=رc _}OiF @ @ @ @ @@ ~)^Q"X=׋KGxM%kA+134W_Mk@̫tgCd;wnꪫ/vyl\Db-f,~ڴiC`@qYhy;uThγȇwB{ye7~ n[Oq0}̱siƌY[q߻+͜93kWtvm쁍~8-xϾ5CM=?3E`|<y[C>t}k&=3C/:t~: }3 [ @ @ @ @h:_WG?QIv=Sȑ#❴k׮pW^j)ΰ^<&Ɩ,N~& ty晩W^є<~Eɂ#88*?O @ @ @ @ r!i70`@D_ M @ @o*ǁJ PHC %TA4Qy Q/*H'< @= 1 iPz7j0H!;.){w|y9s̽{K @ @ @:߿B/Х4# @ @ @ @ @WVJ @ @ @ @ @ MI @ @ @ @ @# ~J  @ @ @ @ @ @w)  @ @ @ @ @ @~^Y) @ @ @ @ @t@7% @ @ @ @ @ԏ++%@ @ @ @ @ @X4% @ @ @ @ P'p@޽{2 hM`N&MJlB` n0 @ @ @ @sѣGyg= kiӦ#G=XK  @ @ @ @ @@# +k[sOOo߾iG=\>}:$Ke]vnY+ @ @ @ @h!Cnf2%6 4(O?`(E`sϝK.uZ%@ @ @ @ @ @, }; @ @ @ @ԓ~zUOKVZx'҃>ٔW|ĉӈ#>[CxPf @ @ @ @ @@ uYo߾m;CxߧO4lذYIK`̘1 \}"%@ @ @ @ @ @+ }F @ @ @ @ @u& 6r  @ @ @ @ @ @}޷ @ @ @ @ @ @نY. @ @ @ @ @6 @ @ @ @ @ԙ:0%@ @ @ @ @ @X}3 @ @ @ @ @m>2h.]R߾}Ӛk6tӴr80aBKVߗYftGHw_zSO=Zjꪫ=3^k׮ڳ:+{Njq8q駧?u-x≭ۓ?Oiܸqyakd?<1gΜL3fHK[ouҗʵ^ymVKzlLcǎ|ٳl} ӧOO?Orӆn T=믿z袋;,Q裏/i7nڥ<~'o~|릯}k9Kҿ}R_sO#Ģ/gss/ @ @ @ @ =-я~\}ǏN9W_?8?HCѣG*9=:D@wޙFp:3uDy-ܲM~{{._`n!z+L_WS=5Yぃ(ogsv@؋I&޽{??\Pcy晹iK뭷^l^{#<o#p k*>FJPEK{^}n@ T8qb9R<fE{8>0K)]L @ @ @ @h^8gk kv;e{KYb%Zk+7-ӦMKKt=ԩSKw}A-"8?Wiǜ{>C1wL|ن7YӟNtPv}#'e| ">.=,/\T[|^[ WK; njF(U"~9zm~vx_P%@ @ @ @ @W`WNƍ+o?L^xa|Y#3~ddb->Jd./W[_~e5\3qiUV)/ \rI˶2dH>:~7_Swq3ΨN#iyWs6hzŁ+?| ss.{mBEmM߫}}2Hk׮飏>o[Vs9nK9_]t/)DC#[H_dbձc}{oַUmN˵ze}tg}v+,M+Ev!#ROTTO5[[o5F3n <8zE]4KaÆh<#?y\駟>w7gpNX{SOߏ9Kw_~>K`'@ @ @ @ @j+;<e}~+_}*g|>c# رcg,أniϼ4T#}K%Xaf9AEe]jN;"}o?g}6-2Y##=eʔt'K/~ӟV/So>8ruץՌ̱⳰ꫧ.? iӦ5;^|{liJo}ZoR|FE7ޘ "fmR~b-A<{a% @ @ @ @ @@ "ȶ(,HQqƕc|(sR)oپz]ڷgn~a*Çm"}5 .K_5E%>>ʀR׮]S@ƨQҿjѧvZ>?"3<3曹ӧO~w\ӧ:k'OsN/P\I\Ϙ1cR_~;57-}_4hPz#C5o8Mr1;ݬ @ @ @ @ @@; tML믿~YoZG-"=ExDo޽sטi)"@h:lĉӰa;38Csk?:EvLFǚ"~uGf'a; @ @ @ @ @@[ DFWd~ґG\pA |s++fׯ\ZcxP&':t'(K.dҥKM<{n?Y; w^ Yf/n2w#F{xSkiر)g>6`'}ݜ9<k)Yg+O}SiM7o\[߿8 Jm,mW ~5aʓ^|絥U<nY!/dJ]-:ʇ~jvj}v+Gl-D|A9_T~tk`={~D6j>|x>;cyjO.h>.'A>DTPd5qEj+'My Z*)=z#'pB^Dcz'LxR_sx8 ɣe殩7ߜK<p7נAf9ߵk^ oڱ_ 뮻ʀcb{壏>Jv[9ld鏵EflEh⋗ Հ=ܳ3枛be]vmkv}&O򗿔7 /?_Tq{GPT2N/{NFi)=>K-TM!~mxwi 6}O|fyW8[N~aI$a @ @ @ @ @@mYdt#6_+{Wj{'"!CSG_|1g^wu[ʹKuOۚk6l?7|392vmN뮻_>kr &0,]|\_,(GC޷TbTiL_ ǵվSL)xg?V^ybYޗ]vٴ&䶸zkC ~}",i3}]b3(oFkR||{KK.d>}bEe&x`ZqӓO>9S`LC @ @ @ @ @:@d`'+27 ľ[RZ+;SZn.ni,UwMw^~WYuU6Y?㲭^6a%Ϝ93]}'^_b%ü뮻.տ{1+[_dvqr>-#F??w+/ ݻU(վ~{6mZno-?:į<#y3pA/x䤓NʟV~QGGpѣS߾}Sƿ;%/~鮻J7pCzC/]vs% x  @ @ @ @ @V"h=J\=z>:l\pAvMs";رcSGF%2|M[mQ.ڸx|gW__lrr7vۥ;z)uY'5*Es"^d|K/]kZݻwF]bQ6`+JǸEix_I}7[*-^½xo:K|;YC==sU_Ӹq2,38qPǹQ _{sV[-s ,Ѥε6!@ @ @ @ @j PLoVm~9+s0aBMg"k3<^x "8Gg?ٴ*TҚ'O|dJ:th2dH^d4(WZi+z|SO_~9{u) @ @ @ @ @hx n @ @ @ @ @G@蹖 @ @ @ @ @^`C7H @ @ @ @4+0qt7{N#~.t.4?ӭʂ @ @ @ @ @ ,B5 @*зo4a„jS=ORf @ @ @ @ @ ^D!@ @ @ @ @:a:B^W^ q Oi;q @ @ @ @ @ @Nc @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@ot' @ @ @ @ @ P5@5$ @ @ @ @ @4KwB @ @ @ @ @5x_TC @ @ @ @ @ @@?9{uIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596369297.0 h2-4.2.0/docs/source/_static/h2.stream.H2StreamStateMachine.dot.png0000644000076500000240000704065413711524621024277 0ustar00kriechistaffPNG  IHDRNsRGB@IDATx eUy'j ) (b!Ac4Ӎ$NihGct^Z-d FAbp Ģy~y޻Yk{}޻ݻ/  @ @ @ @ @ @ @ @ @ @ @ @ @ @*au @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @. w @ @ @ @ @ @ @ @ @ @ @ @ @ @Bد @ @ @ @ @ @ @ @ @ @ @ @ @ @Ƽ1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @a @ @ @ @ @ @ @ @ @ @ @ @ @ @~+ @ @ @ @ @ @ @ @ @ @ @ @ @ @&" @ @ @ @ @ @ @ @ @@; liS]eǎ;##&LXRSFL1mZD @ @ @ @ @ @G@o%@ @ @ @ @ @ @ @ @+WF䐈yBkqH @ @ @ @ @ 0lc~* @ @ @ @ @ @ @ @-ع3bٲK_(O<%۷li`#Ϗ8찮rGU^ɓࢦ$@ @ @ @ @ @h+am8, @ @ @ @ @ @ @ @@{ tWY#z(b҈%K"~ˮz֬(O;--o*sf^ @ @ @ @ @ @ \@I @ @ @ @ @ @ @ @mv숸o~3k#lR'MxK"N9|rıFdXvxшXw_Ć 3Έ? 9sp9 @ @ @ @ @ @``~, @ @ @ @ @ @ @ @m)dIWD|kV |WE~zW9餈ɓ>_UmEzkWyɁԩwFyfĸq˙ @ @ @ @ @ @?/  @ @ @ @ @ @ @ @ F\|qw ly2{]k_q≂f&7qM7ffzы"ޮY6 @ @ @ @ @ @. VF @ @ @ @ @ @ @ @h++#.4 _x/C#9yf= q\U~76-/2i4B @ @ @ @ @ @@+B @ @ @ @ @ @ @ @Q#>+غ>昈%s#N8=x'ꪈ|'#vu3_pA+_$@ @ @ @ @ @蛀߾9E @ @ @ @ @ @ @ @`~8o;bξ/gˈ?ӈ9˗G,\E{ot gٿ&@ @ @ @ @ @h. 췹 @ @ @ @ @ @ @ @m!_JC~Ox# 7-n",Y|3駛 j|Y/֠S @ @ @ @ @ @@` @ @ @ @ @ @ @ @'vmWGl޷DF_E̜ٷsj矏ꪈK/喾?O}*E/9F @ @ @ @ @ @t @ @ @ @ @ @ @ @ع3 _"V}9E}v?Cęg>ވ!F|+[I"|DsZF @ @ @ @ @ @֛h!@ @ @ @ @ @ @ @ 0bG=&O뿎8}S ?K.[9]!oy_&@ @ @ @ @ @ߑw] @ @ @ @ @ @ @ @%#>P]J v3o& "9M)H~} }".4:M @ @ @ @ @ @Z. &$@ @ @ @ @ @ @ @ ?[ox"&Lx׻"">z;W`Ӧ~6 #֭>g̈zoz @ @ @ @ @ @@دw @ @ @ @ @ @ @ @ lD|3v7)8昞;WG˿D|.sNGx`O @ @ @ @ @ @ƶ߱= @ @ @ @ @ @ @ @ q=/ }/$⬳zw 1aBzOF @ @ @ @ @vW  @ @ @ @ @ @ @ @ M{]w4=X?ɈZ J#O#{sDzkċ_ܸ_+ @ @ @ @ @ @`, O= @ @ @ @ @ @ @ @ mgqM/ Fh#DF8sq͈ я"N?ҥ @ @ @ @ @ @:Y@o'?]F @ @ @ @ @ @ @ 0_z'>sFrKđG6J`8;#^W#}Z  @ @ @ @ @ @,0nweto @ @ @ @ @ @ @ @K#N>9b+ΞqSߧHlqVğY> @ @ @ @ @ @NۉO= @ @ @ @ @ @ @ @ m_zo8vhYhQ|R^ĕW^q5?>fΜ+)x`3<3ϟ_7+Wƛؾ}a .?|`vą^8)㎋~cN^Py< @ @ @ @ @ @:Q`b'ޔ{"@ @ @ @ @ @ @ @ 0X\ǗԾA<ж^{5=oٲe}s\uSN9%>я9tr;,7֭[ࡇ{Ƅ zѾs#+wӦKY.moя"ƍ @ @ @ @ @ Љ; @ @ @ @ @ @ @ @W|{#}Z/^}kcڵ\#'W^ٸO+ @ @ @ @ @ @&v  @ @ @ @ @ @ @ @-_kĎW}"_ۭeƌ`e[.pѸ9sԝ۬a֬YqGT]lYܹЛo9^WFk8fO>@(7E̞]ߧ @ @ @ @ @ I~;i @ @ @ @ @ @ @ @ao^{E|&[[+IYj /0.=sL<{{{z~8ŕW^m|0wĢEI'{H.aȮ}E7_wĚ5D'?ٽ @ @ @ @ @ @w  @ @ @ @ @ @ @ @%{wG?jFxb>]*IG}t}ٕ`/ǵ^sC%}/`hf̈}%+V4J @ @ @ @ @a$ @ @ @ @ @ @ @ @ \uU/Y̫Ї۵,GG,on?t;v0to|c[Dx .Z @ @ @ @ @ @Y @ @ @ @ @ @ @ @ 7?sĴi,p??uޭ |&7׷k!@ @ @ @ @ @tNy @ @ @ @ @ @ @ @`X~[nZ.iW_}u'0rPs=oַk!@ @ @ @ @ @tNy @ @ @ @ @ @ @ @`X'R:bz{v`h?Fv @ @ @ @ @ @N O= @ @ @ @ @ @ @ @ Wɓ#v-8㻝t}u;v0xEI'_[#VoB @ @ @ @ @a @ @ @ @ @ @ @ @ ,]|#fάo:Ik׮,#?Yf~dɒ^^Ν^[߮ @ @ @ @ @ ;& @ @ @ @ @ @ @ @W;Z/pA՝~jn]06쬤ݮ[_WܰaCƷ෼%~5Z @ @ @ @ @ @]`h'@ @ @ @ @ @ @ @ 0۵_`ڴiu'7dn 8ЈnoB @ @ @ @ @p @ @ @ @ @ @ @ @p Վ9&⠃۵ L`ԩu'nڴmf̘rJ.;s~ogW(O @ @ @ @ @ 0'h @ @ @ @ @ @ @ @.P~ 8a_FG_pu7eʔn8#oˎNnG7<W[nvw i镄2 6 @ @ @ @ @ @. w?A'@ @ @ @ @ @ @ @,fcǎj~_.9ov E]/ڊQ_іc`^_+wÆBk J}^WtQ`ڋM";/bܸ῵ǿoͷzku]y |q r`x_am),5jo֖÷oޯR>'?[{ 3f{ァ.o„ Ys @ @ @ @ @ @Ή @ @ @ @ @ @ @ @@Y`m۶= Hq<fm.L=-_g wG?n3tAqgwks0< qqkPI[bѢE裏c˜9s/}iGa29زeK5z֭}:>mڴ:+oڵkUOcԩ{B3(x̙>Tܯ=.Y n1 @ @ @ @ @:_@o?cwH @ @ @ @ @ @ @&sj_f`dx`߬iL> G6d3nܸ?~|dݨξf[֨4kl?Rrt<h]?#=.o~c*7&fGt- G{}ӟV[}ݷӴ'N,ӦM5͛7)qǔoƍYgٵkנ-חeʕg{ڰ|ߚɓ'N&@ @ @ @ @ @# w<++%@ @ @ @ @ @ @ @6(v3dU%t~V[l= fv[mmk>C mEZFzXpa|Cc&(~:gō7VuzcAC6bY] n4&? dP,f ԩS낀g͚U(,8ϵ @ @ @ @ @ @;z @ @ @ @ @ @ @ @@@nٲapPbL_[׎+-ڋy=5M6]^[,DAȵm6XĄ b1iҤ=sM'WV7%"CQ{.*m~.aѢE/~Kvk[|y{3Έux]z.~xG!>=LҨi[%6wܸKz=khӉӧOh~\JR蠃Zr۷ǺubպvѸ .uQgɁߏٳgߞq ?3 @ @ @ @ @Z( 췅"@ @ @ @ @ @ @ @@' dڎ;V36-nڴ)2,7b? ͒AY2ĭ(m%CZ'NEm96Kf^[Qwk׮jx`~Q]q׾yC"gm@ G,J_ʁŹ庘㋶:4 \҈Usd0Ip^!ep_~x≸z֡_}wqpM76z|G:&]Ao'#:amCw(~ Ql v`>eͿ},pfܿq~]:?߮XZzbɀ྆xձ^ @ @ @ @ @ @@_o @ @ @ @ @ @ @!P͖:4+Fש?żEnq\Ңm&AEm -54oԖׯmO|󝬭- rHtE]N!EayNz;Ձ3iӦj@]~m]q.㊺ˠNfmR6+Z+o`o 'D,X _}uFLֽ},5 iw/}gϞ] |+^gqFuYξR+f̟{챱{**re vG9绒aY7ۯ>}.:^ -?do[OMV'FaEAs ?K}Q5 @ @ @ @ @NWq @ @ @ @ @ @ @] "p6~J[n/kSuNlk$֗!ElKu$ԩSVYrZ%($Yzs|'o۶mqY6WEN@u{wew]#.~u_b/Z&%K"?X+;-FUAaE_%:Ĩzc|} \rjM6\-3dܹsgHp~V @ @ @ @ @ @` Oκ  @ @ @ @ @ @ @,o۫}vFsܹ輵 2a„:], <͒2ygn{sܢ.vpݾB^xg=CqR{ ͱ}uֶ^}/r]@gn ][/+ıgcDq)=6"R'~@]b+;*euÖp@IDAT~"?_w6sjogpm]m7atS~"mm۶F{H|Ԇ7:`m @ @ @ @ @M@o=!@ @ @ @ @ @ @ @([ΖV׆6k6jm;`N ,˺_ 4iR͝Q~?=3*Kf!_YݴiS5|5i-CN3x-r@oͺ\r[ڢn!EP{ [Omw1,p…[߮hXV=ꨨ|GX<[6l_WK.Kv&G2GwvU>݂xqDAȟ -O?tڵk[n8o޼=_P @ @ @ @ @K@pI @ @ @ @ @ @ VTmriZLAܯ=.@kn4_VkmuyLG~}N[enLՖ3f[9Ÿr[-en\VuP>Sf8n:g].VSot~혼 |o{[9GdIT>i!o}k7Y'=_x~6~,T .Z*jK~-?'gmΝCq3?cfodxp~VIVi֭-YjiEpm=w\?-6  @ @ @ @ @~ @ @ @ @ @ @ @@ l:۬;-Ѭ.M(e3(ښՎ8))iLy| & /\-W3(mݺu!E om?ceXi[͎3$u,m>ޢ.muOc}}Yh/Xǽc9 x#)cG1D`Gto=zp%ėXvmmw}w}%V^-85kִ,I&Udpo~C͚5O|ɓb$'S+⩧g&{ C=4ϟrH6 @ @ @ @ @$ '} @ @ @ @ @ @ @`jhϹj)L[5K` *̖i -v<^ CVެa3| 5,OumXo83):y -[Tx7nX}rnxy~m j[A=7O]ŋ׿~O|b^)3*eUu_Z?@Q'_/=oo֒-U,YlX<ݨ[+W~?s-֨ X40.k6g3pw̞\8?z+> g[l<-g pQ.pҭ^$aÆ@"348NexEoz޼y@G @ @ @ @ @3B @ @ @ @ @ @ @Dnz۶mQ츧z+iLoH@dRm[V{\>?^:rd)R-/O.׬d~Pߧ@;T0+p9Ĉ{8o-[lo|q/~ӜtIq6{瞫7 .[z/'L:5Ν;Rj`  ڶ WZeȟ*+Vft5g"  @ @ @ @ @ О~X @ @ @ @ @ @1+A Epmx[{A۶mFcz:+*+7V)_Ykkkϯ=.k{_异hF˛f"Tf͚=E(o`ޢhzw Ӫ -xn_>'/-o޼%aܮ[@0r0o?Ci'o]Fuwm~{q=~vZz{~S*җFo=o}V{_U[~+!m'x"-[VO=Ԁ"?xы^GqD`= @ @ @ @ @a @ @ @ @ @ @(h[n~om<M0LAE8mn^mߨ?7G- 02*C_[;{-fEQ tm-t"x\7otNm  VypڶqrL8 @}zk5G3 |`ߗ!.(p11gN~K 3W;/_s#.l7ojַbڵCy1?w~XjU":Kjsw}cƌ߷g :ׯ>]vSpeR nmٗcw @"x @ @ @ @ @ P[°K @ @ @ @ @ 0!bۗ1ǽF p \dFo*O=T<M^-3\/Xx @ @ @ @ ٻ(9zٲOd+ BD$MĠ F,*\^ @ laI BBB6dO&d_O};5|sUVuէ'tWUS @k 5+           z 3Mwy]\ߚ|?\BP[7/QBmcRߚ+h Ǐa &Voc^^^^ܛU`(*Bz1]خTjlݸr@CVX ;w<HgG};<޽{bf{ÆyA|38r̞>+xYf^\ (Q[VZZj6m}׹Bu} bO 7gMJ8 juV[~_׭[k[tޯ_?:t 󾌨>o5}n          8~[[!           @S (6 N煷5&8.wcԺgS\SO^[Aۺ0rmCٱ@ 3.W-.7Yxoc*k׮,7Ν;7x`›!`?1I.d׵]7ߵk !2o 4^~e+{/Ϲ?ߦNW꼺f^hxq=()1׿ƏdZ@|> coȼ0m1cb/g.P={lǎ~8pU0QJuίīs&zlUU-]ÁR >}6gT}^@6=)y6m2ݳJZN]o8Cl          4[~[ǎ#           :*++kغ p Mg^wmp U8%@dḩ,O6&Qp[  w`o =vX&^>6Y%y)H NU Rb ރ^jR^3eC@|pcy~u]Hk5@EA@5 (Q.Wau>[LN6 o7|^p٪U_^y?lv3L ,YbvU@ޢwg6qbE)t炀]V<;% ^M+X:9eStأG߿_WU*QnȖ-[0`C7N߫]#FuСL@@@@@@@@@@Za-8@@@@@@@@@@@Ƞ@[jl`m錉<=L[@a.Vm8cfp϶ؒE@ k*Dnk(t{5/޴g"@VF u!j]?^;zhC3%ݾBk:v37QX Q?777k2@j}W_X".M.]`ߩSg0]!Kevf˖ߡo|;1xa u5lL{-:#Z[734-Ey 螄 `۷jii[ߣu]璺sK++X OJJJ,VB5_ymkښ5k6߽{wZ"2hРHȑ##}          @s 9[+           @0=x^Uq.07p`?˵ ]xm087~8.+/P  &pȑHH u(|ׅ6^Xopy]B{![׶CzөS'?T)x]hېl@SUUUh"{_Fo. &4k ]~ق/ܻG5/1i&]wwOxޫ3OkiC- $vXLB;tgy>|}& Vj>},??e]t( ֿt > MI@@@@@@@@@@P,|S%@@@@@@@@@@@ (@$\{K;/kiaSz }0Lׅ&k᱉Ƹe09  d@eePݻw! Mw*NbSX6C0 keUT%//v%E^@n*^}JQD8qHyg.RJY 7=l#ͮ: {xfD;>Oٌ3Lp e*Xagw+**ѣ|}u޷o_0`@80|SH&N.xZU:gϞ6j(=:&{ґd,          @ʹ(C@@@@@@@@@@l]n}pnx[,) lv]n˂ s   I֫*AIa.׵`_˻vj U 1j]PUM[%5<)tH@.7غ O /  @еsڿ/{lŊqxȑv饗_lSNoTU}/~`>I3+*J<t9{3 /[^wnQ5@ӦM:?t@ @0X۶m KSN־}{y^\/Da}{^25 ڵ+`~zwT0~{sv7iҤHĉM(f}f%֘6엿42(س{~ؼޘCf=Twa{G_1ί>O'O/f2,k.8^sN=B]_i߾uݯu=zؠAbV€3GB6w![j)W/G)]o֭[`           N_'A          Y/vyifbMCr] n `np`op[N8Hu  =[ u L(<*Ы|h> ݿyír 1껯BxNx]ߵnypڍU/w3n@S=sO?oe]fG/ <3nk} f_fd w{3(1 x… Yfý |3nHA]v[n[.++ZM(>Va Vp꽯leL.7TK޽BnjO !         B~[!#           uanLXhjk- uaj1'ZO@@8vX$W/.WmxZAΟpow;vӺYX>/wq*UlN6m2@@Fشi9s ɱ^W\N04_bvf%^k_37ZSZi=foyDEk7i~^|E?GFӧW_}5  ^B] kZׇ뵿 H [۷o_}d!c[|X"ݻ7,))c駟+SN)o          -Wߖrd          -@{R{8 ݸxz{k, ކCr3^7:ꇗfq  @ й>/+VXo8WeeeQ@ -**p~}wV܎9*7X>}KA ua7-W[%RHe  R-Z*ދyt饗_~}1@f,}h|b~; K>-C@!f};fV%?34{A3/^EO>W^yV(ίn?wz-VFP@vCH€5_u>EX*!CĬ}Æۼt]4i]SMs6_W3Lח/"SW^i{nalhv=fk*;o0/`{;Hm=Fe[oJسs~3kcQp9s:79 7`3gδ &4 U7UXÇmu~aÆ VYB7o0+W~뒬A".xСlu#         daYF          @X@PBq.DWwL j M6 U?m|74@@ 8`;w;v5gϞZ!E9(@D{l2uuNҽ{H`[ԫօ  <駟oϛ5Kaa]qvmǎCnb6^^J}G3:|x1iO{1s͖,I}N;6oMsk6ȍ^B#< 6z:>ٍ7h]t { ujKJJr@@@@@@@@@@ 췁<         _@Vp]n . gZ!Q-]lpp@npy /TQ@@@To۷o`hoB}ۗbΣ.78//,,̊g'@@O@Sy?駟pXaW_}]s5v}Lu|?0?ͼi)<ؼUM.cS++KoǛsuego)r֬Yo]kȑ#ߛD=zZ @.UUUk׮ƨq QtOa`nئ~aÆH ^n-6HuYQɊc'@@@@@@@@@@ @okx9F@@@@@@@@@2$NCujx~8`7c^ӧ fnF Cv*TW˓ KA@@J@z{||O0[KU(  W^z%?:t&{'> 2eÌ+|OjݻK8pfW^YSO;-5kYuuuԮ8fΜ-֯_eL )pHp0`hJ?#GF^Y3СniNk]z!`;wu_vevm_nQ˙@Z@MuTHa7n4]?U`p}Kѹsgݻ 2c'Ns=Pf; oذ!^*O7Vm۶M.@@@@@@@@@@N {ʂ         @ Pn0 7WXnwW^'4g ua`]7dxc5?e<9(5@@hT"R(|>u;v0۷=W -..j u 8S@@ Yf(=4Tt͘1.R} N;vl|7m߾ ^~wV551[lS;ΙwDÇp7 Zm5׵+++= /ɓ'eoo6sL+))Z G+U^ڟS]vѿڿ9rz}^*=)0wEV&L>V 0 ޲'          }f{!        -J@ =zּN+%eW_}uԩquظ/aqVˋ30;lBͺuB3ڶ5k;6[lٲ_ڪ2s ]}MȯG lݺ~UknV6mZp}@Y (\r]UϞn:\9Pk~l.gzgؠAlaQÇmɒ%o*?7.;qD=z7#         @0l@@@@@@@@Z`nt X***"l[ƫPt^׃6)   8ݻvm;wku~C0W` pyraaݻ{]_:W   @|~5k8p ^~oիW@ U>TM;x). }lС6f2d=V۱cD,pʕ+{=?~)U=P@@@@@@@@@@(@ok|9f@@@@@@@@:(@ׅօe::-%|7//СC$x7+@@@2)0^*ԯo߾  m]vپ}찗@k Uڴicwٺwn%%%~гgOSp{ whw" 6}ӟZRoF?wȑ3 (W^xkoTNCsϚZTTۭ[MۥyfHmLlUkZ/*NM¼5ȑ!OU;׮ (:.KoWm%o$x'?IL@ 4i@@@@@@@@@hwC@@@@@@@@: !v q{'{h^W*(( W@@@l9޽{# uAUΝ;_6T1?<\A իc6l)(LZ@@h'NSO=襫:ud]w}3 .*'k͝[Sn&]]ͦL1߯ԩ榻'𒝟|ImΜ9*P7pmf L`tŋ>އC2"k̃TkZ~F.ݟXhQ$W!7nL {vjǏT          mn        @+CÁ.H7Q^vȑZ nWA=7??^`T!k>   @Ku& JpUUU NѮ];?(;d>|=چj;wn@@@ =+Wڃ>h<ݻ7j圜?[n~;v J`z74[.YbݺB|G2/s&O6; }DmUG;x`Kw;ÿ^ @V^mVV˖-VYY1^z.80ڴibCuسg;`wؑpޗ`ȑ#M7@@@@@@@@@@ \9@@@@@@@@,P(r]X~c4$x.L7j\xlږGA@@@o>S@ պy>X%//Ϻwn%%%ַo_?`ذa6p@ׯ?O>7   #}'7x d7|_zFA ͖-3SҥfWߟ{^nر5aƙuYaa/k8?hѢ zW\q}_ӧ@ P[@۸q)P]Ὺ+VjP9o{Mt4۶m~ۯ ,ÀL׮]mĉ~ɓM(:,D@@@@@@@@@Ilz7@@@@@@@@@ ^pn#G"ܼxc5㦐Xrrr,Mu: S_GA@@@ U?lM̒%nc/lƼv3/cІ79T8#4 f2%XFe_N:GHA@]oյ(A`2z醀MݏY|y$XA;P@t2b;s1cU|Jd2@@@@@@@@@h:~ΞWF@@@@@@@h QPn0X7[i= uj]umple!>   @ .W!.7{M <=z Pp+WU"(   вtC~,XP`ǎkӟu֭rf Rv۸l;̔={3ۿVTd^A9r]ά{w"kj5w*j:''F`دkۼysNtn?wذaQ˘@H_`a u[4 Vua;vLck @YY-\0*x%(4i` @@@@@@@@@~M`@@@@@@@@O+7ּ`Po tFl۶m$p7TXcݲF8^@@@[x)>^Mi\UUUcbK}ǘ  W`͚5v?lP_{Q˘@^V9bo7Nɓf5 jZ? fS۩%GomV5Oku9^_n_җK/VH{bmQ \C z ׯ="Aɸ-[k'N:=z)WMFs9 @@@@@@@@@@!mH]        S[Cu-sk4RPP=cܰ]+`7-wr\GA@@@e^ ;v,+--ByK8ׅOof@@$_fϞmQ0Ǐ~g̘zI@PB}Q7H1b}_|3VXX\D@ .x)~ةS'? V ˽rqÀuҾ0(~n۶-ݻwLbM8Ѹg          !~3f@@@@@@@@N \zp ]np` nԋ5^NN\p_6??h    МlϞ=zպ@|]T=_Y)z{ WKo}TY@@JKK7e˖(o>;j %~{衇7F휂~o;ȨL 4]L˖- N>{aڵ38p.k׮!Cl`J6o }7mɒ%VQQw y U)          @ʹ(C@@@@@@@#.DW u<,ܺV!0ͥ(8&M4^k[z`^   dzػ}Z!WVVfdޫ5\G5*7@@@ S ,_ˣ6;l0[`H¦h@^@רy__]Ӻꪫ6 R@F6l ua|ApX yu?AWq1^СCnhʭ>#tB0Cjqqqb`ޓEϟoͳݻw:zh3Zz/(          @} #        vݴkc׼`Hǩ_8܄T u]B^\} _    @s8q`m۶E{a޳g(-mn^zE}{"   &PYYi_M]>n^z)h мVXOgEA>P U&+?qi! >MlPB]մ^+ݢ}ݴ~CK-PZZj UUk~w{]SL;a}/           HD:,C@@@@@@@f/+,*7< OkznŅ\ei׾}l'`@@@@ݻwC\`[=(^c[ڶmk{^zA`Jف"Cפ}6ҥKM @@h2+W/~ ӟ6 # R3LW@/kdfͲgx.,,٠_@8yYƖ,Yb_߱cGJ;ޯ_??~uY~UvHB׭[W7mڔ06  j^qqqZ|VߎΟ?<B>s#ΐ&Mv@@@@@@@@@hF@@@@@@@ @DCw6@^=v)׼` 2_cͪ?uv@@@ZS)7\|9rǯ ܨ _ƍm˖-6Rix}_Ӄ5  4'ٳgO~{::+iӦEAh}?g}6"//ϮZM@%{HBjժE*x)(`x͑_VaJK.Q@`'I{-iv|ٲe6wH---{9 =L          @ u=       i ?~U um0 1ny&L::  ݭk_{    4>[n =p@J_/))|!g?WA7=@.E;`[:   }O؏c[xqg?YlC Z @Xz?GyĎ;@^}ՑǨL 4 'N؊+_TƍGnjc.jw.^7tv`СCbѽX=gΜH-[2϶ /Яl{JA@@@@@@@@@%@oz9Z@@@@@@@V"/ׅ>|nڍVUUe`)J:u]oyƺu\KxIV    1= U` u}۷oz7k}ClӦM~kkoA D46wH]fMݖ9cӦM7@@@@@@@@@hC@@@@@@r |/wʛ*x7J?QۡCwC@@@hJ]SP{lRU^kV~! גSȆ bV_]|+WgWªF@@(--~_۾}vEM ekA  C-[5wv]w٭j;wZ @н`  dn U`€AzǏ)yyyJ.ص Bwi] Cm6Bv[6؏5F8     i=\VH͛k*w׮]UB|] j[n߿?f~t̊k}u]   pJ@aW?яG:ɱ+:u! PG^z~/.] իW2&@ZM.ZVZ>~}駛 M')VWW۶mۢ׬Y+XaOZ#A vuȐ!-2^}USիW%{6yd?. g         4~^"      )+6^@oUUUiE Wx;By(7??qWA@@@@ J^ƫ =yd-_+d#+ȷ]v=zUxoץtlz@AB}u   \@aZ:go-f̘a_Wm̘17@P~{'x7AÆ Ks GhG;!~{SguM8ѯsS's *tmڀ V\-%vΝQWt .07^{ #         @ Ƽ       @r k^pz%{Q]jzQPt%A.6    Јyf?Wmnݺt%///*ȷ~kۧO _kuFnݺP_= .EV}cΝ;e   K.}{-7$:`wy/@\@a?OG'ND^O'k{ &DAh]Gd?ׅ^:<&H.]" Vp&q ޷o_];O X\ em۶k =x.B?w6txC         Y$@o        ȑ#v]n6뎓B@@@@sN۴i`999ֳgO0`)7\ۻw uJVv7nSȰ/jbj   y w]{gLqq.җd Ţ  F~^.@  wxbS;c ,x8t?U֭[uy ֵkSЯ1¯Çקͩlٲ={+0xEW?lz7          Є6!>/      44\k!~x:)7ك㸂 sӮʫmڴ }@@@@#pĉH zuEEECa Mt=O3@m ռ;'n)777    %!/bK(4+_vmֱcǨeL  UpL0oUW]BA@  Uo߾= ~t'Ol&MO?L{F@`Cvvlذa1KJJWZe/__}U3ƦOn\rM:sxPG@@@@@@@@@mdp^@@@@@@H&GuUx ~pd٘p]Z͏׼ึm6!Z    *]sTx7n5OY^*UZ] LVtM5^ L!C"uС2@@ȼٳ9sDm\_s)( @ G#oر~_o%@X ujy睄FL}|޽;fu2ҹsg>|Zv%M5ت*[hQ$w޼yvر{{M@@@@@@@@@h|~ߜWD@@@@@@(PQQa.ׅ6|<5zK?L#w-xL    ?D[ u} ݻwou*WU$ڏuڵkkvJ{uR/w0_ٳgd@@@P﷾-{7^Ps_o6$Q@v^'~Hcp\v7Z~~~p}@j TWW\[oeK,1'*I& Vpe ,V|W_~};9g<1~曑߅ ɓ'ÇO#z(          863      Y(p1sA@`_ݴkӘp^n](ಶm6Z     aG *зa ݻ;h *WS-z;b*n*2cǎ6x`?7\PA@@om{KQ;j(? qƌ @?owm޼yQk7Ra@ r[x)WSju0Qpgy2[UUe6m`k~pXǥsD}*8~߾}M< ) F`_3(0`KlGW^m VsδvIaÇ5FOhcSB>o_~]vev<@@@@@@@@@auc5@@@@@@H]@zywm07wZ }BxyǚӡCl8$@@@@X@փUjmf Ma % @]lŊ`}\,xޮM81|ZQQQxXO;Q u}ZNӧ`սt6U籺0f~{}C;}tҥK_@@@@@@@@@@_ @@@@@@@ cj*| 5OɆұcǨpop:V?8/???}@@@@@"pĉHu"a.ȑ#iiNN! `o]ufsUaoٲPtJ۶mM k jZ[PP   ֯_oG5ҿ{[nӺm" \.\hwg ^ѣ}vwXaaas9@߿z-{7ٲ{>zh2e}C[ݟ̦cǎZ!WVTTF V p׮]SN]yW#Ὼ|yɦ.:,ӽc          .@oVD@@@@@@(xA+++۷o Uخz( Mma?{]Uq^H%B Ԁ4Ab"eF60:>,o,SGP`Fg* 3HNBOHI!oMr?nC@@@@+pqmk{߾}n! *m-׆@@owUn= հa:R@_]S>:@@@'K[okR塇)S+Q@h7n4~ﳭZS=Cos5#u P\\,6mr5899#w-7>>^;ތݶmhtJhA޻kߵk,\P-Z$˖-d۵k']t M6ף@@@@@@@@@~ g Z      ԻaCwmXVԟ%:J}'5SOEA@@@@@iih(Aw 0wn& m7)d}m ͭ[ ٳ]}upk    N<)?U4@@9 $&&SO=%39m4֜v@:ӿoYnNJJdds9Na$88Dzz -U>Gg{kdNgu\~reəgi5@@@@@@@@@h6      Ԅ@QQ ip akۮkt^S%$$-׆z[۠^@@@@h%%%o>'5wϞ=Sˎ2k'۩S'>]7ߞsz_@VZ96Wk4엂   ٳgc=&t6?II  @yWC}g۶m+~<-    4J955U4(Aq]ݻwK~~~Ovj|wvM;v(7iqaaaYG=zpצMj틕@@@$˃>( ~'>(tTh  PO| V[CBB~ ԅ~'mذ CUxh}eС&WG)5uƒ}ICm6uAAGk>}8cccq… ʹe$G.Lz?         @s 췹~\7      D4dj]݀ 6Ởڞ\C{5(     P=4krO%W>֭h0N:ȲmkЯDyO nZ4W'mOl"_~ ]r;ޟ9r\uUrWHlllu@@@@@@@@@@ ?A@@@@@8E >ZV50tQlPo`^oٲ ̵/$$e@@@@@8zX0p\uJJJ8pEglq5@\.]h8ɓ'͹Vgf;z ޽@@@>_˃>(iiiΩEEEc=&SL?:@jW`ƍ>#OKHHCCCeȑ2f dРA"ȑ#]'uڷo_Ve}5aZv… esβv_no (         4F~9#     @(***֫NT<774hVjO7D@@@@hxyyy k@;$??ߞ5׆5{Isz6Wkȸ:HllݻyGEEy}   @C ={8wWˌ3[nN @ Gk u-3Ȑ!C\i# `:$}{ ϵu2n8gqF6YYYνy Z'%%k=zH~$::ڼٸqTCӿ/7+Rڶm[n:@@@@@@@@@h6OB@@@@@F!^d{2m[uY4dWC 4xNj)s,@@@@@&  v^qĘ`\ ȵjM8%%-W}uڿz:`_mw]t d    MEHc=f~uGDŽ>j@h_|<&Ϟ_R|IٳF@Q}^ 5Vh5wر Wn ̽p{ܹS r___{Z=zT m'#GkƄvڵ:t          АmH     u.P\\,NH 뵁kۆuYÝpVZ9mkk_>     @m6w֭N;55 5ԷE^Ǜu`bZm6Pߜova X0_ۺukÊ   4V R{DEa߻[m75 40R;w ݽ{sv=ydyGCN? @^d|&XT}C_ =E76>5 tMtw         Ըa5N@@@@@@tא:(,ꪄ:amkkL?$>)     PnٲLvPWIpkC}moᙙ&׆p={Hqqqs#**Jze&un-~@@@&-&{̟?߹N[駟h 4lBy7C9'Ͽw}>NA@ kך_ ]r&cǎ/LzO%%%;3z?>''甘ڷo/\r=aȑ-P@@@@@@@@@o~      `t 9~[kl`o]1jRdx֭[4700N      pZyyyf@^k디)--jy߾}ԯ_?SkoNھ:+i چ8pkl^ @@@D4g̙CIffC2|pyeذaN @h\/s==ߦMyG;uQ- ;w5=ZBBB*Z3ɢ!z^-^׮]ϖ.L            @M [S@@@@@@VV :Kdy5ujٲ| _=G@@@@@h@Ϟ={dδi&ٽ{{u:ȿ p_n߾W{kmgddxiѢhZٓAVdE@@@(qj*򣣣L4 4nGSO=%;+'#z@@ ݻWyyEl1bvT1 p mݺuv}     Eq7n6yޠLoHHjHnM|ٱc[jЯzS4XHPAZ̷iƛ]   T"pB;%99YK=k,5jG@ s3<#={t @Ȑŋ߯ZRSS=^6f." deeɻ+s #[""">`X@@@@@@@@@ ی?|.@@@@@jkpoe'Ox[:,,Ϗ      }5w֭WJ%>>L 0u=DT5k'=ݻw{S%..΄0_ իh81@@@jVrʼykp:@… [lq.< @~c=&mڴqi  T^ED/_./Ugm9#~~~ףӳ>7?$33^FEEk>'^@@@@@@@@@aZ@@@@@]DN8!k' k.B{UVfp^mW60@@@@@@}dfڰazn:p-ޛe۶m&W8IIII)}u4XgP@@@@^u䗑lܸq2sLS@@ o->9nu]@#_x|W_=^~O^|reɥ^j" w2}m۶9rb>>>ҵkW)..g<щ        4~g͕"    ԰@NN{Qҫm; [ZZZg⾻@Ϋiiފꈈ1     &;vu։ Ր_PU={`_ SLLLUz\$&&ʖ-[DC}m޽{*{v ՀXk    @ ɓou%/L8飁 hsɓ' {+ph  \zj{eҎ5J*3qeWa"Yth/<¹+wn۶,,씏Ɇ      P&8W}''u`J hg !!!mR3譆`_<Jiz}qB}g:`KA@@@!oԩS%++9[o3@@@ZZL>]}]{ƍ_|фyڎ>@#Gd…&믿60z8C } OСC֌0_e[gffSGdd N~          @ i}\      JJJ$==݄jP -۶qїkJ˖-^ ut<Z)_@@@@@'' k֬1qFͭڵk' 2ZԣG -**]vj2o^6̷o߾&Էs5rޜ    @RSSe78|M >  @e֭_/_'v<@@ }~A>sd bbb+4ᴣG@Y^Ν;W>wH˖VZEnj#f{` ݅.]I{܈N@@@@@@@@@-@ox89@@@@@y jpV v u m۶[h]/k/@@@@@رc ]v~zɩ3ΐː!Cp:T]U+}$ٺu @_mo۶M , 3!7ԩW۳   4 :udff:'|3f̐  ~*eϞ=&cwM蝣B@9 }z i͚5-K/TZKEeWa W^dh?OjU 7 F*j {S̳6]vl:         ,@o=@@@@hN:p#GDzmm{kKյUj07:     \ %%EVZOnA9.GwnB}m֭[zRSS}5711ѫa=Ppp-W}v*z@@@hɓ'_\DLLhE]@@NE@^z%y'} Nel @HKK ߥKJ~~~ 1_+B"##˭CgD_u*&7x 4r׎L,ƦML322\W;p@ @@@@@@@@@#@o,8@@@@@Q 0^ S__m5FDD^ثuٶ`_k|1     4mu͚5zj!5wС2l0'ts ͛7MU qqqA:Ա>X @@@[o%[ޭ*/@@]ӧٳECꫯ3fHnl5 ɓ'M0g}&_|8q9n8?~w7IN //O+9996ݻtM_J o޽{_ iΝRTTT.W^: 0:tr[V@@@@@@@@@~kǕ"    N -inh ͣmhֶS@@@@@@(..6\ ݾ}Vz'W~ujݺuTPqˆT D˽   MVرc2yd׿\~o_@@jZ`ݺurwg2m4y衇$44駁 /!K.O?_СCh9;OZK8l9 ;??P-Z$>|xrKv-#??_LZ{,=K߭6O>@@@@@@@@@ v};     Poyyy{>\fddʹmڴ1vZ-@@@@@@ɏ?(Ӛ5kDylR &:Yge۷lJݻu˖-AΝ;K||U}5w܇E   @`ɒ%2i$9psr@@jKT>y&^xA:4E@ ?`57555ʨQL0FGG[Ǐ+VZ4Tyܸq&wm}WCuڸq5}; 3<ϻJ9V@@@@@@@@@'@oX@@@@7}I^Oʪs 3!aҷڶlOA@@@@@uV3(k׮JO700 67..N|||*B0ֆn޼ل|ff `_׉rTt    ,ӧ=TxΞ=[fiE# @ 4/9 2uTy%44駁  sϗyɎ;ʭ  %22:txHLL>@>#ٳgOnA&M$C-&:ck9pJHHy5X9 jS#        ^fO@@@@I<{!'׶m/jѣR\\\ mժ[6l93@@@@@@! 9rDVXa~A6l [Q ;۱cNJVدǴ:!!A <ک{vj[w^zq_6   T*/999f yM@A@ {d町t"/h !@g"Νk=_,7x\y啢a~G'\G&N(sej ]rUE v jS#        Jfqs     p*&Wzm`mfee!*&""„kN\zmֶMxo,D@@@@@f *˗/7কs:ӠADhhm̀6W봴4o6֭[;a6ط   8vL  @Cعs}_;,ӧOx@~  Nv:tn0dM]@ffh{gY)\}2i$ %Pɓyf_999U\HhhykLUʱ        4~§5     Зbm`v^2m{3zuX[li|۵kVkXu@@@@@@\M MIIqYԐ]vԨQry癐VZTfPm&6mr {MޔmۚNm o6g@@@@$?,f(y뭷/@oO>D~IMMuNO>2sLs餁 ())1\駟JFFF{mBo&֭[txػwn߾J۷77|5YΝ;כ]U^zɠA̤:iӦMY        4*~"    ޴4m{mֹ5k^,ՠ^ c#@@@@@@ђ%K̴l2ѰߊJHH > g}hѢ͠anݺU *. a5wұcG 5    P'N'ʗ_~ .9s戆P@@*-?̘1Ce=s5Fh0yyy_| _}g%Fi{: o0Od淙sѣG˝>r- 7 Wgh޽{VyJ]t`[wԩX@@@@@@@@h6OB@@@@ Kǎkk} N/==$4m۶&W/s -;%~~~5vlv      @ffh.^X*P}5w2f9묳$00&W}픔Հzlo߾}%((D@@@B`ڵ_RYG}Ty6@h 6m)Sȏ?\޻ydҤIN @8u'NM+=K*^{ 3|||N`hB\/11 ǏONԫW/93};vm@@@@^{5`(sq  @M ʬY䡇tg68sLsh  G}$y޺v*o̤;f~y3-eҥqwu_ ̬<###s96W޽{wr        u-@o]s<@@@@@^^k{>p[ѣGEϨj{;t_k׮Pd      u$gpoF.]* Cq/s9gmڴ>^4P   4TlM=Gd޼yҩS'E 4I}'suON+:ua w}Xfo݄<(ǓD]o&iժw;mk=z\]3.nB@@@@@@@@@T=5A@@@@ӝ_  y\Ou@u !:o'kӦ@@@@@@ ?7!;vx5r9`qI-dÆ &WC}57##㶮ةavgvW$    4  PV7|S>c9y믿^>|2f*P׷zK>#r[YmZ>ބ|/㩰C7oq]rez)v|Ү]r{^3F6811QʊO b5xTf,C@@@@@@@@u`@@@@w|5NkC}5跪 :;<::Zlx֝:u*7߶m[+(      TW 55h˥.ҵkWȻw^ٲeunv ܹs՘G@@@@rr\uUi&s{˳>+SNm! #}veŊn>ӛo)^xG@jO`Æ &> ĉ宻2an T !!M3g9vۺn{Wɓ/6긭Єfrsseƍ6x֭RTTTUglXv,D@@@@@@@@+@or@@@@З5W5!e#GVޫvrС @@@@@@jR@F?)~Y㮃]v&7--MJKK=g;}||$66-WC~۶mkWF@@@/&LGoٲ|rE5K.@ޣ5k<lw/DDD8}4@@rrrd޼y&?O0\s Fө}ȠALysE   ̙3{q~sի,X@A@@JJh~lչsg8xE9}4@@4W__رcG2e m.n1$gϖ~[8'ꪫ䷿7N}T4xÆ k׮5SbbW,aÆ`{-nB@@@@@@@@hz6ϔ+B@@@RD<(:p ->|z۷7iҗPoL      u,uV7o̝;Wo~JG x'WE@IDAT~  !!!?6B@@@@aa{k9{%G}$N @@ 2m4r6dƌ@@̔w}W˶m ǏOFᶌ4v…2k,S ѣ T曥m۶ /q ` 1*+aaa2x`lCccc+ۄe         m"    Y@`ފuE|;t ;w6!ek @@@@@@*cywLpLrrrNS|5wȐ!2tP3e~߿Zae@@@@9 ddd0K: HϊG@@ɓ'˷~@{dcǎuh  @ ,YD^}UY` =7v>Ty77ߔ4d„ &wԨQn˚Lvv ^vYL;wJIZnm_c P@@@@@@@@@t>K@@@hVܡCd޽&Wk; NOO?ei׮ Ձt}2/"     ԣ@VV,^X̙#˗/Ǐ{u62p@3P ۷/^    Y`߾}r%Ȗ-[ 믿.'N  ,wӦML}{~ZBBBNyl .̚5rau|WOWfMf@@@@@@@@@O#   MTD8 {q `_RSST"-Z߮]N֠_^hH~@@@@@@ 45wƍޔ;yd4A@@@jH`Μ9=1B>si۶m   x#}v8qf{Ozm@@oo)999ng1n8{3@BB }w%33m:Ȕ)S;mSصk^ڙ6l @N2d >|ԹsJa!        Ծao@@@@&+p1曔$e{z=xYH93߲m*+<      @Sؽ{[u$;;Z.7pz뭢2@@@@x'Gq|Wˇ~(!!!N @@(**/Of3f̐uw" @*8~̚5K^~eIKKs[OCR?m3U &׆Ǜ*ێe         p["   MB ==]v6i۷OJJJ}lo˖-O6@@@@@@@) :;p5k[Uގ=* uUnvo~#111U    (+&LDŽL:ʮ@@+'ӦMW_}ٴC;ȅ^@@?ygMhtQ|A;$88um/tYfo!rJ L>D#GgVZ%:sd'Nt:Ð!CtR6,D@@@@@@@@ފ5@@@@F+pAٵk N{j_tYwL'        eƍn3رCJKK+СCeذa2p@INN~uCeʔ)fq___Ŵ@@@@A ++K уdΜ9rupH@@oK[fu駟{  G`3Ȓ%KNCNoHH2f(((+/{nEuGQT0J1 ]RU]_{cXXb&jL4ZQK+"*EEb׼ac;N3׬f>a㋼)7pAe#ի1/~@,WV;q^tنs߽{ܚ9K @ @ @ @~o @ @R)gŬYrK,}_~h"noip  @ @ @{\op_+V=pߴnvDwyg}ݱ`"m4i$ =䓣qEyA @ .\oL4)o>l{uʙ  @~yOCo>yhݺu P:&O7pC<ӑR m& =Boʏߦw˗icǎq9į~^zc^@r2eJ9sliNmSp˖-7  @ @ @ @~$ @ @ʐ@ `̙ٚ| }ҥKH*UM } C}b-~T{* @ @ @)%N0!/7HRFСCt-[S;Z^ᒮzw'ѣG}q衇FB @ Pz>߿L6-TÆ cذaѹsI=!@^;3.ܵ6,RI'UoV\{O[o7O3> =_>+[oq-%/0ܽjj7litZ MkگW  @ @ @ @( "~L @jo6[웶)71KлiӦYok;m6^|hݺu餞 @`iӦeN{OfwwGݺusev @#.Bh/8޷SzFQz{jժxofi裏s=7ߴL;)p>}z{w{kkժUn5}- @ @ @ @*ߊ; @ ֬YsB}}XwTUMoo+wjѢE 80N8l~ ܽq7x#V\J*E֭v-ۦ>S @ @ @ @@y[^?Y"@ @6ܹswމ_ڦ54j(vi,зp~k5j1MK @ @ @;ӵ`ߴM׮]i4Qanݢk׮ٶ]vQjռЁYfW\ߝHtvK.$N:H[ @ @Jĉc}*h^ڪtw\ @~@ G;#XtAD l  @R(0eʔ/һ`?!z]܋/lٲwqGL>H[lEqqYg6lSN`Ŋ1y>{> vAѽ{\pnݺ| @ @ @ @ʒ߲i+ @ ID}Q@Yaoo}Yf4x˖-p`_`F  @ @ @hꫯ &]kԨQ6)a0]t7Go;wn\s5qիs7oM(zqEjrv @ @J@ ׯ_s z+ @~UzzkgҬY\q7ߌ;prѮ]}ݳGѴi|Օ @ @ @ @(~KG @ @X7w}wމŋISo}~z )=d!@ @ @ @֬Y]?~|3gM3pg){wsYbE oXdIm6~)UV͕!@ @(SL+ꫬi_WԮ]tw\ @E`Сqqł RpvZ @d}ٸcԩUR%k-2Wn [=S>h\2PJb}??-wNXlYL<9Ǜ7o[7cǎQz A @ @ @ @E@oi$ @$yL6-;m -Zabwu-AmD @ @ @?~ꫯfۉ'ŋ7pƍv9jժO?t619sr4h .8Kܹ!@ @(6R{Ɨ_~ٷox|Sl"@ O>$<,{ls=f @T`ڵ#W\~aՋ+2~ (ͩ>,θ믿.X{:ꨨVZc^N?xܸq1v,4{͚5y;[fu]G`y @ @ @ @~7 @ @XdI;u4R_`@ʕyѦMhݺuv?HP% @ @ @'&؜>}z6A`(0OPFرcp~)iR38# kjժ1`ꪫ"Z @ @ʖ@~j=gիW :4j׮] @"jժ oϵA|'sv @R+|C,Z(-ZĠACɕy//?EjeƩ껶ua~\'Lϗ_}o6-[f={9<, @ @ @ @J) @ PlD }75ϙ3'҄߷Pf͚eK- Yq @ @ @J@ M&L`4 ~3 ݻnmSo ݘ˚5kctܩw߬UV2; @ @eG`ƌѷoߘ7o^w= u);S @};mI+h'|2nub0`@}ٱ[{~H~OKٳ7Y#[SoΝz| @ @ @ @JB@oIj @(˗/iӦo)7~ߤޅkҤI ] -\wyl  @ @ @ lbpߩSƺg~Kj&[7ܷq߭Q_kw\L2%wv!?+C @ Pf͚)eܹYǻvÇ7߼l Do  @JL`̙qGY\tEq 7D*U l  @R..8p`KVZ5 ꫣnݺr;?_`̘1q-3<'tRѴi\)_ZX"`j֬]tBw}hРA @ @ @ @(.a% @ @Dl4v M3fի!mYS[lU @ @ @XreE}? 4IҚ&رcTVmXD.MB&>skڵko8 @ @@1 {Y履~ܹsx~|& @ue˖駟>`n(G}46l+C~!Cdfu6ݿtmQG+S<N|ǪUr}gsG))wɑSq/;J*E֭s)Yfy;@ @ @ @ @ rG @ɼӄޅ9s|顜͛Gv}mz0' @ @ @ 4!_Z}Z,_ 9xgrM]pqWFR黹+X`AwmKJ*9EHGߩSoN2%V^w=zwuWr @ @ @ @ |2  @ @bXti1ql4iR̙3{S^رcv)۶j*TU @ @ @'rʘ`6Y @ @@XlY/ƍu6}jԨQ @>,;xWs}:bРẢ!@eG`Ȑ!Y%l2ٳgHi.z뭑B]ڵkݿuGʕ=d K&L+1~XhQޑ]SHo @ @ @ @_? @ @@]6y졘piӦ&w-":w)7͛7/Syr @ @ @M믿ή RɤIby&u]nVy)OGy$?zhРA @ @@Xzur![Ҳ6d͚5+k @M*/uY__~cEsev @!㦛n+VdTR 0 +SNHe.ܧNZ;S\veq1DժU Y&x{͛wUTݫWݻwmԨQ @ @ @ @TLas7j @ P_~e꫹5~9Ək`vo{!CX4o_'pBԨQcC+̙307m{ UVYo>}vm @ @ @ @a36B @ Pرccܸqٚ^|K͚5CѥKڵkM:r @ @ @V ]>}z[8G}Nh" իWMReܹ^{E3-k׎)5& @ @@K⦛nƞA )B @85;,ϟ5W~?/AldkƟbɒ%n-4h+S/R\wu1r"7i$.8Sc6+r̋%KSN6ߒ{[wq|U @ @ @ @Sa5, @ PV^{$ .)҃*ݻwnݺeGj6  @ @ @t+VI&enjƍ*oT:tB}{mfˁ>,sxw!12$:w\^h @ @ /?);̡rǡZ] @~x`[Yl <쳋DZ#@6|>FN8qx&ѣGۮ]RJi @ @ @ #曱f͚ujmԨQv]0cǎz2ܻwHniiѢEv5]? @ @пXjU6k&~ߕ @@HtW^yeHW}7SNa- P>8bṞm6~H[K L>= X~NJ+נA,ώu|G \2&M)7cǎEGzta ԩS2/ @ @ @ @2$ }XJ @K`C%/ruܸq׷TT)ڴi=TR8o @ @ @(Eqn;lw/s᾽z}_v}54k,n @ @{/u_~e638#򗿔 @@Y?'xbX"nǎ矏F# ;K.PF,΋4fϞ7xcUVNذaø 㬳Ίڵk5k75jT3&]wuԉ=zd)w]wի2 @ @ @ @R* 췔~0E @[`֬Y1|lM~zOQrh߾}4wz@B @ @ @@Ha$G4\ھy; m6޽{gm&o~㏏|0cr-cرѲeˊb @ @r#7Dcƌ٘xgJ*fB P6RhA .:ܪUxI&eczIW`qfa{x衇b*,-atO,wչࢋ.3<36l\Riӊܳ9o޼|գVZnr֭[ԬY3o} @ @ @ @6M @(ŋK/C>>RJ${GD_o] @ @ @}y^v}wA?HY% @ @ @ @񬝉 @@zcȐ!sŘ1cbժU=gͣ_~ѿ۷ol뭧 @ @ @!PPPӧO&p./۹ZjEݳzofy;~CMYR\Qbƌy\rk.gц  @ @ @ @ @ @J\`ѢE1dȐxcС|;gݺuq[oQ@ @ @ @@(((Sƈ#"ھ꫼b-P4I[80Mږ&ov[x-^zɴJ @ fΜݺu:;E]ul8! @ og׋ˬAO>k?N P {l,X nڵC=,t\1חB'NXd|vXp Ѳe"^(/"F 6mZ.WT)ڴi;ۚgJ^ @ @ @ @~ߟ @ @.]>l<ϯ7w<0>իX4L @ @ @OHi[8Zmذa6Ys M)7Mf)y_~9MWF7n\tԩO  @ @E`ѢEѥKxw{z)AiEI @~@ kbYW]uU\}?9#@J'|GqDYҽb^{m\q;/}z;bĈ,wy{[f.*_um6i.j @J@IDAT @` ygm߾}3&ԩ @~c,j mG} @t X"~\>VZ2;W`q5\s͝aÆqW駟UV͕!PR|M}Q{R_H?-Z aUUN @ @ @ aAQD @6@⡇*pOa?vyH ~& @ @ @ Pf͚/rpߴ~y;&ݻwp=#&clZ̮ۦ^/^x˛#qv @ @@ ~qfm֯_?^{h޼yCc @JR`РAqEehРA;mfJ&@67^zi]6;s.]駟ƍo8ݺK.[n%nHKn}ݷȖFXxq;6 M&MUV=w ӧOWwqǼu @ @ @ @맀 @l"%Kģ>bĉ֋MQGկ}v\ @ @ @V>B} ~?ӼJ,Ro m׮ټZ?_vyM:54ii: @ @.0~, TT) H9<$@ PvX, }G~^ko>*WV`D~a֑?N8M)g'@ @(6GNO>ڼKo,5D @`c |ѥK9sfv3<3{nuc @HsSx1gΜd׏z*['w4iR{1nܸ\ݪUƀktXbEӚS pe뭷{- nӦyoa)'@ @ @ @* 1$ @ljkƳ>wqG6TRq)!5k\} @ @ @6_~#G̮3fIڵgϞ{fRpH*Uwt 80?fׯ_ >tuPo @ @~@}_|1k#}dRo$@()[ndɒ,kĈB, @@?~p1ql`5jԈ~8;525PJ{*~ZUin4ȍ7K,5߻wH.2;J@g_υ3&曼ݫ_~ߎ;FB @ @ @(~'k\ @ IR_cРA1o޼"}޽{ 0 <Ȩ^zc^ @ @ @ VXƍ˅N81 |]_Ro׮]#uv5j2&>#FdN/_~y @ @:thGDժU{ꕯr @eJ ۧOxW~wyqm1, ֬Yzjw}7pف^q{O:h߾}.`РA=E*yA @ ̚5+7]N׹ǎ92>ؐ@".7pC\z饅/mKaⷿm ƍgG]XdKT ԩSsΰGsv.]Dw @ @ @ POH @ @L|~}QժU?>.HC[ @ @ @ظ3fȅ92꫼ys} @XjUn:fϞ g8 @ @"߿q!ēO>I @@4hP\tEڵkSLɂ` 믿>⊜5\u+S*VXȼlٲ\{Yf2;ʊo]$wܹy^VmݢO>ڭ[Yf @ @ @ @J @9'Yg&M=|q饗o+C @ @ @@ |/f!/rt-o=3v|UC;3>ld X @ @ʇ\pA6_[oE @w֬Y)8^ˎq '| @@y[ / 뮋/ v]oeJn/<1?p @ @ʫ@ u]cڴi/¸p @@>8ee]w]hJ^ @J[o-{wiVXx⮻kfCZjqUWEZp@n=jԨ\ٳ? )O>ڳg|w @ @ @ P~KZX @ PV^=<Ο??omڴɅ'8oe_믿>㏏x  @ @@9H'>QPP5k֌^{-Zn]Ff @~g_7;ㇿYM @ \r%qM7e^z :Thl)4WZ}f]w]X"mJOAEڵKt7o^;jԨlogfޮ],7߆ 2 @ @ @ @@-F @ @@y3gN?6-i[n% Pއn| @ @ @J\o#F~}ݼnr{Wl6y:@˖-v!RtժUcƌѢEV @ @ ,\0ڶm}Yh, @*_|]]xq,zE!0^o׫W/Ǝmڴee~SO=5Fr޽{ ,(;uԼ){]vɅ?/[mUE`2F @ @ @ @`# HNC @eW M{ܹsA4i$zҥK @ @ @؄WW_}5N81R4`߾}YN;j qgfu_C=ާ @ @@8':>СC#Mo!@ P.¸[_p1hР` @ Y&=xgo1a„fm*EYpAAA{.XdIg7xcԪU I … W^Gof]6oۭ[.T @ @ @ @?@@@R @*|={O?4Ce]^mݶ9 @ @ @ 0sZ[ 1bD,ZhTV-w߮]F*U[W!#&xkٲe{xh߾iB] @ @R(ǑGl-S 0). @lѸq|U @ @ @ @M@￑( @ @O =ܫW={vVйsl- @ @ @#_K/)^>(;Zn M Ɇ-[_W|Y{w 6O= @ @,_;?|# @>_c7|s\xᅥzDy[nfDΥ(((o=.XlYvʕ+FR-(-1cD MɓcyG;f)7/u @ @ @  @X%K)SdG?G-r= @ @ @ r7n\~_Xvzaz\oq뭧@q Cƾ[k @ @`r)qfg>㩧pJ @O`֬YѪU} 3gNTZuT @x7GtҬ+<9FKF`̙q 's'h׮]<#ѦM\4_رcs'NUV׼y,o߾vvN /  @ @ @ @, "N @Hr!3dǛ6mcƌ&MB @ @ @U`ƌY /#G4IZjEϞ=#m۶QRUUFDći"낂q#3X"%@ @l4#FĞ{^zoGƍ7 @@i8蠃r>qᇗ. P?㨣ZQFٹsb}r;c  @ @ @ @r( ~D @?]G_WYժU> @ @ @Q`1~\ɓcڵhܸq.7Ml2)I&_D5bܹѠAM$@ @(.K/4?d+RJռv @ hժU̜93ό3bv*c3 @ Z* L娣4 X".;"tf M~@s5a„\orٲeyJ۲e˼u @ @ @ @ʾ߲ @iӢ{dɒ{'N=bj]3 @ @ @ʆ{Æ ~_~Xhz;^Vݻwٺ.BZg<0ƑG=ئ @ @ w}7ڶm)Fo ,J P?A^xq7 oqt!.\{衇׿SP6'pB|uY1hРYf?^`ʕ1iҤ9rd&]_=eJ@Tm˗~HE @=\GF2cƌU֏hAU @O'x"!CrSW< #&@[㏏|0CH Ʋe˲ԩS'8c @Xzuk1cĢEvQF>}D֭RJy;@ @ @ @.a @#8";sݺu[h z @ @ @JF`޼y|Æ ˶_W=z}SoM*^)eE{UI!!A:HGJM`Q 6DQeA]l, (UwNhJ:B衄@ R$S>̹w=LBpa>}/O@@@@'8\߿}Zt{LLĄ ^ȸqg@@@@@@ 6l ~-?#Vo&M${.qoԩ̙3t]SkԨ7>#   W`׿X4lP֬Y   $C >>^ .,ϟlٲٳg 7  :ufhy䑨(u/՟tuӧ|ְT"ӧOeZ( @ h^z{Do?~J*O        9wD@@ '|RfϞmz!?       |G`_]oŊ\rIӦMߒ%KI]͛*C=$'O@oG@@@Rܹs#.?ٲeT^/-4  ݻ5\:eygS  2a3gyF~CP'~w5#GoE_g6HwZῑvZxb97p(O        . 37A@@DSO?mVP!ٳgYJ@@@@@@pS]6 yǤu&^z.'%hӦ/,cǎ1@@@@^}UPW @@PFV:t s}@U &&Fʕ+'ϟ7CЯ4háNQQQҵkW?_Hpp c3{ղf͚$8[oʕE煳!       @>@@@.]dٳg3f̐zzIw@@@@@@pػwAnr ,(-[4X@8/ _!Κ5K:up/kNy@@ tM+5HK  >/pyG%..Nr%g>3@@@w $$$Hb$::ZBBBܹs#Gw߆@@Kƌ#={4VlݺUt3)ׯ_?~U^zk)R:G2V@wmBob:G@@@@@@@ߔ@@@@@(eȑ;wӧ{A"      ʊ+cǎ$ KVLo% e]N"/ʕH̙… 3gDA*THy@@ Cƍi @@^x4i~(}~ @@ӧ|צSJ׮]6 ^ jՒm۶ގ=Z^{5/9]L7oz!J R u@ UVɚ5k~ƍKxx+Wtz        3D@@غuԮ][r!퓢Eՠ      @ ܹS/^l~ׯ_/qqq.;SD ͚5\rIQRpa3\֭[w_s2|pӧC=@4w׮]zjk ~.oԨΈ        )JYuj#   }5 H>C~%e      W \|Y.]j~,Y".b`jݺ -_zDH!<<*' 7.9U ػwTP!  }k  %@@R,иqcɗ/Ę9 oߖ  ח^&Ol#?/}cpxd֭O%..NtݕM67|#YfR@*U_5xfבh~huThl        <>!yU   L>]vjGرC`@@@@@@T/6 $>>e˔)#mڴ1ᾺRl\$8 GksRô[hX>G:p  r=  @QfM3"EȡCϷF@p@eĉ.Ս)@@h)W\zU2e$QQQRlY)]zP;wȻ+Æ ^ -Qux@R#ɟ?CoŊ uF@@@@@@@;Ҍ0("  ۷e ?3~-       i)peY| 4̷I&Voҥ]U$!eS# @ԩDmF@@@D{ꖖfjS@@@ t 7oh"u q @"EdРA&V`}:uOA8 h'|"jՒ_|{*T 7n]ʲeK/νO$00 ,xTjUO޽{Oŋ={VOnv=YP!k -WU        @د?ʌ@@@@F)O6;w6aA@@@@@@Av-/6ׯ8M¸{xxdɒe=N" ݻjJ*V]pԩh6@i5kJ^|z @@ :$3f07x衇{iw3ZF@@Znm~uK,~M@pٳ|rqY`l߾]WTC_ȓ'ڿꫯ=~ə3/ 4ȻZjf׏} ݱcZJV^-k׮K.YVgΜ1sfmf .,_},SU       (@د/ @@@Aƍ2l0sN's      @rbcc͂-28qYf5io۶mTR.q/~rYew4{ܸqh6@i˗/ӯ0C@V>3 ]t,Y i@@?hٲ 0zٲeҷo_?`  ,,޽{*3fpƱ dʔIKX0>>ބ=ׯ__ϟ/aaa>6bohػj^rźԩS& \u+VCoɒ%@@@@@@@~}Ud    Ѕϝ;gDDDH ['@@@@@@ }ݺugU.S Հp 'pf ڦ    ~3gȄ Lùr^z&  TRE *$wddh[PKQۂ# =z!CHtt̚5K+˗Ge˖.]HLL޽[j׮-sΕzCD5jܹsGmf\ƌg ;\}ƍ}o>9w׌'O'|a9~,)S&U  uVYjk׮];&Ǐ7,UKd -RU        @د7J@@@ ӦM_o۶T\9mq!      B-2+W u.] 7q2NԩSyqh@@5bŊI c  !l`  G6 iHQZ@@@_}RIԫWe=N"  2x`t y:t,Xпxeʔ_U:w,˗/7sitb2 T ((HԩcJ\\l޼لj 9rDt;v,Wh-_x_!      x@w!   #F.뭷2@@@@@@H!UTI¤w&>788X7o._|8p@:$;6mڸ=DԿ_Fla v_    &M2!"z^Ns@@?hڴ5+VXe   9r䐞={7oȑ#G;wnYht݌ݻҿy7Dl M sR~}ywM@ůYF># ,Yتѣ%""B *dWfϞ-111u9@@@@@@@@<@@@غu믦UJƍ6      %gϞŋEȖ,Y"/_vE0vڙ_] C ..NbccMg    F૯$tqw6@@H;0)Y/ i@F@67|poƄ8j#=~x)Q < /?C&O׍V`H 88X6lh>|oZ7nk#DׇjҤ4mT5j$rU@@@@@@@  7Cع)   @ߤht@IDATz|mc)      @BBlݺU.\h-[s2e$uԑmۊVV͹  %m˖-#    ^,ԅuAw6@@H[ P7nJl  @bO̘1CN>-s̑.]}IϞ=M̙3%::Z͛'C) 1ὶ5_.ׯ7+W45X^7o?_F +A¼S@@@@@@@C6@@@q}C      |,[̄.^XΜ9&ҪU+ۺukɗ/zDqa((    /Z}_b)   @ ~d `J;2 x@޽MدwԨQz |饗hѢҹsg_~EqYt(Q" H :Ef1电kZ{]3;wȦM>l0ɜ9ԩS WdɒW       !/@@@pi{NXٽ     x@TT ]h[N]vjժ&ܷ]vRn] tY qqqVua/6@@@@p̚5t@ҩS'4=D@@}5!  ;G}TgB:$eʔqGӴ-[4m۶h9p[B/]FOș3uxYFUVݻ%!!<t]CBB硦MZjIPK,,A@@@@@@pv% !  xou祗^@@@@@@_֭[zjY`ُ=rP9r͛[-Ze=N"]͛"    ,0i$џֽ{w 5@@|GpV͛ڵk={v #A@xe'=.nUʯ*!'O ʢEN:=8z!7o^رٵCΝ33` ݿO#b I I~ S@@@@@@@@ 5Fk@@@}Z.\h}-[fuu#<"ڵ37&alٲY#ע   x+V   iX[\\]VZn7  ? 8Pܹ#GI@@WN?,֭6m͛%&&F5k&f2!isWZE(Ptj-k =zEk5\|Ixx[|y.@@@@@@@+@or   5ӧO<Ć      } m6`ٺu9-88X4W~u/Ss@BBB$00P޽+/_3Tu[nɉ'~U)[.]|3>@@m]vɎ; ֭+ʕ3:@@9޽{ƍS=^xAz]U@G3+Vʕ+Zj5kV$vR;߿z.[lRsУG+)55ݺum+f3f̜9Snܸи9dÓ9xge!9sf&![*UۛsOM6rY.ܠ:s>믿N׮][FeS@@@8qޝ @@W <<\ &$)}@@tNɢEL7MFد`Կ9ry=̘1CDhtA(YfW}YΎW .XDw SL1k5kf'!       ,@د   ^-pٶm.      =z,V[nrMObԩ}DDDt"  ʕ+Ν;/]$yc :g3k֬stʈ#$00о e?ПwuNַ~+wޕ޽{˗d XGsjǎ&wŊvZzرcͮ'+Vh5qƒ;wn.@@@@@@@`@@I Zzꩧ2@@@@@@shRJRdIӧ o7|cB;m&ڵk'0# yE7|o߾w@ttj7{1cR:uJ^z%S?~m۶~1f     xKL dfW}.^kNx iڴ9@:eSG5X=*%Jg .\WZu6y˔)S ЬYJM`={ֹ9syfyWeɒ%.?|w:\E7+W| EyٺuCr%={4W\e˖ɬYh믿~B3QjU*rE9yݷ~[Fpn۝GmuرCjժe;t8箏?F9@@@T L6ͺk׮V  3b p#6@@&йsgkQFxD :T#o9裏L8aBaoPe˖2g.˗_~)cǎ8빥K_94^6ZbEٵk({.vpB^7lPfϞ-^z߿uNé'L`BN~,$$$ȪUw}mp_V>:sݸqca~pppsluyD@@5k~X y޽i  ݺu#KjܸhXlYmҤIҧO 7G@_t.LrVnڄj Oq@`"3s5t~λ/$ -QH{|մiSk`+W̺U޽ۚwst.+W.mIq       i%@oZ.   @ "i&Dk6@@{#   f]MC}ϟ/͓CܹUV&W?~8VF5kVqY\2pw8V^=O ]ԭ|2rH۷ԬYS_n7ߔNF uWvݧ ҵ~N%[lMYߏF[-Y$EagtU]PVXsN~珥ڶ&eӰwb cC@@-?n:ҤIџڮ^ʼW0C@D@ǖ9s:uy퓓'OJѢE..\8 @Zܾ};Y͛Wׯ/k׮Zȑ#RTd]K%й,:תW^;bѣ E4}fΟ={քjmo&t׭PBf-7,,̜@@@@@@@ _CF   "##-pBDw6@@K.@!    pe> ,ZH.^e˖5O<4lP  mٲ̝;,ByfU[ڦpLisDV;%.dXаsHihh/^ܺA :] zYf)S&3fˠ_ܹ :v8q*;t;v8N}kS d;e…u̙3[紐VX9xý47~߉y@@Hں.Ԧ=IUy@@u>|F]ChѢ ^/]T^z @…E@@}7)ڶmk~˗)m!ꫯ_zΝ;ߚ0}\6@ ,(f=zԄjʕ+̙30?]O.]Z4y&X猲!      xyF@@@\Y:ۨQ#B޽?LNU  xرc|t@@@u,X 3 iЛa? hС<#U8FTSN&Wo2zh~T;PS ߒ .epR=Thwߕn';7}ryjۡQ/92d.+Hɒ%M]oʔ)}ڵk+[bŊي~a{UIߵrXX5.[@|Z5-K,.K,1qH| $xD@@-Zdu*9aٳg={XP@@]{J |w:-[Zg?x(B@+4p_Nqߛ6mj]j*~- u&:瞓x8q|I& s :N{n+722R\bABw ;jժ_ nذd˖ͪK@@@@@@@={@@@ wlڴT.S)R$yR @@@@@@wޕbŊѐÕ+WlɓG"""drYYz%#@Ν%o޼?=nf!z:Q`A)Z}5k{hob=X[睃uQ߾=o/_vMN:%.]ZtAӧ۷bhkl\g{c{(UV=ɓ'˔)̙\Z]R%iРmO޼yS4~sǟ}@@@ KSW   [j׮-:Ce˖aC@l5jԐ\rCʆ@R]v3fHpp^|EL @+t[~d޼yr_dȐ!nmHHH[駟J֭fu9xD@@@@@@ ~=u   (%@njzָ@@@@@o Z9st] *dԆ &;M4wŊ&H~{ شKHOٳ+bny +@5(444Ewwn#Aaaa9pñ@h{[=:L2&vtz]4Xb2`I5ޡ+Hnzι:Anݲ?e3e˖|Զ{n* q8ܶ;ߏmԩp7:]CT*US   b[E  m_Ĉs'@@ok >}Z>7cgر̞= rIxxL2En޼j ⨨(?lj\|᩻wJ֬YRQ ؚ07v8փԴ}O#pvZ$ UuȖ-u @@8]ܶ5oV@@2Xm۶V.\h)  *AmͶ"W@Ɯ1cdΜԛ0a꫒pxVײeK7:wٳ2}tyפL2úr̟?_'*TEJeҤIP@@@@@@@`e7   i oY֨Q*S@@@@@@p-di(.]\V̙3 n߾kNBCC]$ i _~msDDDܹs{ZWO*}rZn|ŋ(P@ NM@v޽HNدޏ̼w^k`vl ρ!!!^3:Zܹsr 'SoINnݒg_hhsjjܲ@.oFݓu,Plٲ-[f̙#ki@#^^=ٲen5k8K{G%v췇z* |p+WeƌVZЏ-[:KX[ *Uڵk-W:MدF@@qYvJ͛w%  @ԬYSz17 ƍeǎ&Du<@6o)ݡ x:?y7lDO&$Z炌3Ftȑ#S u@{aٽ{|G չ׮]%|G֭߳+3gR@@@@@@@pa7E@@@ ̙S[4?J7n\j/:@@ x ׀#  d-X@͛g -00,b \s@а3gJ5LҥKE sٳg1pճ .u'O)U{B5| js'jժɩukVZ]4{faz/?s&7%6SzpIJՅ͸z8ԩSw^xg}vO˙:uVU'ѹm שSG&Nh5i&+7..Nve=w}94  X@C@kvׯ]]3ߕ @@|2aRuʜ9s_~Իueʕ2mڴ .*TධPӧMrnذ9rHxx mѢl        ׽   :ѣe˖̀pK@@@@@@LnܸQ޽{O5R4]vR`{p%Kp'xB_.K,5k 7W9T+Zh܆sib?~\޺uKP7pŁs]TITjՒ G u$UTosܫW/kN4I4~rY@TՀ^{Iyi-:gf߾}#I>ꢂcƌt/Hsm4~ӯ{u1X֏AۦwǟM@@@ ukƷ@@2VSNN̜9c~3V# ˗ =sHJ#ڵ ֭y/%W\2dj@Ȝ94jW^m8vUY`\"ELoc…mUyD@@@@@@Ha2@@@8wQbҴcSLX6ME   _ &   ܹ#ׯs皐C heǎYf%K8@&MdѢEs.nۧOy|m~1pԄx:܀]v9?pNv-qqq{\8]o|I5?UnğLgz)uz۔)SF\jժ岺s|?:m1 7o~iدmstfaX<"  @ _s[l)y ;# $K@6mTJ_} sQN:%|rc @,Y"of0 V2m\ڵk}hԷyݻKBB :Tr- 3:@ ޡC'O+VX=m']UXQf gn#       @2M&@@@=2e$m۶5{LLO&Oei ^ԯ5jdkd"< Fܹs"5tZ5,9 c]?xÆ #<^;D@@40ۦ?v3ݪ _@}lZZ7     dɓ'e2o|ء ]cs<&' 4>>^V^p]DDñ9lJ*!]xQ~wfR:~@=ϝ[ڵSݜ.8&L}9W$7`ɒ%0 8ӃhqOPBV]]XbOc=X!-ߏ׻jժ9tN:Vد_}_8'ۡa&p ɒ%ڣ!@@}O\@@@y=2eLJz =B@wtnmӹl<@޽E 44_!$-PR%ѽ'mdo߾-f$o޼ҬY3۲eK Kf@@@@@@@P_?|2   kmӉl      / huVIHHgxU6mLo۶mvO#@D k֬&W2druko[ǶݻmE3X@1szFe]uE-Zd'>m (sk;udvѣG_ prA}ȑt^ڵkKL@@@@@@@ ן^mƊ  [B )      nŋ˜9sT-!e۱cGVL r咈ا~,Zu 9rCo?1 \Rm$'`wpl;طoܼyvhs 9p@^z"5cdĉf?tPN+W.ziDlIپkjۺuksދھs|?:^`A9{ƍ?,:e@xxŋeϞ=:r{:QQQf駟ŋ7 GO2s]P @@;Ο?ouPBV  x>+ СC׉! 9sny5LꫯL)S̼+)}z@tΓ]mmݺՄ.]T6l qqqfx:kf.y䑦M[\T)of       @X"E\TF@@DW>zb?      `/-͓sʕ+MؕZ&M_ -Vs@,j~,͹Q94 :jݻzT +.bft1]WTɡNjvڶ:]Dv̙fիWn6 n֬YNCɨ; Oj;xYdϾ^n$SLrZgҪmck ZH^N?˖-Ku8H3~G{J LY"|)]we>?kM]2n8k_z%)_U  w\ph2@@<i.]d#?:J@@ ]raݏ_͜X3Z۶mk(K,; M@?֪U:Rum.]Yf]iدjʄʕVG@@@@@@@!  '-[6k7nܰ@@@@@@OEO̙c~7m2.o޼Ү];ۺukə3  a:/`߾}O,ԡ݁ٝIO>-~E'@@34 ̶ip  x@>}Lدr,iz i*Ӹ \SJ-dݺus4LrÆ ?~a @ dϞ n'NuCmGѣG]?o׭[|5k !      "o@}d    ȑ=a@@@@@ Z~[RlYѠwyG6nVD yMٳgeҤIҥK~=5  %sNsC udwě%KX]^d;ߒ6l9{+\~~K޽{0Pqqmڴٳgۏ?c~Ŋ=zT>p`ժUjo2eY۷[e[]|?: ,YRkãossЏ*U -ZH"""$$$ĺ?,kז;  V'3gl)   g ׯo:g9sgv^! @ /888ˍG@̛7̹Q'N0 kXNҥE~vvySN]H<,,wpRr($OQHPP`@ŀrf< P0z"YD$H: "$9]۳;5~ݎUIUOB@@@v!ӧO &tptGKNL`e ';hRQFIUΣiӦbcǎQFA^{@IAځ[7  :؜>tM͛77ݻM?K@_]9|ҥK*nfez?vMr=z˝-ZHBoya7R#h ڭ7A$yYz)g(r@@D3g@IDATZ_T?ȿԬ h~Vk׮{lB@(FK$@Ŋeʔ)ҪU+ӗ|ѢErv|6! hۼc9<}ֶmd֬Y2uTeŊ VSƍm۶ҦM9SE@@@@@@@Ld&-ʊ   *uڵ۰0ykV.\ǥ^*7tSgqlڴ): XlYiҤ4ky7䭷ޒzЎEz=k^ʕ:ԼyB_'gΜ)˗O8T'\(6D@@@ $&MǛAK,:'lwyrgن  ?-@lҥKݻLND KvѯZjټyO$wڕewTuQYy VZ%[lf\wdvwv˾uV֭[`fT"p]j7C9$=a_3͵i;;ڑG)_~e"jL?*Tymx͚5g3=a|Z?z@H/{WҤ4񧢝6i/pp՞kOU~=i*k3i%W;|o_fOk_>[t-Zȳ>ko;K]]j(3K믱VT)6Q vaI'$7n>64$@'7tߛwƌ |rǣ>*Vq@cK@@@@@@@t o!ʇ   Հ{. 1wyG~6J Kׯ>(lUl*C .,၆5W#@zipI9/O>yٝ}#Ё6Ku/i½eaSqXByŠX^xK.|ݺusoū^w_ jժޕK*J8py7ہxt@ŋTuO4i'c4_v `Z_p}_y=5ovdJSR*ܽ@@@ WIx\Neʔ1hp:B# .;Km;~~5\hpRݺueܸqSɰ5>Iv7,gw =z%zh2-~K//^ٵm>KÆ ;fIk&f? 1ra~szLF W^y\z߆5Hoٲ ۣGE@ @c㤬.񧪝6fgI\'ʟkvNE~=swmFsɕ5kD_/ۋkpgYR&N(}Yءo=v&ȃ+mڴ19vm:(9k %>$?,qqK*ދ9=?\Y1V5jĦ@@&M8 ^T?3Ftx@ :UW]eFO>q8t;wC[yvL֭[&       ?G@@@@@Ejy3$)o?C 6kv^_~ I1%m<<L֖=0%K$}pݧsseEՠ ,^_~ Zes̑E%KƖr[ƙͽ1NV-W e9餓x^3o tIewan駟&[}RmlA\|oM.K;3LRq2|pॉ2eʘ}v͛7~E;qղqFC6`a)Ͳ(Vu]}ǚBo^x   Mfy[Q'\OܶSg2Ww v@=W1 =i}6z4WԾoUsRϥTk1N'^Zv<㡫^oe =,C Y:K9͂]O&pL^ZWTߑµdzdN>dyWp :d5jTٰ= @ )"'ps=[~7ӟꫯO~^=ziٲ @޺nA>h[z;v83sqR^=\|_lٲ9 .큻uvlٲzg71tjPO>e\|]q0c!{vсu}*WhuiӦ;DСl۶-Jz_83 }MҀ^`Zj[`lfQ%\'SE@@@ ? :Ȼk{DX&:u$wdP*l[! @?_﷊x嚛yK.]cA)c$ngAN2>&OTR.M]͹dRW׺׋1gF^1V>,VƍǦ@_9:,%o@< /_޴+WL"f͊v4ȯ> $*U֭[Kvm۶9~7b;       W`qiX   I:qLgϞM#dŊD&Aڴi#Ǐ/^Z|Iyeݱu~3Fz[fOlܸ_UCؤIYtpLg}>3Ё>O.:8ȢEbv%?ke ;}]~C|Aܹs`>;S,Y"͛72vz큂4o H_ ^=TVjJM@@_)RDt*s+B;w݆_M3ϧ5^ cDvhï9Im-%;GvZn/Z*[^~eo6_6m4E {wabL>QEJnݺү_?tG}^tE]t\N+gs}<%gu>gew%KΦO%DԌ1B#ݺuO. @~бq 7Ν;eܹ˖-Ucǚ.Զ^_kxm@@@@@@@\ v9y#   *O?=v(tFx͛LNyhFO?-:[n /iS{V~;^XN [V,~ 6L6M?@kڿ^ȶmbrk۷7(h l]rUv+VM$ >l駟r;"8^u֢vP5Iv}J3z֬Yߌi@@@@@@@ rFNJ   B@iKMӧOM6bc*$;Pï*:h?e뮻!+V,؝5wmt^ r{to׮]gϞt+V屯: :?`"u.;vL0AV_wZ`%.(ϵV"~ׯ_/j`?=*T,.7fH TH9rd`z[nެ]] kmIq6mk׮ś;w̜93Zn-6d`5:   [tg>C/Xƍ'gtNMw9|GWۆ @@@իxu k]鲜;$^~SL-C",(m^|X;vfT Xƻv氋/={SY  P@>?  1x իTV-pdmۚ;9y'믿l        F}@@@RO>O=OgXN}Zd;yr!&BvJʲM2~sܘݱuvI 򚬁g?ʐ!C`:[ou[O?ժUKJ,_d]]/K, Yf(f\ݵ=ف6o,׿lW]uN\Rqo]/ٳ'Pn!06Sb~)K>_N<'4w\AA& 䥼+ @@@O~u]ҤIiذh'?S:uo߾2{lyС(Q"?QP@@@@ 1"68e.P  @: hc/X1cէcyt6ZD<{wц_e'6z>?=kv"NlïQWԾo?ϸ~.23 %;﫯*slٲr=dzWΰvtd^u{;oM=H/p饗v6ZR }!\U%zmgLܒ} %{v.w\9Y'"t뽶m޼y" NV*'O˛}]8&S@ =*U$=zѣG?`SG'|-Z4V۷ׇo|?%H       @MV@@@V@?M[/m ; |pR5Hc8ʕ+ތv'z /_`=i0iӦIݥf͚rmIsNV ZD:GZ-{;vb ٻwo`Y^g\ݵ(Ζ瞓M6Ŷ)^c |\|o%zoUɤ{vc9FZl_:e"EΝ;D=+eGu\veeQ{akv֭[eƍl.   d={䣏>C>c˗j 8 -hSN9%d 13   'PX1y饗DÇ KB@8pֳ}k֬&l3Mv.4只MvSў5C;~x}'\'sj9~.6Q{r~ׯ_/۶m3*뮻bBWTR_ǖ.\X>ؼęͪTbX䓁;0      X@E@@l_j]'Uo#rن_6tho=璝Tϣ|5dͥ`p7[dɒ%&`Y?wL2fuu@&;ܓ-#m۶5i?nݺɿda|"g/p& }q 7{{Mf@-;t=5ܣGр!^AEXruyꩧD;h /P*VV*ks`.دn_E~ϸpIŽ_ӶKT^ة]v?#\/ſ+m*T []q ׭['͚5 cϸr<   .qFywޑSʶm۲DrgJΝs |.ϲ1 @@@򥀶k׮ &ȢE˗uR  @&te˖-aÆߞ EOy9y0UT2FՖTb]GOE{rW pن} UG-yWq-ZԴvՓ/Ҭ[jԬYS VkP_\  g"%b;i+r{=ӗW{ݻwX{D } 3qvڼ\o*ދeszvgulذA.ئ~tұy&8:~sωrԩ|'.GHաq˖-2c wɦW".7}osgg-۷xc[y@@@@@@ ~ ι   @x衇̀:0lj@;_ M;6~#8 q˴iDgǏ7נO (ƕ{/.oצ5=,Bc -v]y5Ts1W o׭[g:W^y͖\੧oa֬YO?y's=cZD^Q2DHJ@i"}hfLϏGڶmI'|+VL@@@@@@@ t  w>XƍgڵK^~e3QD; ;i:`PBA5%Ԁt| K16m2;d=製|_im00yl\|]T&vΞ=;PR bh6dО={șgjf4:VJ6^Bkƕuf@@@H5kȻkRUtoYX  ht2WN*}Ԯ]@Py@@@ h`[oUyӦCӎ?Y:v^m ]SU[R;ܜچ_-2*ړfh,tՆ_?mm҆{4_" %}/m)ReWxsϟ]7DݗB@?v׋u֦=# 6P䑆}^OTd>>]r:3y_i[rq^u߾]\1s:';w3gM/oiۇ( oqg+_@"@ӦME~l޼YMfN2E~XKEuYr9HN<       //O+B@@/ &w^yW䫯2ԩPvC9DjԨT.vvv$z p_6M右Y m&IoEF-*GuTi>}6Z3f ?:Ѝ>9kLFg:z}s:_~?޶ \:oӞbРAMF@H!CdѢE6md=r%$y8dhM]ܜT2Ҏ?L=kvU~=sjKMnJv75kV'|{f~Y xy+P ۬\rR^8[/*aZ\~ O^d…~yLދ.H @_74W>gOǁK?Z׼<4W%ڧ9I>Qm{o(]7.1&=!@Jdĉr 'ohn-@ xI,YbN+W6IݰaTZ FW@%W.v޷7fW(ֹӲkx"髯]v6=S/y䑁k$23ݡCz~@ǁL;>   aqY6сa   @KM={`s.ˀ# @ -ZT}i߾̛7On*m„ ?_;eEۙ&v.4τ6zqЎ?)䩸fhǟjïGruN|]JEsɶk7z#д~㥺u wxs{رX@*駟Aofˢ-[_,X_GH/`;]ҹqvȼ^뚷}QvǶ.\XR.;Y;cnf|G}Ton*RL4ir)[1J^`5FsvIt܅~N;묳 Eȝ^C??4L"T_[}>>RSi&eJ^       MdzB@@@"֭ԪUt]fl۶M4ޓO>)v3HGvPD;Θ1׀Ŋ ,`RD;DlĪ}kRs8)ԢE\eٜ}M7d*vDoꫯٳgKŊ%Kɒ%gϞ~zy套^ liӦ˗_~*6ͽ (ժUT4;l0os]v}ͅK*:kTޟ9Ki kn5aw AQ'Dsԯ_?llnݺغ Wab   g|tZ*])\'skn޹ֳ7$&g /`jp;/y2vXi֬+A޽{ .O>D֭e ! <ߓL4Wӯjq~-jp1IzP @@@@@@ @U]j   P;8ӡO>4iQ % "0|p3ҥKEoذ[]kj şt@;wi'J={d֬YL#;uQ}2˴Cի$k93~Q&}.6iʇz4JWrMdj+w6]v裏Cc,gRF eŲdɒРz\ݥ]C=4HzIgz?eڕK*Y*W^{l| ~ԩL*U˴Ì?vr;=x:H'7׼@ٌu_A@@R"W_}w9z<@}ѿ!oJNA@@?Л?  (Sk2j(\)z737|S-ZdڸOcǎXrwk;TSuՖU]wg9ӎ?}g?m5/W4UGG.K̵/_Yz8mڴ }dyXz^py&48T.X/tn=zkx/jo!Y]\iZGcڵ9RW.͛7'x|ӕn0} b"9Lu|N:ɟA5 "Ppa9{5 MK.9{ٳg.M4:uS:Ν;ӥ:@@@@@@(l   @F h'_A0>V [mƍY0v@) a˖-K/40H^>a0tt\=a23Sh@E /E;%}~+leaj=X)ZʴS>N;4`zرD8,rGm۶iӦŊrJ__o6.#hO<5+ZukSRJvx=vڰaC` 823{@sJժUCsӁhi֭At@=Xi/,W^yvUW]%52M48Q$@@@ht0>|??i$Txq93̀}dԟ1   P0Zn8hР<  V+nݺСCg~-V xw潉J޽|?کlj-/ =y\3mJruNc!oK]?RenV*TXj袋~,l<\?Ě}Ttu}&X=͛7[oZjIڵCk_%Jg&=ʕ+'??=ǏիW \SO=%efNN]<ׂ,`쒮뵮y⽨} :޳$+OvZhQ`:E6h 2I@?kjb _{!@IDAToIՠ i(PZ5}X!:҇5k֘4{ Β:9# @@@@@@2C&Q^J   @kf뮻@yʰlw+_ԭ[7y% {25jT`k #:8?EP˯X=G)8i޼y&ȵWSN1k\%Kr:g%駟_4& \|šLE;r-`wkJ:uU] n_eс qb1.Q.sysOi{z>lo߱c`TT)l<~a yVoaȯ,X 5jրYf@@@ A7ĉM_n<KΝ͠:' @@@UVf͚|?ϯaϺ,y#  ~Pd„ rUWe&9~Nngl;~{T]i˟ m.)nïWsjLR%&{.,Yi?;ߘq +l3IvQ'Stv˖-ㅥE t'p|ɢի)He˖#F7|#3gΔ b ('KQrc|vIzJgtk](ӳ;N@{)폫+UC cʖ-kƅ8dӦM_g}fL(( @z /^\k,tN;MV\)?lݺ<+V7on 'cH#c=`՟.2llZ;pkFJ;O *aw}'/yhxIػwoiذa͜.ϧv@<#Swm4hx~H"RZ5شmU|6U&쁂?ecYgee.T.Y*ҥKJh=zvD&vL=2Ӷ~lܸѴ_d)]t_~iG6Zwa>48>&=C;k:ukB?h[dg_[7g֙q|n7׺od>9=X}]=蠃DΙ3ǀ 0@(Q\{GBWo]Zh!'tR~6uC8@חn1}`h_}h`T      '\@@@ȧ5jԈ3V9ju]vɲeimJ,)ݻwf2NM6 l;D:Ox;ƌ#f2^P!Ә\;wM .UΰG}.\83w& vhS]/^97n7x6(h۶mb$.7&RlcDywI;VZ%ӦM lv%UI:pz~yAI;)S?͚ұ߄Kwa夞\k?oG^4/^ Fqƙ;Cs_IR   w5窰UUf:0+nf   @{tR!د@@ }=֯_8sjlکe-7m:Ù؎?UֳG݆_\T. sl2.]{.[n^.W&Ϗ?_S_,F 6o_-n/;vm/6lyh+R.r9Cb0jժv5-`"}ήzmgJ42sKN5du;׻]FjZ_V-0a / {`] 2d3[; $ Fp*co2qx''3_3}҇FB@@@@@@+@@@@Hk۷ˊ+eLv4{>|̝;7W_-˗,f·ڑ_; F4vd;`/ o߾&m:iA7׭[7f)_n_/\ӭ[2eʈv0֤j5hΝOES,Ksݼi O= -?ꨣLo>W.7ƫSTp>`  ׎tG:|DziӦ3ay-[`L:56a Cf?|L[vZo2ߥ{@hJ*ҤI9餓bϗI&ɫ*YM7$=w}rE&!  Q`͚5;ZSڵk׮f`VZb@@@ 4m4vl BB@@ ڎ?UT]it~7qn˒k%^vKmutf Z;(\=4`?$;ȱ}q ^Yodr)?MW\Ya_z./^,3}:̙cxiݵ_`~dРA&m&ڞمaWR~n ,׺擊Ũ|Ż,p… eƌ?J=t"E2Z@ CtL;<5iMC~:ydn;s8wbRu      @ 7O!@@@@.{  A쎁%J0ߌ; O/ LLjq%Kd߾}%k9`9N mۚ:t N)j5x駟n{v_W˞={LPkVV!#Fxc U]UC ,jOO(+误iQ{k֬(o^zG}d:{_֯_߿(6~?aÆyش;x.^83s{ݺu[t=`]XtiA1tPW࿚V^-={_&aV@6  4+Wo|駡]t1A~}# @zK/_!% زeDt v-&CH@@H'jj'men\]MYmLlǟ䮮w~nDن_vuNżRsZa7;? .]ش+ceUVqƍM_|KѾ(8B-a/뵮yi\{Ӽgk0*A}_u?\pϞ=[tCLB@ 5jԐk<ߙ3gĉwZF=> $=8 $@@@@@@p/^Vח#    @vRJIF!kæMJby2vX5j,^8NkRdroFNUC??k9蠃Aëh+<%WewmV{ ;޽{خYrQT$͛77w6%ׁU,}uM!˕+g^/O_tE&Ӏzܮ]7Mk@_~Y4oŊt_`L2%N72vߵkY#[:ud-2Yfus5׍mH   @~w4>-[ZEnC?SYf۰@(0n8 @2O@h˗W_}y  Zngl;~{T]it~7?^4Ў?]]3߳&| ꜦhD5o[R$ڗ> cr ppߌ}=-Z46|yP\|wO?-*KH {^g]M%ey5/;?9ƘFT"or)#<"Zp8K@R$9Cw3#& ϚG2eM6ұcG!b      D/@M@@@9rdZ Ÿo S]r%McvïZjټyOzjv@<﨣WWZe:w3g8}1ȝwޙe;[nnݺe.GnLYPhc޽{Kpi_t{ 7nP5د?[h[zݶmh1m|jGy4lF(Nʟʖ-k/]ql; kݵW^PHa_~ _\|7;eիW0_{̘1~M7I:uѣW^:hzgذa^zNM41?s38;#+V0۟~ O:8wl`N1U㎓>Ht2}?~zߥs2`:^,A@@2O@Ѱߩjp_<ݠAMX @o˓D@HPVZ&دڴi/_>= @@h\OE;UmGծ9vsɴvhO־3!6g'o&w\m2˝lߕ+WKGf͚ެA`L),YҷEΓvQ|䂳EڵVڏD AS_Ŋ  5E |v }<Ŕi[5z(ӽ@ {N8AF!7p+H .{~3f̐;v"r˹+w$@@@@@@N`Y   +믛uT@ 65H?1Tn]4A΍vH"q~X ? l_o١jzü[EI>͚53ArCz~hgWz˽e+G"5pcv.yX}4Яzi/;%ƸhEK^-./߿?Vj/PlAȄұcǐ5EڱW_1B #Լy |Xvu׉N4%7owg З_~< Ç/<@@2P@?ϟ?,-[4~5/e!b @ܹ3 sM5@&PZejC  \OU;Um]s?Cg2}>]'7kΗv->slïuY^iZV6duȫEXdIioi.}:O:رC/_yRN*4Xd_WvSO=[~uM.*B0ѦM2ds1qtYvq+a!,mݖpgW.7fg:^|76ASuН={x/S<3v@f͒+R͛Iev_>Pti馛لn*7n =²8MGCwa1Bv%O>$J   @ qg6~}]Yd>SL.]ȡe  P4=A Y U;1hذa~*B@HSm kv4jmn<6z\^3;E~4Ux>y]y7͛cU׵jՊ'2aĻ`U\|g7w&Cj֬)otM#^ZZli}i1d_n> uf-k]N{Q}Wd$Yd{#Gʧ~*u…ү_?ӯ=SO9@ c|~5qD3Ųeb VaÆGʕCfH !      @rM΋@@@wlڴ)O7Av+WN9أ~"N8)TP g ~Ltsڇn֬YtX2c@%K׋[ѠcǎwyG6lR-Z 2q}ɩ׊8S.;w#Fi&;vjQv@"cs]xd& dܹt|1cƘҺukݗ+ lT@@@@@@\ ߔ= @@@ m۶A阡+ϟo:qnB@ {쑯>]nȦRJRxqWԭ[Wjժ%@~طo|tRY| _B9L@kPפ_&/Rt gpJϩ͛Y^=\޽7Yl4i$9r\}& A|2@@@r)k.>}z,%%K˻vj($@ ~7ܸqcS+BFJOKCױ.pʃ>hz% WSN/}퐂^xAJs$ЛN9  @M6/Bʖ-+7oS,լYӬmoVv,Dr+@;ʱHE*1p>Q6_ve`ܸqrO [qUWG&@>A 4>|r-1D_kc;0@>?)_+Uj \@M4I4ԩSe˖-Yj\pa9M_mװa,۰@@@@@@'@@@@@2H@jP(SfP)jЎ"7Ν;;(TԮ]<ڷod4c׎wݻ˒%Kr@@R`Νf@ޓM6e)A$g}h_$@Y@_gyo@  ر#VAJ  mҾK @@@x'rO ү֔(J7xCK/d\x2k,iѢEne?@@뮻N>#y .@̙#] @LX<ݻi__?*۷O>cׯ4jH4>;1       W      C=$ .y2rr& @@@ g 6e'N-[d٩\rҡC֭o^J,e  @5k}}%!P}ի%hРjf1+@ #+W̘:MvʘrSP@@@@N@D=Z+l۶M:v(~ԨQ#  Q?|&K˲R(@(Qk<~iYxq,ҥKcY}嗢|PW.wtYN;4Ɣ@@@@@@(-gz#    @X|tYnݻL(ZҸqcٴi rLeG@@4E'O,oL4I,P{&o6mDj ! @ *yҽ{<D H˖-3vV"@X~ԬY3c*SxXYwf@@@HVvɊ=%ud?_,3g]GB@@+P|yy7Om;0diݺz}9Uޛ Ҥ(x ^EQ)**("(^A )"eRT@zwx&a7f93ߓdSfe N@+W,}}eƌj*}19r|7fO?4jHի'ҥKtn4@@@@@@@@@@@BH@n߾=Zt̙X+ h7   `)5ӦMҥKM~{   ?w}׌ ~eƍI @…[nf9y̞=_ڵk ̒2eJ1jg9r" mB@@@@@@ @HkX      *E1/_\-ZwY   dfBٳK֭7[lK/ɂ 2zh_>~y!   Eƍ AB@@@@-&N(aaao߾m۶čB@@H$ݻwի?o~"i:DH:V]v2k,9uL:U4}̙mׯܹsܹsKժUeСr{2      zbh     f*%K۷oJ|Љ/͚53;6Lj֬ "  nΝ3g ~WISΜ9qGj$Ydp@@@\vޒ*U*;O@@@+@Ŋw { yeҥ$I45C@@ $MTƎ+J2M&~t1eS  E mڴҴiSܺuK-[&3f0?cq 7믿.eʔ&M1nŋO(M      DI`Qbb'@@@@@ a-ZT6mڔ0*K-a U`A9p̞=}   KvE͛7#;wn3Bͥrʢ @@@@ W^"دMA@@@h@ K&M$w6AKN*W  -'O5j4l4TVRE+ u x 5j嫯eڴi}v 6.Թ64oٲe}       P1^9     A+:vhw>|x֕!  @ 9sFF-Փ\rIe޼y˗Ov*˗/Ç˰aäjժK@@@+WNΓA@@@@-*U*&Vz]n@@@ }YcZxUy#4@| h~ɶm̢yR\9)Pl2[)F@@@@@@` o0_      VC"E SiӦ%vPq@@3oΜ9M˭[,XPu&Vʐ!CRJ$I{2    ٳg탳db     u֕U;vرcAA@@D"0h y衇Lk7l ~a"i9D@ jŊ={ʺuf[*U$Ydv/RU&yN:… ͛>d@@@@@@v~      raiw)wN    ;j(Wx [P!޽]V/TP   @ӧO kSA@@@@Ol/ΓA@@H*7N'On:`YjUh7! @k׮l29z9Rׯ/)RK&,,L>y͒1cF{[3ܸqC/;vXe$Iӧ$Mw!3ǃVf˖L(ھ;~xپ}_pai׮=cZ5kVJY;ocRAřscH"cI "lwsmQORΝ=zj۶lܸQҥK-Y \ {ҡC\pAΝ+ӦMy˗ Ξ=k0k?ӛ͚5#M41%       @@@@@@@(z7*D_y@@BSy]i  ܽ{W}]/͛2eKos0f3as|ѢEM_N8a˔)c߷2˗/ݻ4 .}vt[n]P@tW-[g%KS[RHaYog4xq׮];ww'O4tb6mHʔ)}uV^#kP^SI,GTYqO'O<~ GئA5ihmk"l1 zi$o޼1-2d*n.zg`$@@@@@]@h_MC !د;@@a~)\bݻ׌B4 @ dȐAZnmWeԩ2g@.^(&M2KԩMߦMJ D'!      +@@@@@@ d|A)ThІuօl;i  ]@@.駟.4jÆ E7=m… :۷T,(QBki۶=ˈ4nΜ9ZV^-.] .A}% [xqԩSfK/$'O' "o%K&J2|.ZOgϞwy~րΤ{gM]u>k׮m&ڽ{_^sǤLDUӲc;}a'P[u[wgb@R    %ФI)PHƍ':iVϟ?ׯQtFMw]w`%Ku֙c4EK.r1Ld?Y'߰a]N~5l0޽e˖R\9{}Y-z-0`h`+ݽ{Wf̘!C VqCLma     3sңGQ&Md1+@@@ .\X*ڵ3Uر<䓒-[ @P HQ~nݒK㦮ׯ_ٳgEU ۰aCɜ9sP      f! 6:@@@@@@ y'   O@={Ӏ}۷ *TW[v۷O>լE@X|ܼy4?W7ɓG4 +p)S 5kLN`^H;vyoeJ7ҬYLW. 40y(J'njʔ)Lj˖-v0#GZdVݺuN:28t~# I$ƍ˲e˜%]d}4ʕ+E?\z^5>V\qkdǎ&+d>u;z>N… E9}tT5N }(qy+I!pY|L0%j    *жm[I4i_  $.ҨQ#'NJ%Jk@@XXԬYS9rgkI|l7nܹsExz}Ǵ      Ģ~c@@@@@@@@@ a h&kH@/gΌ3y5^|Es &,ɜ9)~0*ybTMu5>,fd";w6hO?4Zdڵkۇv^32}vHwt"4iH [ootרQC>)_ SN55sJ~j}Հ۷7ϧ%JsY5@NF;wHAt5~T=v=[Ν7|Sf*ŊZjIʕMsahbgҥ3jl='tŋu.Wv lٲ+W.s}ԩ#KٳKrd޼y^ϣ[n-2d06,X 6qv.]*|9Zjؖ-[AfBʪKbu>G X:D@@@@?yxM6+@@@ 1Bef?e+W7xCOM\k}B;9uT06:!     ~C"@@@@@^J{"  @ ?^ƌ#O? A4@ԭ[Z*THw.k׮}m( XJ?۷~[%Kf|g9 ֭[Rn02{l:.V9smvuJ:¬8.AvGreݻ|}߿]wK/$͛7ݻwW$IK,G}T֭[gce<Dxrk=z'رcN֭3_LnuB7\a >I=֯_/+V93<#2i̚@IDAT$tٔ"E s]t1hٮ>}G}$ǏOVκ$\۫I     /Mڛ eSA@@ ȑCվ}Bd@@ FbŊd͚5mr… MܹsKZLӧOA@@@@@@ gii      A o޼}  )pE5kh% uƍHKFa  ӧO7YmV-[VmfjV F2evI7o[t¯?X_|c^ؘƤᢋ_|!:d1"RҦMkڣu5f5k0]}9SW汞?~W?l0I* &{_x9r I]vlٲW^KܡQF˖-37z &|riӦ i   L@lR&O,Hcǎb;K`M $ }Wu4h;e:u۷ϴCj?\]~5EҸqcɜ9si+E@@@@@>5F   A,0j(Y`Aא! ի"uԒ!Cp7h. A@@\|Y̙c&ۙ7o NS@W'!@@ɂk@{.prҤIygM0X_>.RJjR 9p@De>ѽ=yd)k֬%K~ldzgW_}>DnxJ 駟oREk`p}k_Gq)5k ޥKX?~V&k+(c]cm2~х  (n*}Im  @Bxb~竿l޼Y֯_o{wݤBu @'ߑ@ v?ҥK2k,3f s2JE@H'T߹aOWٳ}u8]^~eѾڏWfʔ)Ry@@@@@@@~} @@@7x  @t4~  ĎA;wOʕ+Ns6o\Zh!O<$I$>@@"0d3)РAcǎI4m:uYDzK%J0gΜ)V:oz;ٳۛ:dѠ(Sڻw \iNj@eo6}xs3د fϞ=;BPo廯W/ k_OGz }?iRs=ʕ+6m]Mk׊.:UժU$ 0 AxݓU/_\=jv@& `l m67=:_ LÇ[r:kҦMkC:0q ֭諺'O67ވkƌm۶2|pپ}׀ڵtN}~Y)*ۨ ر_߉ZI  l? jQ@@U KƍCU KB@@ .f*#FFuUBܹ@eʔ]ϮG_nky̛7,ڇvf͐!$      x دg"     `v3g۷W@@@v̟?_4`i|hf͚ \O>`z" Q }Jnd„ `YjPthPP +eղI={ {E+W@eyYnW.K,ZٹsgcnݏʭhJ4ԬY>䩧2:5Hꫯۢ?uu%KʬYٹRdƍ&hNjve˖l"9rp&MܳJ?ݻw[L w7nll{k1h{eϞ=GZ$I0~פUVjJ^yzpn}swq(~6ky  @&O   @"ȕ+WhO>) XjUs(WgϞ7Pn#mC@ Ŋ D1n_cǎ &M" @ +WNtL}:uT9t萩5kYt }%UTqTKN      uD@@W|Pt!!  @dC  2   0 :h"\JI~my7dȐ!]5pAt=S٥cǎ&R'LLS`VO׀VZ`]: nܸaeM #(\SI+:t& =rH_DMgΜ:$oϖ-[D7իWիE{v]Vח/-7o^4)86nhWTRv   @:ԩp@@@;v-=  cx.Ɨ>E@>2_4m`kRfMɖ-8  DO<矛~VÇZj)SEf7lߟ+Q@@@@@@XHS<      k@  N@'\p :+W.`L?c@:NvL@cǎw5j o.%! [ܵktzR|ySNTAM4J*;ngΜSEg_-tɒ%b+KL &V@֨6dɒvT)RL6_'ɓ?vٳvޙqv׼{4:;+T >\oJKs&쫯ry ަMYbNȦA]fݕ9sJ } :קJ>Lp'SK@@@@o2eʘ*h[wu8?  ģ@&My'O.]cm85 ~+V!CȡC$<<\^yɑ#}ŋeܸq3Ϙ:tE~d@@@@@@BV ,d[F@@@NL@O^}USDZdڵ1)c@!믿?#5#^@@L&MY<ʘ14lPZl)}LC@N _|vҥKgc#ӳgOHr3ƯSrJslѢEt~,ݽ{WfϞmYǏj/ ;oo޼YZh]-M'N˞={=F@|Vs`uqC:ŋf|C֭gq@@ 4oʕ͢,YbO6MΞ=kF2RJǓ@@@@@@@fJ@@@׮] .xJ@ :._늅- oߎ>EҤI`SA@@ Z^z͚5f)SѣO>GfթSG4 @/?,/Ic5AwK,q@|gL0˿[4@it e( VyZ+cj0իXAf.e˖5ݻ謓GSO u+V,Yș3gҮ];I:*$9r,Vh˸q?oW;vx,KW͛l;x:tHouY>_+WN4ȴs8'_|ջJ*&دVҽz,lĈҥKHmVkHܹkU<vZSL2<@jM5@@| H%6~c7obapā+W,9E%w7R \zϙ@8Z̩cc^% 2dmlܹh@B@H,ԬY,_|…f̙3ŋ'NfѾ=Y5 @@@@@@ ח!  Xp^'h (B@@' |䡇򹝍  ?~\t`I.].]:;O@@-'O hҦM+ 4-[JzL)} ćc7ߔ믿.O=/^\;ݻw 4ٳO<ᵚT'4$I"=zr+V`v2Gg̘!䟏?hm<;v{G 0YIzK>S'oҤǸMfҥKe˖-f a]ǟq׬a~뭷LR J :饗^2V/SS5jyC̙_~湫x/_V?3rH2ehҥK2}+߿Li@۷K֭}Җ)Sl}tQ4`x֬YM_8[I޽{of7lPri2x`W9_hѢEKk5X& W._,r2۷7@|]h|pUr;SF:~IڵֺgS}.낶Z,'&I=ڏ ;1IB@- 2H|BQbU`Νr-B; @`W_Zr~uքVo"E$y!>$F>Ge{ x͘sʑ#Gwos?  O?mk׮/bϙ3G^j*!8pYtި6mژ      z kJ@@@bQ`RBX<E#@( L:U7oI$>wb# @tu\>Xפk 2  L&Md 4TݺuUV3ϘXp@ ٫W/:Ν;}86:ug_QܾgF R잴o߾AQ'LWU :k,f͚^$TϞ=[a}IӦM#;sOF\:;8q- 7ocR`1$hw&MRJfy}!c'L`Ѐ:ѧ&+24+N_ʔ)M͛7{:Z]2fhy9\^{,XPtrS ȭC:!3KʕbLY "y4ȫ쵒N:yXKhP+Wi<Vц`-I  'PvmY+ZF@ {3[z[n6@OÇK|<:oصkWU3G$q@ a Y-f/*ccvFwÇx髢}d|G@4ib폪ε… ͛[n5tK|[han(@@@@@@ Չ8      X`ҥ n@@Р%JE.9&O\ի'??~\OnեI&xAM@@>h)SƱV"k֬GGc~dL LL1aaa&3<#oZJ>s@Nֹ[O[4.V[um>vXAQ˖-kxz;N`45qydb&jzeȐ!qF~ݏvnk F]v5k/:iF2ed1j?Yd pl֗{~I&Nh"Љ~5GRpk޵kךNJn4ЯAy;u 5xx޼yM]WnvԖYO<qyg5NA;7n)O[d] :['Mn߾m@XK/['ak֬ ;i߫WZ4jH^~;:Xxnm۸r31g%Z"    @T7wD C@@ȗ/4LhEB@/]O9sѣ7ߘW.]H}X?'@@@ ! l$>TzK .z<^I'S@=\rbWTXQw2:h S:czCb|Stq5j.`v1yYPB&oMLI.߲e -[6QK -iZ 7Tb0_3248ݻM Z}]ѠE15nv?yߟ:7lPtpܹN;wnNO 裏%'` )gx,;,,Uʤ-p5YniDѢE!a_Nj    @ .\>.   @ҤIeȑ͛7ҲeK$dIC@@(P;fٺu?ݷoիf)S$SLҬY3W      @ N_#j      Xŋ@ 4trӧzʯƕ(Q¯8(q,_nh*U<@@@@@ :yw?z'  @TL_K=qƒ#G@@  $KLԩcǘ9sD/r #sNӧYʖ-kܹs'")     ~P3@@@@BRիl2ӶҥKKΜ9C4ʳuӒ5kV)WaMȑ#.]:TR<ԀSCצ   B7oޔ 3gΔ˗/Gj]Be˖fH  #6mZСC4 /+iҤ"ExM^5~C:1ʕ+M7… rsi    sd͚5K̙.+2%S}z:kv^xqy衇"mVիM_Jy֭%Kgg}V'OnNgɅ ߪ˗%eʔһwoDgF~ӧ~i*N2$ɭ}Boܸ!痎;ZEE2h;?|q'&V1}\ZܿA:1 ߿>?]vCSH!U}{i*UۯJ:>[tuh!XJkj" 6c>.\h =61%Ψ9QreuQ;O&xb~+P?ݼyD_ksKVocV}ƌN:ük׊ԤctV >Ef--^X,Yb6KQK8&[c5{}l8luܸ~qɒ%7x.fe&_pai׮]}_.}>*+s~>wnL?z1~ןϗ1cg5.Q}ͲC@Z9-ϟUAT@{5}M7n@@ q dʔI:t`#G&L`3R ߗ袿c7kTZi=      MW   R`w]x5pMc~Ww]Yq:ľuyxWLs\9"k|~hM|Y[26n+rӺ:uvyJcヒi5gΜeZw\NZp\]9s;|>gʝ;c]8kB#av֭[w] uE5H.ʸ:uMja?=\#lsok""0V/Q2\X[8[vz;e+H^2~,5?75#5+*+p]Dgf ùدC۩yvۧ|@@bUk &뻫@@" |ayK_|ɓz+( VrQLWHeZ+\5l+W,kuncbǥVn֬YvY͘1]3i?>:=9ǡ辮vqP3Ym ??_ƤZm6;|VlyͲ kUY-s/8됐>FmBn?uG =c}d0  @`t>ºTy睻[l )@@@@@@akH    @O?Tt + 6׀ 9wl۶MV\)fu"Ekp]\Ϟ=+Nr 4hP\~0]5q$MTqQqMb. dԩ=9YWPd9vue4i5]xIs?[l coK6̩S5U\>]yG+ ٳAׄFx*B; r%Īk"q 0yRpM4d* 4/ª1Lx{瘷ׂ[co9y1k,iժ\zK D+Vȍ71MP9sF/^l>xol}c2sLݙ+sU󮠨WZ8P;9ڞ7o^+֟k1gs-yuիWch}od[n"ϱΤcuYŹ]:IwԟӦ~ Kݱ݁x䳚G5ey詬 1=7#*о}{eժUf~/ֻwop@@HLJ~h˗رceʔ)\l:͢|p:S#!     Ď~cǕR@@@ 3 9rTܾ Gw AM_}GjЎ>Hƍ'/^^zIUs"_ekڵk#Wk:wذa*yyXڡcǎҷo_tmS^lw}W4iZ 6o5޽PgҲeKqNޣVi_MکWS} ㏛`z׮]/ݓǥ^O+ip_I-u1cȿ/sǣ@o 0@t0t3dȐ!*jg;@{ܺut`=e3  *kp_]tbhիW g$up@@@ ~.@!W\AQ/*  '^+iu֙m;w -xԨQvP^{z?b:T֭Atbmpkҕ~*;|X@Co5Jq.XnСfyO?XDW1(t}`99߱7u> бv;wϛ )RnOrV5?t;o~"ձUǞԩS@7nG}Y ߽{[MիWTR|{ٲe8 2cEuc]{=DTX1Rz~\tu|L7*/:3g4'M޹sGt{#cv5>}~^Ϧ|֞{Kݱ݁xYM-yt }z*+b2BL mÇ{Lṯ|DK#! *W,gYf9ϟoct1]t~-I6l0y@@@@@@"𿞝@@@XЉLt?0R_]'OѠ hT$@@8Hd-_nƤSOC4o R|_@ 2Nk6]&k֬q-}@@'}ԩ٦x4ȮNI 9' xt{+kjaM'OsDkT>PJ>)jܸ=tBP'"ܴiy/V7Xk}y}Ͱ۸Om|y)&cQ@IDAT،+,ڡ)Ukj>znt,իe͢A*C=eϞnɓ'<'p[1mL1Z@AΝ;Wʗ/oNZI{ןuͳLhMkccʔ)fl? ՠ=4hs L^꽂9=g{T[eTv;繳5˟s1{Aks]?)OSGA(Y:\ȓ@@͛:ʗ_~)ʕe{VZIΜ9C7`N,@@@@@@  7^4   :J3fqv/sM0A?̙3~q*V(9r0S[+rL(&uױ5wٲeW iPFgrSsI+&֎M403֚@j_ʔ)c[Oޮ[ ǂ,X e˖|K(][{KݺukIt^7,k֬2l0K4i̢}:Sj̱-[-}f?ĭDG'@=Dcu9Sݬu#F9t萵[ IXd:іz5Ro}YgʔIׯ=z0575.Vy\io}kw۶m99Ν;B %Ky}JSN5b>WajTbj]Gt1揕N.]:ҹsg<֭N)D]>s12V9y>X`>ȼ.cPRJ<#U/zMVIB5)8}7o^se&cǎu/"hDEV8 @@`8{|wRF ɗ/@$Iy'wJ?6    A,SQ^ )UC@ "5iM_[_ j}?TGj@}7T狫o?v_ >Zz\oV_'[c4D:AI&Ytcogyz o;}wy }1?:NC <߭Oh^ i%SJVznڦ}x_Yul~گ]hnoVXakyO}eCz1bx[(yk>z~оAmڴ1c? Dt?}<7ǩ1qz|ӦMeƍ<Ǣu^NV:s挕6 z& 8.W^Lk38zocĜG7ow5:u2㾴 k}tKG屡}*'On9wTۻcESݺu͢Ç٠I#[Ӵc| G5˛| ׯ7c#otϱ:NP=zJq=SX)ЧOÌ3 @V@ҥ]Vo.={4Y߷u pһwo;kn@@@@@@'4z7    Vw&6UDH2BD%L Ie4Hӳ!D+7nܐC/ur{nW _z>F^ M Q0iGQHH* DM&= I… *- ܠA탙;vf ~D@a``Q$qdH$HtU%YdjDp(p^ >Cr=F5 |Mرd7f{NFaݛqJ<3gcnng#ҷnݪ:$~]dMqiF%ۿ:qBR2}~/^c;GҪuY"Hx!m[`Ycv:hOr]L!¾rwpoخi^z[dN/)S |Devq$8]駟$㏭2>[#dLv Do xڵջ-޵V^m/axB®Çzh$@$@$@$@$@$@$@$MK- ?z*ϱ /j'C2}5kPSZP Z*ֶfY7Vx(֏PO8 +oGO>$&,7:fbO ?/RH!A^{Mv - >~bĢ pSi1ǾΫp]NY8$ۈXu+>1| ib V?y:`X@$Q_`ԨQ֘[4   ~go lRҥKg5 b?r!˹s!           ~Z$@$@$@$@$@$@$%KZ"K,֭[{MzWoJP$O޽=n'Oy饗:>}c@ Ѯ6O]:DR)n]uN8?m,ڴ^5]xp< ̗^EO tMݟ.:titVK#OV1sg.@x?r\߷>ǎ+V|`u$RBɓJ3g(OVPAmQVܳQ+V\vM@rf߾}x̙X(Ѣs<1 0cΟmL4IO%`;4w >0 C$4 %w> )S$/F IFk3fXQP!51bPޮ]U߯_?;1#Y^`7,XV=rA/m8tsNᜀqU2"$:YzC[FBp^e$EϞ=c 1>$RJ)ja8v3~yh2H$@$@$@$@ Y 6l̍e}(o޼rϞ=O? \0n D(Y(IJ$y:RHHHH R 2(?voc ϗ/f=/_^ҤI֡_2pURž:^c5(7|615X,+_%|pi~fY_7 OW3)tV\L/"C Y*gQEY;Xda>XBb]tbT1t̙cLr~JBO/\Cvqd=|˕+qF{f̘1x^\uE1 Ul g,J0?x@~ܹS:tP~WœA A C%JP!(!~e@?5jqnٲ%P|9u. &JǗjY=Eʕ+roiƁ>kAlٲ b|CM!IֻiN~Ffl7a#n^f{S5xI5^tIŲN]#ɡC2h 둀9rנz{)̒% Գ aҸqc姞zʚw212(ǍmoݺDD*Idx!0arEh ©͗вS⟺u+D9!B QKbtN  -W*QM4"E'$-*LR zZvHdǎ駟VИANDHݭ P^z)`1:˗/dɒʕ+K>}7~G+pKK$BU:`Y=d$48iٽDhvnۻ+mڴQ"i ~Wu.\ yI!eZ" ỮUVV5B>P"ȑC%6J>ZƵ_*AܹsU]|O8QOӦMpnnݬ27gjK63Z̈#W|/ވm^Iq}gʔI7(G·KZ,w|? *\8xA8!VxVk>'˸ $3mIHHHH_=l$xpRU'   @Xľ4H Qz `MzzS    P[~͛O2Pc1Xɕ0D TR& $MCUOc{7|Ϟ=Js38<0M_)fq: H8Ę8*m|ӝb׾ƢX w&T3(P; JZ}/ƍm۶tί5k֨8 ^R'd3:dxD׋n޳1 :4pk> s߾}cvnZŻ"Nqcƌ1y7I"qD 5~/ SȇK/r!tƌGhWo: g"7W2evIHHHHHHHHHHH o=1      p@;Bt0!3>HȀue'&MgcM .,F"Lk? 2gl:v5  A͛7U)h~H6Կ׺s!LxHD]xQvܩ4m ɐ A̤.دYn>EVƣau!?qCC8q-oڴIpNرC@N}A~@xћ!Ⴏ$Zyk3r"X {kIw`))V! {y\CӖ-[L p ]UM#*URqltB!]41Er])& yʕ+U 0fn nP3![b8'AFz)c= +SAqj-kvwx0 }w,InܹYd(zЍ t"6oߗY- vܟq.\tI7ӽ{Nh$F4    Yb#ᦧgo<xN;d~HHHH Z ,X@ &_ eˬ߶1gHHHH$VZ >v4!7?_s~'Ǎ7*mU/=`L ϵ7 ^v-!T @KqiϿ'-b]o>kzIq?'cww}ףGa0z(Yciܸ=~~,QFf͇ʟ?OC jHX0^Z2 6vRf_">? PF~s$@$@$@$@$@$@$@$@$@$@$@$6M $z8pt] jXB6o,bsɓ'_~^yAmcC$A0g>}i 6g)RDƎ5ɎǍ(tM8Q<%BZ~cVٳG@B#,n ?"1?Ekzibd7} zFdR:} `k9 _} SIu " Hox0n 8L-42=bQ/"*T `nYd.\`̓vcObA>U?f3,+i*$$B$R[vމ@0$7 7k֬49zh@ \k&[lQq{O]SLeWX!^=`*3FKFQ CRyD.,ʅa&{90t\Y;w i:߯<%щ煞bHYƵb$@$@$@$@EɨٳeݱAR:u$UV X HHH~OdH$@$@$gÐ;W\jHHHHH ._oݺu\Քv x< FF֘ = sۏ=19 /Z*OJ,QIO띖+oc|P8v)lF\q{իgo6Zjo{饗7oޔs)k ~!>,TĚuq6'TEq|(իWeʔ)*~N1 12H9ʵO9o~3wmma Ze߳@?Lwoq4xH8GC -[<^AH駟UVѣN~wk/[ F|L$w'Q""H4.p@i AJ$!YBΜ9jժ}5b !ߊF$@$@$@$@$@$@$@$@$@$@$@~~ ! -Z ^|B!I&0hHͤ?pdf?y?eH@-mڴRV-tMFD4!;l0 2(AR)} 1 s-]t2f 0$?i۶ pb|M8pHk.%Q<߲e;vL^{5mSD!ړy 0Tef]:4װY9u b`6iVzue$ T9mޘt}{;~z{܇Zn-˗ =ydꫯ8%28))SZ;Vn5`)+]S`x ]09sٳUwuE%DI&U=f $Ԁ!Y#<D$@$@$@$/_ŋgo$ܵ';A_F$@$@$@$$652["EXbHIBm ~@#    ;)ij$*~7%|gϊno̲>jB?D~6/s,kL_>z?>KyiG>f|VD7wcokEߦ?m>t Ըqc%8իWKժUe*Ǘ:f'"eg(&Eq2Qf??YvU0ڷ Žի/|[W~={vI&СCej=1.޾#h@ ~&#fww{cjՂi6/ދ 2+ws|87l #GTU@ eضmT |N^yIױoiYu>O{je$@ObUT8| Fwމs$@$@$@ @ԩygO>D}:_8q7t\yS%(            @e,"      G 6Z߬yg*U Ç@`@63POz 52e -\˗ S?4p6draҬ_>8_q?Sjwo=-Sdʔcm{Ic{*'b{n@P8SzP-餞~wӸ3bwe?ɽ)x{Ǿus/&N}u$@M`̘1V1ю;HHH$.ܷo_iڵJ^z>: o W"͜*]sNAYWIf̘v_ʖ-?~\]3g6Qm-u1@q IHUF vǎ4.xj~f;-P@MTO,VH {|ZZbŊEžzD*Tg9%     ϕgϖ ŋcm;wniԨ,X0z O`*Q-E~:t$%hB/^;= @:uO> z{—VԮ]ەNIHHH@6mdĈʯLoh{РAk ?XzpΘ1WԩU}n ?OMkVz_k|8']H 2LMqhO,qN|qlmŊw94]tϪ=oܸqjV\Y^ I'"~'i޼y,^E%?PcQb 0`}#-%Vwr=?|m۶*gAliӦ )l_[Nvꮻz)@/YD^|ŀʕ+U "u|\ A@\\ٲJ*jC_~/&VZ̹QZ5)Y:NC7ށ1X~5kV:(]9"_ܸqC0MA˸b1we?ͽ߂s_{Į`nn}ƶ4 $Kǎeȑ*_~37o^t GM$@$@$[=gӧ8W._\}iܸlR/            o:,'      .\(Jvn"E$mC'N$" 8D~˖-k= HHHH~?NQJ҆Z48%Ib^EY?shjժgQ't!/)&1%Wk&ZTdN#,qu8ׯ_/r岖13w\1cB SbU?hrz0 yw'Tv,YW.]ru [ @W[v$gΜzњƈMbz^xAZotžyP10a}RJ*aYwH}mTѯ,s6Ur/G?k}ǂw%fΜ)W^UEns;y6y "\|gꫯ i$@$@$@$NysaA<&`3vX/] @B"@߄t4/$@$@$@$@$@$@a'piѣJеkWXJ&Mٿ5J9sfyǼA^&fHfAE_=`cƍʉ~S"K,QAhGU"" պ3JU3!ڈ+|,_\ Af0(T +D4 ^E0Io^+#8A08ٺI̠p!kCjUdȐA/IcoӦ̝;J$rJy뭷ʕ+>ey3Θ1jU/Zb>+:X`OT.QbH~5|p:~ *'BӸ7={VB =D^l/_>5 /XbΝSǏ)+$M'JY8Vk 3B^zލ{!0~~  HHz`/C_Hq{\H"$?1B b{|e AwL2J5ɦl٢;{# D⑄ ^l>X:+ll~|-;+¾` Ð@.1+V]gH$@$@$@$75>vRMCbHC쏎0NbQtL+-Vwr=@tA۰aTD}scǎz5~@l((y~Aq!$\h/;fb=oQxiB 1fl7b6oެ3edVQ_x@|[1Q@ӹ᭮.Gb=mfxVq _'8>mȼ[nWl\_7Yhma^Сzςx~K/~XxM2'n {=並Ν;~F G   B~wO>vZX .ΌgԮ][嗪ZQPp?HHHHHHHHHHH/;sIHHHHHH @P }! !L{_~*Uޮ]8~QBpS ڋղcQZDI 3gΨpI"@A09 >!|Μ98&G~j5j5hB_4@R@ꫯʸq¾%KTqb'v[ݹҎSVH0d5$b؅NbzeHՠAAb%$.>}zuB7T h}z,Ex3$w>"wŋ8]VgllJwǎ*/_B$СN^x$sΣ&MgN'CO>\W"xs$x$-'+p~HHHHHN \p#ٝݒ%K&H҆7$zų:HHHH >\6Qq$>mٲe} H 8qdϞ=;5~W,4    !!۳gO >(Vï/B`iԨQco 7 Q>m5jг3@:gsdSpOEkB \`|~䶀#~#l7~ժU!VS8N|1^$V߲elذA>cg~~BIj!hUV{|- HiDNTr|`2Q =UnsU]i_RK9硇"C           ZwD9p      @WJ1:SAHv)]3F#pS[5_QAOA\B#17G@ ΜRW>`N/4uyN0f[?mzi.]U:3fUB *DKy$@UZM6U155Vcs58o kHdFr6-~o-1F@'OZB8B+OݻwK0`R{Ŀ+167֏;VqF t! ZFy0טZ,+\r9 u/~_brB8?DXqd˖M x#a 1~ ^$C:3-#y2M|N}5~qիΝ;F`ŋrBBHrO+Fc,8aefʔ)2sLޞBsoco^˗y߯s ˖-Sð6^,SE>S"hW9    ͯj _>b&O,O%K\Cgu        .  L3sެy6m4y_`L8۶mSI!g J-=C"SگҪҌ漿6Lx$Ǐ p_?Zӏ=@(mbsޟ&}[o%|h+w!P_EY>hWzjK/c/mS sׁu},>MƾxڵJX °ڿݺuc*a}\t>.Fc]n>L ݻQ+lvm] ~ծ][ |r9$Emoeqm# +ٴ`|fꉷپ9ٳgX%ݞCA| ֭WYcCYיef='Dӱ4jo[3ͺx`Ym#yݶ8}^[nbu,5kV%tuzbz'pH zހwb[e>}… ѳ) @#.]:_vڥrXqq[~B,wD;L$@$@$@$@$@$@$@$@$@$@$7vTO$@$@$@$@$@$@A@6۷[ѣ1Bmٲe=ֳ;wN=*'NPNc He޽JIWpHd/?ڠdɒ}>C9EG -zW .^x1Dw$0CȱcT8%@)me'qoʔ)& V:uJ/ !B( f_냹_.{Q}ݧD)H5A{7 I . C?祛-    "pMYz F^x\|9n5].V,    pLiBDֲeK:u6GD 4X$X A@ۑ#G](oF$ OJ կ__ϟoߵAON:={6^"&7#   @… f|=zIex_e}pww0S`=7DB\O}¼Q>zl'OTM=163 )PŽ_(QB'OP cO>*=5F,v- m#%ܬe^0'bŊ CiB{m6?XZjOu_~7J"p@ӦMU ܹ= +|Ww/RA2;D>䡢 @4 {1 @ >t*ejSO:l#f0$c`$ 2Y$B(&   W )YdΜ9v4i"HPN#       pN`ݺuJ-ըQ#9'HHHH"@ҤIPB)cq`?Nh>&!gΜ3fԩSeϞ=jK.Ʉ 9iZj%7䏣 @#Rq D.CI)?>rw呑@\%`+ݺu:.7D!1c#\dܺuK A(4    E2p@)P.]ZFC7}ҺukYv9rDLupoIHHHHHHyׯosHHHH#z6Hռ7Dc(Pb?\wu~;MIHx 57nH=r?8h   {ճݻeӦMҲeKI:N:  zj}3$@$@$@$@$@$@$@$@$@$@$@$)p$@$@$@$@$@$@$@CA!ׯ_z7o zhېq"pڵ+NG_E~ygŚ1 ,Z*W5    KܹsgɬYdͱv4yRfMp)i$@$@$@$@$@$@$@$@yVZwIHHHH $6\'㶉@b!n?F }իW%s }N 1~_G!wCܜHH * S&O,ǎJV\)UV}IHHHʕ+>GsԩSe֭ gϞ>yQ-Zlٲ DFa HHHHHHH *8$QO>Mn;C@vbŊA^pᠶ F7}ljbxYFΝ[J(HHHH [ 9sXB$Iyꩧo%1HHHHHHHH VZ%ΝS=B7UT!] @HlNY9m _{C  $аaC3flݺU 7qDСCd"   &#Fu wٲes/,Zܹs7!           g(&         ȟ?f$@ @[[z,$@$@$@$@QN`2c %{X{#G%۸qc/HHHH4Q/^)~?CR@)XUnOdb 4<_-?@q<+VL7o.>j,Yyy'|ZO}>'OKʍ77ߨO̙yO? HHHHHHHHHHH " P7" E$@$@$@$@$@$@$@$@$@$@$M,XD(0^zbot8V   ˗/ˢE/ ebj֬0`I$@$@$@$@qȑ# ̜8qBΜ96A™+uY޼y}qWAWBVP!)[ ;dƍwׯXw=D1$Iu?TQTù ,YxB\E+WUuA*".]$mڴyɜ9s$SL(h9iҤPիW0 7PMCڵk V*ҥ D8 0|!w^%sp̚5(eʔa"a֞F$@$@$@$@$@$@$@$@$@MbM @&0x`qɫ*yIP$@$@$@ w!իWW]M&SNUyG+K)< @ P7# @#0k,k7nlsHHHH ܸqC 6c Yd%G arIӦMAI@MHHHH|8p4k̪sNiٲl۶M o^-[f޽[G%B z+FtU bcy%L AX/^<6X #GTyJ".)Nǎ?\mA[n -R:ŋ1N:ӧ|߾}?js)?&;:kj#F_|Qyiמ={ Bk3ޏF8%pHN<n!r:Di$@$@$@$@$@$@$@$@$@$ҦMkuqek3$@$@$@$@$@$ٳK=?||Mhm @TȒ%zz7d͚52ydYx\~]OΝUF۶m`Qo$ @t,D1VHHHHHHHHHHH"cdÆ j\ (~qHHHH DͲe&5jPbfZ h'ƍ]vM wHHH&PpaYp%ctiӦYH\cE?y/Rʔ)cu[fMk,7{meZ("ƵjR_t@_K>ԯ__v%9rP!Çm"zɒ%ݻw4qϭUV~2dH _H$ԭ[W֭[ES^Z:pOٴi|wbŵ!qW-1_vMݫ !7nzqZv`/9}ѣz\q-bQ.]䱞iBd̸pLI"B۠A;C} $riҤU3$@$@$@$@$@$A6|ٲeK[* $ q9sĉ2bĈ.\ѣGKB'3g |i$@$@$@$@$@$@$@$@$@$@$@$~$@$@$@$@$@$@$@$@$@$@$@Y,ƍ'jy   dG_.]Z9srLW_[*wyGrm MB?jbWzD\uA9}g;574kԨayV`ɀ s=Ҿ}{ٿ+|AM]jժֶ;w1lӦMk¸PNI*-[Vn޼)={|P'O?ɓGS{V,X!OzG$uT_&8jJ2d F_BFDYf% 1hիZmYcxC2f̨!UTQI }JӦMŦG_|Nݺu]v)͛Kʔ)-$Q?ulT={X8C$@$@$@$@$@$@$@$@$@$@$@oXHHHHHHHHHHH ӦMSKI$`8K$@$@$@@ҥK2uTP}뭷 M" A@ L20rHHHH ;S:^pA:xG%~)S&yT 6?c[YF)RDrc}4/@@SHـ-[رÚ_la6[z2|p9x`M;9|UvmiӦzۿ`~`0ŋ f~ " :uJ:TΜ9#O%MۙSY杌s)1Kw]wI<i5|15,zoܸaJ|wʕir|WzQM[)Z̝;W,Y25N:\*TH/^k{ <<}X[:ܹs9d~5;.[ٳgbcꀧyB%'c~7cǎ94iRpq$j!\rIr"y @"@t0+$@$@$@$@$Zj_0-[#x ?2i$3ZH7F ]vU-6o\6l(>?~\=z ͚5$½.]WС]V c_ԩcm/,/^TB8ڷo/yQpٳgm_$ [zߪ'M4Z3gXBsOZUVUt'cƽְ̙3˼y'֭[["ﺯHbߨQ#u#m @$.]:kOk3$@$@$@$@$@$&|RfM,|h ?7m @|/|NgӦM?z/ܹm۶?%          H@(&wHHHHHH L:U%Ԍ @B qgHH'PjJrJ$@$@$@$~;w;w. d_|rk= HHHHH > @۷oF! x kFow}6ZoZSSt@ٳ2dȐû>,eʔ~OĀUVMƍ'۷o>zS:tHBv fh> *~ X PؽޫDk@uѢEÇwyPzg*RIX!ƺub+W,a9rƍEC8@0_Tc1b5˗ խ[W "!d h{w^{I)m80\vAY]'߭[7kиcZHX ^mx_d@3v>}XÇ{ڵ6ih ן6Wc)vM/ָqcs83޺uK :/R#>}:F0sLk8v. ΐ $*ߥn:YpLҥK>XbP'"$ \|9"iiZw",3#GS|9,`$@$@໚3ĸ;[ @5rʇ~&a$@$@$@$qgԨQ駟*_tyC?fI+R^=I,YE$@$@$@$@$@$@$@$@$@$@$f%̃`$@$@$@$@$@$@$-L1h3I$HH@r!2dȠ8V     x!-|'o: 6MJRbg @VA|ңGL$I24iR=ǎ3gl;Sxq%y Yj@VoʕŮN( I ]iUR_"ǞAR ]b/ ";vw"hɓ3X'`{d鱒CvӦMҬY3ٱc*N'!QΜ9p(Xf&Rڰa:uJUЫ5A}~k={V ~jղ]ɘԩa۷O3-ҹsgCO*U>o<5nG)^$ʘ1^s0{9l+yspCv_-.Fdk֬QÄoJb и_w^uJ(! arL$@$@$@$@!&$ 1tvG ʕ+  2~i$@$@ޒ aÆIɒ%/ZhɇHHHH 6ۚ,ɓe۶mHT]$A.2g~V(ZSuPjQJOQ־}{8p?sU~wHʕ:+V?:B <ߑ*mڴj7f H"_7bŊ³}_^vi ]TRk.W_^zq6 [m5w7njZ G՛J2ey=sGŋ"WNƌ@Yk&[lQ?.* )jh^Oٳ @cS<_~ *ݼtjxI c|d„ vZ~k .USEFacU= ZT1c54HHHHHHHHHH ߬߫C9E$@$@$@$@$x ӧO{2t{J$@$@$@Ax'ѣG˧~*&M={Μ9#>@e+RfM|7#          "wFX9T       m*QtNI ~ڗ#Gŋeΐ / KHUVzS    x pM#pВ) 1M?U@+&IHHHH/;w*UիWճ-cϞ=+mڴQɿ1ux)EcHN_Bpvڲi&%>cNDHֱ3 3,ٵ C#cg4֘ه5KHZ̴[75{|Ny==KI~l8)eJl\v嗏v!RHC5jTC/N607idW[m;ƌ#Gi27|3J&^w9#zLӦM:?[>—W_}_$2]TMӶ9sdq/juiR2ooQe5X2+K̩tOS6ܹsd)as*ЩS,ƔnWHɒW:uS7.WsY-ngY<,oJ›m#ÇgS=S%DJhW{dZO3uFΝ) @'#1R~f~8T PkfQRߔ7I\s=7tR*]gǽiYfM7rJjժ? @Z{=ZktӵO뮋T6%ꪫ~l{J٣G,fm{giIզ SO=mڴ)^\ +[_4H CUԩKnqm%/HG^'N6)I?)*R|H=/9.i> 7hѢEnZqﯵkwqHɉ?쳸r~S=dǗ,e^~>4Z=|MJvb"@D=FkЌ*H3\"| @ 4j(KwUȫoyBGgs ZѫWڡٳgG~;\ @,R`]v/cqmń }'M~\tEѱcٳg{,J^wF$@ @ @jd5 @ @ P_s]|ɹ  @@ҍ{o6oW]u8cn @ ^|qI'ef/¸[%-[FJ̘? YޔfiJ+M\OGq甤xV[z#F,q|iߥIg!uP~_Ç?㎋tB @ @1L$@ @ @@J>f5m4=iX+ @Z,0{xb-ZD޽dߔtVM6-KX%o-~: @t=[ol4)Iĉed)1?Lqcƌ[rej4Z`Aل=K:n!Wd~qEe]̙3'.ҥnʎI Q 6 ;3/I}{EiFeǤ,|駋Zey 2Mu%dHW\nlY=_VY(PJF4eUV%&[~&{G61lذl°N?W5\=?zM?s+^Kǎ;ATB @ @ @6 SI[( @htğtg]]j P c#FĄ _~ѬYܸǍgyfvmJ綩 @ @ @5W@ߚ{n @ @o=7|׮]c嗯^4INnx=C+|'%馛"%}衇SN) @j@J٧Ol(s΍.܆uy߿L:5\2jԨ/Jg\=&LմƟ>oҾ}u](w}/¯v޼yYݑ#Gfn&M-)hq2!CJ$}뭷F#}VKe6[nqVw14iqg/.o&~g 7%뮻r_y;vl/[hcҤIoFu e9l=R~Oqr?p[g~~ 0V^.SO>$XrSN\~s/ce7-";{H%%n%]v%k._~RMRaa?fr!~>& @ @j@q43fԮ- @U&p'G֭z?Qe PZlcwlgήMn61xy{M1 @ @ Pֶ/ @X_~cƌY& @j@Y&Ir-Haaaٳ @&LbСHzoժUuQq1lP @@ {Q;?O ֩Sgչ唸4%,.oyt1F}Qk.HF4h^2?|ŇSR_?>xᇳ)[n'+)ja%M>%%]\{s c?5%M'Sq?}w)mz^\YF)grJS)ɖ@IDATo*)O<1Ҙwni:?O?{n?=|'M饗f2eJlq7gPA[o~{<~WZi8餓2>,>lW\1{t{뭷ζE=ϸj#Xe95o9'{{^?gFJꚮI;.V_}l0xW^ܡ~VstgW_}zd`HhtMyU=ML4i>(=S7|3N?,n{$W~.%..%-Y7Ez֫W/\\IIφѣG*Kؔ<sYb85%M]Wݻw}Y{'kiӦ&O%}6MOURվ}FJOfr_~,rJRS{)ozϧGF8\WmQ:b4g~\}٣x:%· +dC9$RRNw̙%%THI|uDzj1cƌHɚSb-JZ~gxgKY:d?W?g}vf|.K5 tMYb߭*6l?cH K&,.oUSO%%O  @!76d1X$@6;W_W=@wԜf @(t}I筷N!@(ʮeNw|1jԨt]^]w]v_I'_ԩS" @ @ Pڛ @ @ @X Z\8g @E9)%޽{⋹DI) RJ }1dȐH $]U @R,% &%LISIIYSBT1%I_/\V^y%nݺ›#%oL#Ӥ3+)oɲrmeyQoKJ~v(^c.yM>=n6YE֭Jd)q]I&;qM3z&]]9.>x)g^U)I 7ܐSbt7n۽dZLI,qnJk01Æ {7ZklsJ`[2lsN:_}_YڐK~S)!oJ|S-[vI-ZbIoSYXsJj8oJrNzSUu^|r+ʩRE,l{̘1qGc*Yz:p@3[^4iz/vMId܇v‡e/k%>V,nZe]r{SJhJYn콟oH~ȾzsbT2t\V!@ @ @@U 4m4}Y!@ @@e N\ww^v Tn  @@ k?x7G5Ke3DN"q%d-{$@ @ @*M?,tD @H My5QDB!@l.(7oDݦw}l4+Dى P>;㮻iӦblIs1YrF!@ ~alY(]tA-2뮻.N;lz"Ǖ~m[1{h֬Y42%Vj@JlgŔ)SbƌYr4PJ^[PuId^}\޽{ǵ^$|祒f++4~\ஶj$IKsҤIke eɐ=ܸ˳H̙)r$q6ɳ7e9%bsɉ{M68/~޼yYO?4K:^idϿ>(&N 6[o^e⪈sِ#V[e_,M|gJq픠XL%H ϱIs @\ .>Va @`ڵk)YB;#S[gϞj륗^!CTxJ;su Y`=̒%n)N>d. @(Hz'9]Hw+ @ @ @@[- @(?4Q˯A- @h:7O?=WW!@o{͒5$M6Ν;gI~z_l @hҤIߑ@4m۶˔6.KbJ, C[nb-RwXSmfYխ[7K+/K_2,e9l֋/%M>2ojx @ +S= @XBtm\qꫯ ^HzQ@ @:/<}X`A\|qqE j @J ݫqgD駟o9FEEE1wܸfm%=#cWpK @ @,@RkW @ @ @@x'ƾ:āX+  PR `#A͛7SN9%J&M :u#F)S_T'@ P3&L)>曚ajv ;5d8C ɍ$ML @ @ @\s\ӧOU @ PY^C9$/k @@ h߾}v_sύ5X#ǻ=z-Zd?6 @ @ @ ?$"* @ @ @ .X`AiuɣB\wy'zLڱc>|xO fcԩٶ?իۮB @@7o^̙3gEEE5 hr"k0İaò5j(:uTFg( @ @TW~MV]!n @%\uFqUW_]G$| @@hժU\z]w;Cn@}]\{>#G綫 @ @ @#ȟxDB @ @+O>$7qꫯݺu˫C *2dH=]6k,:8ccM6v+ @͛7o}ظqe>ցTvjyRߔ7Ν; +l 9 @ @(kDAAA,X O^-k @K.жm[o5~,\J  @Tr-Gydx뭷⦛n/f͚}ODzq'F.]I&U  @ @ @d9  @ @ @/?GQQQN3q/!@jܹscȑYԫW/6m_~eL2%B @TϏC̙3[ntOtVja @O`UW];ۄ @ǏguV88c-̿A @ @2Z6^%@ @ @,I[7N:i# @ ;ѫWh޼yt)FQ*; ӧ}{Dd @+&e]bw^>6 P9}QYgnilӱ^ @ @ kVԩScKp] @ P͚5޽{g ϙ3'_h @M4~'裏F kw֬YY"xv￿=e\ @ @ @R HT\v&@ @ @jW^SN ֦+ P꫸b--2nsi2s9'Ǝ%VѣG4j(] @ @@E <8t׮]su @ @@˖-0͛ӦMˇ@ @@-8묳bUVF?tka @_0:tO>dvv޽qƹ_~8ãuqǗ_~ۦB @ @Td @ @ @ L4)n,VZ)zUF \ @;wnr-GuTEw} @ @,@qtTڙ @)7k(;l^[ @$жm۸kc1`tMs=M:5?HEs1o䶩 @ @ @+ oj @ @^zi̙3'SNUW]D @^~ѢEԩS1"RҔ;d7N>=s=%&>  @ @*O`ȑ_dv*^O @ @,@֭s{~g  @B ݼyÇKW'A @ehРA#}x:udO-~o) @ @ @@ lL @ @TS &6lgyf5  @Won)zlk*dzZk9cǎ_~9QF* @ @B`РAnv횫 @ @ @ _Yg\(^ @U) +D~r!{  @@u]{?>j.^{-'N.,_v @ @U)0uC˖-c=pM @ @E HH+  @B]F6m}x0] @EUVqɓcРA[KI~/H俯jn  @ @ Pv~n @ @ @ 7.hUVW!@T'>(ݘ<?Snnm|1mڴ}QX  @ @@^ 2$X?xaY @ @ 'J?7[&@ @@ ԫW/KV[\L PMׯ]t~;^|8CnݺhΝsO6RW!  @ @TZ @ @'tjgyf4j(  @`?c 80vih+S]c5"n믿'xb4n8] @ @@> ,X  TXXMNO @ @ 6f͚e}Qj @RΝ;Ǧnꫯƣ>Z @ڵkÆ >,?EӦMsqQGk]tQ|嗹m* @ @ @ ]M @ @Z<\sիW @^ %s1~=#p @ @Y` 7iӦeIf̘J99 @,@aaa\r%ѱc;/Ϩ`7 @@ h"_~q}ō7of ..,?8Sc۱ @ @䣀Y\񬈉 @ @>}߿4h BI&ŝwwqG.I6lҥKy䑱jܤN @@9 < [ %U ҭ[\] @ @(>Yh}Q @elvkŻロ%ܹs-S0\ @@X~c/R\CEQQQ̙3'/=ݛ;gI;uuԩ0FH @ @(PXN @ @=X X6`ڵkA @5C`ل۷֭[G~J%]eUOQFѣW^֌So @y&PPPg ,^G}tzꩱW  @ @T@Kt @ @ @@~ zq'f;? P+۸cРA1z_M6qqEJtnT @(~K.eoU  @@_&Ę1cCǎ믿~q3  @ @ )1kŶLj#2NA @ P;^yHOҪU,r-W;1 P_#G痒c=N+ Jm@ @ @j@amq @ @ @w}0W]u @@ "~8âyqꩧJ۠A,?lB;OJ?K:$@ @h߹D$hp @ @ P.-[t_*|A @;:tȚcմv @n  mUV>&Ә @ @lMndofB @|b-rbL>=n|K  @U(_?S#Fhf̘ó:DΝ^mS!@ @ @Enmq @ @ @8b޼y}F-2 @~4hP+n:ub}.]Dn]t@ @cƌuEj~뮻b֬Y~G}tԯ_W @ @E`mͅ2jԨ}s* @.(EEEqWFϞ=aÆ @P01z{9sdw}o};: W5 @ @T@Ku' @ @ @@~c1\ѡC8c]vɭW!@ @ @]@~O @ @,|[ne̝;7ׯ~ifڰ3 @X`޼y裏fHz(***ޔ=jqQGEnbM6) @ @?c4o8c֊<0\h߾} 6,L^{Dc @ @{s}y.V @ @]`vʅs* @'t? '7?Sxb!@s[/K;y+e˖z8cu~Ϝ1cFn  @ @n?Oj-^ @ @ @vmO۶m^,Ҕc @Z(0k֬xc /Buqg7%bG+ @ @ l6ofovlm* @ @N)ijϏ7+3N:)׿z @ex饗"%1bD̟??Xaaat!N?e]rU @ @ @@> spb#@ @ @'KۥK~ V; @ |q-[o%K%xꫯ)Sİab=跆  @ @n\=zU @ @ P]vm, ?_]!n @j@>}bWF:p8qb-! @T@vb1nܸ8ScVʺKyu];wnEm @ @ Pf/ _PV4@ @ @c/:wEجY3fL4n8# PU/r~Yߙ3g Aq衇Fnbw, @ @K'KMkZ7 @ @G੧+ Oo9  @ׯ_\r%tTJ!@ P^}];7&M*Zk%ѣG4jԨ6  @ @ @ $͇  @ @ @x㫯>|xtԩ0 P:th 80ƌlYΝ;+V @ @ wqGt%;dK @ @So*1w` ⣏>@EE @RuY'{[nM6l @yk6xRmӵĽz^6  @ @ @* s} @ @ @*ZN%=%hp @j"`x"%mѢE~N9=ztѣG~ɹ& @ @@r @ @ vm eر1~0,c @ @ 4n88lt)E]TCGjX @U)Pnt /;v"̒i&?5jTUo @ @ (y% @ @ @@ sL6Mz  @K+0}2dH 80>_.w|pԯ_ۭ @ @ @vnioN @ @D+}f/3<3O" @~):7D:u7p_h  @r7n\7?k֬R-{8o6  @ @ @ +# @ @ @*S`ҤIq)0`D9  PϟO>dxѲe8sJ%mڴi6رc_WuQ֮ @ @TmݖG  @ @jAsu @+}B+**cb"@am۶o9A]tQ ѱcp #p2܎* @ @ @ \*}M @ @ @*] c=YsLy睕  @2eJ <8 'N,LAAABnzn @ @={v4oNM4ɃȄ@ @ @Ob׏4ӆn~atU @{Y{G<غ @]`ܹqgG]V[-N>ѴiR, @ @ @wiK @ @@fm3gf=qe"@N`1hР1iҤR׭[7:t'pBQXXXj @ @G`ذaqaeqqwOp"!@ @ @@ Y/bk׮z, @G`޼y_xy˧q @(g~:K3ϔjyVc=68XoJm@ @ @D,Kd @ @ @ ofϞM ^gϞX2ȑ#cǎѺu߿L۪U袋bĉC^{%ڋ @ @@ ~w @ @ @& >t5yF @@ [n\p/WW!@ o{gNuQ~Me֬Yq뭷ltP+TN@IDATx @ @ @  \,bP]tG?:n駟rIAq 'diY!@ @ @z EVbԩQ^l5XzF @ @X{/6lu]7>pm2@: @J?~lg>ٽ^ @Q %{/K|ZK{kаaR, @ @ @~ @ @ @j'0gΜh׮]5*#ᄏڍC @6 q뭷H7ƕ,͚5nݺEݣe˖%7 @ @ PMyرc}7XM"l @ @,^{O=Tv=;w^H @>|xtAYwlMյ~ @ +2Ҝ%KJ۳gիW  @ @Hz @ @ @NK.qwdqz[o+\!` P[:th?,5삂c=N?֭[j @ @@G&{ォDO @ @e׿kvfmG^VB @H Ѷzx~رc7 @,keIϵrQGgyflF* @ @ P;$ݨ  @ @ @@[⤓N_qW_M7ݴڎG @& 5*w_̜9P6m|#ڴiSj @ @jiӢe˖QTT=gQXXX3g @ @XJw1^y{,wߥl @|e:|ͳĿ  @q⪫Cٳsw}v)^ @ @j1j6Z @ @ PҤ6{΍aРA4T @@~m6{  @ @|ٳg&j޽3V @ -Zw=[oŨQr9l @~6lv[|qEEזc=M6M3&} @ @([E?9uUK @ @R>]w5>4ݣo߾yY @OC {'[o8ScǎQ~c6 @ @(L䖥zEEE1{]va* @ @ }ӆ ;3=qh֬ٯxS @ f&L|pb~;l( @X ,;#nƘ;wnm]qI'EŊ @ @ @0 @ @ @@A ,[,}K/֕<駟rT!@&=ztz /[F ~[nkֿ @ @H3o=ʕ+#@ ƍ}^x!k[/:w]v5kfA @ @!oa\GU @ @ @{NK\rV@iii<1xx'bŊYqׯ;vSO=5, @ @]o .իǧ~*U* *'@ @ @|hѢEg63gZk3 @ @ 78qbO?=7JE @`% kiG}4g/$CJ]%ԩn?  @ @ @ % @ @ @*0uԴiO%5jӦ @jo_~Q^8c̘1F*T?>{xk׮kb  @ @.~'xF~#@ @ @` ~sΛ7/n: @ {KXlYf  @Bc=b1}h۶mTX1-wq뭷chݺu曅̠6 @ @)2Ub  @ @ @ꫯƾsIuY4 @G7H`e7:Dc7! @ @;&MJ$56jԈ  @ @L୷ފ]w5VXkv̜936tӟa @)paŸqpIS;fP @BO>$nƸbY3tAqFfͲ @ @ @7 @ @ @L,Y$x饗z4i?|TPLԯH -ZIsɓb:u#8"ʕ+u @ @> ֭bOwy  @ @@Νl&?x~, @ [}g[j6?*W[!!@ [n%>Y7_pqQGEqqq1 @ @ k$! @ @(sm۶4Mn5jFeo  @`u ̚5+zoy$zѭ[1cFL0!Zl8"@ @ gÇ$>2V @ @ @ [ꫯ 6 ƓO>}- @@F{̒h͋!C`J @[/.[o:3o{lԯ_?Xti @ @}܏)! @ @ PVʸ+r^{xcw.+嫓6?~| 4(ƍC:uZ*U\&"@ @ @ T͞=;ʕ+s΍M6$  @ @XSN9%VZFjV'@ @xcwLIYf̚5+- @ʺ+bԨQѧOx786l޽{tdl @ @ @ 7s3T @ @ @@Y1bDoqqq$ſ j&@U)7D߾}cm?<Ǝi[R8S^7x#N?t~W06 @ @4iR7)r @ @X'|r|s΍nݺIH @,РA8Q0`Jp @S\r鿕N&L͛g 7o^wy[__u @ @=܋% @ @ P^~K,IKׯ_^ L #Gŋr-cǎѮ]` @ @ @h߾} :4=}ĈѺu_R @ @ @ ̙3'FYO {8#ʬ  @3fğXbEԨQ#f͚뮻n~ @jxףw1f̘y[^;_' kժ @ @~fF9 @ @ @*Hnlܸq|=#Fe˖eTP!N>8cB @ @kV@5ov @ @ PhҤI$_FO<0Ǝ˗/6 @7o^ 2$㎴ǩ^z$Q8묳nݺ??d @ @[SN9%}}Ґ;cy! @ @ʢG=XZzroSO=EEEeB @~KUV-fϞ믿~ @;wn7 .̄H>hٲe3vm~+ @ @ f̴f%@ @ @D,_<;L>z!~ @So[[5\wwL&42 @ @~Y}۵k'K @ @Q yuM7M?ѧOx @>38#2|Ʌ" @@ ԪU+n3gN\zQF4siii<#;6mu @ @VՋ6.O6 @ @ʔ?>$ʗ//b4nܸL( @Ob뭷ŋG*U>M6$ @X`A~ѿ7o^V]w5.8ꨣ(  @ @Xūvx @ @ @~Yk4\r3F_Y{fřgw7/<̙F(h' @ @+K஻J&kne k @ @9/.˗G֭+s &@ @ 6tܹsxѢEq5OxI  @@ժU΋CzeRM2%9~{  @ @3Y @ @ @#|}FQQQ1"Zj?y0`@쓉7gΜ8c-L_B @ @+Wei4 @ @ @/ q!ŋzI_  ~ 80 &-":ugqF< @ @X-[1cƤ$=U<  @ @ P6{8#b+Wz4hРlJ @Nᅬ:u7|ʕwy'nC` @(/G^'̊FΝsύ 70  @ @c1?&@ @ @~[oo$7j&K6mƅEEEr @!PZZ&L[n%ƍϗ/t>-y聅 @ @kJ>Zjc79sDqqc^ @ @9眓~4)~1yXk N @ P} /0-cz0 S @6mZ;+2TgqF#~w @ @鼐 @ @f͊C9$E1t :ʂ bРAؒߛcǎ4M־}Hnz裏~ 5 @ @m+m<4% @ @y(p;&>}zt1 @"ХKxr~2eJY)] @V@Æ cȑ#}EŊy-Z :ڶm3fX-yLB @ @B(*q)F @ @Y?8ƏG7 @?Oo߾q?9T\\G}t3ve~+ @ @ 4V$@ @ @~o7L_?)^|E   @0{"7o]t?i6 @ @ >`p i-[#<D @ @ @@a 5*;J*ŤIY @ge˖ŶngNxb}d'@ _ur-1`ozqEEӦM @ @ @.q @ @K,I#d]vKfEkzoUP*U⤓N]F @ @ @@ ^/&N͚5˵ @ @ @;XӚ{4N5j(C @@a ><ڴiӤI¨L @r[`1dȐ߿|Yag㠃o @ @~Y@_v @ @˗/c=6ƌĤIbmz)_?8~{|Ylѹsh߾}Yl @ @ @ L5J5h M1e"@ @ @@A $j~&Yzh|?i5~8Wf!@ @os=W_M_q'^T @V@Ҏ"yF^bԩY֩S'.hӦM$İ @ @ @ @ @ @ ڵ4TR<# \c @@^|qGr#S~k֬]vY|G1|p~ I @ @/ 2$mk߾Fd @ @V@ꫯNg())O<1>U8  @ zyarݲe2V @X}EEEq1Ĕ)SbرѴif͊:ʸ馛b…cV @ @ P~|~iYP; @ @ :v~{:X bѢE?> @@ ̘1#n洉?aÆqQTR1 @ @7KFڵ>ٳc7Ϸ2%@ @ @@ $q'x"e=^x!|_5/ @!O=TZ׀.D @ ŵ^&LȊDnݢsαfA @ @$oYj%@ @ @HK.1pt>`uQh6 @xgoqE8ӛ5kn?  @ @ Æ mۦuwqy_ @ @ }].1{촂;3O @B:uj4j(f͚DժU \u @;ɓ'G^GzvF7i4M[ @ @ P4-kW\ @ @ @`% t=Z\1bD+y @XdI92m;mڴPN?ڵkԭ[7  @ @@IIIl1cƌW^y%7neO @ @{W,\0c(  @(8VZuM @ PX~llٲVZ|V!@ P f͊>}wK.TURh۶m\pQv~+ @ @(TB-L] @ @ @3~bСZr @>}zt!jժ]vYV=3zH4pyi)  @ @X}{Lֳg̺ @ @XZJX|y{GPf'@ @֭۷O̟??暟J @@. ԩS'nHs9Zk,Yzkl6i[ @ @t>  @ @ @H^uUiIKgyfA׬8([O?t?zʕc9&m{- @ @ PfJ9䐴FoQf-N @ @\());,ko]vI&E*Ur1L @A?y]tQV @ @ P(ŅR: @ @ @#УGLdƛoYCoXK.{'6ltP?>wu׍ݻǬY~W0< @ @9%лwL={f֭ @ @ @@nuMM:5ڷo @ @mQt-HK @ 5k֌뮻.̙W\qET^=MbŊ9rd>:LՈH @ @_/PTOw& @ @ PV>]-Y  @ @ @X|yr)q/_>xtIk )  @xW_~<,ihӒ4?ꨣ&I_  @ @ʺibwLb"B @ @-pUW]^zQ^- @eB`ٲeQ~{(IO=TtAevE @(DKưaâO>1{7n6=ó @ @ @@>hWIF @ @ /Rp 裏 *V#G>z %2-}IS1cD߾}_d׎O?=uu:f @ @eYcѣG >,s @ @y#PZZGuT$6l6QF ( @+DVwqǘ:ujn*#@ P/_#F^zŌ3*yK/-[FQQQ1 @ @U~sE @ @ְEҦǏOT\9~8p2 @_/x{_~3녛lIt%:vիW:f @ @e] yꮻ2lD򙡅 @ @C`Ѵix뭷͚5z**THI @@ {oFZwmڴ)zF @, ĨQkiӦe;%\w\gA @ @\7׮< @ @ @ qϧi^{xǢy9N  |1hР8p`|Y/hРAt=Zn+V:f @ @Gqƥ:uBC @ @y&0w}>Ko>n8k  @ @x3֮];}jŊOE @ @y!k /^ׯ_wyy]H @ [s+W^ѳg.Xu @ʨӦԩS'@6mB ??d @ @k\@5~  @ @ @#'~MQF}jժM<ݺuڵkX#@ @ @*S^x\r5 @ @ @@ \qqWAU/RT+KH @@! t1nN:ŠA \ @ IҦ&LtMGѡCXk @ @ @wu @ @-Z:MWNxꩧnݺ9V$(˗/x 6mZo]vիgA @ @@&MW^IO1bDn~3 @ @ @ /Zj~7 [vxb6ʋB @ Pyl61(_|۱vf"@ @ K_k&5k֌;/:wUV:f @ @K@%m @ @ O>dp4;ƍ^b @, qwFcΜ9Ynm#N>TR1 @ @ [h;[oſ"@ @ @Xxqム<㴸g}67o^x @*Ƶ^<@dMs9iիg[!@ @ @wU @ @@޽㢋.$lժUs=Qb>+ @`M ̙3'wyg$7$M};찴{n?  @ @ @{qꩧ#4j(x?0 @ @ @@. L6-6mOc{q7rd @(pwewSFqqqW< @~I`̙ѫW_˗/ϜRZҥKt-6`~+ @ @X Uc @ @ @())s9'I<4O @5-F>}bȑY7TP!Zn=zvaM4? @ @ F`ѢEܹsӚ}h޼yԧ @ @w &M7ݔogC @U/PZZ{L<9lСѮ]U? @YٳgG޽e˖erѩS_5kB @ @)4 @ @q%K)=P4i{u矟#@ +HniZjo>uji @ @ z_|q:Z-"yB @ @/p]wegǨQ⨣*UH @@N L4){4o3gΌjժdV @X}}Q}w/μrqg\oyf @ @~ @ @ @<?~x$?eNorZkc6 @ @ @` t1ntг:+r'0 @ @@6mbi 70^yzs> @ٳ~dɒHv{V[^*"@ @w |gqק߃_paf+F۶m /ڵkg[!@ @ @y  @ @#{.9ooqi>QFD.! @-/2 d%,iӦM3ԩo @ @E@ߢ\ @ @ gwyguY6mNI&iʕ+rl @(@Gz>K{b+JD @믣1p׿|qI'_lMf @ @~s @ @ @@ 2[h#GUfY!@Z fРAq7Ɨ_~5]b @ @XIl2Fʕ˵ @ PÆ mۦU1e7)k< @Too9weK>hժU\r%ve[!@ @ @8F @ @P~O>9}Ls=7ř}V @H&7 80TEEEqGE]{Gf @ @X}+V]v%MNz}I' @ @rV୷ފ;ϟfl߾}~9W0 @ S4v}IXwu㡇<0E࣏>믿>Xxq&vŊSO . ֭o @ @֌_|nm|wi䡨7^3aJ @ @9+F֭$8pܹs @HO{:u6*JUE @bѷoHORTTsLaÆ? @ @f" @ @ @xF .LSN<Q~N  |A;˖-DRJt!zmYf @ @X~z}imƝw޹f @ @rV iۥK4_qqq92?+ @'駟FzbQ\2eJ㎅W @X 7pC|g-[.,vi~+ @ @m~W= @ @@III\r%işJiڴi<#O OzJصbŊUVN:Eݣf͚V @ @ @` +^{EiiiT^=f̘n& @ @^\sMbŊ1vs6` @_\pAZXr//XxE @&hѢ"Ƨ~5G6e] @ @ @ h[  @ @ @@hݺu}b޼yYh".hԨQ~ @ @~εV) @ @i⨣YfU/_>]v-*B$[oM~GhlAt->Xgu2 @ @ @@n 4(}/7IN;ɓ\rR @ @I+Vı>hf͚K/Eݺus2P @ N xƿi," @kB`ɒ%1tи?Ίpae]{G~ @ @fUH @ @&pGvb…ieR|w} R @@.qUWŘ1cnFѣGرcڹU @ @_~elFQQQL4)4iζ @ @ŋ㠃_|1=XNodB @!p1ѣө9眸馛VǴ @ @,]4ݻw|GYU|qǞ{ @ @+o^[ @ @ @@ X".ׯ_v-!q7BVɓ&?xplIqgF*U @ @ @h׮]С$iÆ ͠R @ @ @@N |w>oa^5jtn @( Vc…Q\Hi 8U @ 3˖-Ks4rxi߽+k  @ @ O@»*"@ @ @ꫯN'fk۶m <8*UgQ7x#x'lҦ۷ʕ+gA @ @+K/{̙3f͚X2 @ @iO>$6mgNsFժUs:p @@>} /Lc=_(N @@wqf>)6M>3 @ @ PuU @ @ԩS裏9sUUP!n8묳 J @2eJ\qOdEUVz{v4ϒA @ @XtiN1}4-]t @ @ @@N ̚5+m駟95kcǎʕ+tn @V}{/-[o;a* @ ػp-qsڤ$[:Lv*$#( (K$$jHJ!*[ʐuʏe mz:98s?s}/+dɒ>|xZˉ}ZwB @ @@ (  @ @ @ :4-`4˭:z表SN)Zj .O?~|β;Ct5ڴi+V̹ @ @CgϞ߀h>6mZG$@ @ @-0s̨W^|i7cFKt܂#@ @ NI2dMGԨQ# @%Z ){}E>}w͉Jq9N @ @_~9 @ @b>?H.?Iߤ௃Z_=-0nܸn֭[m6*Ts  @ @oo,Z({kO$ R @ @(Jo6N#FDaaa] @@6mg<6lX~'$z @F(+;]~ozr @ @ k&b @ @(3gΌ-Z[oezFbŊYX7x#-;vXlY6ŶnW\qEkLE @ @)>M o߾}3Q @ @ @@2eJ{챱`4:_ @9s{_}Uɓ#d@ @@$EG}ٳgĝ?ѣG( @ @@^ U%@ @ @\{>8+F_4h‹ֶYNZjŘ1cBlM 80}H+,_  @ @ @` $Eu]{kQ+ @ @ @@H6衇B iwqG\zeB @;-"lEe @Xʕ3<3/lgK>쳑_~L2% @ @ @  xO"%@ @ @S`qyŰaòbGdmXS?z#Fl5k_۷J*e @ @ ׿b=o& gI7 DO @ @%]VZҥKPW\qEI[| @@nݺucڴii=z􈫯:3: @,|^һw5kVN*Ջ=KRA @ @@~((  @ @ @ ѢEx,;t 6 @#G>}{ŋg֨Q#-{=h @ @ @4m4y4:+\z  @ @ho۷bL袋s  @op@eŊcƌ1 @VY`ҥ1j(EWY@ @ @%S@ߒ @ @ʈw;v~!x6J7nٲe&g}}M,\0~M7.]\UT5 @ @ @<ѬY4*~^zIP& @ @ P~oyy~{s9O$@ @@ \ysuԉoQPPP또 @#hK @ @ ([^ @ @ @@?~QɈ#lw=zt.YXU:n0`@|moq\|ժU5 @ @ @t |嗱^{&FKW!@ @ @ٳg#5)u]wE6m"vA @  ,Zjٳo8/ @ P*;X^H>WI~: @ @(YC4 @ @ POvZ̚5+sύo9*Ui @UH ?snZj\xq%&lk @ @ @@hٲe$~I&1nܸҙ @ @ @ /⊸kX cذaѪU] @)S~lٲh⭷ފm61 @VyѣGEK/1 @ @|P7_51 @ @ @@^ $_M 1v=-ZPZD~'#<I @R/o^b֬Y9&E{GqDN @ @ֽb܊ @ @ P>hݺuL2%?vyOL(|?1nwI @ @\?+43Ky#@ @ @<رcvmiwzhҤID.D @M`ܹ{ƿ4|07ooi @2"5jT_~C2oA @ @%Sd%* @ @ Pz/w W\/Be ։qb}vBqꩧ[oVw!@ @ @@СCV7ٜTߒڈ @ @"n8S%KD-bҤIh @ PիWfv1^M֩A @"E֪UtϘ#FnE6yW^oY @ @N`ُǺ[J @ @ @̛7/;9rd;Æ ?< @+:uj\ve/ mԨQ7jժ @ @ʆãui[ne曱曗eI @ @y#thӦMLMl&L>:or( @#p'رcӀO?'x @ PfbԨQѻw={vCRgϞQnݜ~' @ @=~מ  @ @ @ L2%T>8㌸ۢZjY%]ƤIr%^\QqB @ @%+{;wnxAiӦMl  @ @ @ o gk4 70&NGyd P @C?=34qE&M#xQ @ PTF}wr<4h=z:u;!@ @ @ J3 @ @ @+x㨣~WnD2|p~?  @`ƙg_NߤhoB%j0 @ @JYgMo{eD @ @$P\H9ӴhԨQ<쳥)M @ Pr˸[H=믳s  @d3~;e]p|tϙ ƴiӲ~  @ @_`ُGOkF @ @ P/ƶj*O%_~6lXlY9a}c…ٰv!z>QXXk @ @ @@M~m7|3W^61dM @ @y%x8Sb„ inaL81<ȼC @|O<1{Jw @ @ bĈѻwxrO&{r!9N @ @zC3 @ @ @@Xtiݻǂ R+;we\H 2ﭷ\sM$oy\qqyEJwI @ @eXwމ/ϟ*L4);2,"u @ @7EEfͲ[IG}4ׯo @,駟^{sM;vl4mڴG,4 @%KbѧOxsѣG8蠃r @ @ ;  @ @ @@6mċ/i1rȨUV֧A~J`ٲenݺŇ~ \rt).VZ֯A @ @e[`QNxWS:_򗲍"{ @ @KociI &QG @)jݺu\5b̙曗`EE @UH6,-Ѹq @ @(\[A @ @ 7_V跰0?kЯ" Rgy&#8㌬o$)";5\J @ @ @@޽{Vw=?e @ @ @ Pj*V=P4i$ᅬN8!Y; @ P\gyf4m4?Os95y @ ^ʗ/m۶ٳgcwxGL?>}z֯A @ @ ,XA @ @ʮ[ob|3w=瞨]v֧A~J`֬YѥK0aB;.g}r @ @ @D`qGҥK#)/~ @ @ŋy#yT\9K @{sI1bDjժ( @ 䳖d}G}3SӦMꫯ}7  @ @+(\# @ @ @D(cyr%\3fP?E/". &W~4iB(" @ @ʮW_}[N & &< 2'@ @ @@iPB=:~N8!uiS. @?5jߞбc㏳s  @@YKwIlvY:ƍKL;S75 @ @X@3 @ @m3gF6mW^ c:thr!YoEŀO>1o޼nc83 @ @ @-ЬYx>:x [o$ @ @ /-[رc<*WǏ @@<#ҩׯO?9 @(Q^7C k6>,dل:k_ @ @P] @ @ @T`ɒ%q 7DϞ=#kr+W.:wzJ*}G~J )p饗￟]Zj\ved* @ @%d>;fD͚5 @ @ @@^ TߤoÆ 2A @ P͛jՊ?0 _~鳞%+J @ @x.\N~٤ѢEꪫⷿm֯A @ @@b @ @ @@&0}t^{-s={>8 @-GNg.%:m6z[mU֯A @ @~N`ٱ!IAMp @ @ @ zj3&ͥRJƉ'I @/0eʔ8ꨣbҥxwL @XK ,;#ϲUpdmݲ~  @ @@! @ @ @ W (sqABʕ/<+V3gNt!-b Č3b I @ @?/hѢ8ӳBߟy/W @ @ @tTP!xhѢE… Yf1zґ, @XKHHovi?ט,N @)E]~tM[-]4F{gn:}ݵ  @ @@Z @ @ @`- L0!:v}Q>w}wxYXQ`1`ݻw̛7/뮻9p Y @ @X . c=^ 7pUn5 @ @@QQQi&R\:thqy @X-C=4OrƠAoPV'@ @:no1̙|+cv5 @ @U~+/o @ @׿^xa3&\r\uUq%D~  c=:uٳggoqt=B +V5 @ @ @<ѬYtl/bԪUkUn5 @ @KFbȐ!iNqwFvJM!@ @`̚5+H\%ǸqI&' @ @`=̟??/?Ewa_ @ @@YP췬%@ @ @dӏAEnoɮ5l0i>  ￟0aB֝llէOQF֯A @ @VUދ8 ͛ޒ-8Wv @ @ @@XlY\xfIbq뭷_  @^`Ȑ!r6lxcmYX @QヒM7_}UI m۶lm]֯A @ @([V^iy @ @ @1cFt!^~ږ[n7|sviYXQᅬk6nXpav#H\UV֧A @ @VG s:u{z駟wLa, @ @(]t~e%Ν;g @Xf͚?zaɓ|k2{ @ |M?݃mܹY.+V>;⊨Yf֯A @ @ Qړ @ @XQ`ѭ[h׮]|饂h߾}<#qA8\dG&MĄ (fm;n)jl @ @X].(Ə޶N6q @ @ @.p1Ǥ:ujJO8∲N# @~@ yG} .A @&PRW^s9OGJyWbРA_ľUV-k<%@ @(~<`R&@ @ @2*l}Ƈ~ ^iƺuf} @`EٳgGǎ'̺ ӟ+*Ud @ @ @`M|hٲezkʕ㥗^}gMr @ @(\sMt-/i'; @ @ qaŋ &L5Zi'@ @@믣_~1`ܒ;XKFY @ @&oi{EC @ @?)i袋Ϯoѽ{ҥKTP! @~H6bѢE˻㏏Ǯi @ @ @5xwo&bȐ!Ѯ]5} @ @ @T Ν;g9^pq-EN  @@SNni̘1#n՘P @N/2n8p`̟??KJ*ѱct6, @ @ PZ--< @ @ @'ݻwZq" 4o=vy矼O'xG /> qcq 'd} @ @ @,\0=td38#kt/ @ @( J7_lY뮻\r>w  @ vN93fL:yڵcʔ)QBY  @ gs̉믿>h~,6(ݣsα&d @ @]@|O ,Lx@IDAT@ @?+0rҥK|٘>nh֬Y֧AV裏y䑬bŊnݺEʕ~  @ @ kڷoNc=W_*UiO @ @JãM6QTTz'ǨQ" @+0o޼OoӟMO @,gu]wqG,X Ku7N:_IA @ @ WP @ @ ^ ˮmiƮ]*Ҙh @OrK\uU1Gv[nY @ @(oR796px饗b.A @ @ʄqSO 6h ƎUT)K @xעnݺ{=G&Mw @ @_k6"-Ze&ğ袋b65 @ @䛀b @ @~V믿+2H 6.?no~O #ꫯO׬Y3ѢEO @ @/GqD1#UV5y @ @ @@xꩧiӦ14:uĉze@ @m;vL'LT+;f"@ @@)㏣O>q=ŋ6lҥKJ*Y @ @|P7_^)q @ @ @ ,]4 W\qE|ٸv-  64 @}]Z([oIry}jժ8\ @ @9sbO>$.&!@ @ @eQ`ڴiqܹsw_5j(r&@ @W l2|t;UV @Wg; K,M>sύʕ+g @ @Jb% @ @ԩS/ٸ!ݻGNbŊYXQ`ĉq9dkjՊ;3>j @ @ @b(** ɓ9?xg|Ŷ @ @ @@YxףaÆ矧nSOvmW9L @oCz+SNѣGGAAխ @(^3Fˏ:v۷J*- @ @@(,  @ @;'|rԫW/oVb֬Yq饗* ~. @, |hܸqVJ*q7ƫoY!w @ @~k֬n: @ @zZjԩScOs={vva< @ @lF1nܸ^zz?\sLa, @ʤ;Æ 3gƩ$ʿ c]v/x2#i @ @(X?ኔ @ @ʺ_~zo=狚ozeH FJ]~{;.?  @ @ @Zxj+V>lԮ]{eR @ @ PV>8#)[ne  @ @ ΝtP{Y[˙ @ @Q 'RJ*ȑ#OC @hѢEZ*))DK/EjVk  @ @ W_:&MñG="yUXXs  @ @!P& @ @ /;w_|1|M6ѻwz뭳~  ~io>&N]fmbРAq'f} @ @ @`m EƍO9Ңl\ @ @ @?Cl2&Lz+W.n8 @ @`ϟk׎7x#'yNuر P @H޽{SNzeq)&L5 @ @ke?zQ @ @ @ϣo߾qwĢE!Io1=جO9sҍ5k֌;35jO @ @ Nh۶mV ⩧#8bm @ @ @.]tQ|QPPO @@;.,Y4hP{x @ r~:wӦM|G^aÆ9N @ @m~׶  @ @ @`sM7ʸ[b*eur~  S'NvER<~qgƀz˻$@ @ @D矏:*-ZwwgNֶ @ @ K/4qСCB ?}^ @!C% L0!-_Ü @ @(:.y-ܲ @ @ {ouYdɒtԱ=PTRr @+еk׸Ҏ6({U"@ @_%0~믿3_~N @ @-oq @ @V*xc޽>WT):tݺuHL_38#ylhRwȐ![d} @ @ @`] ̟??֭7iРAY|0-[oL/ٳgva9N @ @Z~  @ @ @`ƍd9sf6 N9ݻwY%iz*VN>|xNY @ @XW]uUgoM 8 @ @ @)oı~iV[m&MH @+3gNzC5jĴiⷿm:>zœO>{ @ @[lɳlI1qh׮],[  @@ig7|u]vԩw\Y @ @5PwMG @ @(a<âAK/ec/B>k @_XdI\veѸq3gN:tmɓ'G^") @ @ @K^6mdxѰa\ @ @(o}t??<  @ @Pd @ @ @* MN6-g{ݻwE~sX @* ,[, fIɱ;ѣ㠃ZY #@ @ @kO`ѢE:uj^{/BTVm-jf @ @ @`\ѵkH۞'tR926`uE @_~E.] cԨQѢEMH @3Exs?#=ׯ @ @ ("  @ @ @`"=z_|1g|Rf͚EAAA5' @`Uhݺu;6޸q6lXl&Y @ @Xgyf1" a^z)~  @ @ @bH>h۶m$'Gݺuc馛*"@ @4 t54+Ƅ c)ʉ @%V`ɒ%s}w}7'?Y(~ @ $)vi1o޼M6$F 6\D @ @ֆaC:uaaa3&4i62' @ @ Pf̘|NQFL0!> @(K.-[C=XjմaVRC @J@>>}}w7.#@ @Xu~WH @ @9 ]w7xc|9~ѭ[7E~sT @ zqGQQQ:ERL~ܸqN;#@ @ @.FÆ cѢE7|stԩ1! @ @ PgoVXʕN:d* @J@=}äIҸ?xԭ[D) @%C=}7rRUV\qѬY(,,̹ @ @l ([^o @ @ @`4hP?>{?K{lN &Iq /0C*U, @ @w3gFy_r{\ @ @ @֍ܹsOɓ' &tMѩSuU @K %˗O @be˖رcw1cƌLw}ڵkj*ʗ/s  @ @@Plβ$@ @ @* ̙3'-{mżyr9"uwBT ).߼yx')իWd} @ @ @`} |'QvH~&GFGrʭЬO @ @CŋYgÆ V g @@RN{,F?u @ @` $E}۷oK9+q饗F۶mRJ9ל @ @n~K+; @ @{7|s}?d$S7k,vj5 @㎋3fS%_d2dHqvj @ @ @b;wnva1stރ:(&OUT)uLF @ @@=gϞY'xb5*6pìO @+ $6mM_v+&@ @(OG>}g͉b뭷K.$:ty' @ @+o}meF @ @ L6-n;vl,]4_bhݺu\ve.d @8fϞ 6toy7.֭[ӛ @ @ c{.3^-آ0 @ @ {o}ٱx4<0}r-3!Q @ M4I&%SZ_ @ ɳ#}I&ܴfENcǎQzkN @ @Jb  @ @V*M *&E~/xTZ5`sα6۬xI/5/"7MnV, @ @@jc̘1g;Sq-a @ @ @ y8c޼yi&;C{  @%`hڴiVw 7L԰aõy  @ @` O\sM-ydQZ8¿5jX' @ @@)PR!@ @ @/ |1tиwZf͸ sΉի\sBK`ԩѸqo)wxb*%C @ @M teРA|UV)S_l @ @(3gΌFŇ~&<QGU: @.+T#F-ZZ&$@ @_/oǵ^F%KdV\9ڶm\rIY @ @@ (  @ @ y 80n/s>ѹs8ӢbŊ9ל @x'iӦOdӢcFjՊss @ @ @b۷o\y\F'N &!@ @ @Jg}7^{-M.|aРAqYgdeD @@,Z(8=zt:_aaa/De~ @ @@ |qСCc…˗-[e]~ @ @P7_C @ @ @'^0`@w}9_L'P_r%q1:  @@q <ѬYQC=*U MuXXB>ʄ$eBYRTB)dɾ=e# ٳ,e}"[Yz*ENPa{n̽;|~={< B@@@@@'ӧO֭[ Yfo}@@@@@HW^_]-[|sVϞ=ݦ A@@HR.\qɘ1cٳnmTWj׮6 @@@@ o`N@@@@V2yd?~;vmlٲI۶msΒ7o^eL  Oo|ax 1cNڟe     K`ӦMRfM~ҥ[G)!     @4itA"""'dٲe/_I#  @WZ7ߔ'k0D@@kdԩ2rH9z[KK*e~kܸ1d@@@@~C@@@@@hv)cǎ9s8;6(QtI5k&2ef3D@ Q~yʕ+5j$saD      qضmTZU.^hnڤIw@@@@@@S`͚5ҰaCyҥKL2!  &O,ڵ;wkժ%ϗ`3@@@ i DDDHXX 6LvָѣjJ2dඌ @@@@'@ߤ"@@@@@ Z۷o˲e$ׯw[7UTK/IΝFn˘@@ 8 +VsΙS,\PҦMXM8     Z`Rre9}vd~׎ +"     7{/,2Wɘ1̞=[իm#  @ ИܦM͛7M'xBVX!>` @@@4 :tsk< ;v:H9ܖ1    tHt^ Z    D+KO:U&N(Gu[7k֬Һuk"E-c@8s挙H/_\ҧOX     JRR%9v옹7!CXmJ      @LgϞ5nڴ\5((Hc^zŴ)@@@ lذqyS`fߒ%KPN@@\7dYrId̘?[nⶌ @@@@{/@{@@@@@ ZN>3/%<#0`DFFR,ZHr]/]Tk3-  ӧ_-[&.ݻwH@@@ǎѣG˔)Sʕ+n+TVMz)/|&@@@@_do@@@@@ٹBXX\vm=TuҶm[)\2&@Ǐ:Ȓ%l޼YJ,y@@@@@"p ydÆ k,X0ʺ@@@@@@|-`iѢ\~uHHh޸)_\|Y6n(<󌯛@@@ w%ҪU+$]t,   &pc_{LۤII62&@@@@GdQ@@@@@w޼yf Ֆ-[WJi߾ԯ_@(:@H ?T\Y%((H-Z$K M       DDDa/_ܜ3gNbŊ      O#[}Ȑ!Cjsi     @2*|&wܑMJXXvrn:)SL      @B4ѯ&ĿZRJ%޽{{ݵ'_,^mAI1  O`ҢE ~yry1>3d9#@@@ }%KȈ#w;{ф;w -c@@@@?$+{E@@@@< \pA̙#SL۷GYG;n߾1c(˙ @Rh۶L4lVժUeՒ:uLڃ     ڵk'Փ^x!g2}tsOV\)>l      nܸ![0箛6m*'Oa/޳6ݱc-Z42f   @غuԯ__=jXڴieҡCu    6ol&]thLUҤI# 4ݻKٲe @@@@ @_?K@@@@@U@[~L:UK\Kpp4nX4Ybr\1 @ľ5k4ۘ5kVٹs(P I!    CXb,_\Wj߾|gҥJj׮mY @@@@@G}$ pvSOŋ%O5j̚5K_PJ3+"AAAn˘@@@@H~n@@@@@'N?\M&{u*T mڴ1j_  $pM3‘#GfϘ1C7oH@[@@@@@PUV}Xmzƌ믿$ҭ[7=z& ?ԫW/MX     $&m֬\rL.v튱w^ɑ#G  $ aq%{&jժU8A@@@)}Κ5KF-wv?Ծ}{رΝm    q o@@@@"?ʌ3d޼yra?oG꫒.]:L  hOEAw~3Ν;nf-?  /pAiԨl۶y2o?^*    @+Wȑ#eڵn'>}z]v%K-c@@@@ $k"    nǏYf̙3e߾}nt`ҪU+iݺ9ef  ݻwQFٳ ><@τf#    Ç%44T"""<67;'y'#F^z9ם0ak9      å}2mڴx5sݺuRjxmF   7o49RV 9sHŊY @@@͓ͤ[n]5jՒ eL    D/@}X     \zU-Zd&"##ݖgʔIׯ/-Z0;CH*r&@tK.I˒9sf9vd˖-O+ٷ6OD@_^6  x뭷dʔFO^@IDAT)>G~zosuG-]tqN3     ʕ+vQbbEΝ;%}Yu@@@  ̟?_~mxyVSHE)#Gdڵ`  @HHTV-ZLS[ɓ2vX4i\pŊw}W7o.3ft[    gzva.     s̙3$yW\q.ӑ y%88m9 $'#GJ=S޽_r:d{.{%J$@@'Pxqٽ{w6f+@@Q@; [nx,YȥK 2Df@@@@@CIrtk"AeE@@d"pQi֬lܸyF*T3fb9g2b.\( 6Lω# (РAY`A 66'իWe2f9xѳg.m۶:H|ܖ1    .})@@@@@K`֭f2 J͠%DE5;;Ў׭[g&%ѯ@ L2<ԩSK׮]ir^     IH`JMD{D      @ hKP_=Ç˞={i+  HPB~zO4iҘ{tfH   $5L2Iǎe߾}dyM< 2DBBB_Oe     7׹n    `ܹsͺ(ٲeƍ}+Ve93@HwG}<Ś5kʪU&sJ(aSJe˖8@@ tI_.ŋ>@@,p1yc:Y֭[H",      @@h}V}~|Æ @@<Q7o.}h<2}t3S-… aÆ5j$;NA@Hz.\={ kР,X 5*GyIxx[O.]H%M4n˘@@@@RWsG@@@@Sɓ_ ~(*ҥ_|Q6m*uԑGY E9OI&qFK 44T|j4E@@d>);C@@Os_mŋZjwIB:v     V`>K-۴iL2Ez-6!  @}zw}Q3}!      XW~p{e   82d?X֯_/!!!fï]&FŊeǎs2@@@ y>@4fgڴiRT)t^>}̾۶m+vr.c@@@H$M:    @ x̚5K^yɝ;iF֭['wq)SFFi>t߹@Rm/T4%[p     BΚD@@@@WL6'?pT^]N>@@@@@@azzܭ۾͛'Vr  L`;vl޼Y}Q!""B "%JKL@@HUV%KK.%KĚ5kDq 1cƈHA@@@R@r'    }L[`|7r('?~iذ_eFY @p\r/d*ˍ7p"  "R툇  @ :tLܿVǎGnw,C@@@^_%@@@@@@4@dҥ2hkҨQ#X p Ƽck׮lڋ  @|?f !  ӦMyv)?]V@@@@@)-[6s.]v>w\3={Gϛ>|X>6l  )N ]t{I&MD5^4X|U=wޒ)Sg d͚@@D/> 3gN:رcu+Wȧ~*ƍ5kJΝVZQ    h?    \3gΘ<˒+W.i֬,[Ln޼Dd&l޼Y;&<<b@ DFF:W~s%:'3l@@@@@ vחm߶mّ/ɾ@@@@@@_ S5jTT)y\~mѣ,Y\e˖-RreyWN>}S@bdʕ8-@@ |ҵk{@fj^X¼wfsW\1AiRիI;dԩpVE@@@@Z    8"##~޽{Khh,YR %ѯh?;vLƌ#<&@|#)S&y̝m߾]Ν;@@@@@8yL<'H&Md۶mj*D      H&ԪUKfΜ)̟?_֭+ӧSˉ' +#  @xeŲvZ)U-[fNnZ?   @H*h"իWݻwޑ`'~W)RD "gΜq.c@@@4Pډ   ?\7ozFDQ:|zqi:(HwBFb:}ZK'Uvּi!>@׮]5kֈXBN:qe˚nկ__4/@OzsN{N,]TZjxH     @ gY.\[\1nի۟QTC>1ff,=d&)6Lnܸ&eȐAZl)={틍@@@@@@,E6lh֋/ʢE$,,L֯_o;7).]Ν;DYܷnݍهbum+cu=ۊnu?..Cwgt{.cS@@HJժUm۶Ɍ371=}t;wҷo_yRi    @" /^\ƍg&G?vO>iܸtAʗ/H-0    @H0?F@@KjGIL_\=-@ľJ, x_W>ϚNbE}ܚ}P@ 8qB/_n&]vNSUT1֭[W (r8s@@?6[C#    @@ s*Ǐ9"rW:=x^&1NL ɒEdQ$OGBpaDzP0iҤxFwy>W\"     (5kViݺY4nB͟?L?z=/RN]*3Ӆ ~nӓ'OvI>}$w1   P Թsgԩ|7f+Va8sL+WL!@@@@ 704 @@d 46"/\ָ}˭yWAȚٟE;qf'v,k-GWL D.3֭[=;!^F 3+"9r3@@ q*W,O>;vŋnݺ    $q?ٵKd߾u~'"4^ u<]ڑ&}G u K^dFFq,哮]J۶m%X{.      T@5iL˗uy:K|DѣarLщqVڴh̩fThێX{ڟEj_ΜniZ5[V@@/Iz)o3_a>ˤIe=z'@@@ @q^0Çe„ 2uT9e˖-ҲeK޽iFڵk' 6    H^ ڂ  $1 <{6j{ZКaJ^$CGՀCրAoCO4Nu&ժAVnZi'Z5i:"BD6u譺.uK$<ܑ<\WE >u*{R:=y9sXU;}rߜ-kdڵl23)/ov_M[zu  $=^zI&M̆uQUftbBA@@@@R>{v0!";v8>Kעϖs s}zA]\kڴ"s+:N=Vg;v^]g=ÿpρ|yT)G} EBB׉ԟ)'Nͪu/nvٴiSI @@@@@@ 4nEsl\:r|iVjВQcQcw{V:lǥmui+Z}=S\γomehw뽷V7Uu\eZ~p[ɀާwk}kfVD@@6?}nݺIǍg}kҽ{w22    @ϸԪU+f T1n,[̬E5ui@@@@ x=   4ɻU;7I}WG {1k֬"ZdI5[&;Z 5@סV+Y]VzֶļMԎIws u\)$+F4udʕf#۳xsԨQÙA}Q@@ 4жTRFg/WeܹF>     @tڵb ٰAd׮IgOD yG^/KnbOmg,un;Up-a:?mZeE}V"*S][TӪ,G@@@@@$qjkr_MpϢ u5۪m[C+~ۊաγ5ѯ{bT͒Yo#k֬{7˻7u(IZ@5 VMWNKժk<&zVa/QNՊjB`Tu1B @@9R+cƌO?ߢ 4y֧~Zu&u֕:    @Ph5jL/ĩsx|U58A<|%s/_v$fiy~+-ȅh絮] Ѫy#zݺuzjYrS4Q*UVZfŋ{Zy  u֕aÆ9jЭiOD-;ȏ?o͛˻qjF&/FYI+3g,>hK6_P6n(]tqBe̘m^|'4|f>I@i֬Y6&`wlػwoiԨQ{2d,\й^)#ӝэlڴCebY}߸qC*Wl&e<6|31Dž8sh޼y`9?ڊ+Q~i]ay')+󇻾5hε/_u}\׮][õ3}gZ0`Pc|Ƶu# ]@}@Ȓ%"Fr}7O(1uomMEkF^nHߵo ˌ3} }[nҦMi۶їkLƹ#   @"  S@@@%kǕVľָ=䥉SS4)i͛7jy8g)N#)HHH'#@cf&Cתwxߟ羽M ;:nU}POr@xxP&/xMTH3&ՇZ}W~@@?H!}50j(ٵk̜9(^B/+mm߾mO=m_2k/U-ZHlj֭[o###ͤv%`k6XFb Lƶ{nZ3z$ױ-ֵ ;w9>a9c¢mo& ׯ,k׮&Hn0~נAIy0}uKưM&ZuFOS{wþ?_NkY׿IVDf4&^r^{Ќhbc MZ_fdt۾}C{~Νݶ@@񳦬Y#2oޟyQwgɔ)ևH+Z64kЎ5q٬aH!JPPvy꩎2p`'>5!     p4^Mtj_ͶmM[C}dy5dѪcS mmu4F[e犷uq[M\#&[C+{c> TtI˖-ͺxpOcW\i<7)4}t+WN~miܸ %#8HQt=&FĻ|o-gLk@9>u=O>_/z _3z t(v3GyDƌc4{l7nه.>#:tԩSG:t իW@@@ @@@ !A܇:O;oɘQ$~Mi9.4`/6#Sߋex?[ 5Q&}>g͛P5Ոu g~L}5Q5\w}ћ&a-f! @Jӧ̙S4m?VMn 'pD*OzMC O=jJƏ/ .4:1z҉؏-1CIBꎟx gf د=zl^;wDI(lÆ ngу]\63q[۲bŊI -| lذ;w.NǺyщÑbw˗jժ/x8zY)1eϞ]zu9Æ Kǒ5kV[,ߍY믿ysݦ^z2qDo;7oMF{lqS TG|ykv go?Hv 0[P$,L{QO^֨!Fg"k;ωs#+;ng&[>#~8^@F8~$5kspy[l]tFI֭RJ%b1yoܘ8X!oNji>1F1 ruwcUHxcmgۗ1?{ c|aߏ/EkF۵kGm۶5ƍͤ_~ܺuꫯ7Ie˖%K;b    #% @@@ &w3v2w{R_ ֊Oy…E48K '%o|T%x5R~SDF 9rĽ^yk `u|㾎zj++ &.^\QgW\Jj_|G XfWjj%ȸhJ*%?8SJ{pC PM6wFÒ A2j()P=lNl#ƗBChLU6Д,YZmh@$ō/;hZN>5oښmh?/fm:?UTqJݾX0멟u<t^g|k̸{cۆc۶mnw};wny1MT^=U\_~ev1};}nbk}Iw]vs&l7'㑃Fk5K񔀹SNSO=ev_ցkC 0@nܸiG__뚌8o޼oBWgWoMC[Ѱ?u M(SxV4;41y 4?0?~3Uӧ5Rf70 I 4slWܘ8ô] o<'Excmgc0ҁsl /EkFߵkG*W,Z_I&oFGO6m*:to9Y   q oX@@WWZ}uAF_q*VZ Wǵfݱ2$SMk%XIjRqMEV"`NmuukM"h5 \G_MPAӧw[x |ҽ{w#h2W}惏}e|V\ry]  @5dǎҲeK#7&… 믿={Jn$3=$ 駟6r}C:k>,bO"XfMYxs(EO>)Sߗ bn^ l#_t{ '{գFA;wt=$`KfzZ4&䌩h2uy]J4uP];UЀ@(?D4uԩF^Q{~[>SI+Vp#`Ү];3ftŚe&L1c9f[j6ǥ!CHzN4_ҥK.r_+l|wD|\=[cε MX㿵-c@@ d4:yxpL\hhƗIѪQFnR%b#n̟% ~=;X9Nk_z~:U;Pc@75{IZѵ#@#ٗ94~x_Mq#rĉfվ64oE-     o|@@Z@Aw718WNKUZC%k#wZ\u4ѣ w `wj0*JR#GY]j~=j 5 ,h]&Y%s&eԞ=`y ~=%`@@>(VӧK=D/A?1jR;J֬Y0r쁧 TtiwHPԩ-[Hr7&nldpɠ\<MHi?rNY~_}=dRT4Hε-v\Z:>x/o޼)-Zpvh's̑4i|q˔)#+W^3r„ o>"fK>ͣ;֐[+ES4aӋFƬ zLjm}tC{w#c'tB~0\+T`&wM@k?6ٗ=jos!gQsOEdkb-YdK.9W+QO9#d𕗯ck  6;ȷF_Ҳ~wʨ˙UVr@U+G5ʬY"3f8|נA"C4l(ҫHQv @@@@@H?1B̺{3gvt,q$աxlqk#ssTO2I65[Î5~bԭ4fJl<V4GĈ14:IQF ƶh9r,ZHMfb|~sRzuiРԫWĿclq_1VL"n̟"+&3O =/z&xc=>c1/nX׎?^f^{磽L#@^uqR9sX}lܸQjrzKڶm+AX@@@0<@    LxMziiq& %a3QMtOpe CCEsI  p/4 no~ilٻ}ퟃy~ݽ̠OM KrtC>;HcW\,nr;m 68n߾=J2 iKjFQ@@ 221ĉ#={V/Æ 352>_))Fp3F_(ZGq… bViȑC4JB |Վ{p39}9ueߟ::uY{pa__s #<6G^sJj!&IW0\:yd~} V4*F ]˒%KbLkyL@IDATd$^22/ES}uќVٯ>c4Q;c$2\S4&ٶN:eZ4+"~9h+WM2E&2uTZ^/]΃ze7kwoa>  yI~wp0,͛o})SIY@1~so p԰0WwG6@@@@@W@7G&ժ]sҰZ5@.>3N?騚x8yF=z'Nx]1@@ 4W^fa|Y h55k̪OM55Gsl61{1{UoޡWLױ%G̱%ῡ㍵w f' ]^fhmg|#XZjأqo_E̪ :͛7,Y@@@~Kˉ!yIQ_ `@AD%z$ `L00bS("*p% *IA(Ag{j{vgvggf_}>S=]D@D@D@rEGN LfEn-UQ6krZ~j &SkM-$ٟVƍs8ƿF֭ݼ>ܚ1}'|Rd&VXU,3(te̅!͉d22cM:13f 1(I. 0{NܹUfkXT:QZ(ƩIN\zc=kLLOͱ:%݆IQt|S焌裏:Cӧz8Td%fǦJ@n0^X/IR(DjsZ'" "@=E0B9vĥUwq37POC;̝Rܟ i?nBI?jC07A?MH5=#B~8jԨę^o* &`ԨQ3f ֯_Tj͚5xgLaG#Mtb`(g @iWDEJy`P>}:o8+Pșv--?w;Wz&\E?Ϣ {5hР~a^uUeӏ?Xo}#ß. s qBRTi`>gΜj+n9тw?~j :+Vo*ּdjpuO\E[RN|Kvap*6ŐhK~ T^=cvLxpwu_(`n[|(0в:kyZw4H8G$>;3][o##G4LDF@˞<bE. CCߖ-aS.KZ)" "!_ϯԟfp 61=K'0vG6y}@f΃M׍;1ygJqD cyNƃf(游TtcQIOϧ޳Hoϻ(18WsQY(1`f游TQ( uIw㞍G;ӝ<{lws饗FJ" " " " " " " "7" " " " " N_a a^j˜R˃% O|0PJnZH}O>9d+W4ePf_-=; D'00i{&i hҷo_|'nS;am*?nj}is7ʴb qNLM>}SN6(P<%H/ӂ~ǻmסNcC7m% %P.pqn__~Gz5n11帖#t00oӆ A|> h4WrhjhET(fv 2vqB&N;N:$'oݺwżyb(M~:^~dw7n >4}cy渺ӌrr{/v -T_:j*L>qD|ᇱ"yͻb˜~ǸA Qu r_IRèQ7aʔ)q85~>,44?%ZKC+ZK4|Gt裏6ZO $6}Oþo$g]+'Z~wj#E1cDڶn:gA䘘snyEם $<{p͈@c޽a7k\ 4D*VB507`güw.02%" " " " " " " " " " G utzf6R5]CF3ڌZP3%2JݻC4:f\{YNiׂ}jڙ֮D@D@D@D4 PWa~ ~C'&x̯{뙙-uN~SO/SsTs.XTz@i `]&Ei֤9.wX15&lEʌ(LKlG^Yw%'P͈hi;{{26d>" " " "} Ad=yk4`"z5/s5 |Z+" " " " " " " " " " B`&WgC3FvL4)9>M77nLhjnhZ~{=Zqc6CWd<ݾGSSL PݻYjshD;Q%R̙Qlf+/רQ;L$:$b +D.&ږ##wKs\(6Coׂ01`ff}#NP݆0 OeIw#$"Ye'%JcO_a)OgL uעEBˣ8.s~>k\}]ֿ96g#Fp2 /X$J%+,7QN}#QXoaoQ19 :*6;n߯ێ8xY6vd.%?rR=܋Sl!qF_ _ tNs" >V G ظ6o n f\dJ>" " " " " " " " " " "=31Mcy$ sMvfvkK^ wH@qǹ;a0Rcf'N:|a`;zL @ %\Tg/}_AgӧO֭[{ 84nҤ 2?)J T5~ RIE7_JCcnͱAxQ.E7fݣƤSmc}#>Ea}3.|}dD@2{r-x0l0'ka >ɝ:uB>}p'1uD@D@D@D@D@D@D@rV-T!;q۶(an0^J" " "}{raMO<9f`io>cxSREsN:)fK o-" " " "P \ .p@f?(2e36mcm۶8P7yd'm0 իWG \~}x[Hmj/W?]Ff3gcL;ʁf͚ )sI4oןrJ׷k.p}T+O=TV6*MXtx߷z0˘:u*h*z1ҔϳsHvܸq&lWc={qSO#mkGy>”|dJw_gx''l%;w00D2iy6c:v㦛nµ^1cƘ2O:&yz![Kd¼6e'{M&o'uw(rC2M2f-; ԰aC؟ {u`wLfh>9G^<B Ն M=`0ؾ8НyD@D@D@D@D@D@D@D@D@D@D4pxﻙ::39aC:thk)@Zsr)WvMor3/hJnsID@D@D@$@駟dB MSl25}nܙMJf_7wPX56ɚ.zh:&oO*L7-u14Ǥޘc_x(5٤9Q7;Ea]3.|}dD@2ɼn1iN\rիٍRD@D@D@D@D@D@D@E@f¦D@D@D@D@D@H`z7aZ ;͛GtGT)ֈM~Ggfn[ C7b{}@h8ܿ?`@?0^4E^x]w)B<"8@_I\tJjժɦhs͘3g#t={6Ν%KѲ!MMRIG4rmQV-'WT:I^(ƍASJJVy% 9NHrʠ3d3u D249_a֭[8/uqaa^f *GPB8(?^zWl"o_|> _qނmtRoS4꾾xb]6}E.]eO?W&Bb]oV9Y}}y^ÚW_}< hm'#G%6}Oþo4'UvIE9OM5jzH7mNʾDC\/fڶmR H}},UF_T@tڏ>(51e,+˗n3ZУG'V%MB<&z5@s_1\ܺ`{)ȡo@n0f8H{fk7x=ρ?pK;{'G zşFKC#3gDq A\"@Qŝs˖-Xp!,X~g~@Ҝ~֠vQdŊNN;5k:f{4cu]a-ŵ̻ (2My?&sLڇF4 TSm6>۸-&M={[lS-@gƧc*' 3iӦsء؅Gg5ʫt#8zoMlI~묕F:ZX6sw[H3d8*D$SI{5W^yݠeСfQ^=M徑 T6\s5{b:|o+ϝ(b(~9o@#mgcL}3do3#:}Ǯ[\C,D=ZD@D@D@w N⣄ѣ Y|(W0 8,`2<~IJpjrupiaVD@D@223{yĶ1n ;Z'-]GD@D@D@252ryΜ9ocy%%oذ1 qpTJwwm7@/.{eN]ށ?24Ts.ݘu K#qY,qz/hQٚ(1:9N}!( uIw)a'">_~N1l0M'VNn֬W^`L)%& T{H  h^xEK4 b;h`PD% 7 =w+3Ӥ'lp)gˆ&6;oC=`@TMo}\n )i4Lڲe [f;vLЄ4/ >t4J4#hoKA+o=sN@{ 裏:}9(Emohk^-XgFUϮ]Fi3fŹ+n9qЊ /w~3z/^4fI%H7X_ { X:͉@80Jq&kLii0}9YGuH!vº'Eg.e1߀?+)~- / 2O46֩'ԟu^ n ~{2m>"k:w fƧzx≘Yp嗣8宸 x@2C >fi*" " " " "P[]ghhb%8d@q " " i%P*У)+77uv-S/hי+ZGl&PT$" " " "q(T{}|a֏\\M_/s/lt͚5Xk~& s敿kBLIui9& w yy|1TaJV~wkM ߨ:g.%TubozX)JVf_ =Xb)k~ 4+.ymאO¾GÇ7pގ}\09yM}m.a9s6V_y1AWdryygk?{5k6mژ f pD@D@D@D *u#ΨrE @ݺ'] ?Я̳]`}$" " " " " " " " " " 0å`@⥗% > %l,k˖-Np6$0YcT2l@Co?߿;wnSd+[dXD9Bt2/\0a{)\H8 ~Qn(Nd}~`ܟ&HE{K.E5* lSovr]{iٲelQrP͟vebyq6޽U)'|;}%kcq7춄lsq OQV-'hƋ/^H7 vS1K?V_kk  OX}9o<'SHD,z*z,u>#" " " 4=$`8qIJ"N{#F{ u{1鬋%" " " " " " " " " "0aga7lGF0/#GkD@D@D,0Ìqn|b୷_>d3>}' tPY"jw}w'n:ai GSիWǦ.SLl7r0\$[>>S(٢1*"q>}iYk.j154E}69N}(%Ua3QrX~Ib^ ω23u7uzꁙm]wE52D *4>묳<}t7$>̌5seᢋ.B:u@C< |7z4v&7 ̨j!" " h҄`̞Ș}g0OlJ7k,DRJ%.KdWì1Ź=a\QndoۼL6w&fb :H,/~F= 9Tx6w?evq@;%~gq7͚5ۧ$ vɈKrl9ƪ49r$ƏŠStCA|SZ8ѫLc XW`WoPv_g~駸S3n X`1mڴXm3RTH)J4E'b(*-X|An{.hFsdyM̃ʕ+(ֵ8T [8ܲeKԳ𨞼~?C'(Ev ;ﵩާSuzX*fW;0E7ovĩMم bɒ%Kl^W|M'La~`*J" " " "P|lӳgѯ7:w.I:VJF` W& w  喒E@D@D@D@D@D@D@D@D@D@rO= 3`;6N?g84FD@D@r@UWx9ƿc~qnn 8lÎ&@*T'إN\jӦMf&s_sW\ac3a'[c#Jtt:ôKSYo4ǁX"]ޘa]cJKYRt7bPQ)>w)ۯV1ܪUp;ˇz2o9o>hţOƿywmIͲ?a%g+WX^w=ߚ5kתU [`qJ" Ɖxq:qu`q73ַo_k.ⵯ@ 7u:$? X.fwp9P&ݺus]wMk`ԨÚ5kmmO;N3;fF s_[~xhwW;N2g&n8.xf y;5j !J" " "  `<5#_ra6N 07@IDAT_vX1NCD@D@D@D 0AzZ~SNgJ9Nnw4Q؟oq˓8X+qq{TɏRoEu) f2KSsF2OTD]ʅcƳݻwlٲy1Bqf,W,Fnwh"gdlٲ%Os VJ41bD&6btI_?_aۭ_ Q^mQ7 4< XA#<uyU6ͻ8;2) omgq|hѢ4.gMD?1}Dʣ&osϾ;@Ѱ$K|sϹ{W +di`h|14iÆǦ:@fC6f섫Ջz̬j%" " JfM1P/FFdIhܼ9Чpy$(djm RT1<Q6QPX'qٯ4QʌRoDuRcuTzV=ϰKp}$vqG0(7DDzm[f Cٛ&3/^Cxa 20R!;裏vG}O=V^05w޸̳r#njРAᣆ@oBHw!C?/oL~}6PJ6-e7a`' { 5jdwT{ l2FժU-/8%/YrcX{~,R*lƾ`U`o팑#saÀw+kr F_~D@D@D@D@D,CM:(e4ks _vO2ſ^@J{ yyy@֟9}7WR5E?;SH@*=bL/ĸq}5$L6cB}활6i uX5i\{SO`gE|jFͫ͝7U 4/_SNl,Qv뭷ƖҼ}L+fI!C&7LyNQ^!ݖ0gΜ )Q~1/(R2S5g5ҟU_מlF|vMʕ+]:V1/)d>|8z- yt!U<_D@D@D 0ppmnO 8 G%j|U0OaƇg L4m[TkD@D@D@D@D@D@D@D@D@D@ '!e|0\3l1.|!PѼmݜ\/o8Oۙ$uoF-[`ɒ%N.l?zo̸+aQ-.ږ^n'Vѣ1l0xIcС8зo_uQqq#[[MD@D@D@D@D@D@D:+N" " " " " YO& ,_&?`<#о}7 ?<×5r2wرP00$3Z͛^z .TZ5,H%n9G}ƍ`6lkM+Ngobͥ?뮸 ~.]Z`:Oh3Ȱ@2dȯ2.>4gN,-g̘ᘓk;w;aUQ8jԨG|&y4|'㮕=ssx%P縼~7ix 8ddt0,y-'>3*UW;^ކ0va7:G1=>F$?)Suֱ60uNUj`={^wޠ͋׉J*Z:0z7Z!^;;w-b@yT1>/̿[Y̘_T'LE߁_ßO*x_o3n~ AcSa͸B" " " " " " " " " " !cՃ01| {Wn4lvu;CMQfvG駟ډm ߏck*cZ׉P0 if:Cc `fW^]a` /nflu&@)JslktЍEzc8ZyQY(1Qj0Wiz{= Wv( eaQ|rH>JAzT͂;?S;X˗/̓ {̸9|y1ɘo,{4(%xi#qҌIܸqclj}x5J" " " " " " " @lctގ,M?8/﨣良Vwyy+V%j@6e-{Nc O1#17yìTmذa`J4g"1%S$ka6y1K3┬jBP>|xRm YǎcǙQqndfx㍸2VZన$Ձx #W1To}m3&M;Oj[yFr:s Zry6>N6}Oz%ZNMa7fqMmԨQ;>lF $~}9Zx֭[C Of6k.nw^a'6'Javڱ{أz6#.-7/"}}D@D@D@-[wyUjԢP1'|g+E}ۼy8_,6mk2hkӋA`<[70dm.flDg2 X?} Qh{TӡӎsfvT_}|8tPﴁ=owzlEzYtiwJOK⋼W_}5cRc׹s?1R۩No>G}tW\&ac <8~c_IV6N,&P\_Ԙ,Lm:m޼9jVU??O v?wǕQJ\uUqZ}v`?#w@ cuNQjVV Ǐ1L|p1QsI4iHFX{ gy\s)\g|f7;J&qK[`~}jde(v%_d rNe6੤VZs_wu 4mРyhx@%IaݮCX܏;8<Gg@CcH~a^;vt-ĭ Xˮ :&-(H*Pp0{G@rgչ瞋lK4ဒC=1g?]veP(,=; ϗ_W}O6 &MJـ'2]~cpQGV^݊UU3w܀ ^ztf'f$9 v1Wԩˍ5r -P_7_9}aٲe8)쒖S'`ˣEI 袋sf,oÆ 3%/֧:M63պD?~gj^jԨ={W^D;'{۶m눶دRʕΛop@.ul_@Wm 0Ky6;Fam+6{]+-, 4c 0[De=2]c6׽r)l^1σEݮki/~~6m-[8ϽO>dgyiCY힃G9,= 3Š+_noߎ#@|[ bL 69Sɳxۈ}aeUfqTuٯRr0c!3 ͛Vk?j#Z0n4ap/-6ljĿs_Ǹ0E7)au*?Q {?-ZՀ?&l140@8K7VyR!dOP4F}~ޘL9άޘNq[l_cDFqaAoDg}2R.]l4/2'Ҳ3^5L- /\|m'jfTՈadD&?aÆ%yhFݻ7(r_E,_%|]wΠc¬0w;XK4?ۉ'FQjQ)*.GycsqxW1rȸj͝;^x=nC-L0_}h$㦛n!CU;#/[gPpym٫uzk\`4ܦJ (;*DtJw}Ǎf,a>/7˜AnuvH5k"Q$/gQ&*NdU2>(I\n]`%{PHe_g.b'64V0b&z#K9 ׫Wׯ>+V,uQsCuZf͜9ө7t3Mx)@M&Q|=o<ҥKR^v^6lH3kcIpz̖$(wڵkOQyWڥ0zZzQDG_~&͟p x7R|B3nyIT]D@D@D@JnۼϪQO"Ɯlذoy73`jժyN6m};f;N  UD@D@D@D@D@D@D@D@D@DlXF<X6xk'|&ŝ S3TSv|^:m#*6٬3|T̽sP{ݿo16;[Nf&w{3s?ø+cРw1V(i{I+Ǜ8*\~s|&@ ڱ"%Q fϔ?&4ǙiuQ]clrak0Qs\ͳ_ؾͬߥ\>l,T<@'jժ/cjϟUo?'UR1/s-вeK'Ɔ?ͧ@&M0|p'O?f\&~Όr734J" " " " " " " o泄e^U#1s1T{tFܣGPjC_OJ*DB E_Zenݺϵyxm۶EϞ=<L୷]fhM) ɰYg*͜93vHsA^bJc26"r \lc0sj.zK^|1.3Zw8"!Pp45/UZ\iSv&~oUժUA&ꯃ~s>Ԋ {)QEmP; 0V7un6`3@84,rm.l.&ڵk]v?;Xuܹyn۶-n7bԩNo`4烌fG=LcJ<ߥ\s51r?#܌Km?cRvWcǎiN"" " " " " " e@HQD@D@D@D@r0@511`0m~[_wM&… ֥caqi޼9N9唸u-}N0ɔmr zj;UWE$Ӂ We<8|mۡCfLì؟_~FA~> A8h.6}W%&֟h́+^i0?[&{˜I?ievU;@.]g^y?0|oQS2F3 Kw͠RO*S1bʗ/wٳKkaȐ!u괝w}`b۲ D" " " " " " " " " " ]>5̘oc'7)f8SUZ`|YidV;KޗgϞެ1S&pѣc|&V2n!Uզ &P.S_&d<8P`Ѣ &" " " " " " " " " )S8\tE0vXy=Ϙ1/"n7.YVZe|[YoժUq!.O<?Rv- Зqyg [reH}7ЩS'oó>Ϧ$uEэ$" " " " "?Xح?nUι{FcT;4sL%oUSN;_~rJ;+c8֮] j]6Ũ3dv8pQkܹ8q"; e8Oy8㌸e{amm۶/cy'<#`?'N ;OꫯbV^ݩc7-k&s 0qB  ^! ruWD@D@D@D@D@D@D  1O=Ȫv:NscN}jLI&^~ދ*^D@D@D  &`[35*E=>80GRir,͔)SLGK.^rr?Y`rjˁSN3qGZjAfvv|if L/ m6>-S+8]vw OڴiW˩S-ѬY3/_>n]EhyoxFf_P[l;0J+]veu]c瘛*3 \ۺ'pMsj0!qof|j@"|YioeV;SKg[={64zho=z;[N4pW볇AԂ{aL ygA5ԭ[z 7ǜ9sX&L lذ <'tv}w4lм=4{]&˭P5krtlҥu 7SF88x7vcAF_uX5C@@@@S略m%v3ϔOʖMNXluVcbb)N>_+ߥ}5jom Wwq6lؠ?[gt90L>ͨlgKH! $`B6LO;)   x&;F(YN=Toy3/K6;o<[ο{]rlzrʩystP1,dOYfyM0A`7@M6nu%͸(@@@r&@ߜq4  y&`o/`w1cHgi\hǎ.8E{l'"- .tG*THs1r {]R%/ͿO> /PguVmd5ꞕkھq?dCe+O?La|`9FZ_@ZKlSV>gsƍCVJ/\ !w+}v8QG2% No7_3WΓK,[C4)Am@@@HA <@RTÆ [\ e[4 dMɷbw䛏 6_:.ulx#>-}g}z̘1C-A^O.dVKKx}'7    $%sϕ6ob'rmىnan>Xܬ{I$Yu8m~1V;冀3D'}0޷oW+e˖Iw>kZf:8ϕq^Mh=?pTԳ/-~ԡC"!  /@gGTC>nVȊlϕl˒Z`{ꫯsNf,wz-oŊhBgq^"E3uZjy_#FZ̿?>t֭ "ʔ)p    .P0G@@Hݥ5k|͹&` Ӵk_vNp-d)mݺ5iӦMڶmrRJ,g,ĉ]T\9V>̿K_sY@v|VB.5{eʕ+|r7gXl&?\VbZy?8 &2N@V^?m5-lXҶmE/Gi~Cb!fl_ /H?եb     @ '{vnN +?״Tz5) ]7mT޽Sm#ƠRB7ȱr9ҿ֝D _fLf0@@@@@ nj]~v nhػݘf󏼎ͺd6Ӷ痍.X{o5:u_FK.w}iӦuQ  ,g4kp3k$ۢ'}kƌm)RrPP@@@@@(PjUuAFҜ9se/ѣվ}{UX16|CzIm,e{Ղ Y\t۷-[GSN9%p. ƫQ?o    @@x%i _]O:Iw<Ғ~w^[Ԓ%KdS-[tsΚ?|4?xI~-}ݧu뺠+uz<(VFs+h=Ok`$'p (f/FP:Jx I5~;w 92<ٯڠYs[or6mڄ,Vw+w֬YtEB~-`MHnQr?t!j    dGO>Cǎ{9'  @l |iJ\w-)o xo~ڳgOȡS-BǂzGzqQui|>裐DlbJugujժ;찼~B\ر73x@oHy!Cyql_| ƍ'Di   9(9@@/o4x:oO?-+%{L/RD /yn^T@LޡTR:We:_LttM_bEنKjȐ!z'&mRrkG˽]vO7hͩ[bY)rŊKkxbl%.Y#R`Ta~}ʕ+ ) _~6l8Kv0al^8rp?6LڲE-q*    D,py繤g\UzuVe+# Ĭ矧T-)c|.jeJߣ]FKV_>-ժUSn42'uxOUYw)"sO߄yki    ĹYCaa&ŒyъsDG^jG~hU!6~^z߱xO mOmל2eJҕ+WN3:CL^? |/F=+'|a/H~(͘!.@@@@@\Wl޽wVO?Z_5pM6_&[Yn]/j1/^l,(t̙^R_fN;4:s-h=EYw kܸkw!pKln%~WߛdT,={Mb[vrhCm 7F~M+m۶!~yo0B |  +|nci [jO>VN:@@@@@ ,fgϞ>}7fytwNS"Eյد3gz+[k3g؏*TaÆi͚5z'eIoի'x"nưןW@@@r"@ߜq,  Q8p@=w5N9}@mIp% nݺ`?ϟ;CFk=ԫW/kރǫ\r̪UCˏhgDm۶`x*6mJU2eʤZ+1 M}i:<ٯgÆ i.[,1ŋCM/ٯ}GO:餐}ld!n.0a9S60    $)" bA{M@Xַv- I\s5 %}W~ӈ#dIc 4( _bUsNq>WNI@@@@@-u~ҨtQ>@4cszXmU2i[Kc1V;K}K3?fT%RC@@@@[B OСC5w\/n7۳d/.ET*پv ލ4-Ꙛ/&MZ|7Ƶ{=h˖-m    ) @@8A-Js- %y-\p`m g}V?pȵ{~!buڠ?9䐐jgY tÇzhA֬YXoxi`6{@^lUq?ޞ=6ـ%F@ؽ[ڳWҥc,Һ~ƍ5~(O^xWu\נA{*رC?!="Cv;v%p&\5     Ā@p İ@Ncci qXx.U\O}=dk3,q@. NF.     䒀kg?X'O_,K /voJ]v8q"@鼶lRfҷ~.]:QFVZf͚tj@@@WdQs@@$(T({3@VD@E 6,3vZH5׮]+kG,s9!/B;w lk޼ʔ)XnO?4'pBr",']hQD :[XNJrZ7eʔ]=ddi% y8&.     @^ 4n8p A@|-[&ڟr):3;m޼YOOߥH<ÍD}! skqN@@@@@(W.RK^wyG={ svϞ=9swN6lS_~Q^dZǍ#/Pua״iӴk׮>̤Ԯ][=7]*s|guGSNRb@@@8 oqT@@ 9=TZ{ʾ}tҁZ"ϻ+3?CH-x8!r^lYzꩁZh=ٯ%iJ*s Y [VB믇,/lݺUq$ugokxޖ-[j„ NÆ _~ 6c!ͳϕ΍Wݩ-     ]bŊ^z?svOq   K}lͤzzYgO<13qr!'RLv     -p1AGݖd}Nbc(b5N>KߥH<ÍD}!)gm8e9@@@@@l6mѣGkժU1^-YmZ3fP.]t+ЬYdNSBT_WU|yo_V#7\:@@@@#ћEU@@S];_7mKH2n뮻.z'OֲeBE{?СCoE|){Oi$9 C 9u?CZ+hu~ׯXy晩>w={T"EbY%1>B{Ge }+=矐sNȲN:ܹ{3f>u-_ ζ_\ڴi [FCw/ӦT|@@@@@]׸۷k˖-PZ @ _V_hO_j>dȐm ]ĂH@@@@@ nUߍˬ?ۦ$Ms3[PjK'Z}!V;VKL<}zgwG[TZtE 4H~>[Y兜݁gKxiX_~OkΝ!Udღ {U|r/Ao*aq]f͚q!nVM: :u jJ:XUOnE]裏>hm~K.-ܹsuT޽{`w x\@@bNU+5\%  @D#:(;?Zvʖ-ūqj@/#/v֭jȯ.}> Z.Mi})     !p5һrRQ/j@Nb?kֶ-E#(q IXX.e훗yu3șO>Y:tʕ8@gJeʔ&Pw@@ fvub$'(,Y9s4eo͛7{ 7nƠq5jt饗B Ĕa[K,oY7pO}F%W;M6aüv3<@@@1R  4o.gH.\RJTTIW_}{@^x :TGqD`]Z3+VPǎڔ%JK8}ꖕRJ7.!_~.Y_5kSNgfs^'<H.]uPϗSNQӦM-… ꫯjyKڵUNU[d{Xbgs=ӋC.7Kۭ0w25c@@=l   իWƂ;23  8+ϟ~?!/hiI  `k׮/v~C?g%     @< \p\lxsIݺsٍ󏼊ՎFݳIɮ{4㴭 ѲIX쾧2Ϭ3ǚȎ'd,oҭ)XP4(ي $}'z3i   jѢ7٘Θ1Í'PԞ=dm=\]uUj׮ *1{=zgȑ#q 3uia   @L R$*  OfͤkN:tbE`^ݽ{zU׻['N̰[lfS-pݺu[{nM6͛)h=D5jZlUCfr˘裏-YR38#HWD?>jԬYp1do^`wZK[eHϬWvnFf׹ժULO7EW٣ɓ'{]fh:d6m/f:o6 mY_K>Y#sOk_E.ҳ\]  @^ n:L@@AcTV-P_50  $@)3G1e9B^DOKFҥ +Wf[n;WuJh u2 /X{]l?ύKp@@@@@ al#5хꤓ Ѱ GGcY| nV;Z6m>켧2Ϭ3\)&1l[7u.5jz?   `cYJ@@(SL\ @DtڷoML_t>/;Ɩ~WUzuuw7mU$Nw2syIWXfٲ;8m&F@@Hp&L@@C䓥~ѣuK.K)|]:wtҤI^|*䢏ۗkY#GzAY>8ȉ{zA-[TѢEeYuȹշo_-[6'#6m%֭vQ lهz(}-[o_]'oq?d*W=p7|3dW_~W,͑sBA@@ &pDA@@ 칔l߾?+ $@fR?!o =p@+t_IKW,9DЯYn^7J?Hk}-Z$[^/Z5YF@@@@Qଳ޽GgK.UI:$f87՞`$F>ⴭߥ)3<Í".,%;bC<8  @ X6    ~mZ~'/=[<{oםwީvyInvmd/E5\+{/6P+ D4i\@@@ 0:@@ Jꫩ i!6(&%wJ*r名i, 4H lyXg4JƍO?7.]Z#FЊ+ԣGL93=I;;/qHȪHCoEdłKR_'Y2_-﫯5kxc%ѯ=DύcǎϽ ^SyM:%IOK(!8,ݟٱ 6رc5jԨ9,tV ?J^]L~UioG_]65@@@@H6*vJ^@FukdhOȄ2#Ug`\1 8f\ww΋ܨ6Ŕ)SԷo_5o\֏SǏ¤׮Bȭ@@@@xA>U3ΐʔ( _ҙ G|"뤵=ڱѬ{srZ ^{܊ӶE&=x{}H54tPzՉh<ÍY}?獆ܼ枀ݺ |,YRz5{{L     /P~}oٵkꭷ\Hl~unذ! -1y-̒%?s:#g}wt'z60@@@X( 9+   ƍiIK iKqlM.۷R2Ldt˕+bŊVZd{:h.ZHK̗tsUVCmҤITg㏵~z*T%ӑGuu8I^-j%7PM\#70oⴏ  ėup>製J_}F5o޼4 -c=V'|W)/rت AbHDҥKHʺ,|[n.^8d[6r+Cu-΋ +0h4rd'7r+:k+_}%pBױ~, ,+-[9<7E      OE uJ͚r-K[_ V;=#{<Í$^ksԵ꫾|R" d.0}t]|ގ]tq1wΞ={4qD}.#W \v#FVZռ"   Sn.  @j֔>D:߹fΔN@@HXCM ?}K4,ƌ&_ڲ ksi@@Ȧ@ժK;KwR_zI9 Z`رcد_?#jă֭ALѨQҀP{  O }'A[`Ŋ{2}%p'6"I"p7k1cT@rUkd)WM:\'C /_ٳg襗~]Ƈȫ1"r_q     ee>nQzqj&L|b@ N;ijDSݠR)C@ ~2d @B XeT,9G.lCr,{h5mڴ @ ԨQ'e|ܸqZ`Wэ7jĈ]~q}ׯ{׻ݻwYͦMdX'ꦛn~+SL֌K!  $~ݧ  q-Pr夻v%|5' 7#. %Kpf)7dx-W/i:BŊ[Jfڎ   Te˖ԩS`@ ͛i.]Ȃ]( S~wx[+g@Sओm3+',0xT/:8W4VZ*X`\"     Pcľ^+K-[&IW^)%zh"6 @4ӎ*D rҖ-)u|P{c s  @@E7%[ $믿f)Hͦ- ۶m#o /T $W\q7}z/k޽Ok„ .  )Ep7gϞ=zƌ۷kǎnݳ4x`p *Zh2Sv@@@<`<@  DKұJ#GJ+s^@05k/\@6mモHg@@@@H os $w:0-Ԉrڙh%KT]iw@ryh\uڿׁ "     Х{rP:묔#Fs=%]f =.>n:Yh7   @RE\N  @^ X{.]뮓~IZL"iS-F\ bInݺ`T'@< -=U7Nut$7TJ`3     A;v,/^<0  ğ={dɒ@B_r_K~^SH;K矟^lA nvIR~eTtM`@@@@@ Zj^6_޽ڵ5H# Kc&'ǃ#"@v čKw)͜ZSNc^5i%@@@@@ZdɒuW^ѽޫo֫]uU6l ={hѢy]Ř^͚55qDY߁wpBiFZ6l0fLE@@@_`7   @@r =,y3ϔ>_@\`.i8#>}$/}4m~#dO@@@@HF?# *A@gϞ|Pݺu 4P׮]5zh{jDE)\k[@kv/7Ho%sx)D岮ޝnd+WjȐ!*UT:eXj}Y2gq?po`K{{#Fܹs]"ڿ֟#    y%P?H矟r+=ڵ;es  H3fWi<4ѯʼndII!5C@@@@QPBԩ͜9S-lXB1cHMr1G}7 H7nJ믁    99c@@@ 6 oI4r4v?rIZNnEB=ǣ  @:6IOk…oETC=K{^>hY_+no\{۹4gtA7rڟ⹏xReկ_?~7N;vH_NViFhkNew~˼m'|tݭY7 >w    $QGIo!͟/ &͚k+8KvKu&Ri  !mrkKCTtmWH6 @@@@@X8"͛{Wo8]} tZ/^<պYB!it뭷jŊ?ӧ7(o'G@@D.gIFL@@(WN>__\N~tŒ%*Gjl4 %x4vhhΔ=jԐ ).!     ' Zjf@(jѢEo7x%p4v֫W%<=>05h@UTIj뷴`j 5fxG{yƍJk'7 r!`wc=*K*]yf/%iٲe{RDrΌٳgOigr#b'e[_i@@@@@ओ3}I-6J@,YgI={J\ ) $&OAK/%o      !дiSu;wÆ QFoV޽UXhT.ײ@ҥ:trӦMÇkȑdR@@@Ȫ~*  ġ#҃JO> RYZ4tt%R^R&q@ @.\֭+׉E $6,!    67ʩ%b J(ޮ1~׮]3gWFRJ1Yx%ʕ+gyE@( X߅ z }}w4KYĥ~'=ugvheH*vdIT'M8BrbN`>Abv / YU+V,^ '}bE_;Gr\?&~NΊ+zv#3eٲxboJk% O|˦ZjeHZa     -Kk6,ƌ=pFĿ/d]IvR:hՄ" @ԩ3H_}U: o_s#Λ,A@@@@@ 6;8KuwxI߯7zKLJ{"EFbo&uM~֭[wuc?Qff\@@@ H G@@ U "(zSҸqڵr J'&7>w.L*_> 'gW@TW|y?CaM[0H nc @@bG:^.p[?xm}ǎհa.=-[Xϔ,YRՓux?²dRr|'nĆ*TPݺuuY!G7zBق]H=~9~`߷g 3*}fΜTpa/Ӧ2y'P|n.FP7xc{F>iޯ?\K.Ֆ-[TjUfܺu'vyںukH ?W:uqƩg;[2 6lX erd,pJ~9^,#!`k;G}-Zi _ D d_~gR=N_#@H;ٟ?3* }߹5 $VZFey;0C@#FH.SqQ%ex-%3:cFz衲2(Or-AnXb.1~[[fw/Ԓ'7jSN_~c?_ޫ^͍    ĊQGIO*͝aBOQ믥+>[:蠠0 @ l(M*Y__+qo] 6lb@@bTVR%d}]`KגYeF /l1ý|p>Fykڴ&KYdVkZhFe!粄C IF`Fm۶t$UVex|E-1Gn& W- ,ՊZ)9%c'&  РA^Pk"EX`ٳ/8X \p`[{rYM\`=?MuWgjM|衇w@@@@M)Û,/ƤIs/]b{7]{d-F $naF-  &`Pݸ.1/.uMU*TtZr! @@UԩL +˃>Yuî]K:STdI/^Z?NέRfMNY_{Qnl[ogV,⵭hpz!"‹S @6Gne{Z̬[.k7 wO_˒Κ5Ssjڴxo,$|{ho5tPY.L'NԘ1c'Yh7   @~C=XB@@ i>Zz}/<#dLܳ'o.ZKd4@ ,7|k [0BA@@4|.(>r\%w]zQ{ܸqSZ^Kkb=ۿ.W\Xh"ǒK\Vٺu̙mJKgmUr "`[;C/KM=zP-2L2|?{,X 믿uK5uY l ޵7>ܹN83 .v_R Ol%{7kKk?'iܹNc? Ȓ~^͛͛cǎX=s(ٳ{ uxK˖-ӹ덿dI'?@@Ȋ@Y9}@@@ a>X714e4yw&Ӿ$}/Ô.,4 @ \~*\'OVV6m]}AEng @@83^u[oŒMXpm,qDp:{hc+:uhOwp֒Z‹3fx {=0hݮ5i$5h@kǏgZ\+UVuIFJa G.BoʋZdi}'[ׁ߶^B:e7n_r XڵkUvmo~p#FZ";NŊh6YO?># /Kvf̦cߡZjYnڵK_~,(ޒ,Y2SvKj*KBbǛ\*_U{ГIu39}T6_elPrO`ҥ7@  npڝoC$;MF\r{b%*kҳJ6H/pZ 例ٟ֜ڵo'xKku{p~'MUv_ZjޔQ"`fs ^i~v{qvo en^p7o{vm}n~m@@@@@ \-w\G/$Kk]WnZ^Ż|\_-A}O?]eB@-\8~[3然eնv+jBZ:Z:Zm-+WK6b ⭟ @@ KgyF֭>m}I6XZn@Vo_:…%w_2/Dq~@@Hf͚yC ۳g׬7xCK,۴i%RlgPk֬IpHo:SJezo! ~S;’_> GGoWsbci@֭[p8s٭F G+g}@`[4g2s4˹3h߾KdU\rz9of,Yי%9Y0}t/~z~]iٲekbIqw}-ɸ]j[{yRJT vu#LڵsVtv;6:[%P!٪U+7pi^-(k׮ł-dGR~z/l\.3z Kk74i=zt+_KTti;37n\W:x[";ڵ;<͛7/o9'׵Q޵,T{ND&OjGL{`_h!;'%w3H;@ ,9W_}]Ai{|_~DZ$~{ ߅_|E-_\6mٳuˎ{饗zYywܘ.٩܀-RogrE {6`'$uj֬I\ZjiϺꪫT:9XNTTDG,hΗ-[wyGcƌݗ͛3'˔)õ~]sر]"s?`o}={dL;S@@@@@ R 躝ᇥk}-żi1 <@h+1 HO{tH q_ͮ>`\ۼw- qomO%4i>ZOv"@@ .9//]w6_j"E۟Ѝq9ȯ׏>k;m13j*/bS?k4wTx~GliĠr-r^-FQFX~}ݐ+BlsVXps8`n17Zmb*`N  ƚ{bo%n"jEAAш"((-݇=̹3~<>=3s\qyYo@&RA$n[':!Ik*?`{lot" " " " " "  "" " " " " E+rYI0ƍKvdԨwDf;h<9ik@dO=ykd袉/i~9!A孴DD@D@D@D@D@jFq#u(0x7r;p麚/k2$fȑjl?d7ٹ6|N@?;h";8y$HM!z>D1 LmY^Y#js}WǮMʼy3ΰK.jv9 omWO ,ѣG="M~/ԩSIÈy.<cF9mv}<.= }̞=mtMyട6 l$[XK^1#;_`nץko:i).~c Bfjz뭰15FZ h>oj}NAlux=$0|^3l);̬K> FrV@vfJ[r6d:u~S_~מvi!5&|&QuK ~{N;]1&S,B7K_D\~Kr~lpe2X~C[Zk\7 ~"]>6')#3c?lˌJbx}naσ慉F{+" " ͉C_x!A_T|e1;찐?ԵSܬwr7=eʔqTL0+Ch+u>`nꫯ+:|#ѠҞ \~ꪠ]uU/hlms)m/G }x:x4ܓN=TqS`qW^7zX;;QcQ:" " "Y#gzBo9܏1gDŽc[76εQ`c!y<v};0ɸ~Yn݊5%63XcU)_>)w"hӦmN1=P0Td :G=>3aSۇBͅίe O$QD} {Ν_iޢI-&l0 xرnXw2dH^zi{~4s=,ƫu崙$"ch{eeX'2T2ǬX6?0^6BQ?9g>gF~9fDn4t{^=15}'Syrh7FӦ2۔fT/iӦ;]11W@s'6|T fUv3ѣRB֑><#ȑfbֳgkkO<`v}pY_4cw1w/M7;%Ib,Ooz9⊡ώ73% ٳW_ %o 8dѼ@ ݇CfB s'4{ ^7GdŇ-X{w-1c^!" "  M-8yD|sЄzW=`>~ YίQ1B0X@ij Ƭ~ZshhܥKBj@& ]o.:Vԇ/c-f:hJ1@5Um,#P[o5R?&u]u:8ѠҔodMw]uKR(S\jՂ9p?qkSu% "*^z鸙j2 ngG}=ሏ>?~cСCgj6j(;N[l̽BBWϸ3aBD@D@D@D@D@СCO?d$y~p| ">ܹ0rP_s55 )cY8 E4saځ.C׿a4-tBגV.{1|7.ln4#fGYjI":mnC+f1o lSU4tj5 axzE59DAH`Z /0U~}`rþF_]v%VgVl]崙Mew5?y<§B YwMz~$. q+Ef2 b`KpLzj>g=oƴ=If~:׬u9m~C3I650;|(#2$T4C3RߤU/Hx+('+N:ɼ_ƜYމ)盲ϣ-D O O8a˛~{Hb+XVYePcPI*0^p `IB )6mZ0@8^ ~WimSN1n`y=P3֚(7ޘ,{-6<)F"@F,IL~gyp?\YQC^gk/B)t9s裏5  ǏJ. p0bB2M@dC3ޯP0F"N)U[LМb'|+si&͜@Ch_G#׃:(C9^~ѠH !uZwMh6ڴiS5ds5E@D@jF>gy&8Cx/8^z_fk[~!if]w][oB" *ZD@D@D@D@D@D@ o(Z$" " " " "P>yPٔ͛g 쩧_״;Nɥ>?1ޮ{w>}Q)FU!" "B`cl9e\BD@D@D@D@D@D@D@D@Deg!y7$|^{W+W_UR~̶*)V q= P|sI&Y1?Ph@*2xlbkz5eY&fE@D@D@D@3-װ*]2:GL>;Hr mqϞ=mv{]_m1m45\HsWڮ+UσA>j33~׷}@IS*͑^[zEMH1+Bج:NX?C ]w?E]d|w&>c7x/ zkA=K.C=|MCW2׺0-^Z&" " " " " "P.Un @ жIfJݓrTD$$@TJATfK-_MQ鹰p=nzks޿E7 c =3we]6$W` ok`nyJ Xicݎ VN`33y>;?j(xs0yKoWHWzviL)41$7k225,c6gɮ&[8kܹs1?(-VF@䖭KNkѐ8ӂ/:E4{'|rkĠkơV99v7ׇ6nL`\1>l{A[v˚ʟR\<^8C!" "4tA>SO=eݺu #nb57p+6d{K. M<ٟ. NY:@r hx,c6hPR8ى(cƘ'Xh{'G"&EXJݳbM4<ě1bN "Ϫd[lanԔ,RZ'" " " " " Ңbd;SlM7Yfc뮶b&MłM-/sC=6|s޽{XO7.F'tRxm.rC_\\;s0}7k#)u崹ڤVOx1g:)Ԉ#dOU/[MY76ra6Ƕa.B{mʔ)aLG5LZjKkYa6WV{HXޯ<Ŷ; q=ܓ3e݀v/i6޷y'L K"Ɨ<7f!tH6Eݮ]&g<;|]&vɸ"N]8CfGevf@(٩&4Co̼;I! II(# b_`z}gM۶mC? ۓ ag292}H[tED]vd_Q3" " " " " " " " " ͎*)4޻m_6ލ7fG'%.E9>6e|T@K$[ncV}လa'5Zp⃱ѥlq&bfU)s`l(Y0M;vE" " " " %4%55]rZZ~ z=I1 ;cooM@% }x6ͥf;w̳xT(\'r'f/KmsZ[[zbrM4]|>|=#;*{}9؝wi\sM0mWP-7'l{vaq!UW]e{w5@Ght2m@ y$$DznUOjlڴ VO=](>%1R=̓U)!ПpVU{z%BN ~)뮛W֊@qKDWvj3!a~:rjL;~GڼyA믿g1㈚SO=4-h-lnlA([7z . HsWB!^wyA7j(OjDhMOB^6W@MŋkvATg'V]uٳs鉴>(駟|T9}"^{mXͭj7x?Cf}!93ӻ4隼ƘtL$6/fqnM<Ŷ>c~7v%[|cf0Bq!C&Z9DuQcC" " "P#$Mm/B(2_U`ثW/tMsUuOcƍK[o%W_UϕYֵL7i/?Wm٦[C]˓P 7g}<hXYg\-Xo JisZ\[zSfAD@D|yk_|q@6rA\q˖fx鷿|׿{! =" " " " " " --tE" " " " " -T2)zܣ^~91ET:fٷƵ * ﻯb9Ϲq) 1lBca*)hfͪ,|{pf_mYމ/;ZE@D@D@D@D@D4K.dnǹs^{e1SOMC9.RSNh$+CpT:ѣI0+; xFH={^McӼF>2vg} 6,}1+(`$ɠ}mV[mUi\P6gt!)K7|g㽄 1<̻d N̾615weü&M,~R"P[n97\?`ҋpxĉ7zc~1%)|ۆdgLr`gb6H"o]f]TI*I/@$NJ/0'LL>y`4LaAFݕػE" " HGC(Ǜ&!h?(ɿa6Xf"q5gܹ3oy=.oQ 3 b8֬0_qfF@aL6xxh@38r;*D@D@D@D@Q.4JE]r;bXdElРA#)mȐ!¶qW^8." (@zNNoӷケc۵kך{q!}s1m3'(y ?y8sooO>D6ؐ6m-x. vgm " "P6_ȡۑGiO?t8]weO<]~V,C'o 9N:(o~t~sH|\rN׮(*%{6W`[u)APfx|"ŭT@"}{#1'i5{6()WBD@D@D@D@D@&1C~yZ_G7 2&H> ;c8bŮN:$;Cx뮻.lyo;:wgszh"c@y l*.kk78Bm M4)޽{3!>`SL ϼF7;3Sq 5isCI=-–^z 4 젃23dN$e3~AwqG0O'#x饗MclWH.'s-ÅG6Tf"9Erst-6z]w fy#)SNVZ)o.K?#F"7"^/"|6cgK>A[o5Ϊ.3<3kx[ (߁/ǎ[e!KO>3zyp*%{nMcvmflN=51~+Gu,/Q.{+vOy(D ,ֳgPm!y7'xX:F#l/ 1Y}Ճ 0B^7&C=qlLA7sY#`" " " " " " " " " ͏Ƽ>1/4c-)^~;a {diʪ-@F+ϫ15,>33~ΙiYkOټ 7 `˳> ڂl|i4c 9c|=fg]t cr&ѥ qyv?͋@K%#GSO=e/rqi s=SN9NU~_+[DCkKmsZj /BW4~ 5ʵ{qI̜9oC\@r5^hS^ϑ>Ď81cF apәD@D@D@D@D@D@Ꚁ~뚨'" " " " "`0%?%!c2ƌIĥL1Flu ^)!i׮ LjI@As=N8\ߔOJ E@D@D@D@D@D.`^^{s=g fW,=T;C?쮻 & wp~ g7,p@bx7c= /6Q)c #/yMy@' L"~ǰM޽mygg0b踪`Pz]$}y衇v9`IB9sOSK/4gh`@IDAT[kBX:x x`Y0}Y'xb_Caƿ\cc:܏o8APnUy"FڜiD1x8,s{JyrP0x㍃ia;ie#йٍ7&zN0Of?]v{'6E /m[>3iN"æ瞹&G?bL0|`?0~8.b/ڜ5M7K 9}Ա՜[!" " " " " " " " "|Ч6If()zC`K7f G %·eyk'm8" " cCc?;Пq$$繓a 0˜l2eJxNMхaLMznܗ1lCƂ .0ML)3W@K#&ȡOF wg>8\2дef]wQvqhlIf:Dtwr-/vn~:  ֱ̨I_3odֿПj ^6hР0$S@(GωO> 4,߬g}vPhDȫ,frFS-I(y޼y+s>j;awc%bWUICjisZbAmy~1r6l{.z^D@D Cwю>`pˡghZooV!w(WW<e$UD@D@D@D@D@D 췁t" " " " " Kn ,Ƃ|v><7^('\>#ԈL}yNڌ0s F{9ք .E*js&AQF3qQ9-)g̘Qe?;r b.Nda!&9S8F#c6mq.BBQN9ƾvX(vb&c3BUjf_c5FL߷oߪ "Q~}Y/>i\D@'|2^{KhH//B3gNQ,|/s=RTZ 0~<< ٭$<'1h#3 }8f*#]wy$_" hnw*FYw} $`[xSVGɱ7A@ߡ$ D٠BthIh|J(`6gJ|㍤dҟ6ez5,-͋4}glҤXܫNQ^LhۮAϧUOJ ˳>bK]fdz*9>y`<7xFH#X&3Ny/7߼Rf]X%6ueˉnhx0e/cvڅИc IG4n8C $}ݵX*(GϹKgޓacV?̢2{|2ܫ_zna6s~Kp 0wVS 7C4.Ԉ6rN:p'F6T꿈T>#Ñ.ң>vV_}k@>29@#8¦Mrz y?hd|_;\D@D@D@D@DV]Ռ0jDX SkF_pgI845LJKs" uG=BoϥR#+rM@D@D@D@D@D@$UVYz`;|Jmtd" ,FQWf*gv[{ׂ/hˉ8^޽o;N<' ӹ O L= n 3CA0OAj\ /'H[#/`^{٦n:앫_Ӻ ܎85{~17E5(qXs1v+ҍ.C͠{D?|G{XTuB9}c]h~ZVkX=;`l ?bDi_ TIW_=3W9,BഁO> qeHꪫg>m3cbbr b,`p *}ʙO6[o |0}衇닱| ^ >  LsInzL6sܦ} f'9om>Gm{ v4 :rSNvgh$q?Dm^([}!x (D@D@D/2|; eر>nXb%`KwBah?Wh|ox_l0}ĭ_nŌ|~[P@'hPA2h0~60uo3_>UHn0%!ugp4N>x OO뭷^(믿~nzny&JGr<_}r,Ly~Cy:tHL t.fmTGKD@D)G7{ y+(iZڴx)7cu~c犫zrJ>9&hL={a瑌30'7֌Evմ43uiihs9' 5Ѝ񽨶!]rabi^-j}aZ}`1ұbP˦#eŦy}koܞcSlL?vM3/R_r'|rb ?+bV}37+v׿3 oKm3mg`.;}7r  BPM46(US^T>"D/h(#nZD@Da !׹crt=f ORk=rywF-" " " " " ͝V" " " " " "PEb{:s;=c0WZ<"X<&>FH!"  rg|0"N4˾nU.,sU Uy<hY$': cpc ^'Qzlp/| R 4+D@jF\s;rx ެI~kz(Ē>8jݻs`L 8~!#tx<=e 냝bHQW4}tu횔lk6n1(8h{#^ʮMfzm p Xf" IrCp!Dr?*%V\0,)<:p4,S_~y:n6;cL{ǰ9$J6Ν0{sc KbGy'V33$!E57IREhFD@D@DEXhZ4ƅIpԗ^zin:9Ѽn%),R6uiϊR\jG&ƍN8poᆆ0`4r[ni|=裁µ^k#GobҗC-" " " " " eX#" " " " " "Њ daډH+R#2EXJ~si6䕝:e)ha|Z*BD91߈:/5=e8Ci1guDY򉵣ԒZl~Ge]VҾID@!{W9aqsӚhmyߴfUm~dJLV27(l0k 0u'YAܦM6̀c1Ejh>N!ƅeT|OD H/N/" "Pkcb;hР}_mx=v 7ZG믿ގ;8>kgyviB ՚vhxI?(" " " " " -翳VKJ 5q)bRjʔ)f_,{/)['G{!p.b4mLX0^l1E!"P3Ĝ:cf/K:|NK-7=f7y'Ռ~(ȥWɴޕI(s{CBD@D رcs澘}Y|B޽s澛o!V@CY>$Dov=f>knfI+>s즛baL&az^_km͞z'͍> g@N̖560'- lJ`c7 ӓ}`$,1HMnݺYCn7o}=$5h'\=R)q.X`ܹ`iROtl_ I3))tm)ac3m^n93t+D@< 3*}?3 '$+%,uew*CO<Ν[#l<,W@57?(Io1Р I|&=ֲ.3MsI@ r1g-BDҺNhy~з{1ح.|Jvm[E=Pj/']dww-L D@D@D@D@D@D@~ N+" " " " "к,e+_70dQXJFX,I(r6/{sOh>BUF: J]b˱JZټ |]"DKtb曞fD_J0^eUWMĜ+" " " " " " ", va[ 7ܰK@r jLc1c3ުt+D@D@Z 1ugT B7[lEܗ%׌tT76xE($v{z7]imcI9E5h#}1OT$yokij꫉{;OM]v1}Ty%ը="к ,zJ_mǏqjnϙ3'YHo%Ĵ0ӿ/$w„ 9_TbNqGc=[ 0Kq4ƀ) G/JJGv^O-6J7gbߨG Rh^:ZJj}"@' c^h|_}Uwxܩ,"9H~@ذag0rS~pws@`9@0~(LG#Bn3@y{u5wNN3C@!wn/%E@D Hد/" "P;-b{7 qgkL+5\3q;<;]Sx_®:`-̙HN`fzb0~ M]wCl^'HjcKIH/~wO cZCs2>}\דŮaWModZ㌊rhHg>%FhLBK.F241ٞyx}>ȟ}eC ܮJSuk|gE@D@D@D@D@k(" " " " "mf?y ?apnfm$&bteƌ иDA5ʙ4#(ExtebZR7x Uk+y{ލFԈ7e/ӆ?3|ov!ݱ;}BD@D@D@D@D@D@D@D@5Ν;E!" s7B" "lRy7o^ʹd"$ >4'}€w &a*3jy⠤xټ٧>cÇ-':ƿkֵyؤshEr5 OhD01k< ӁQ3<J\PG45)ch&c>0p [n& JTXI"y2{vp4F׍^;]3MAp;3sS+G]j'pQjXvwvV:nuG=wZz>=ͺs9ͳ Q]۔ !^9xmzl3] -C6eZ]iu73]wՆjǏIwM>Fa<'y'=DEK.qa|I49BY([mU)1QB4~wYy23g{WCIt8N/MP!" " " " " " " " " "Pz^{N8k{'h^իW}Z˂2q~6zhkfȭu4|^+TD@D@D@D@D졇2 ~3x.-A<;ѕn$ zYuSK8`>#}p=5G'٣f@Žn-<./z4Qg:9BD@D@D@D@D@D@D@D@D@D@Di;s w}sӚh<Tq/|xnM6mBh̀;wc4-J" " " " " " " " " A'MRyS۠3`ڔo(ͣiSWDiԇ^jL?.E-DuzFKUQͶK"$?3/ӢciVX!<#_ 1_<׿ Zo<40$&h4eཞLY0bhKzgJz3M@$@ڶf;W[la]tuQ ?$~O+2p 7ް/`Z-]4#H hH3 ~yX6d&DNC ;f6Y4\,rBFl &7Og(X^yK|יwT02 yP`}vg1^&{9K9 yB YS_UXk=E@D@D@D@D@D@D@D@D@D@Dx|̓UNRF/wb喳+}I6N{8nٳ>.u؂1$Vk]v=sa5\3$HПM6IJz9ӌo2O̦MtSie񒤸eHÎ,ZȌK-eI^ygm*jUW5[d:;$" %XoX$ 6{&ӧOG oW`˽XHxOnb%!R&2~Pc|:0!J/`x 6h̀1W@)g(_xo 8ji᦮j:&jΗ^O1^rͼ}^\lzK 4)t!yQnquigW]\׸S\Æx[hElԨ}$I!T"ֆ|\" " " " " " " " " " " qw}sӚ$I}ꩧY)餩ٳcV[0S,%ͷd>\<t6gv!1ڒ!A"mk/̸L=$OώWa8^:d$VPLDIXEPhGXts{$o4kԩS'l}~G}3f$S7/Jja#ݻS|i(r v"[; F͢;]綾~_+F&jYw\s9ͳ l"Ho)wyVRUlvU[RKCaŸq?n?|y B9g0첋aX̀"T,N$;vQH4-.( %.d)zwSwe۔=#f?&3=yJcJg̘aF % 7&ꫯsjGgc _|qtڵ6a؟Sȭ:^ҹYM@'W^gtA6eʔL:u H L㤓Ns<$1&MCڶmk ƿ fEI`jJy$ꫯr&犅5٦cƌ %|E5>[osIkmS@K /סCڗ_~i'N6̮:oZet hFes+"{ zÇ:Sq@d[:;)" " " " " yHO|о$^nB=ӍZ[EoW^y%H"b#+k b6[n%l̴?{^EK wwi H"҃\,u]+, R)]{Wt:<{Mr)<㽙9sf Ι@@PHѣGATh/w{@FGR[l͚5h"{  i |)] ((Tt^3gըQ#4}_~`@Hdիo u˖-vܹ'w%[l[<TH|.Xק>*Tpg?jޠ {{=a_TFԩS4Pz U_g˖ۇ7     @r2dR׿z߇Fs^5IoXLC7nl۶m^zɾ;ĈmڴqԽΚ5{ќWjthQ滴lZjh .={vD0M5F U|XO?=o@b. .tҥKC_> 9*NVԮ]w=Oo3Yȩ ׭[76[n{?R$ @ Nڮk׮ 8zh`9rĻ]oTd[e1m ||2fb_W|gϚ~Tn}"*Ƣb5^-.\.YI&x7#    IF@z^zEx  mڴi$% 2kXoo>`Ӷ.,[MXD S]z^N/i ĥ ,[lp@IDATq9$c!\ݻ#<|ծ]۞{9~Y=1ewo O*xg &'m\r%34@@@+@o@@@ nܸC@s5= aVZ*bh)O@qxMxZ̙3{VG!C@9݀VA>   q!ɻ*NC@|X`A~vy5x w}+p<͞|IS @ r$^d7Waq{}UPU4g}f*U*]vQ9T_.lQ|A{wCK@*3gNkҤ[}=_[߾}ω&dʔƏo5j԰^{v=2uT@@@%7LcȹX@@mȑ .]z'x - صjղuօ/W_}/\y߶_ O=+>uk֬5k{@@@|v}LGӇ  )G { RQL( סCH"1@d-b;|WtÆ .-V[Æ C U,D_`֧O|=sޯF߳F|+Fg"7nVȮ lvDMB+ f͚5|o!p >@ƌm V^+T`* CC@@@@Z@k׮g׮])|_%zey \ߪWz=}v۸q[ iAAAw^?ޭVpRUVfȐk…MK֭ۮ_ {+We;w3xZԩD_Op<]xE@@@@E`Ȑ!q}}Ϊ>9)AI[Я6]tn~(~~ٳm֬Yb u떻(Qȉͻ_mօ>_8[H{z׮];ܾ} *0[j]- *Xpm     _9r9s؀lРA0C]vٔ)S,o޼uD?ZH׮]ݳ"3c   @ P*n= @@kl6j([`ݽ{7dʔڷoozFq*_?|H!"WE=3ϸ-/_Pʕ+a p>s6|pw ~{rܸq%K$y]4   XXd8/@@H0+Wѣ~p?2_^npPQX_ׇ~yEo]zջYaQm+Vt! 6Du7!     q&S+Zl2f @ (mӦMpիWjy浦MZf\o|:eˬcǎž}Q'8j( X@< Uae4PYn VmOSO0 | U iNڳ[ 2-Znr7Pk׮y͙3glnly(xk{-:s#=c    )[@_zm1U=_$Y9'p]S3f߿ }vomڴqKƍMsh$wO@۵kg{=x7믿3gz{L2z(Z{@@@@@ݭt֮];;~=z W֥ԦR >}MϛI:ux?!$*|޼y.ٳaY ֭ UYTJUA^O]~M pkw}ׅx@vD@ izj+B֭[.weÆ ;w#5kָų2K,VJSgJcZSWAZ֮] !CET7onm۶-Zp#e/ՆȘ1UV-7?9 rҥLlt?QK;w .WQ#%@@@@@ "}vg:t`VW}k췽 VL{… [=G2ekذa~.@@HTAk q   k݈:u ]dayAN:_=C]  յjղuE-Ķ˗[z_tΝ 1/~i1b͵k׎7@@@RݻlٲdɒxIJ7@@,0fvm/Zʕ+ cǎYl٢=; IAߟt_Wf5iӦ֬Y3kԨeʔ)G8_N:@n5U^'ƴN⿱/~  ͛7B5̉ ʕYiQvL ߓuwލtH{=Aw_@@@@j4n]^-ZVKgΜQ: @ I :ufΜ,\Ю_sCY6m\o"E|Bo۶koYK&(Q|AW-LCHX暚TP!aO! DI@t'Nv&O$77n17{iO= 2R{3&9f@@@ NSNC@@& V=7zh7!AԩSze۷3{">|'~;Ǟ={kf} /뢛?|Dن   p .@@ @L~?0`_~6x`HǏ7O |*} =p@2 ۻN:S/PῺ_{ׯ_%M4Vti, k޼y#ݗ  =@@&@ob|@^ Qr[X{uJw޵g}=7neȐ7   Q 7VD@@D.p%}y(8rcz @8v7wѢE9aܹs[ӦMGuy @hDVl tExU<6M|Bk׮%;6 h9^mZȑ ȱi*9:͛79sfWZjY:uH    $n?x wzt&L]~tBB ڵf̘u/%(((t˗/k6jԈ>B@ j ޻w V?~}X8w7sNyf 2D/@@@@@ i o֪U+<3 'Nh[Ng=|ԩYauUX^ @@@ F݊   TLLcǎǏYW^ֽ{w˗/vV =0ZV-W.&I[ ,pC(WcÇw(eΜZha:tpq#9=wvszlbZ4G4iXRB+8gΜv@@@@H"3炃}&+ܾ}lҎ=={v6m5j(   @2 7r9  $g .ĉ]ڵk}.UvtB~U@| (`WAiW^GyVZ冹s玥N:ZC6{Xl_|hOg@@@@@@ :P5Խ 6{l(ݻ>{5jpᾏ> J*O?V @裏7t'6mZ駟=ہڻ놩T :4@R#GῚq0w*T7W*.]]ba\^Yˑ#7\Hvc;    $1UTZM*զ+XHuT ]@;wY5k,tӧw+uք8vO,(((/1R[t?SK@@@@@ i ܼyzmǏ^[oe|ĉ֪U+o???1b#p   @@@@ n߾ms3f̰7n8jѢ M#}MC >T$dɒvܹXfǎֵkW۶meȐPWtUVcƌG@@@@@$0}tk׮ׯ~tB[ʕ+pB;gТb    $K+pO=s~ݳ:tȊ+*PSh @B h-M:Ms6lh | /_o޼ٴܹY˓'7\hQK*Ud@@@@@PP'xF(\z՞x 5k2}k̮A@@^߸7eD@@=z@S|FT1^zTM!P> :4ևâ/~m7;c^͎;?g# wܱe˖ߟ~Ɏ?3|ԩۻ_@ 4h׮]n'x֭vH5kVS#-UVuKRL4@@@@H_|ܠZ-lɖ1cy tVѿoGTmAi   a  k@@@={ƏoF2M>֭ HhzYfml_ڇ~¬)bp*"҃ .]L2hvB@@@@@Mtobݺuue= /zTa3f̰3gڞ={<mܸ7PBac%$=;wZݺuE6{>s{WKv=c3$" ;;}~OުUԩϓ'ODw~=zݸq8Ŋ \Jː!Cd@@@@" 2}Cp‘f+,XMm۶s#@{$mk׮uӦMs?BתUqZ^`]Q@ߧcӦMƑӑUu]*U ս2eX4i"ݗ     0wصkWv;M5keϞ=aN Tϻ7    @@@ܾ}~g9r+{֭g™[v͚5iӆ$RqU^p_rʗ/o۷oѥ<6tP˭^z1@@@@@@trʶuVy֢ESK.ټy\9sعsH"pFh ~w7gѣڴic*2~֨Qû-[6N~?lC@@@@ ,X6m.y6wh]1y9r*T(ZH-[ysNC*Ws<  HǏVgRDg!CߪUE@@@@_=+/^tP{n9{$0w}g};w=۩SZ̙s   @  @@MGmcǎӧOU@@=#G@ nBq=@~͚5]3Z$*}I˕+={6Z{)SؤIl۶m>zy:t0|X@ ;w/ܸqiQ'F< V[ʔ)cSlW#    @ lݺ՚5kfNr#>`+VX!3k,w?ڵk"99sLm@@@ O !  @< h lȑnz!=zX޽tҡ75LVdIqJ*ezKI&p yfWN;wƍq @@@@@-pmSݦ=_#1{ R}ղfj͛7֭[[-,gΜauc$3.`y+Ӄk֬yɕ:Ԟ}Y> ;3gθ+V˾yf'>}z[n]Wvږ#Gptw VΝ;M#j*r ^{     >;zEĉV@vE3@D z բAׯ J$ .I PRXv^j{v[J(aϷ"E   a_  **_ ]pڴic0x4i| e7npC{`1֭[%K7Bwq @@@@@-0dׯ[ݨQ#[xq.|D[ 00=9fͲӧO9B=A*怬D$'Oۈ#y+[*U*NرcV\9to…֤I8A@@ 4r.wʕO*U*w'WE|4Fu~ )/njrK͚5; @@@@ |gk0`}GѺ9sX˖->}ڟ @bPO]|NMAC[,O<>}XVŋyfwqÆ %*SZ5T^ݴqo,9:    @8qÅ}}vwqٳgsyjwE/Ѽys;z۱`-Y @@@'@o3@@H;vѣGرcԩS>פI ڵȑg;+H, }7mڵi&Sqn>c^vgTЕ'|>}X)G߷wy]{8^zqЪU+={OÇ@O ((T^+Vp*Q˟?뻥bŊG;{7W(X"jӧUz\Pva    BtҶw^K*۷U΅}o]&L`O|8ғ'WӔ/_H    /\GP˜9͜9}^)c˱c\kͳJ* @@@p؄  8AQFIVnݺY޽lٲ75^Ν;T|MPu۶m@شgyƆ !gC q/]zŎ      hԩ+  n)~r޽{gL2YӦM]o˖-ß>X)N`ܸq֣Gw*=qDW6 4k׮n @ϖ-[\ 8  'O yf}vg֭5RӥKnnPnjYv+}ڵ( Y{9f̘1}؈    @RXl5hrFl>:شi~ ,UT`@ l߾`-mڴ?=c+W]3mܸ5G, ,h5j.%KH    )hڵ 2dp7ogٳ.wӦMN {6w\LC %@@@'@/#   @~:o<9r͘1n޼b<W7 t*M4!I]ƍuV[d1^z>FaO?РA/x,vD@@@@@N:e%J˗/ ޽ۊ/  @PP+@p_ر#6mX۶mqƦy4@#rJ3O?W_}ճ9֯*YL;}K? G@wb zjtR>}z[ڵ-s[ny:5kָg*TγN:&B26"   $r=zظqY?޺t3.Z>|}wEK:u`@ ) ŤIֽ???Wk׮n~VLqhV ܫޟ9s&BStio+VhY@C@@@@TKSN6sL)]t?J[tߵe˖Y ]3z  T~S<׍  @,viGcɓ'}FZ)W̙g;+Hn?={9{ǽP!C{{nlʪT>]؎     +Oȑ#~H Zd{PSk?~Prj GEy]ׯH5k;Xb"<޺w{.mTl=˚5kd@@@@@!"PuֵիW_}!Ls̙3mڴinARI> l۶i͛2j'l͛-S}$[l+]f˗ >ܞ~@RǽK.]v>' ifr\oÆ koA?s{Wn} HH|r0aM<9 tvj+WN\)I@s9l Uý),UT+R3*%õ"   xٺjB2ĭS௞=|'}R۷o󪡭&QFY=R* ׍  )Te#  T=Ǝk'N鮇ۭ[7˙3vV gNrOСCguL Sl?ovC,YT@     DG@ZuRlYۺu+H_®~'l֤O@IDAT2C (]v֬Y3˔)S.|D* /7|Ν֮]kEttxO?u4h4B+i  @XgϞ5;Hmfw BῚEkwh{u` ^խ[-uԱ\r%ĩr @@@@B~U@f͚f>'OQiYRA@ Y ܺuϟoǏӧիW}tҦ.]X}aׯwsϜ9d̘ѪUfk׶ZjEuth    _~پ wzPO=TJpS'V'vϞ=݇    @r 7r=  B… 6qD5jzυʗ/z3_#b9b vׯ?s+ߤISNQ|']}W#6@@@@@@ ˗L2pOyYӦMC H*l3((~۾}{{衇bDG?=snt… ~"Ҿ*P;wXm֭VdH  PA+V_oڴn߾U}4ZZP/^tE=wօtJzyK(^w#    k:t'Fc+Wvex8@;aW CAU(sΖ?ЛCῺeqFWUH \2sE(F@@@@.Z΃ rÆ ~:_V/h_K#F8A@@@.@ob@@g\`)(t>[V͓G}"IS`ԩֱcGw{^wufϞm-Zt:l߾*V<h      @To_}ަMw0m\iLjŋ7jQ!U [6j(իWl -}[o  @t._ӲqFNz,B .QF.7Gwu'W6\kuq R Lp'6"    ׯ[… 1cF;qe͚5 {r5˒%LN_9 @Ο?oSLM7 jXكo=$7o5kָ`O<|pW>}zwP(8_|F@@@@kf};m= 0tP{geG Ç'|2^Š   @b 71ip.  $={\̱csʕ+nݺY\|0`}'nŌ3un oa۪Bo 4gVHL*Y1J/@@@@@H  S7Ν;H")ҹFRu\F_nƛ!CX~tE%w^`j3gNܹ Hvwܱm۶C Ϝ9 ]eϞ=x#    $ `|;W=ړO>$=OW_AymCoqG@@{-@  ij .^FiӦMk׮8 DjE6m",PaB Y;=j(iVt鰺Ek݋/h_G @@@@@H@tAB i&F6¼W\iSLq!Ǐ9{hذ)hS M>D@8Pf͚yxWRe̘1dn.ܹsݸ/c0   1UxtkQQl? eȐ֭6iĪVjiҤ kyi^+Xŋ*X_@@@@.믿ZѢEb%J}}aÆ}4/Bar4@ذa 8q8qg`WoݭH">YWٳzj[j["000 VJrOբ i    $7x>cwScZ׮]©9駟s@㝜   = sh@@SСC6zh&zCUTvr 54+[ܾ}{W$;*{>6ydUߣ m>{{     %{˗˗/R /ÒbIG@!˗/q~I&YΝݸ tu3g0   sْ%K{ wlٲYFvKR_oK[ӳ(ݻN)׳TXT܈    r}]8pMcjժek׮u.]d$! ^El̘1?իWCyN:Y֬YCl Ho߶-[_OpXuK^'W+W6??]x    @xWmРA|ҤIc'Ntg''< Y FS   @/   ЃSN#GҥK-(((ĉʕ˺vjO>)없ЃIzr}G6`( ڲeK3g뫢mqQ@{Ν U?s     LMڂ L$.bi UQӧO\{^mڴٳa X(x\wuԉ^xʔ)c'Npcgi  @b8~7wQ z4ib*M*+W_nܸi(X4h*U @@@@R")bGu 51x%K %Jؾ}b4;!DOʕ+رc|<ҧOom۶uE5O-mڴ7R}ZO=Ekkx-cƌVfMw?^zVvm˜9sxY    @ <6x`w\???yy֭<:wOsB@@b,@o@@# 4i]|9ĉ&Gfͬwޮ` e@ p]h5n8J7lЅrMŵcܹcYfu-Z<!@@@@@íO> *d;vprY$;>SH (ܹs>ר͛7N:YVb$z!7GB6l=3r !CUH~0(  __-z̙pU|y{G\~ߺn:ow+80uzUf*zDC@@@H ,0?3b|{2eʸ;vh'OX 3cǎٸqLv]Z=r>Y)K 00֮] ]z]x1\֯_߽͛7l@@@@@ ܳ#FpR ӧ}0~r6mZ2eN   \M.\  @8~3ƅ߿K.mֳgO˟?vV @ԬY(K*Q.]zu۰a&[d7VP z̙ӽ?      Gѣ O?d^HwܱKߩSٳg}6cƌ֢E SAۖ-[ޓ'bx'O4I?Sݽ{ TQB ˱@Hںu-\-˗/7)0VZ.YfwԩS5^w1U˲eSp 4pK5Lh    C@&Lp3m4{b|a'N.]}@ 7ntos̙3>jt (ೝ t/qΝ+Vد!Dɒ%C/^*mCB'&[h{o& XVt]ׂ{.HwHyf2Ú23I~f=> xEΚ5Kܹc5bhA4oE2(  VreәT4mڴXw.^(yK.?8c 4վ+їV)      @O?$ 23|}}.@@_hܵkI/|jۘEhB:udj"$  'ϟ_tE92N>CӶݻW" "p]ټy%ɓ'_:ŋ[֩S'Q:uʒWڗojժ=oJ* J~8    x &[oe %K:OmH!wլ]uֱ?Pƍ  Z(  { ܸqC4i&=r *$={^zɫjs |cMGcƌƏMϺ{m)Zji+z'NH%̩v… _3     $ccǎIJӧ"E QFX#^rܹ ~%9J.I ~5ok!0n80`94&uF9y!%{18/D@Y… & ٰaܹspSN-իW77n,˗7ϋVvsY%5jXVXQRLG@@@HDٽ{s 'wrUo޼@gϞӧ3gXX1ݻCw<'{CBBL_݃߿o9kkժeTR>@@@@>j֬l޼ܖ7o^dLsС,]OmٲE*T$ˤ@@@ y7y%  bĪULߕ+WJxx50Q͋ uIԀJVd*ɶMffAbTkiʳgKrJdddʔIl0 "?0 V8g7o6I&4iDe˖cS ; h@źuZ?͜9Sv괡jtoe2j(E  xĿIUt+W.ѤM6 J֬YUsٹ/>I7s`2f(5kִ$@@^^^Q    H/^^\99x`Fruə3i~aÆ н$AAA2w\wUfB>9rZp1"""ߖ_۶m[nŨCUZ5x]r@@@@!qu2$$k/?0iժ]Pȑ-Z40@@Pza# $-cǎ3f̐k׮LN7 WQ@=J,)ǏԩSEmǦK)S4UWncs_l[n5ٳV!     @:t%]ٲee޽^H$L D8y̞=|i`ۘE5hݺƬ1 O._l׿UF1/ZHڷooϛ7+q0 xuݴiIϜ9cw6(J*&~&MRJjܸiߗ_ i{@Iɓ'pB@@~̏  xݻwM)SHHH5d``I\$</^HʕM@؎H͔) k׮oZ[ՍTB@@@@@$)-Z0ҦM+RJ%ɹ2)U@͝;Wf͚%0SLii߶mۚD68x@DD4hc֫W$v=z$%J/5lv" IM@jիWD>;W^yiڴ#G\yV[ܹs[jr   $K]7,P\|$NthƄ#GʰaLӧO7 "$sdԩ… 6Xs쩳7'OZj`{cϐ!M_KA@@@@tFaI>ݚ߻wOj׮-2s5k$?w&  IKdIl@@\@b&]d<}jiҤVZYA.:%i&Ko8p㏱nʕ+'OS_u/Z(Ʀ9sK._|!ÇmA@@@@@$(py۷o隆mP@7oޔ ۷o7 %j2k{۷lٲEg@#>C+Hp5M>jժVk  / oWM_ǎ[3ERbEi֬4o\4ȾKr K-[ȍ7^:EJ >u,R\@@@@/f~-iF/^ή]ٳÇL2 n@C@lܸQ&Ol7Oڴi]v&ozbm=VٳQ_/^|>>>&Aѯ *     `O̙3yիWektRI2ꜚh2d5o2dHVL@@<[dc  "pi:uL6MBCCmF{-Y֬YmsOo> LѣG4Pݻc}ol*Fo_/@@@@@&iїBBB۶m+-J~ RL9F7h߾%ZxXXi`0-oϱ765H&^ ~ҥF@@@@@HbcǚY)RD W3A@>}*V2WXach`/MlG  N:%*U$3f 4ȩPXg}&?# UsNK߃ڥ*Gꗻ={俚X?9{EԨQC6lh~)Rث9@@@@ܻwOreOȑüļO<3JDDMp@49&9sܼyj&^njܞvIڴisEV[[nݺR~}{PBq銺    IT 88X4w?*6n:rԪU˒ 9 @f͚%^^^qk   @"7@@ i ر$;whE_Bkڴ[Zh!R~ AP5 q k.V{'gޠAL|Ν}      ԭ[73t҉O+W}0/^DpjcW_}$$ScHJ?7xCk-{Oqf>}tIԏ=*  |ݗj*Yrhܘ{FP`AK_ v.A=z$HiƍСC5lٳgݓ+_|V9@@@@8q\2dx&$$DTbҤ&Mc TGd0Y|IvZ=|2g,?K~ @N<)6m2[lI8Q]㺮 s2@@@@Ecǎk=z;HSݹsٓjQ   .@_w 1>@@rtnRT)իy1 gΜ1/s&ɓnjZ7k l >\⋸}|eˤe˖J      5kʓ'Od&O,{1@â ~5ehh͈tO.%E6u8$5 :c 3-'gɐ!Ӧy])^\vfiܸa@@ hp}MԩSv+߇wUV&;yl޼Y֯_osГ%J0hԨԮ][|||^Z     @r}K۷o7}L~~~ @xԨQ2xI )pe6mL2Ӥ:u{$5@dd俺>c}e˖55oZ]dW    @7n 0LK̙c=O3V^-[psw}'|A&   $MtD@H |r_ """&)S&WfWR K.6mژIhRݯ:N~ޫm8,X]>sGwA{      W\ʕ+˥K+쒂xI,=jӐkNv*ooo:@رcefz3f)VS;h 駟L:t;?G@&դV[&Y4`Ŀ-[ҥKǬ:Mn:vǓ*U*Vh&MH DwS@@@@,p9yD*U>蚤MjN4 md2obԩ͚&կJ*خ'@@@@%Ga&&MYfԩS'iM2 ={uYsl@@@   4p)Sdr .Gڷo/ҥ$ O?T,ZHڶm"bn=Gwy'NǦ! 2U5kf>      hڵk޽{$jԨ!7n DA ܽ{W,X 788ނ&D>ݻw7ɉҦM2@d! WnIি7uϔ3Mb/^?~\.i@@ >4Is/_n^~nK 4I5>vc sDDȑÒWgϞn=N"   IY/f~|$jZtO&p  %p=o„ rӖo_$}|@!3پ}lذ|믢̙3KݺuaÆfm^Ws    I@_~/s!],YdY§q5MvZ.A[@@@$u)-" $A?{l#J@Sٳgͼ}׿TH7N>I  `wܲeD=znþҴiSiӦ4kL؝yfYnK|ig+V&M/;n]N"   IIhѢL… q~eꫯjG@@#wܹ#+]w޽Q\9k }lڴɒ̙3/mpҸqc^zn>ҁs@@@@O"""m۶fVֵݻwK\P᭷2u yRT0u  &@_1\@@ hpH ģ ~-Z$O<}~3  @ YfwJܹq? oΜ96bs[v/ϟ?6Q@@@@@>>sN)S΄!#z}/((Hϟocx&&.TP#R@M-,)St/"3}.]Z8>:!G@&dJuV H:ԭ[oժɓǦNb8wY|ijР ԭ{g'@@@@OJիW7Sg!ׯwtYR~-[JiF@&9sIpAVR$ܹdȐ:'@G ߳ L7omZ߽俕*U"])N"   #c]۷ bŊy.-ɐ[n-+W467[!{8F   ٯ3Ti@@Ο?/ӦM)SnYDj,Yļ1$q'OJb,uApɒ%qq`˗/-ZĹܠ/-m۶:      a/Kdd ǚ/8{I;}t1KܹEuMI  ~g_bN) Z@Tp§w믿.7n0oٲżh@@lڵ&I˪U6#H"h}ݻۦM)QM> waI{СTRҼysi֬I)    %j @Liٲe湐6N1! @ 1IgϞ-=!ԿP5@G ~Ⱥu̗/&k֬ҠAK|٭I@@@@v횼XZY{{{]0:}f_n]Zʕ+')   ]~@@ Q>}*zɲqF;^y17ߔeFgHf3f̰\tY@}6m2qn$7mT_3*o,n      xΝ;M'O72l0=Dݓy晀۷o4>:vfi@  [lƍKXXw}'| 0Gr) ͛fo7.GD   H >! $}`?sL4i9rfE޽{KϞ= i ݻwӺ}dΜ9(_~wQ)UTۈ rk׮Il$j2R@@@@@W 44ԼtE3FɊ+$UT;hF #v@k  !p9K;vHDD͸g.mڴ15>+=wժU&XIWt>M655S|-ks    ڵk'/6ͮ_^4h.4ɓ'%]tvX4 &}&LMԪU$׹C1sIC@CCBBzի/^؝\ɒ%ͺ-֬Y%    U`ƌhhl J۶m=墾#<{L :4Ly"   ׍8 @@qquڵ2ydY|Y5!CСGt='.3f4~鹮]ٳMgJBVhѢ\%}wGB:@IDAT     q{ԨQC;fnTl޼Y|||HbW\3gDG]9K.&ɯ& ^@j_-w_"Eľx`]KѢEѣ"%! II@{hÆ >稉q[lij\MEuؽ{I{~:dw)S4uN势    @ ˔+W.&w*^^^1jɓ'fO&5=R쌂 t?&*`>zO/~ KnݺebY|~~5ZÆ yҬY3ɓ'zD@@@H/Rn:O>l߾]*T8q^5N@ͨtyٲe9   @2 o23]@@ :uJL"ӦM˗/LZj&oNLJ @ ۷O*Wl .c֭bp5Ѡ*}|yIǎ"     >}jK[Z4Ν;%{..p?0Gh*MIFZje6iD41@ n'N0=zdn={t9nģÇXb}_VMƣ%nA@HMW^-?`ֺVk_KL_WJM_MEx{{۫9@@@@'N4{O{}TbӧL4am /DAAA2n89vU5}1C  ׷ *HٿY{C5Mk-Z0q4I @@@@ qzik7o^ٻwɓ'q&#Fd̘$C.[a   @r or3g@@ hPɓe۶m6͕+ /si0H  [cM1cȠAb{U R_ȃ+V@^~(~#-@@@@@p@xxtA-[fz͙3I[pap&5kܺufPG 3g @ <{>|_~2a„ݜZÆ #GV4qҥK"# $u'OĿ޽{6SĿZ6k̭IppIf9}|Dl\4oƍn=N"   Slݺ4 ֍&۷i~!C8mB@ 6[l5xby-HjRL2Y]p;wdݺu׮]}٥iӦ&+.'@@@@ >zɎ;L_*U2ӥKݽHҥ̝; @&֠   !@PO@@„&7o<|ЪTR Wx{{[]@^dڴi={L0ߵk9!^^^18ի;wnӞ.nܸam     N@KI ,0f̘ɬPAO$͛7eƌ2uT9th^}U4/00P)bs qxwEfk)]y)/>>VoOw.Ǐ˗/݋c}wvڢ[j% Yc@@@@a/^ݯ/.‘E=4i&[#-@b-p0a|}2dnݺĿʕ j|߾}b YrH2ԨQòB#   qTZUΝ;g:С"E v?}Tԩ#[K*ULl w @@!@xq   hKM9emVT)7{69EDr I:ɛ7*! *ǏAAAD Q}ȑC+ou @b IppIO:ew8h$mԨحI@@@@ Y<0i\nݺ%$‘#Gz3#Fȧ~f@@@HI?-Ɗ $s]L"ӦM"I"ԩS$m߾=`ظq4hk5m|PzeBL/eYLXLE@@@@@H4H ONZ,Y"M65IM޽{2{lsZjU\n. .xhcNJ&^M%}|F-p Opٲek.J(}iҤz)/MA@@@pѣeȐ!ѴiJppT\ٱxhkn>z˯[l顳a   $ğcF@Gd2i$پ}/={4 *ds kf 2Av̙E/^\?fb}ߚ5k,A{=c}/@@@@@@ qeRATdѢE&W⌈^ppt'O:Q^޽QF( 7n 0t3gN9|ȑù_?zvd t  M9sŋ6B@@tElPK߭[3fI>4nX4>ҽ@@@@>coLQ4#&m޼irذam! hm۶ .y&_D b ;ֽĚ{rJYdYnTRI }ҺukyWu: @@@Q 22R ,(.\0{\6Ϝ9!I)5 q=?^BCC͒%W $  Ϟ=-[Ŀ˗//&Twڶm+*U2V$    h lg4ǚ"f~TE޽{%s   N ٯӉ@@ 7nܐӧ@mK>}H``_ @ >>r=!QÉi@@@@@ydMG  LÇ&9ٳe{c7x$ w4@ 4@kbNKv&Ν;MN    @رcԨQLYf@]v*LFˑ#GDMP@47tRg֭V$sСZUpu%KÇ*o޼w^SLn=N"   \@cW\ĐZgǏgJK&M:51c'@@p~J   ֭3 ~-[fW:wlVZ5R p@hhϟ4ڰaC{+=ܽ{WdbnEA fI.\h҄%JpE     qwlRmfJ.,X@4 &O8sI8uT|TRH!Փ7|Sڵk'iҤ >sLŋ_UWGJEe̘QN<)rrE  @nݺej`yսRƍĿZrVǁcΝYEŋ63jժIg8  @@@H>fAAAkrcǎIԩѣG$ s0 "Z&YٳgVɐ!CL%wpWgϚĿ/6k1LuYf]/յ ?] @@@R@%W^]4QFrԅ RJI#Gz  Ldt@@w@SL {%aլYرO:'@W hЪۛ.?/ݽ/ϛ7_]E%wo?vK @@@@@@ץI&rs5SL|rѵS (S6i$ٲeDFFZM#_|ҫW/ӧ*T طoM]v]5 qFӝq6l@@%Ah03fÇm5w.u///:xBᄄ:YW*W,GNW_Ws    D"""̻׮]iӊ{ʘ1Cg&2d0ʕ hMA@ hYƍ'W\VΜ96_r岺 n΃&ݰaM"sh$%ҥKn`<    ̛7O̸RL)k֬8c@gΜ)]vM'  $&4D@Aɓ' 3_7wҳgOȷhѢ0dƀ ;rHyٲeҲex˜:uJ^us``h]W߰aCeԨQ>@@@@@@ Ν3~O.ҥKM6… o&iҤqYt  @Byej\|G}}6ġC,ou{jժ&T$p@@@@w۷o/ ,p>,WKͳwB $&"Є #$$j4S6އ "+V >իWĿ+V 3C ҴiS>>>6u8    ||W k֬~)X <#0vX8pH.رC5@@@Y$u," Xt@Κ5Kݻg9RL)͛77|S5kF _+@]֭+[l1ùz̙3CӀW˗72nܸxܹ#0Zjf2.S@@@@@#k.iݺܸqtP@Y~xZЪ<~$阥Xbf_@Ϟ=EYS@K@= J*fOrE %Kʙ3gLw-mۺk@@@/^0{g̘a޿ߦի П)S&|ĉf^6CM"DɓǦ'@@@@kGL9&rtݺu3~72l0GwA{ Ԥ .ϟ[z{ڵkGl&+@]={&֭3|rѸG1KڴiQFfme˖1cƘU8F@@@M8+V0Vjr[HeĉPB&r,YA@@.@_   ܾ}[fΜi^Ė1KťO>ңG%͌. taSi=|P4Ν;E_{rs"ELpӋE@@@@@ ̞=[z-FK%dڵ?~Ds8Gȑ# ~O.ݳDפ:ud֨Q #uV[DFF8 U?86m䪮@@ <}T-[fY&0nӦI۰aCrxӧe޼y2w\9|M:}&χ4oΜ9mp@@@pt&_ivʕҬY3GwA{ @hh;ͼuu_~5kVk *nj2%Kȍ7lMѴiSE!C:@@@@ƏRf)lk׵kזݻwkSHaS   @BH=E@Є7n4 ~uSeT@J2*oT˨k|GUرcRti3< 45 uҨQ#/HP{qs&ޣAʔ)۩     >ؠA9sf9> ?6\Əoy-8˕+'ݻoK|Fp3GIٲeٳfdFlwܑ"E۷MbK]?!  *k׮Ɍ3dڴirn+xW^RX1~BGi_M{cM[Nڵo^xSc@@@|h=f4hPr"x\CCCOnܸah /@@@ >^{@@./GC… %z_8q\zU&O,$gpw={XXjU~QETTݾ},     еnݺY%ĨW&Ʌ~ Ç#{J^}1<( o<pa,~kժ%K0bW;@$u)?! P gΜ>_ٿW^ҥK7ߘ5k4I9TtX"iM'xlڴI+jѶm[?h    xٳ-ܹ峣?D%5%ѯqi@#4>W?rlܸQZj%^^:TƏ/%K45q&ooo[㏢Xn*4kQqرcGɞ=tE/^l..@@@@ PD 2eeرr?˗O̙#IIXfMr&a   S.M" $q @d4iW9robT~ۼ 6!E_bڵib. e];?SB½      G/Jd޽N w߉PEA4Xܹse„ V}ƪI'ݻw'o @ؼyԯ__uMڮI .џ={+ ɓ'%o޼.럎@@HlpYbL:UV^-zh" \+U|lIN>m33ĿA K69   n!H4ģG$[lrI*ɔ)YˬV.L *p sr}iT\Y>i߾=ۭd8@Oui޼ypBqͰڵkg6i.69   $QaÆȑ#r-No壏>2Yf56 @@p~H#  @Рwƌrm&MH>}e˖Ny1˪C@TPA~2xE@<'ʨQ… V=jCX&>>>V8@7iܸlܸ̱z9JT2mʒ%K-+V۷Kڴiu@@@$I@@WhGd>k&o^$O<69xǏ%SLs)WIй=Z b߭]tIhqDr I& <,Ɖ     Yŋ&y݈#D?k)\h] .aaaƍ`a/_jդվ69 9~2SlڴIRH ܹSEr-tԩSBpQ  ܹsѣGV`CڵzKjժeuS} .}_%f)T"Eļ1   $@NDjsH4y&2fM   h,y/U̙3o-d8@Os6lٳgŋMw34~S׮]dɒ1/s   $)7o&p႙eԨQIjRJ}Um7ߔ_~%q   ` ٯ  1mfF WO<.]:СI[vm{ `T ~Ʉ 7|#igɒ%Һu4Ռ3-/.S@@@@@ /KibuYҵSѢ ϟǛ$2ׯ_R s&Lʕq ۷o7{!"##E9rD4+޽t{1tO@@>|(s1tٳ(Q<ѣdɒ'x왬Z$]b<}fժU3I}X!  x>>>ݻwzw%[l?~\*y54iH۶meԩSaÆWw)_L0:Ȳe$<<Ӧx@@@xMtv휖W9b") Wuʕ+͚gZD-[V4i"6lppWiӊ.ZH4N&jѵE}O#:tH}ɟ?7sLyQe#   IB@cK32}gɓt2qD Aرcc>   H?%>7r  @kך˗/ϟ[M.k֬ҭ[7(F7nS@"ЩS'00wMN    (гgOZǮ1H=q*dܸq%JHHHdȐ   $&3D@ h>BG ;*R* "UAA(J@])R"%{ϵ7?C a&s.`9gLSӧ *7~YAb@Lɓ]7BCCpJy-I4hwm[@A@@@@@رC4̮] ٳMIk# D&ϟ/hѾ=VZIPPb@on`ݿ_ŋg ͛7ZG8rHԩiRJbŊhm@@&{7,,ah:Yo^~8aE~h?\:#   7o&gٳŋ)>* Q[jrQҧO/;v4sH%K氏@<(f2cǎEBtaÆҬY3ipl@@@@X'oK*%w6cӧOuO;wW^E#O6,@@@yHb x^d^pL4IVZ%=rQڴiDD 5kV} I@AN |f _oi)-9s:穤`&@8q$<<\$HOȖ-\tm})\ptv@@J3g7N6mi+V:;$<u^b 3{ѢE/:/2zS@@@@9sΕT֦M qNOEc`fλ6lb OZjժw}'ϟI&벶1hMƤO^>3ٿm7    Vիg[tɻŰyG@uʆ LZjYGeذa^B-/#g8Ǜ{?7n\c\4iҘ9+VMNA@@@}zLL>MCA@@@-ҥ *of*}h.7o6mTM]=@@@@@>>. t钙3f shrKx;LoV4 lٲҲeK[$Hݬ#   1J@N ת^z&?Aꤛ:>^ҼysMݡY@@@zF@@' d3gʤId޽)\hFI#g h`)RȵkL_MRT)믿W4;ʝ;w$iҤ&U|dm"     qgϞ5/Νk=~&UE)DEip&fjQ林NV@b N:fiӦ}щpaɛ7ܻwO$I"Gm!  ?G5x4իWLd";vs=5zLǺsH)Th_}il@@@@z޼yիWK XcU|~Wqd˖M^#@O <<\ƍ'Çs944o->>>XA}$k֬Rre;wC2eܹs2vX!/n@믿ɖ a„VXdZ4qmD@@@@@ >>BM;|pɞ=~7C,VyFѤJzlۊ)"!!!xB``@@@˗/7~uڕ~ ^a+H ?nMPBVG|`%3F"""}, .t"?C6m*14&&M&y9@@@@ & ԬYS:vhtmWu7&}iذoܸ! 4{+  &@_. ^`^dΜYz-'N@tg}f&I]L ,@شiu}@'k ,ؒ$JjySK(aUek@@@@@&NTZϛų6i*\**͚539V/ƍ3I5&  `عsU 45Qw.=2Mkĉ  "~5렶gP@@@z}Vj׮m[t;~]FK DIOׯo/YD^u{աCkr5k  7ϼiӦٳgeرRHkX fҤIRxq)YL2     nKbL78 m۶uwbL#G9sl޼YzcFG@@@ O]u̙3GƏ/6m4 Mt }]Da   ܻwORJ%aaa,Y25k&ӧO7sn@$_5}X*0she@knjjׯ;+yҴiSiӦΝa+    @t 9rD-j]Ø:uX㯾ܽ{_r,,>   H$! nЀ!3 ]˒%|x[GKے$Iϟ_vjv ^xqټyS~t|LDDȑC<3tPw 'O`9~C3/lRڷo/2dp   ̘1r咝;w%믿.ެYLB:  L \,{udtSNҪU+3aw'M;sL wI4ix[n-LA@@@ 6,_\VjڨQ#{~.%J-[:2An@@ z]]Ν;<aF7o\vjbdٶx~_ƍ3a[ LZj>EA@@@!0g_iZdȐt9^x.#*MؠA#ԇz!uWuzc>~1B-[&n+oZjҩS'$gw@{ܹs2ŋ֭[M7ɰE@@ lܸ_h<|Ъ7a„ҲeKڵ`5k֘:;`^Æ x    7wMJuEthǏ,Y6j֬) .ti{T 8 >$yڶ' 4/Rrm; uW^5Ϩ?^80>}^zGIɒ%   R@EA9r+ tsHHicOG@@@ H}ִ 8_^4TuþĉKMRJ9c@vΝR@5xY+UڵEں̘1C6mj0h ֭;C    M@n޼Y>'N3̃,X u1U-ZTlV.@@,pA2du7z/@ou'vxӧEr3@.\pQTm۶谏@@@l^rj$ѣ˗ W1cȢE̜N1jLAM{&    سgիY&v<7o^;D@@ oY  /_3gʄ "U%KJ˖-M_ KA~M2 Ԣp²i&/4   %@_@@5(z͚5fݏ?(wqh(EAVZI v|3{72mYsץAv'O.Lƌĉ]'     """dݺu믿ʕ+-2azèF.]iӦ<7    @LرchWTf@@@@\|Y ,(gϞ5 2uvJ^'/YhgvZ)]#  H,IA@x,[L&Nh>>N&oΜ91Ca_| 8J'D:k֬+괭;(ӵkWћZ,Y"իWr]    ofhb+ۃG'Ihz u륉N8)@Qdg3w۲.wqFdE?5M(gg h3fȰa\vڙW@@>V@xQs믿hQ:ʔ)d}7dʕQ@@@nܸ!!!!&XKI&MgϞ5kVk,ܺuKOn8paXz}cǎ`)   @Lӧtk̘1$IbfϞ]:&@$pm?9sơW^y ^(p)W9@&oÆ %^xXA@@@^D`RR%KA;lذA-"Uz͹zݺ{f<:]'Nk@@@@ $g" ɓ'ENmm A[haHǍa?+ 1G@MG-PHڴi9M[F Sg߾}GN?*͙3GׯoN̓/Qs@@@@nMb +W< Yd1ja+/>M|qфcǎɽ{s4ߖ]&L)on%ݽ{;Zti^zB' /^ l:vXj̓'t$1Ѥ@-p9ə3h2-M˗o\rѣGͱׯ'T@@[͛l^|l8qy_JL޲ׯ-[&CUV9 K=l\3̐!>V@@@)Ŋm۶htҹk:PzjY,\m WΝ;&^נADcw}CYFR@j‘#GZs0mM:|Ҷm[   /,矋^բυabI\\9Yny&L0@@b~c@@48q $C% @$3gv  @Пɓ'pI? ϛ7O4 '8Cf˖ԡw@@@@,E]~=RW5bʕZjA^l׿"Фa'NMZz< >6mZXK;80ʕ+MrM VT ( kזƍIǰ g۷O &3g 8f_*T ]tիXF@IL:tѣG;gkڴifǖ/_r   x5j 2D^j 6^xҪU+ٳJM o~~Fܸq~gIiȌ@@@4oƌ(/.7o-YDg-_|?Zڥ@pҹGcǎ9tHj;lgF}?g֯_0ĤI:uMLA@@@^D@˖.]ںܦM y*\N]`A9Z4N^   s 8@b5oD"{9rJkٳ5`["`Mk{i`]Κ5$K7n~$=|+W_w}׼HD&6:Q`2tPYtD>SI$ݛ>^S:uܺuahzG+8lg@@@wG}d۷\b%tsNiYM/?3g3J8qNN?pټyIAIu…;%M\|yܻf͚:uǎ` ܻwO̙cl߾ݡrMتU+{,4 XZjl27|c'V?c 86"  *~5&_J۶m-4I_/_a[EuSʕ+gmc@@@T\4k.ɟ?tYf]k … GK4 1O@#={_8+J߾}^s  6qA___St]-j;    \&L֭[s4#9cO?w}W,X   b# ؽ{I;sLr 0VZҢE a?+ %A'Nh:vZ)SlI͛g8(T `)    4й^;v>}ڡ@G5mTt2~Vxk׮%eŋR1~~~.]:ɔ)W+C ?59-EDj%gG+ޛ}W3D\-Ǐ/#F3g84ɾ;u$AAA8qb}  jM[reӌNڿďF_k͛W}'M$6l;wnWȧL2~6 x@BdΝ'N39a„NH߾}W^%KN e…&1/DŽn@@@@X&*GNn߾0z?7nl:d' \~)ɧiH(II&MI:K%Kb>zqW;v,&:hG 6I~5+ώp@`8#GHpJ*%]tڵkt: a {o"E9ړٳgK ҩo|O+V(VrK?h@@D겶+I$w={v9tn@@ \^H'ԪU$-P@,Wb ['}aĈ<ؗJ*eʔ2    TMfIm5 &H˖-zNl٩:dɒɮ]$C e@@Hk" n[ĉMp [D6V@@كp¢IE\Q>s4hz͚5R|yW4uj ʕ+˟N@@@@@ O-[P `Goᰏ!p]9qC[Mjl~n/,)RJ<8qbD¶&uf;wȭ[$,,L^j^ܹs/ )QhU}̙yX&B "ӧOo+;f͚&oҥmyG@-{YfmjӦMNY4S~7)Wܳq   ;DZ/]a&kv|Xϙ3G/{umݻ(a'+   8QaÆwߙɓ'%SLwyG4`2@x\@Ϙ1$չsիgΝ۶w@YS8V}xV={+of@@@Wŋ>zؾ}dϞ_M;7o.ӦM3C&fwl+  $u` @bkoI&=1cBLF̦ x.:QYK6m$$$,;?:u#Gj7nh8֗&MѤ /\|9p    ,zjw͚5hbӠ i߾dΜa+dMA2u) O63gΘpAi Hܸq^œ8q51ۣG޽{!o6ﺬ8hr%7/M 3;6o,4_F?~|iҤtի; @{d Φʖ-떎ko Ejo    =K.uV*ݶm[V:{kk ,0ICCCYX1۷TVa;+   8C*U*z΋/Zs͜QX|TZg9shR~y뭷Lw>Sa„&p.]>&:֠_CPn֠As_.K,    <#G${2eXw\g*U* iӦ3g8J@@X,ϱ :TF)7nܰ$'N,;vO?TRHamgfȬYLGZC讹VgX@@@@%p= ۶m3ڵ|71̪UDc?zHݻ%SL"  @4 Fc[4 T@/pN@>}zы~SL)c7nL_~"TxƍDW[nY[1aA͘1P`P@@@@"l&Nh 6J`-ٳGԩCRŨr 3 hO>D歷26l jw3r  ljAAAnK8PL޽mw@@@Eu%00дK)P,]}pg&k6md͚tG͞=[r-;w   9/:[F k9:t>&բk)  h"~ɱcLb_[lM;`ɒ%m@/'M65qǏ/2d0}ɓ$B}/    rqʌ3$~Cʟv=7xCZjeל[l ݦ   :*@@.\AI97ߔsZA5HoŊͤ2 ;dɕ+{;L 1J`ӦMVJ*e-b!""Tl7-]NT,Q95<<\8j8@@@@  ܹSJ.m&_rH$LY?r䈴o^ĉ: =*[6..CiҤ* RZlYWw@pQ 6u%H@zzRIhh,_ܜIիj8@@>'SN}CIG~O8>(Q$ tݻ2bɖ-y6wD@@@'dI(  RL)}壏>b\v̿ʞ=Ƚ{$ 1V@h"SJe?Gm/WHc?B:   @ ˗OZJӦMn?!C믿ɓ@@@H͟.cC@=z$+Vu Xkr``tXj/^>>RreԩSu@Љ۶m3wFʔ)Pl%ՠ1(Q͛e@@@@xELaÆYkе5k֘ҥ{C@l"(P@[y/Yd_eĈ!Cj@p dرi65Ӓ:uji֬Y?   ;gI͚5KLW¤uRlYO~$IH߾}ҪU++Q ŋ[\F@@Wj+AAAruj~>|M,^XX@@v7! 9sFL"'OLW*W,Z~[ĉq :t0=z쪞%O\4JܹTWzs)2AyDA@@@bʕ+?SNY%K,6@pdCҥO?#H0>V@D .H̙ۢێ;&RrP.^(2e2}I,ShhUwoH˖-,  W\3ХK&ٯv N8ұcG@@@g?/Z9M76/cǎgʣgҵkW:ӧQFRlYD@@@'tRkUVkAh"=-H KG4h ` 4] :+{ҳgO~H @ ԯ_%KH͚5M޽{ɓ'qO^te;@^D@':tTƍ"s#""c&Lh-ǴƴO    1C@55ƥI/_.zO 3ݻ'SL\rIfdVz/c…sNiذ!,@I`ԨQr 3$Mʔ:uj o̙r%~zO@@@ *M6I>}W36 JҤIo1},[?H"ҽ{wum3   @>pjբ}ĚLVHk@)qgڷo/GZ$IbsMׯd͚U.wqg7i H=̳L&FעZ͛[sKC4   n*U2}<~[S aÆYiݺl@@xzG@<ӧO3g5jO?$<0d6I~+ɐ! #x d+J->yъ5X>ֲy@@@@<\ɜ>#{ͫjo׮#M;qDə3hbãGZ=+_Xػ*++U)PDAA@.*XJ (ir) RtI &&Ut I }/{I~=;sff3g&w m7n-M|K1>>,P wquyE@@:l0{7|Snܸa.Ǎg#  mO|@p33gΘqW)䫅i1_ݦEO8aȓ'e@8 * 3Zryk8I6cG'PkݻwcĄ    SLnv13>xb3޵y@|@@ ^ ,(:tDڵe۶mj*Th" "n2 D.;2rH;~m   RKhh.\ؤLҲeK~vqIFk>s%KO\ /]TN<)}ܹsCĀ d~IIAߤ    !ԩc/שS'ټyϟߵW@[@=Z (`߹)رc|wi @||Y̕::vX;>d"X:   ӧS7|#3g698qBVz3H6Ir!s0,,Lʖ-+۷o',   DZcL*Ut%{ȧN(3nѢE}|D@D@# :'Z[\\|RHӧ2"!PbEپ} 2DLzf͚ҪU+|GA    poO?ԦMyW;)S_Z @@<_w<3$@I+V ^`"O1͛\Pԇm,Y"?C 2fٲe/^E~({n h@@@Y`͚5g}sa;~-@0O?ȑ#%s&z3GIBdaY. poZĦW^o>V=xƌ( ,    kNz)?,} rINzql  "@_w$@ЅwuRiN:f]R[|wr ׯΝ2$\@opد`siӺn[Ll72NB@@@HuI ĵxZEj*q, >+!~ϟǸx"M41!.\(KY#G@%0|pWW}]w3}tqshݺKΉ0@@H6ywޢ/K]pi޽ ";w4τJʄ˗// 0%V@@@7;֨QN]UtM$TN ,ݺuǏWYΙbJ˗;")EyĩSyne˖r @@@@ t)Sĵѣ%,,,G4H{1U믿@@TbJ  5jd.GN:ew˓'YɓЯ¿4@MUWOL"##0vvMTqqqc7@@@@C@ 8=s%KJxxT\91N9@|T **JF% ={.Ң-EҬY3ٷơ7,`D ]۷o7m~r'L`;v옜3   ^裏dҥ%KѣGE ~嗎ZaҥMo6*U$wfr*FE@@7}fX/i˜9s=cQH"6?# '[9R~'iڴf.س>+w *믛6nئ8{l)Qϭ@@@CPB2`ދ~7֭[ޑd>}zu&׮]?A@@د}fD @ \xQ " ZjɢE$&&ġ Y‚~h_]A@pWٿ TR.]d S*w!   x~*Ozd֭/_>K@E ::ZƏo;r%3-x饗=sJœ%A@SƎkCߡZdשrJ9~FN}  N ԩSGv)&޺ukܹ:cIXXyf,UT&_CƍX\    p}իq9r[hQۧ x@o1TTɦvZ)[r >̟?_f͚%Z ]۹szmڴ7nxc   O ʕ3zZ˂& /H wް    83փ@_^6m*y>@N8aϝ;l[t}: .4Zd)$$$¼C=l@z4    zGҳgO]׮]eŒ>}z  }L#pEMYf-[:oA@@|I _|yfСM>ڵknJGOBCCu^ߩS'(K|<@@@5D\Fn>|،-[6ɒ%Kπ  @R TXQl"͓ dԩRH:tDGG'upTErScʔ)$۶m    h] s )0i$uɽM6䜂YVXabVuτ@@@H:L0AMfm͚5RB9rslٲsNҥu`m˗/RJɪU|΃@@@OﵮT߈9{ C@@ohҤǏ4h }: xS~###- ˔)c җ/_#x@@@@1c UzrЉ@aYfI``k\^zxͼ" د)SJǎ^ɷiĉ!:H,p5j+VLU&s]cɟ?y! bYd… '[*VWaOxxA@@@<U,[p/X@Ay  Ѕ6͛'%K_~,::3^}Rtif^@@/  6yI/ iҤbrsv@@0ʕ+Χv-ᅴSLL/ܚ5k֭kN׏?Syꩧ̳h7gB@@H -mNŔjC)R  .-[6SaϞ=]mӦMf}_%s+ M 6H~U|%K)UrA@@@ԩSJ*էO9u9g)SI&)}@@Wb I&꫒;wnyw·ayٳYwҸqcы4@Aĉr%J 썮b=Pr c+WΞcO@@@@?`Ϙ1ZJׯY- x}6իCXrYhʾA@V`„ vΝ;۾ŋofnҤ4@@@ Z@tSȑ#vE>@@W/n뮿dRpasr:uJ֮]kBйw`l@@pw???>|9RMBQQQ~W\9ٹs4h'-V'ٸ@@@t>͎O<<P*/zo ֵkW9z[2eJqIiڴT^5|ي@2e$͓KԩM?)S<}   /!C7nMT^z]O>۷o۟   { P׽?C@Aɓ'J˗iӦ͛7t1ޙ3gٳgeĈRH@Y 44Ԥ*B<د: .ș3g@@@@@ƍRV-Яnr( #w6~V*[lY)K.m۶I͚5v:  pf.]:y$x1"Lx [*T   tMfϞm^x A@tf$W\Ү];ٵk=iLSN~ٴiY0M4}: x@TTJm %gy}w︊j.!   @ddԩShE?Я.AC@;&/hQ_-jO<,X@va /0w\~9}dx>}9bjݺ@@@h޼X~E;Hܝ{'k֬ٳ7=jZt;   @h8Wssƍ&"EB@@ +Wʷ~+ 4[ccc>iɢh TPAv)5j0HW_hoK|@@@zznvڴiqF'>ǫmРAr̙;@@@ (!  X_~)+V4 O4>ܢ-_̳gرcx2" :֭[&dCgZڴi]]دD   %7iD6olS.~@:]v(Zx0>>/_>/d߾}ҨQq$@@~tEWk߾U_~1cשSGrH   x@eÆ 崅ʳ>+W^Ԕ%n-.?reȑr~N   pW_]pk.^zȾO@_w~<#د|T   zhF#cƌKPP: +Wޓ… Ԃy3f9rDZj%)R0؀ "aaa eʔe>ЩSړ曶O@@@ ZV 'UmZg˗/'$^g|d˖-Ҽys]\\Ym۶MJ   [ \vMvib*Yh$~g\@D4i/7T-l ]ʕW^st@oW(ϷCCCEڳg7H   @RJ&_L^p9oڟ@@@yVs3 @,p-;wTVMerU{.>qD3sҤIRti@|]](~\$gΜ?;v1#   *ХK5k /mڴwq]?,B>H ( Æ H4h?~\:w,Sv0JF@{ kfNt\b;:7N:N   Wh$-#GϮ]zw=czrΜ9ҿ{?O[v@@@شiƚZ%NG-jt@@\ wY!5+ѿ>ѵh 7 4jH6o,y5i>}:_d7I.   xLON  Ewӧ\v.z!?|ᇒ>}@@ۙ3gҤI#-Zs$_]e˖'i   /OƍE׶w^SDDDI~&UVIժU… ^!i   )?~iwsgB 9c" +PJٱcL8Qfj?t%JNCI@ KHHIKj` @@@K.Y@=z={VOn'"  ߗY צH_###X788Zh    { ?^oiӦIݺu+HApL ..NK)Rt=b~m۶]Dsذa%Kbd`@|E`ŊrE /_Wa W^񕏁<@@@$k6l9rqm& 4$N޼ys]vIJرc>1"  )i&sֹsv2F@Kʕe֭㏛,N8!ZljϞ=#  )6رWX1ɖ-cjA&M7&  sƍ;wJժUI.\(2tPuNd4iW_}%zi 4HڴiW+B@@@ &}]rW;e˖7|Ӥ} y#  uO@|J@YF7n,~ə3g.^'uۜ9s䩧A@p-N{I'-W }:     ڵ, iݻt٠@-駟zɁlLk6:܃… t@@ ^*˖-3ʕKj֬3gδ+O@@@ qJ,)˗/tҙm۶M{Y-j *UdrEܝ="B!~M.E1 111F_ׯ/+VǏ ٳg!RE@ mfOt߀td" 4jXO 8@@@@8w)਋phkѢ|G^/!$L@CN*T0 7TDҥ]yE@dX`ܺuˌؼys9Nsu3NIC@@H|xbI&9iD):*Wl8]fm4@@@شi=~=jc)TA@xpW^yE:$;w>,>[~3 n ЩS'}ԭ[Wn޼   Q$cƌfSʖ-[jwx/k֬2p@k||ƫ4@@p/A4 >"_~eɓ'r1y\o߾rICZϾO@M@ݹs9H"7Ĉ-mڴ=|lΣ8($    '~ի'6tl] tEozod…A'AA@GfϞm3wݻEsSO[!  $.W_zm&huL2ɚ5kL_?:uڵk=+E@@T].\M @\-1fٱcsFsˋ+&Ç۷o6x@ӦMeʕbڵͽFM@@@9sl2Ղ۷u@bD0/t_@@@g(;"7dĉRT)R:@IDAT̚5KQ,X@N:% 0}@Ht]vITT9oHHH?!'yz_M$<}dϞݜ?w}WJ.D O?-k֬L2yNØ    @-ll޿92GznfWhM  ~ @/سgo^r%;v}Le&=z#GիQF2eJ>@xpm۶ٓTXCf,@@@@{=YdIRF_l=' o bSN]wvAtI~D[]- ̝;WL-ZpZw{,;   oݻwuVJS2n=zb  $~~~Һuk{"ſ=xTVܯ_dlN$@eڵ%K3֭[Frڵ q@@@@ZID j0`:u}u[׳.\Ay_d   P׃?iBM6۷o'rTR7|#3GDDݳgd@   { l޼.j78q}衇$gΜD  dʔIƏ/:gB `ƌy)SH||N4]k={vzXXo|;|.]|&Jt`v3f}=@@H&3 >\ңGɓ'rgq 2H[l_~YҤI#2 sǺ}% $22Ҏ~ӥK'O}~0{"  @ P7Iy99 /C%-5kJѢEeĈrezPPL8QΝ;'&LDC@8>} ,3 ~5%5vm24@@@@45j$Lm۶ Z yRBٸqMbŊyf3gA+@@=H5muU;j9w,F@@|U [lm4i 1cϾykA Hʕ[/^5j>@C@@HΝ;RD{ޮ"K N8%  ⾇W^yE1p^͛v;@/.WL2:4@@@p? 2Ȱal`;wFSgn23g>|H@@د}&D !Zw/_>5k$>>Ddƭ[Bx۷{Hf dt{6mZxq]~D|>N    zW_-M =~g { xE I(R)ts\<>Y@@͛gkҤ;9x}jժ%K'`L@@@ʖ-+cǎmڴ-|Dι_t,Yl{jՒ7n@   (9zS L2G%.Xt&3gF@""f̘!֭ECn߾-|ߎ˖-Kip; Y|KĶh"S% @@@0-Z}US5j{gdСA  ~ @O׮]+ׯ={ֆ^P!>|9sLft  >,pgߐ$,X:0~T@@@@{1b](G1SN}'@'AO%::裏ʄ ҨQ#ɇ@@eSNIxx!(S,XQ]6l   @۶m套^2#/^K SLj*)Pٰw^i֬F  $@SRpDrg_EC@p^Zjg0`ItI[Ycε@ ڟK,_>} 80a   $qߌ;x`tRno^dbš={\pB$@@|Nb>0 \zUF-ϚEcbb̩"` GݻK֬YgA@Dضm=M6:@k1bOˁx@@@@O>0!W_}%s@V\)AAAұcG_.z١CI2=@@) ڡ4ibNut3Wy4@@@g&M$7AlڴI>grs)zܵ`Պ+k׮n%   '~T%lߩΝ~ .T  Zo߾o> ƌ#qqqͼ"!3ȬYD֯_?9sGN   @ɒ%M6&ׯˇ~koͺ"ƭ[D@@@Y: n.}vy͢ݺuÇۈuxIYhԬYN;A@n߾-\[B${ebZt&C!   $^{i޼u.mZFI3gEp\Rvm]M5K \yE@oFŋvEٲe%o޼   "?Yhp 0,Ϳ>sٵ7N>@@@@~;fcد fsG5qݸqCv*!!!w^@@4nXnw}7dݺug:    >3N\СLҘX@@د~褌 2}t 6h_Ze޼yrizW@p#ݻwȮ>8do O.7xٱc/@@@@xɓUTNC>_ xݺu 'E:+̽~ nݺ   Tlu떴jJbbb=ZLlFJw}FS۷I&?U   "ٳg?PIϞ=}%w /sݵ  u!@S@I9z_۷@3e$]t1׮]k&LҾO@O@w5]vg߀'Cy]~Daaa|>N    ͓3g72f(gޑ- +-~*TH&M$&-~0`HHG  xb5jqe˖ԩct@@@߿)Rk.:tAYZY hk͛73gθY  M 2d #ϟ}?ҨQ#Yfh#jJ~Gپ}EAfP@pM.*Uh"##'7}W hد'Ď   *жm[r YfҲeKw @Q ,,LT"/]P_Q^## # 7nܐu֙{1)S!ׯ_71x @@@|IС ***Jڷo^A4Ÿq>ץK7@@@8rř6 >@@H:Wv-zզMf g~7M"n+ke-^X2fhb? :m%0@@@|UEd5-Z&o]D&Ѧs @@`g@! 6 SxN ]D ǛdMqիWK%<7A"G@?Xd}݊V^F@@@2d`wEիW/yG^@ҥe֣M6t@@@:d -jNu~g;4~-@@]vrAiذҥf}?] oX: uԑ~bcc套^˗/e   Ԯ][*Wl?p̙3W)L!!!7o^%""§=H@@(<"$޽{C;wnԩ 4Gʉ'dRfMщ4@PHJlߩNTT:mڴ艹;{jč   @ǎʕ+&-ZHz*>A7,Zsp,YD1 H @S@[bI.SLSO9-m6CEO@@@W@9sF :k&͛77\zUZl)  Ç-Ablߩ }:  )+W.YpGnܸaӹrGĈ|B@^U=G   G}d߿_W\im   @ P7 @ nݺ%s̑'|RdҤIv\jժ2w\9} 4H͛ Q1 $~CBB{/22nb˗PRA@@@[o5\ y;v}@8tԪUK^x9v _ѣG孷ޒ)S:$# @ l޼YȐ6[l۷oxyʿ@@@[`*U*䧟~*gϞuN̟?}ӦM2d"aX@@@}\tRUW˗x@@ q6l(vډ9Νӵ 8G @b HB+ YF|   Hk.?~dɒn + Zz\]^Ozٱ`@@@ A:2޼ySk;e̘QfϞ-Z0Je޽@   ]6?iҤ='~Ͱ=D  z~ҤIa)T **J{=X4@r)3f̰{%+     kNժU%}&+WZ  [P->@xYf4h@ ( K.S(Q,{YZxq@^;wJttIP'C\-mڴG79qGB    ӧO{9i֬06 = ɴiD /9Rn߾mΠeΛ7O֯_/%Kdz; xد]lڴ'UTq<@@@H@߾}%k֬f篾Jv !5^{Mbbb|Lt@@@ +׮]3?-Zq+Wnuah  )&+ݻw)ĭ([ 8α |XiҥK:'ؒ?'lERJR֯_/N(@@@@pႼfQFZȂ @ Rzu?!ΝӉyaÆM@@ GΟ?/˖-s.]ZT#hfuԹѡ<   `SVZIZtvoƦz?Hrt"?|O @@@ػwB &V~35~   7Ѣa}j @@@@̫W׭A˗@@L-[&իW@l/0o~zsN[zz^oPae ?pA]?n:z@@@l"(F}ǭRJr]wW\Ԍ  h5z&FS --MO. 4 N0AΟ?o07n,f͒Q r@@7nԇg\Ofj1`ڒ<    E'LP_@#l߾T\Y'l2YfoYGDDH޽Lzƾ}L  xW`޽&;4=pdddʖ-kr#@@@jժzj4hΝ[l޼Y^2dl @N )RDD(sa>@@@*ʝwީw~rȑɽuJO8!~R5e"  }z5 @/=*o*UJ/|rSwGcYhnZbl  [NBWNNSզ\|9'g.@@@@ze.{7$,,j a@#GGOnJT7_^Ǝ+ 2 @@k~y&fm63}*ULL   ~oQFY!xץxZ\gB@@|^`߾}rʙ[ԑ&&@@@@ ʕK|MIJJ(WT &! /YOkŊ2s̜N@@@@:y]mW\>:G9W\\)r͚5&&@@@ ׳M~(鯵UZUƏ/GqIʕE@nY 11}Bf   xMG0a\tkxkbzKy@@]f~@.\?X/x۠A1c ,m۶%Kȶm_{ D@k_׺p 44q/KllI]<    p}~Ԣf' @ =zTx iԨرCcسg<391 :/`ҥ:ŋKժUmQHrr#""B (`H@@@ɣVoo@?[}_zu]5kdΜ9@@@L2P;  M5VC vP*Uї/_޽{KÆ 7@ hBz!=gĉ@@@@O }Ү];'NȴiXĘʺu| F@@hs/ #P~kRD ֭lٲ$[X1߿̙37  Xj&,,L*V!2ƥK8!!!&vJ~䳶$+@@@@EX_UVM:t(! @N \zUFKpxN:vZ;ɔ @|\@};Z%O?Ӱ9va~@@@ ݻw>rH 95[oe"  طo)44T].]0?  5l6l zVX!5jп@ xL㜡CŋRe    )`̘1&PBݴiS@@@413 Ȑ9sHBGSNeԩrAOO    ^}-[˳,gbrٵk@@l*@_0]~R|yiٲ̟?_j {N+W;pv@@7VZe~p3;\xdbbo͚5u9w3g84@@@@"0sL}r,..N׿e\AȾgϞRNٴi~ZD[nҥ-~E vX`N' @|A[f-)U-r" @@@ t 6a\_6f'   K.*:0vج,%wvH@@|H^zyfJojժɜ9s]"8pk{ɹs<6#   @^z%s|`b j׮mJݸq @@@s4-##P'=RD yeβeʈ#D]2yd6  HLL4ۭٯuqJЉ~U]111F233eݺu:?    dbȐ!&&@J*W,ƍ =i͚5eժUGIXXX$,  H'OumQQQRX1[yGҥML    U5˖-80UsբVL   xG`߾}frʙ[zz~֫  ϟ_&M$oѢEuAǎ-[J׮]i/1 `kUJu3 l/!   /mڴ1Κ5K~)]EaC@@ ̀@ZZL>]>Q ު.^ Mʜ9sd޽0 KN 7((Hbccm?4u5_vI@@@:!|۶m:xys#~%"j{Lfw哑#Gʺul{_8 -Z$&Mئ2PDDm"@@@ <3zL7CGׯlĈ&&@@@ `f-kٯ%-  xGd֭nmĉzMDk!k? ;|MQ뭪mԨQrwX    'K.П(S.~   ٯGymY $‰ˊ+LA W^yEv-ϗ-ZH` b@@ Μ9cԨQCBv\)5cJJJ21    jQm[[V- E-_jU;we˖c.AAAf?  p; =6-Ra~@@@X5P>pŲaÆ?#@@'lB@IDAT@ٯP  -*~L4IϯINN HE5`C-PR%iժ2uTwOx    'uf Q~322(bŊTm4א@@|O1 qUVIǎdɒw]M-:dR|y  ֬Yc~Pѡ^y̵oHHWr i֮]@@@ oFnݪsS4i'&I@V^-kז޽{˅ t)%JYfw}σ@'pB:MɅf@@p@塇5߿_yl,(#G41   ə+W v{3w2eLL  tY7Wի2tP[ٳv c >\233}@@@EO~Af3;vL!  ghY_FG|F@5OI_|!iii: iӦ,YDm&ݻw|Lm$ HLL4PhT?3    `Gw}פ[o@O_|Q[ls^~eٹsn2" Z:%%E;U_l#FFaaavI<@@@,㏛gΜib cCPzuSML  ٯg\Ռ_~bg}V6l`r/R~L]DW_o#@@"`f/^4TvZ$ 66֌db@@@@-Z$k׮եGGGKf@>}TTI>Cs֮][֬Y#cƌ HL 'xbStƍMljR @@@)ЪU+=~o_x}`zzL8O@@@ueʔ47 )" >.΋?PҥKi۶o>^!#ze7n @@@@{͛7p9sѣK&gRf@@ rhҥKM6.xwĉ&ᘘ2eFC5_T@@dddU:ŋRJ$KҥK掿4٘ @@@@?PY[߾}[@7 8p@7So߾zdn @%K52g4BCC9   xHpC<(ׯL矗\rT_ @@euԹst ʕE)V_+""9  3#ݺu3Κ5KDȆC@5*[*!!Aa@@@nC ((H{9=:XVjժT @@<&=6<#I˸qd۶mYR {Lz)qqqY  `W;vӧuzuֵe~nLLOJJ21    o֭E˗//m۶7E<*pU;v_.\`zGp@7'iiiPѣG>!  Ŋŋ|9sHڵox?XD yGdruB   &H{38p^˥XfC@@y敏>H5k&]t_U:$<[ $sd  ^xAz%ȨQ^5!   `wj۷o_' TbFٹs @@@34+"ؿ?^>9uT܊/.ݻw] @%Dn||6 Sjn%""BnE5aC@@@U`Ĉtu񶺐 @=[nΝ;ڵk̀qN@@v 4 4\uZ~zzy {T*   8O7-E2 /V~զ؋  !o>hrLٳrI=}ҥ" @V$66Vz)YhdddȰatB@@@xgt_~~U+V~]wܡv!  hTD)p92e7Nvڕ%رn[f,q@Eٯ;VZ,ҥK&/XWը.tٯ_mjC@@@ 3FJ/_0!܂@bbtEviUJ4iԭ[#@@rR`fƍ.APPNjB   J,)7>ѦMfA%K]v.^+ O?曒!ø  }Lv&ҥK@@PKxݻEs?B T:ܹ̃nJR̓hR@@@|Vu/O.G^,wҥuS߁   ?$#"xC@]|ꫯJ%D-W]?l0@ɓFx@-p1INNضqk-8JnD<%ٳԯ_4͝; 0@7,ѯ@n&'Y.\ؖdϥjKOOY9<   ƍ*T_ bjn@@@l*`]k(vhO?);c!@@;ZjɆ 7Ϙ1Cuq ܂@||/_^?cr[x6"   ''=ԩS7xbۍZjˆ  ٯlZ0nҢE P3FΜ9ce֬Y~ӧy1@@V\iJP'usmb4ݒ~     'Ng~i~ב@͓UʸqD8%88 ֭[ĉ Z4nܹsvK|@@@< P^=ҥK=0T 4h ۹s[yER  7""|6fᮍJ,T@@ɛ7|z=… kHeȑz@ <3Pug}ݧq   xPO=8}Vim߾}V-  x@~+ yHD& W VTI7o.9YLT˖-[dɒ%Һuk r  hDvoXX/_^7nt,   U ##CƏ ^{ͭ3 /iޓO>)_Z1_|2j(@j:@@?ɮQF&SP@ΩS   xH@]SXV-=ݻσك~ꩧ́ӦM31   +O_U[\9[mٯ-^@@j=M6FQZZKZh!Ǐȶ10y?8@@@<'p}Iٲe ,Ç{n2z޽{mi   L:u*p}W_pٳٳTZti1b:tH>c^y@pʕ+MYu5jcbbKpEٺu^A@@@<"0gIIIc7o\*TypZDr2uTSf&Md۶m\ k!   %e˖4h`b;E餧˙3g   xH ..N)IIIYêsέ={@@ EFFZWofz}&  ,YR.]*3:͛'5k֔%KIZ aÆ-[`A@@@PO?Sz sd^oNRL );͜@@ rjaԅ8E@]\ cǎuB5nX^~eiٲ9qqb@@/_ 6*V(wumTZ[HH:666VTCE[+!   oҳgO \ 55Uw.98,,LO?m  vX|N;(%bŊ,XܷcΓMLLcj  xTnݺҴiSa5U]V4iqo&?@@ +W.:t4jH:u$?9rD^п0`ia|)c&3f̰#+@@@<#'8pӧg&ɨIIIE! @@ ױ/-! ;wNL"jaݻwg)'o޼O&UVw@@XnXMtm]KL~*X5֭u[@@@@;w ʗ/ŸEQ 5'N_]Μ9ci׮>WhѢf  `u>jzI``]R˒=c8p@U;o?_s  xDW_u&ǭ[mڴ~Qf؋G@@@^vk&GH%K   "ʦM䩧ȐAҥKeԩr4! U@سgOz̜9S !   @ .]Z:+W-[Zr9GNNX\9ԩSrI @@B~O ԅI^/RFK#FȡCd„ B@C 11ϵo~"Qr/jˆ   8]`=zH@@O p}Tݼk׮o%oӧ ~^@eL 64澪/   bM۷;`7UتU+sjˆ  ݚ>|X7IS4w" )PX1?u`͚5eΜ9B -uS {͛7gy   h߾/0Se˚ҸP   vuq  p-1cܹsͅ 5_~Yy O- ʕ+M&co~CBB$**J6l ;wK|Ґ    p껏?z3.Zˎ%6U6j(\/L   - ڵK^}[zNvΕ+TXQn*իW%(((;OcNŋe߾}{n(  >#~kdd]/n4l$вeKyuFs̑7|Fّ    )PX1eѢEw^}}6=pT  @L pO?${w=Kߒ%KʰaСC ~. رcA(`klc^$    N0a)[n&&@*0i$}k_ζmh{  `cV+fv#QQQ:7+y!  O@]hmVM7on7o @@@; \|YMrE*ϨH$@@w!f͒1cHܹ+V5k… olF5j׮]kD7E@@@n:t0)}&vb@_'Ԅ  `GU!'peˤM6"#Fofjd̙~ӧ@@O 11ܩWX~BvoL.X3~    8L`n:]ս+kvXܾj$ЬY3y̙3z@E5.XO  @ s@AVh[{w؎;l'!  Ok%̑*W,KũϟwfT  HII ]SٲemQgQϨH$@@Ȧ/,˗/oǏKӦMeola p-Z 333wx   onZuӧOݩu履~rjԅ  h@/_O?TaÆ2{lz.[5|{gdÆ .o۶9@@Xry~||X~CBB욢Rϟ_K_2    D`„ &nݺ@'Ojժ?`H{9پ}^$@@|D@-gm+un@@@,pwN8ab 4o\]t͟   M&f@_o37  ;dƍb5Ȑ~[_ !J645   xUpҤICjje<0yѢE%44TL_3$  ~y+ 8z 0@J,)>lڴTxq*UJ7=vU1uTIIIsa!@@'oɎ;yf^<ҥKzvj 5III&&@@@@ W_8v%_|N(@P|U&{9ٶmn|0  %'OݻjҋS{)lO[hQ{K.u    *d |8=}%w ( 6#8qBlQ@@@nWGP=ٳ=믿.G@@:(BnU ==]f̘!񺩙j蛖ɝ;tAVZ%W;dž  poLz^xŋ7&&hP    CT3KkSM,@P4o\t"Vp7o3] # o $&& Je˖2sL'k@@@l cgA ITT~ƍ2G"  ^pm[lY/duJ9:wZL8C@@w4h 6mx@֞ӧjՊ|e%s"[ے%K[@@@@iӦ:G1^LǣS*UʌA   7#!'pIyD]놾]w%6mԩSz[@@?)b ΁H55/ ~    8@`޽|r]I*U$..UQ f̘!իWAT#m۶If>@@V\iүWtItSL{   pfܹs {>P9Z g  r=|h0~.  #-* 2` R}{イuVGH p~/^| @@@@֭͸g6ӂSҡCLL  ٯ, H`Νҽ{wQ_^WRSSMQQQ2i$oСRxq  .{гfyɡ1MRD]k#)@@@@ 'QT3K6@_N:%O<lPM?C)\G 8Aʕ+|H)VOյkWYhyW_T$xJ@-8qD5k\x14a2d4m4ctcǎ{?zXW)-XTVM_l{d7;솏2_}Ӽys9vX=7˾k|'2~x[+`/ו$#S31A֭k\f @@@ =z|whpDDR"@@<&ФIY~mV֭['.\'xBV^-?%;x,9F_̞=[N>-;vxL   Y'oZ%99Yl"QQQYqfN(@@~mM2e;v)X^_#@p ̅.]d̓'%z_^xD@@@K,k12hѢ@ G{|233>@ڷo'@p:_WWpeW VPA#_lڴIj֬z1 W^{M>?[}U #\to8{ij0tPi׮\ijH|̙>ݝݻwݡ'OnppM.FZ[:u[{]y{&oJ@8v옙61A+&KիW%((({O(@@@ ofz769(Q  8UTRb ѣL3%t ?]Veܸq񊪹I&uV@c_<_ 7xCȐW_}ab@Ξ=+׿a_Wxtذa2j(ݿwaHNN֟ǎGcnѯ\}v۸q㵻}ʕ+}Wֱ漀/וs=Ȍ =#GY@PR?l߾   @N 6Ukas]4fvxE@@ '#&M'զ9U,_<'R`jkmVBn@@@@Zj-<<ܔua   ro(FB!NP |.YjԨ^  @ XL\ҥK&M|XS5kLL   Z:i;-[bܲ:wbȐ!2tPsE޼yeңG['  &~OYծ]?lᰲ)\`׮]ҩS'YnPgRB@puB…}|k_t? HffC>P#8p̝;7K}Bߝwiw]ƌ# =zTL]kƺ6V,Y"oFEyfÇSڱV݁bǵcf6mҵXKjլzYW׎^w F'lٲE/_>}jbcc͔o'@@@"~]"m @@{:t uv^{5QKO4I7l LX5W;vס&;l    }֭[f*ٳgK^3(^ٳG9@@@  ? :utI/&xcه8M 55U7uv2,~{)+V~!};6U7n, c|Tݱ}^v_;s\pݯ7f٥lһ=Gt׎| ǎ]v2Bҁ\Bg^Ө(F3@@@z8sҥ9j[D?=OD@@N}>J~ _~l \u>5Y7ovnT   <&oN T_={VΝ;Ҩ@@[p-^@ؽ{ !?СC&5kʧ~0@-j#@@j`mճB^|bb LIII&&@@@@|Ih"Z͗%grE{s(z!yWŋ:ʕ+ի7ߔ {$J  @M5mRB]Ə?ϥȎ<{%sl;qDɛ7xm۶uݕ222~8ctt! ( ]vͲ_]㐖esmc]w5?U7ݻwY;nƩɚW\toL9} <~ַ!*ƍ<[V+SNp֭Ծ  uj^;\|y9uΉff@@WuСC믿 ꇶl"1114@j[kٯ%-   UD5'O~Rnj=r䈛Gg8@@/+ J-D-BGɅ tꤨVZҥK O? " vf Dɓ-66֌} A    fΜi=t J2jSvmL(   8ٯjX>ㆆWaҤI2x`zEHu_~ENڵ5 CeoQ sϝ;gշi~[t,Q~F'NXwr %333M?Z‰~ "%K7xC8`|)r/nW`ƌf~.~+Q;ju @JP^% "MT `CQlXEEUPA\UB j(! I;B$s^qm<}$3sy@@ĺy&MN'Elu޽*  AdժU`ȑ#ֽƍ 1 @hؓ_>4(@@@pꬬ,5kK.|$-{"  PGc@U˚+oLJ=CL>]z媱,  *dʕ{X_{!7!yӢ P@@@@7 |&l * D:]w%C cǎY#_̛7O^}U ϸ3@(@RRudXXW(hhҤIG ~i  ~;wkx|=֭[{sI<畑   @<\AP7g(   _ד@A/ҠA;eӦM&F/,{&mҤF@@YG5꤀*TpVDc>::=w&Љ$N 22@@@J{Zl)5`@IDAT&5kX{=3oQt>}uT@@PHOO7IZjAC0tPy뭷xy=zdffuT@`xҡCڵ׺4h2^[|^xRR%r-^8^|n֬YRm[ܹW\=yxzNN̝;Wezm۶9~Hn.׺/eDb lQFI\fN~ y@@@Y;v09eSB@@\111_G ңGk.\\).Z0   ֭T^ fْEڵMK$5T@@~FIC l; _W9t K.S/"֭ ko|q[^{53y O>~W`@4A͛v~絜‰'6 *xӅgEJJ|7^k{嵬 i;W#ȫN: zX^~}kѢTX1^ܳ .3X=W/8{-={6}׺^[%vCZ)m ~g8q^9rtYD &b   Nعs )~cb[SA@@ hgyF \Rر,[ &F&wQ1 @@@/!W]u5cǎwLdt6   "1!Eɑٳg+":<22R "cƌ  .˗ݖ>_ttGU4[oe {ժU֤fx@@@@:#+]`޽r뭷… P4&iڴYG@e+WwԃJ:u 4M6Vo9X@ D/^k䞉rmY7K\\WYuMo/IPz}ÇIaƍ+hJ*Ҹq\[lZqWVJjuVkիхɅ+~_/&Mɓ'~v[zҟxݩ[j[@~+k= #"@ dffʈ#ܹsVO<- 4k/;;[H[2KF@@ 81ٯ3zд  @ -ZAmAӧ2jԨ %@ tFe*    Xȧ~j7H={'ٯ1i @@<r2NB*&?e˖ҿDիW'|RO>!ѯSO"q! Xtm~M˗7Ph_Od@@@@-vOB MvAL9DK+'ѯ&*`%v߹؆ & ~p 6l:Ś|[n}p7d]/dA 6,رk}}V7)p=sѣeԩ^Ǿ}z\ޒmGȫh`OB@i}Vu^;_~զ&d-Lrcs+^x;V~W={tM}zu֭[Knߗ3gttnw^te$0fIJJzӿu4/}mJ -   ~pzߺuq4  @ jz^+){Wp4uy$r@@@ꪫ$""̙3j8Tcc0  8AdN8 ĀE ?I {[67o.oo /Hz6*  dkֿ֬jժ={ījћTb dz0n@@@)`Oɏ( N>-w}\rQk(׷=Vb7@@ xVTItr`.]t 6XI =o$~' lpŋMgZc7M~Y`7N."0apU$**k}^m{PM Wm[$ܹ!tBM6ymd˕W^)~$˾.}{;$>>^>YngSZW(k8xy]rGc@?? Qп)*T][-xO8!rU  -Nts{ռ>O3@@(@ll̚5K}Qso-zoˑ#G:* .{ߟ]-   A.PF giOk. ^+W =e   NtZ@ă$$7:iJFF׮{1cEo  _@j_-ݻww݀~=!n~X>ԩ5io&a]?   _|a:2dSA&M &۶m3:Tt2jժuT@@+k޽Z#""jժwN ,YYY2i$Irwr 5jdZDZ$S6T@@@ :1[$2׫W/:t  ;n:ρD=}\uUQ#իWUʉ'$999D6   8pȚf˖-^C{G~k0,  @0%R'7$9$-"    @Y L6tw 7:@-:~;? Y}'$07"T@@V^m6ؿ6+IeMTo˸qd޽֨u^{ 4套^*;wMWR ax  ~掠0ٳg|!:9&=g֭:Z>^늳)a P˕+'b yMr%dWXz̙3g,a_D~=*=KAǔ6_jS׻Ҽ^h)*SL'zYJywot=/q;d  !$sN3Z$4ᯖu   @>Eok4K/$?pbO_{a~WkDA@@@gnm.ZH}*&բc:vT^=@@p~q &X?)))Mی3FF!+V  @p  /tM$M4엂   8]`&%0;RA"0w\+ѯރ%<<\|I&2D  `{$tЊZʕGΚ5K&O,|x8q|֏6w6kLZl)7M?uoM?kL  P Pk׮-0eΜ9^kz}\}RV-X^=F}BVٞ_E'TM(׾}v/͛7@]v^mhwO_7\ꤲ Y:ٯ&W>wW%]qٳJ֭[ӄߎt+Bi]nvqN@3:uJv-^>_/yWyճgOy/\Mf% y7'k^`I:RDvGuzgu n    @0 \q}T^bd:kdAqZ  C!'0@@D'7n5ٳgHs,ld2^Y@@Jѣغw1'U du֕:uNrfdL˚@@@ 4{XE!1nDO?<:"壏> L A@֢P/:I5\chBoVfϞ-}Я';;[mfx_8 'ͨ(>>@ &@-TzעEkM<[Z;|u7dqkbMn/^cǎV_zdo\ /bAy۠A }LZZL>ݚc޼y*:mݖצRYk]AJzw^* "t8}R]v׿z流 ԯ_ߴw^S  RW9߿߄߯R@@@+V/B?3%555{)#GnAʗ/~k]-|I]u:Z5B{ |}_d7&MUW]%~tw3˥$^EDDHVV۷zY@@@hd~ &   % oҲeK!iŢ̘1Z_8JS~޽{K+F@@@bh_ N;w i:`@@dnMnI+CW˪Ud   >}d 8XonM9bEY\9;v}ZM&&MEINNN#$]vk<+nը4w% ~׭[\ d<S V'>xdeewaDw   d~|8pC   :u$zO`?~}눖@o$% !   PjW\qW?yZj}Ux"  M HNN֯_ߚdVp?G#+  ],{\rİ'uCtC-III @@@@|̙#ut"@ @z/Fݽ^wuVB- =oǎbL E:}Joy䷚X]߶mhB[{ɯm}az5w}Wj׮-#F z]t{$?։<Wcs뵮ε@xTi_  R --M "@@@@\ݻw *XΝkWřIk(   F@.#gϞҥK/D'?Ӣ7 =Zm&_~9q}@@+`O_~7LaMԗ{    $3gδR;p3 ~| 7 'Nh޼|<a  @4ӧ#:uT#@iڵrʙg},++V뮻ξJbbb:ςo"5jHÆ =KHrʢQ|.( `K;[_g|rJddnXv뵮xus;$@ (~*(N)@@@;w4;)r&X*   CN80m4A 蜻KI    @GVӿϥMiȑ#e7!  Μe A*&'OW^yJkf||5Q$66־:  <~åk׮e~sD4iaժUI{O    e/rJu߾}%**샠G@ ۷СCefaÆo-  PrիWFHk( S|'OC=$7M@˻+f?o>5kuJQڏ+LݷSN 7PC>qqq[oJvA {V* eӮRV-Q`+w2rHׯuk]m}I]rJ&F@S#+  J`ǎk'&]   =#5/IMMK.2sLiٲeuL PhMRRR } ;"   @ R}Ee{V,YNNp߳qi@@ H\@o 0a?>'>r-L]rjZ@@BB@o"߸q56mHLLkMܧΞ7))Ix;@@@3LW_}SA-'NȢ OTPA^u뮻# A%f3 * kx XD6߶u/2]]/'Nڮ֭ZWPTQ+o nM{1Q;77^\;׺`bF+p{Ç=U^@@@$''~ĉfW *@@\$pWʲedVB]vIndԩr嗻h$@p Yojb%,,,8ʨ@@@pe]f_pw}fٍфǎ#ٯO 1# 8Z 8Z`2j(iذ/JۧOoeӦMrg@@g XBzٳg#"##%<Ѻuk)_j*    N$rBX@?gքrI۲eKWICG@R$I1a0 P}/޿URR%+91c=55Uv|Isv.`A?ؼys{nS^4 ǽ8_ܚ7r:67'p۵Ci]\N@w W (   @ vioܸ~}ڵM   rJСՙ~ѯ_?yJsz@jԨam?wf@@@p@6mzV`/YĈ}m}_cp˵/kt-ZEBU@TOW@@@ d7>H>ړ֮]g+   P+V/R{17n>+{wyG"#v,} `'{F u@@@%p饗Z9x4EIV`Qu>v1,vG@@uaΞ=+|˲}vuֵs=ƫ@@ȐUVYku"x=ܵI[|yw^vD_A@@@)`Oۯ_@B YYYO?o$$$ȴiӤe˖!,@@L':t0u* !.͚5~b! @(@*ȖLm(   @<(OzdN)7p3*  P@xWD/<Ò-&M}ԩRrep=';"G@@@ zmFpBͲ+&l *  Xd%&Sȑ#2~xy7%%%k[{L &ʕ  %Xz={jG%izFGG;"hB$w6+    Ȑ[=׮][ڷo(B]@ϸ馛dbȐ!{}2y   _֮]kڻM    SN&F@@G$''84ibꁮ8pR@@@ <ԭ[Wnk9sH^d̙=7Z111f$5T@@@p@6mD=zT/^,9998 Pͮ:&   G ? ܯ74h@?{%dٲqF>|8~3@@AK.5ѐP]E$ q%%%   O`ɒ%ri+𫮺7]O@@{+Ѹ'odd+矓K@(#~D_CA@@@(_ٳgM    P;w4]6n]ٿ !>>ԩ   @:7oD{#v*?sgBLRJfgΜ1u*    ,M۫W/+#GȦM`'=vXfw@@OdɰXvtMҼysy7sCN{7[7M;W^ye0\@@Xld"(+ָ>,A9F   5k _~N( _zc޽VwuԑEɘ1cʢ{@@@vv_޲ɱ   )@<@@' ؓ6i1!Xj֬iT@@@ \r,_\6lhk.u+Vl`@TP4--ԩ    .R… Mݍ$u$f@@ שg(#ٳgK>}cǎgIVVsʕ;v,۷/@@ Tt\I\KZy殧HOO{;w6M&%%:@@@@ s̱}"D8u 6Lz!̴z-?5J0d@@ `۶mLK#   sHsA$  @rr!pRCYqEFFJjLT@@@  ߛyD9"_~L>=A.@ ? @@@ tOYhX7~ @@J,@ b?CiӦO.\hI՞{9_eܸqҠA   )?ǭ.w^]IΝM`%::LtS'&UV:@@@@+?խ~fdce}غu9SL'y޻AA@([kך/bS   +%Ѕ`   p;w7nlꁮX!řO@@@xb+iiir 75~NJ   @V ._dZ_pM$5T@@(~KLHGԩSVߦMeӦM&-Z?Oٽ{yꩧLh>5JkVRAoo )    Pݻw7H7+]R!ٯKNa" N.tF / 4 6{N;f&\s˗/kVt@@@ ,]J*Ҷm@◾I{~Ν;[;ü7n<   Y@'f7ojժU%11= _}I޽^3$#F+WJf:*  ذaqݺu%...0A+       #믿JVVq>[x!9߱ *  8Z@$}7ēߖC}$Gp}~_{zN   =ٯqk!ٯ[q# 8]dN?Cć@1V^-C -Z@DEEw!?K.s  HNN{Z wU"""Ih=::{wGw9III(@@@@ ֭[')))֘.R 1p+CZ3ccҤIRBgI  @ Gڵk @@@@@@&sNzHkN@@/p,ʕb6m_N< ؓ;w-a'   !+о}{X5e˖֡jժ&Ǐ:@@(~K8J`Μ9ҧOфYSNl+yE{rE9*nA@@`ҥG=oTTRjwٴM_CA@@@P`޼y}:@_h2XM6lP/_.w}@@ _޴@_CA@@@@@@ yJ&M<Հړ֬Y3  ^ছnoF*Ud`o=@W7++w3    0rY9~4,~߾}ph^!;qDb/@@8~K8[@2eo^*Yp 8>>^^x_ԩSl  1oFF!6u*I=I?j    Pv7]~N(@ff{VR_ŗ]v]V:tP9@@$#&M!   d999ֈr  8\`Ν&ƍz+2!ř:@@p@߾}E֨Q Xw޽޽ J\"H @@@}ĉ͠~a3gl  p=       HNN6M41@WRRRL5k4u*   DYtԯ_ z$oS@IDATmҭ[73"EXSÙc+   NKLx9 USG"   KN>-IIIV-Zut$ЉJyWM({̟?_j֬iQA@pM`$5T@@@@?L@NNeR@@@عsi~SRRʕ+'ժU3qRA@@ TTIf̘!_5DD裏;("G Ν3f    C>7+OUV5kN8aT@@@$-G"P*:W\!;vSJvvՏSOɮ]7݀_*4  ƍqmVbbbff,$5yV+@@@@? ԙV^z[)% 6Xw,XvTT;2aa"P+ YW[    3gxRbES  @rrI&ʡC01   ٘>LFaIK.'NS4@ AVPԩ    ufLJJ2u7U󻧦)tbE@@!MW_ / Wy||3FF%UT  nXlZzxşnIk(tYfϞmm/25j~D@@@%xbT^L  PX;$zǴiӤk׮m@@ a+iݺ""3f͛@@@V`ΝA;`ӧ͐*UdT@@@'mܸqYu[~>lGBq  {*}\?^rrr{'O?,+֭[n֬<2|p!1   A$tR3={z0TH[~=eժUr7zyE@@@JE`ѢE] * Plyꩧ_4{g_~ԩSǬ  |,T /;?Q2D@@@70 1"  ;w4tR_}y:66H@@G ,,L|MR5_LGMMMgy&xH(4j L    8_@琙1c9rD~ѼAn*y    Pb+VHFFN޽K @h褉W_}Oր3Lcѡ(@@ شiU6mLJ :TZlY#   `VZ8/Hd @@BbŊRVP}9rS@@@ ~ߋ& y$(wޑ(11J7*oܸQ.bwA{    %xb#ѫW/S'|rs3(  ظq5iذI&x Dm'|b6ydy&1!' qd=7D  @($''a=N*$u @@V믗ӧu]g%::u5= pFDo8Od;'D   @Qt-[/ f@K@'  @ 70+Suرc/lӷ5j3Fz*  &U7jH4htdQQQA7>]vNꖔi@@@֬Y#{  N~뭷Zxv_*^@@\,*wFЪU+ shd#@p@LLȑ#1T@$(8u rʦN@@( ;wnW?s5jx"  @_kkg++i$:::D& xa=*TlA@@@G hrI&YlD@4ӥmIJ   e)lsZߣGxd(   R}oFj9s̜9S $|!e`߿㻙e@@@p=ʕ+|CلWreS'ٯ  @H[">uJd/xyGdԨQb3   ŋ{eT0D $&&Z~uBeM}嗟 @@@@ tRw=L  k֬&ٷoRjUE'  ƍ̀Hk(Q;wt ;rn_7i$:th}X @Y O)+cO{1F@@(@";  @>}d֬Y2`!s̑_-+V,xؿguJXā   hݺTPAҬ9 y#vG"ٯ#N A  @x! PtꫯN:ɕW^)D5 &,cL ! IwtϞ=zc'*qc.]u+     OwV:sBB?-pԩSE?$mҤ|$uy%|@@ ?{_}薂    >|جQSA@@BdeL   PR}GXM͟?_/O.ik=jŮI˗/q8   *)۷c9~k(HSE  . ٯNV ;;[L"mڴ˚5kL@]t|}v{%::l  YYY&J:uYf;Rzz ~ E{ߤe#    PT-[!ݻpGc>࣪? HzG)QWEY~`_l( "**(H)H^>={3;9W3{ 3s"Æ ;SN:eF٦MYt @@Xfa    [@jęߔX   XpݱuֶNWrwˠADoҳgO1c2|u9  *U,C@@@L 8p!Lĝ)BvB@@L |G;v0{WR%oCu`3-#  '-ZqT,X \sgOcdUy@@@_ #/_<;#*TMo@@a. tBױcJեW^i&UV2i$oQ  ;w𪫮P{ ͛ש򘆀^eu4f5    ~wد~KAطoo^ƍg "##eȑ'G@صk9r ^z?`F   8x/**JrΝ6 @@Ȍ?_B2sv@@3gJR /^,;wBEB3N:%fEɒ%/ހ%    &M~-p¦|.gO!@@$@o9N<)?v:tYfɂ 믷˩   @͛g7n۶Z̙3vHu* 8a^OA@@@%h"Ӕx_ 6H˖-y](TL0A(@#;ںu:@@@@-2 [:  d-[aT@@@52s: .뮻NN8E.|Ǩ-(Q"    @:u@~ yta?  dY,@?~\F)+W}ʞ={4W/9so.  HHH盝J.-kX>2 ~,Y @@@HCСCZ4i"KcV#@ ҪU+ٺubŊEr-:dƅ  D`ڵv a    .\ 6K]"  ApoӃx-ɓo_dɠ:8  S~2c q3};: z/Su$xD@@@r咆 ʱc|3~}s(  Oɉ8z&gEDD.+VI&W\N2  a"f;M6mDvhZ4+_~ 7M.6@@@@t ,ZH|N46C Ə/W_}8&4jHsH}  @LLlzl     hЯjq&w  [aG/VSA@@2}t)^Y!믿.ohSr%]vJ:u<"  @Νk[ꪫl=+gΜ1Êܹys׬YS6l +Wu$,9zl   ) ,\ЮjժSA5jwY4pH@@ڵkͣ~_vmT@ H7n?\e+T 5nAt2Ǥ>ؤ}~wJޓǏm޽{'5kdԩf]6mE`2eGZDGG(.Е_|\SbEm1!CviٱctaRK>7n_}ZVZ%͛7x#   /^lk) .\0Fcƌw}WZ   @x $$$Ⱥu̠5}jxI0Z'=3ٳg/:e2b{2k,5k4a?=N0M:O_~湆:az=ӰavI+;w6•*UJ*zQfR I.  ^۷o83u-$ ]Չȑ#oɂ DqI[5j>ɕ^zIVL'>NP)S^zo=ܓf9-[6CW\9u-AFjV4vڲsNq&'8>嫯RJDf+W.iذiW'a]:|<&YEw7r}khѢ+l޼9Iw@eÆ yB胥LO`vCcT@@@ _}?{~~q    4uTsαcdr뭷^ۿ|rߌf(   c'^@o9rMs}Sܻwo3KŊ<"  @t}֯J ґ3gLGv7tR:eɒ%#8OyD@@@2,K?~! J`rM7~ƨEÚ>CѣAg@@+vZ a Љ dyI͚5kkҥ-Odݺu;woymB56孷ޒnAΟ?/[lC_|a>[vډ=ӧ 6,5ѹ… _,[A3f0DZ9sƌM'dL O<ҴiSN양2v$F@@@p 72cD-2ArB A;vF@@V[nݰu`K@ / Xw)^iO?w3V>j@hܹ]dŊZP)QCwg'(9CdrkvZ[׊{YH6D85Ӄ6^k6J_v*'NH4P ։u?":˝G #?acQ@@@O[Z ~-@@֭[wZ;4,@(ݻ CUH(    o Zֽ\q>{>3E@@",~9S3Mm۶o&)xw қݟ~i3YϫʗiJ  Id]:W=I޼yC}AN甥K:U@@@@ 8ar咦Mfxv@L0qhx ŋ~=E@5p`}7m<_sΉ;7k0mwݺuhmL8CC)?Sc^W`W4)sv`SN&A=5Jlْxz w ;Cbcc̈́agϞ-5e˖9G [dv“cٻwoetݩQLizUZeƌ)jher ٙzf1]\VlYрd-Ye)u]cqf͚٧g;Xf9Rʕ+'~\|GRJDc6nݺ2o<ҪAyx@4]t[Ѣ9.\P4lW{su߄߿_qzb\Kk݇o\-:,}4 i׶RwĈ6ޒ۷1K.?~0Qѣ޽\7u]vf[YȒ};wo^bbbxOn&1~嗉]i.V;EÒc֭<"@vaPti)P@F   {Q٨([  dD@o$wf{O|Ɍ4xN@3q~s!   )KDDwժUj#wr.@@Țjg F GtÇV_^裏Ovzu؅;Y]vm>kBY}>\͛ ꫯA#5wv=WuFe&V0suRpxv  @I .,M6M>=LKɜ@-~0xљk@@@@ l-[fެY3[ nv:uu6#d   7Т@lذaҷo_/ ʡCqqq! /$jP̘F)0`D'3f 4(-ӷ}C{"EҷSҰYX];t gv/CV@)W_}ݲ}&Pmcץ9k?(NpmuBUVoƄ]mz][LL)S&,Ja?۷τw]ڶm+͛7(xؽcw^JuǎYƄYtw!iquyJI9䜀uRJ9  a)kM6^  ի JyG/ ~8P`ǎ5N   !M0 FQQV`A?~v!@@ȐP8tLxڠ_ 2dhpm`  ~]vaOcw͛O]T_ݓ-Yb;@IDATS}3    _~t4R^=t^"@;ڠ_ MS @@Xn]SA(QN8Q/ ,nݺك9RvE*_~yߨM0Af?~eٺ_+2m4} ,Zh˗O4 Q=z3ǫp¢,JҰI-yWIVڴi#o {n8p@vgxX@ݓU'Vן>}ZcuqOʪc(y1 ޻woU {47}uo^tKܻغ{{{+);?޽=ڌOl޼Yj޾VZɿ/SѿGqݻ;IcZ۝3Q>'g8pRP$~-%7H4   g$gUTIv^ʕK=    GyDFaӧ|g9 sN͊+:@@@@ 4]S]  r{t0lv!/|G6W1t" @@Gs̱m׮rٳvxZ WZhaYx>   %mڴl֨Q#qO־G \soŋ7?[n  'CFDDذ2OtN & P5Xq„ q޼yr=E`2sL9x&6rkuP5k @^l LF2et5.B5 "Eȍ7hO~Ʉg\:E؝{g>Oi#_};VVX!:KBB,Z}Mp˛oiץT)_|J2<><; 'njp-A*   R~x?.\8   3<#qqq2|pt޽hѢr뭷|p!M M     ڞk)   66g^صkGW. `_xe۶m2x`!׋g>!  p@89sBk)2\i޼8i/@@@ȈMOf2+"G֯_o¡K/T4_0 xLwN;9t'ufǻi&[tCҢE QLpfN Fvv=>TFFgϞ-NcvY1B*Ud4fqO֯__֭k6}5䘂Hoj5 *d~57 2RresߛaK.lƽ[fݻ7u˝5]~=Mi_r,VZݻ?,Nj:EwJٲë́˺@M׽<v@T@6@ 0~ Hi@@&79J*NSNo"E@ ,]TJٱcr,X@իeH  ?L([v@7O{  *ح=`s, ]?iʊ+Oݧf͚Ҹqmdĉ_`a&EN}Z9TF]h;_ֳR*u6-;wm?)._<ѣ{h>ɗ//I&INL'ODGѿZ֭[gLA6>Ssmeԕ9#@oθsT@@8s=   o3z=-"W{] ͓'/_ݥ    NiР#GsϜ3  a!t2:}I߾}Zj8on\G/B׉W+!o@@V@'2nZP2;W/d^e˖fg4Г@@@E}?arg L>]:t 4ClҤ Z\rq! X@ƜBد##G-ӹCwׯNZ馛^zf;@ѵIU jٳFkOz͞={̘Zi׮]?_F'7o5H?j[t=\[~駢NywSh˖-6Y']ț7+ Z%J1BN:(HN"Ri޼h Okg}vO>,I`[hhg;gϞ?lkjcn۶͋Ƭ޽[{=]roSr2̏}v~Y#d%ŋs8@@gTRœǏ7*R'G@@@~(>뮓7p ߊ+Jd$S~fp   a'C/wo{Po  Wr{c+tƒW_}Uƌ#'N.TG'%K˩   ̙c;CKqOY;F,Y"mڴZ   a#b 3ւ JZf P믥G6TCC{aP;ӌ@;$N:=#{'|R^~eyǥ}<+o +]u!)/Brʕjy*Vtg}6ݡ?:tH6m$6l0?.r;S;\ ?_ywGu Mw~ϡ_(0gƍˋ?z=yŊsvw%HnݤwBտ3f̐QFc)S&Qu:cd5ZhoTV:>ǫo5ҿQN$ϩuȜk`̍@@@ʕ+{'O4is    ,oi޼y;kF,X`/qi =zT9bv{*   p}tm۶lgz41@@ 룓*]/G-?~K'xᇥP@@@F:_G"s:S/^TyD@@@RР͛7mBi&=OxVߖG}NxX˗ϳ}c  pj(+a~H }p<~駢) .L<Vد!?(658iѾkpaL^^x>i$џJNLX?h6q]})!zݓO8Q$V}zҢn:D3D;DC(_|Eٷo ԀJ*=&O,%I}}( ̚5˄^ZJɓ'!i տCe>8=zڌjOל:םjP%-f_`sJ L>l7Q յ Td ?EchCɤ(PM;L8KJ,) 0F~5?npVGĺM6+իqZC@@p~s#k=WT"E=  !&$zSv_Gϟ/%J2 8u+Wp?   $[]a^.z?Sn8xD@@ DflsF z͗CA:c=&[lW_}'  p~ .,͚5\!):{I-jv&7s   @8 D fM4 Gƌ "}aP73@@ 7g9j DGGPܦM&;Wf믿>6$iHEhXMLU߿>01s-8xM7SO=% .QFDesl1u†2޽{e͚5f^˥a)K/$6m2I3 ٳjժ~kL?ɝsh|MSؽ{wM'5t^ٳgcg@kEjIGg_} տi>TR%زeKѣj`~9sLhGxxرz-ƍ)K.^z׿˥TRoZFk`m'X{nY->Wu_k=XVPAt˜󧴛̝;7uB'7IiXÍ-j4 92eܹs&<^0\}U3 dɩ>kqjgIwh`_ 66FN@@޽{ԩS0{… { @@BPlٲQVw%Km&'N~3V^ ]    @/R/=&zL7@@3~j/Ç)s=zȠAMr@@@ fϞmXSqa h„j+/o=k 7   a!` hw-|Aiģ>#fX  !gXqHаDiҤ xB@Ұ6I7{.|/_>iܸIsmDYV[vmnڌX&i&{,h)   @6lݺa   [r2uTi۶>|XMfꫯD 7o]*    9u뚰.]s}͛|f z)@@ Dtϟ?Xj֬)< ݻo&}@@]9ská/(Yhٲm@~)    @Z+W4g3z4/7tj_|AЯO=D@]OpXZ F@@@ 籊 QӬx   @x 3@ $$$^0x`ٸqm:""Bnv:tԮ].  -)RD5kڃM2g%ZLWZha]dSA@@@8uꔬ_ެ |&9%!-'NM7$g6I7;ܹ:Jo@@|)U/@@{zӧ3ձ >𢡊N]E  .,ʕ 24@@֭[m*Wl^:Y^?( իW'_/Æ ƍ'Z@@m Sٳgd6m$W\=$;s]BttRjUٲe,_\h;7id@@@qk(5jex_ѣח,\ H"2i$ϖ)  B Ѷ$m H3%Q^LN _C 3>/8Z|E@@5J*މ'l (`T@@@ޓ޽{>SR|yڵkvvc!`48gΝyr*    ZI~<|D@@"@2_ΔG9k,0`,Y$Q۵k'ÇVZ%Z@@ٳgہfvRKۀ+l҄"a)@@@BL@CV^mFueIbBl  l޼Yڴictb 2@@;vgh/v>!   Gȉ  Q={֌J*p{,Xгc   >r咯Z.r3h}KA .i   @ ԩSvBajq&׫g~! I tv99ٵǏː!CZj[oə3gLwJ(!#GXy%O<9M  ={Um=*{(3a;-[4闄K, \ô   !#j*; :y_U*ٽ{Le޼yRB=@@YwotttȎ!   @u'jժ?5   @mfrد;(Kô(   WJ.-SL2eʘ.͙3Gzяp}*U!~   jղ{BT_~tn   +~}uY z7M / qqq栅 {Nl" 3@@|'p ,YR4h`~sƝ_m}9"   ֬YcMY*xH`ɒ%ҡCٿUfge˖P/   @( o%70cB@@@ 0u Xݺu(   غuaB*   @ TVMΟ/`8t8޽[=jZNp2cD@@@ *_޳ ic  > ''*@?\c=f'W͓'͛7ˋ/(QQQ #  VZ%6#h׮DDDx4;WWQ#@o`i@@@Pp֯_?ySN֭[̙3DE@a=w@@@#RPA@@lpV\9ø'vO @@@Mod-:̵*"֭ Z *   @2eXbf|{6`wO  Y r'iԨCmf\ݺu~Mƌ#e˖ r/h@@BA`֬Yv:tp~nx+U$ʕ3/]Tv,F@@@ ^t@Rzu^#BSNΝ;ͨ:v(hѢ!4J  e7/^\J*7@@@A~sC#  I)@@Ț7,F{2o<  7   ?jժe:}v9u';Mد'O B@@nn@`ٲeҿ3gNt#FD+x  !m߾}[j~wn[l)ȑ#~z]vF    +966nݺYBM`r뭷ӧnFo}3@  xK@-cө5jxs&E'{7d HHH[uǏϩ  [lCrt$6A@@ lݺմ]L)TPЎՆmyu*   qٴi;sA=N/'ڙ׼2'#@@@@ =&_iƍҰa얭۸qp0@@BH:Nn!  @R"EiѢٳGϟ/z/"kѧ~* 28.\Xz)y'E@@@ fͲ{Zɓ֩d]`(\Rbbb$..Yg@@@BB`ڵv׷u* =f3GA@H;Fߑ-]@'  [@HN`v1a   d;J*t?8s   =+V'J۶mɓ2n8J=(!+f;6iT@@@yիK\D36l˗_KA@@L Dfj/vɓQFrڠܹs?,7o6H@@@||,\Wo$ͤ=s=a"`-[ e˖]B@@@ Ę,YRʖ-{|&@ЯNE@D`ƍvZ *    D۰a$ky  W`۶m^?ܹsaM@@@ӦM/?a~d^6a?At@@@ w{tL5}t{tg   ~ߔ- rJׯ̜93QwoVy嗥f͚@@j௖:I_qY~-E*;vXŋ}k@@@@G]v׭[ןT iw)ƍ\rtDt@@ T6mdRti a8^}UOCrl @ 4O'iSFs  УGySXp6h q@@@#uV+Qre[b'@@@ 5[nEz'|RgϞRzuiܸqjM   @ttJ\\ܹS*T1Ag@@|.@دO}}6p@Er @zפu"@@@ ̚5˶ٱcG[׊;Vzz^)KA@@@bbb,a A:uzris, ~N@@8y޽lUF4fuN ݻW֭[ !&PhQ;jPA𒀾伀%*U@@+m۶FDDe];OsOC@@T+k׮O>DZS ^l-[6X@NدO]v@@@BR@~'Mdƶi&~C,3(@@ qqq2rH5j:uʎZj2b;2*   @fΜin߾kŹYUǟ'Opeڸk֬)%JC aAca@@@|%@دN  ҥǛiq 0@@ JBB~L|TU'tD@$APYiTXQł],V]eW좮 ]zQJBx9o*Lfrgw>d9{'3'rʕ+]޽{W2e8/O!D@FF8p ~>u֙ҭZg-!  'vZXZTRpZ:ri5>eBK   &#Fʕ+eƌ~zݻ|wL&ɧ]|)ݨQ#)]t>kR @@@AqnzMd/YÇ]   \f nGwyG}QٲeSժUeȐ!rmÓ+@@@(d}ܹsM͚5N:{$Ǐm۶ɚ5kAV@@@@ "AF@n~Y/v2SA@"\_u3^06ɓ%99ٷc` 6H{O훭 @̙3.|`Wu.O@@@zz[;*!!!]Շ [xڡ2   PV1c3ϔuIJJr-甐ȯ/"^SV[r    %5r3`~KxU޵6Nƃ  @$A2駟.w'k{GC]wEdC@@ |b/^z'@@@@ `]V\i7o\J(p[TD@@Xv~h+Mh1 @@G}Tcw^袋d2="]JSjդv!f@@@@ 64;pl޼WCnJ   $@_ &H˖eO@IDAT-eРAsN3rɓO>)+VJ|:z  "0uT7;c= 3!))t mg    دow Ghݻ7Jv.@@TqF3FE,   +h"0͜~6G}@@@N]ޯcǎׯ{q!  @ {'xѪU̚G 9Ā֭[e˖-f[3E@@@I{ ~D_? Ƃ  \rfT ׯ/裏J2e|6j  * ۹sXe6of# Ɇd̙3]    Ė=nڴilM"b%KHnd޽'͏5JC3#  5k.2ݰa&   Dڴid@@@p ]tsԩn€   >([;VWnF8ay}:ZU ,pChժ˓A@@@ olof  ɾ߳g  f/9G۞ZhƍK6mB އ322D=g̘!޽[jժ%:nk׮m#[l@@ ӧw}'{nК5k}k7HF@6د $@@@ zbK:~#a/1F@@FSNf-{G3P~̹czj0R7~g7#=w   )@@@ [\4hY@CE}gT-  R`n\]tqy2"a oh 4ilڴI֭['u m   8tBy l޼4 |5Lm@@$ P6L 1-ugHKM6-SN9%`^޽%--52KII1眤j׼j`ݷ~۴U~!`m۶3د4d)Yɧ yjРA~=*w}o |WKRrlю9+V(na f/wʕ+˃>h9[u%Kdjb믿n|Ls@@ zK 6kLJ.ef   Kܦ۬o @@@|9s,3͞=k 7?FٲeI&0%   $$$H%##C6TW^cgJ/Nh@@ oh]`D~ᇙz۷YDX  >2eYΝ]kb:$W{ЅXL:kZF@@@zI@ 8۷@4ih  "zj7Ԇ <@:uzꢋoܸQmf0ydԩ,\PLnq9~V`W\qh_M͛7d-~=ty\Rֱܹ֧=WJ)i5j:$]4 @Zfw[]7mT6l }={Hefjժ9 t̺AVL0uڵKx<Ӏޤ袋Xu.صkWPYDAT{}^xG@ f͚2eu@  ,#G۶mh@@[`ڵ@^B>;!   @Xz-Yl9mŊү_?/r=,,_yrk֬1csي+q1@@@ԭWQ#~sva+  7+7ٷokE>m#  YѣfQGcժUu~nǦ4yj}1ҡ.j̙3/wE@@@_,5H ЅufVׯ/O Qj"  P6د"t:tYЂ,YDn3g :`nu_ra8p ;l0y3믿]w%V Xs:J/OKK3uHҥM/nvQ@رcM5ࠞێEf_jݻwٲe?+!:uʼy\߇.w_|EsЙgh_ J{gy{[@|/M" P(zM -A;wk`   QW׋DHK@@ Clٲ2fH;w49iC )i#ϟ/g3a    P 64~kGRJa4tuZA7J  Ĩ@wا=uTѠ0 ^{5 .C@@B@LܵkiA=dTUj>Lbbřhd @@@! {)K@ *8 9E'x'Rv/B@^ IMM5 dI N;M>sh,.A7n,|&6fMZwǓ2e-6Fp櫯2s.7n[0?ST\vetRSoh%K=#riBQ84ժUK}L~u{Իwo.  Y@O6MKrB6>}̞=oϭweʕu~ ~ou:co[zu^;mz_ l~R 9?c+Ht3w='yyVUkݯnݺ< Z_ܳgONŲm l aC0cֿ}>_0\@H[t  +l`v"   >#?.&L3<k%E@@@ vs+w]tVzy@@V`!޵ׯ>}HΝe7 u뭷.: Ny@@(tɓ'6td,vQC=Mh*W,M41rСtD    Kr0]tx&F؎d  F@ًN5j L@zfTh0`}MItmqouVnѣk`LԽ{w7@/HR 0T{ Ճ*۵kWWɒ%. \|n_ BBի-[Vy{4lPN99A&zN} Ȯ;t`߬"ϩݻeRjUvѴs^s5bu6))ɌU}&s='}yq:?K+V;#=Gtz|CSNҼysQ|ޡf:_Hζ~s1ֹעνm۶RfMyuc+B f]z>>|xY7lڴI.S_Ю}̙3V1gϞf_W_}|>ǣǍ?V.1_2wG;п?m@4 듦%KJ˖-y @@|*]׻Ok:Y~; @@B!Ƿjsj~ Eoyi    @l xIMM w]t{ݵo@@@0h釕gy,ۤ(n@@$;w|ރW)Y[ÇZh4#@@@7oƍC "}e]&ӦM3s'O,M4931@@Xz#!wPl׮]>VV}ԁtljѢԭ[pD5hM(4vX- 7/ZCyUV-ӽ6B=gGo?!C?YfMaΞ=[ ;vL/}UV80X_[nmddd_,/a]TR& ~)Q:aꪫd.+VZ;4p7۷O4Ә1-~5)GqMh`U >|qssߝ4i裏>>)igk`.jxO$U@_W:_  ߕZk `Y@  1!Cc:Y=As8tPL̝If;wXLi֬YlA@@@]voN_    NPN= o Q{ҦMJ   @xsΌ3Lg 4߽x#{t6دB#!   @`N3S A@Ch oƴV|yo9/=zz^TsO~gΖo-iz֔)Srm`Y۰}5i&٨Q#SL$ڙe˚@ǜ{_9ڤsmۺtȑ{n ŋg5k[o%:~l~@&1by=EroޤeGSbb9UkIyg筯yoaor]wb[l{,k3. ҫI__,Ybj::&/}}`ۺu`mNuo09?m^{L8>)Iׯlڴl~5ӀĹkj@/Vs87Hw&=qƮۯ3n8;cVo&Vڮ& ]Z5p0c3yVEU# ܩS'$uF(7o{o93hfL@@"I@?Tn] p  Ĉ{'4=d/3/gsmժc   1.(   U,ݹyfsZovy'B n;@@@ Rt0Y.]"u!7/'ㆌ9SIII~Wd@@@@ h]]P>&Ʉ>3=h b!i@@x/%oX\9"s1pƌCmZȵ>`Vhذa!oPٓN:mogϞ2dS\Оs9޷I˅"iA h5kOnL2&`۷[nݻe…s7X4T%JV51k#|畦tk&:Ozh0o``[bŊf} ػcՀ=o7=V`Uڿ@_|! f}iK/Ԯ>iw&ovEԘ   D~mS$״~Ryp  DM[ne˖d_`Μ9nud@@@i5j{.@Qu*6Jp  @`^X]jO@y>8?..m'  DI4t ;EVR?w8811Qtq 6O>9 <   Q!]`QKD.Æ 3wk|t5L   @] EB b(5: hBUNw6ln{!oFd޽&姟~2h>=_*Izg@|dСM͏;֔Ν;:u2>,Z&Bm-_{3[?k^ꫯ^p .'K,q5g!K.O<1ku#@.~ǯ\z)Wرc.od m)))gu1\ӧ֬Y6n&o 4ٜx2z.MZ^Ǔ5iv!c]vy7| 9@ܠj~jǽeQ/sڦŋ˹ ܮiϞ=.(~]syt/c>}^@ǚ0qDիx"@Ǭ[Mo_Q*`gMF,  Y`ڵnx .n~o2>@@@:sNo-.̜U\|(0w\7*: 2   ļ_|9~c  @ ։z^z1w!z |ͲrJr9}@@@ 7o]PlZRPvmhv[rrX#!   @ u G`rw^y۷O@@Hbk@y3~(0h 7n5AXo昽58^ gϞ.NA4M>]4&tN&M2~*T*UJy8W&4mݺTiUT)h#>}@7xz&h^m6[=[\7Xn- r-n7Xl rC~o{nӦMsC# .}~믮n~׶W_mj^}>_Ç][>̘ѶkO[߂- w&B '!  HMMu]; W23~'GB@@bU`ҪU+3} (bC`Μ9fܹiӦ1if   _)ny8n0רhW8]  D@|T.DO§zqMz]HLLE@@N`ʔ)nN]tqy2' =%ȅB.2mk>}D@@@ x'دv C~ۯ_?@}Q8po@@(}D5j #@ h .4x˃>hرc}r7 b0=F;ՀSN.HRp}݃N6M8`Ƥ]σ8qo5yK~\J_y>ˢ> /6ԅ6-[m'OW] !@Z~Oۿ[iذa")S&}3tPPg1W6OoEW\9[]`d}0..m.h+w|neۏd1|q3s+}tQnX%y(|6mr=$&0$   d_vm]71~=]/=f  @ O2aW\r%c!  Q*0i$7]<.BW\a $%%Et1 KB@@@~X}  Ν+{ÇV4͓O>DTE@@zM|N" SOmfuZ N:f< x?-UT>s=?RZcǎlA~wb"oN._|[N.wqG hB7o.K.nH/༯ن@DѸqc^w`pG1b믿ȑ#ߖ-[ƍW_{,K?jҶmu뺼u- 3oa99lW=?Ϗ5jH ̂vA9EvoM!ꪫ駟65ȵjcL6̘O:$)Y9ncd[9A f͚f@@@|"%ϽRG'   P5w}W.R]w%gy \Ж̙   Xq 99>Tz_rHw# D@(Cȧ>^z%x7_,˗/ ~C@@X@N<ٌ|UItGE>\4it0|hkze@@@ ';=cѣ߿ K.)`J~3B@M׏Mf/ȡ& ĨU #wCyWΝ;/ ٞ={z˖-3_MvqƙYԪU YlJ +N+pPfJ.-O>B=6ݝ|ɦ*V#^=-XP: C?ܵh"ϚٰaoY7gOn~͛nn9,o( amSN1e=Y$ժU3UMV`-s+{WF-|YXG7zs t\ؾ-\ۤ2D~dG2 @@"\@TT)YG¯%KaA$̋1"  9kw}-GHSԉFNb   fE4׭1~GB@@{6],@Xs=rSZ/b_N:i@@@϶nj&өS'[ L6'''^ta7 8]    P7ovK"E8FҵkWsΑ>H!4  5k\]n#(r87sl~BӐ!C\[O}ye˖bV P8۷*UKzzz ر#[W]$7tgd_s*]#Gлki0Գ:=#lcwyǔ?En@s^h믿g3}[ .0wWZ%o!ի}oӬY3iݺhjԨ$&&|_YhZr̘1#S|#S! ǎwڵEH   @Q`ݶ~)~)Cf   @H}Yki o9x :v@@@@|'སٞA{1  D+wux@~.tz˲e/Υ&@@@o48)go_{@+l-l{⻶R   H@gq6-x4hJJ*)E@@EljРr>kVZfTLqݺu9?> y@Vu+V:_|![l}v74]NIi GM_~_~ׂ ru6;v~o[:C:vT:7A5 ܩ96<{ltzm03fw`׮]2zhҥ߿ի-Xr2l0ƍ%))R_s5&ҥKvKiFx ]Λ7O:9x)کS'[%[mO?5 z=7ܦe۷V5E]$ׯ7J*|a t:iSU{1M3--M^yiڴzfTPl8p Hokd lyo5 _}CDvz7BkZp;ɔfZ6mK/ 6d;D~VسgJnAa@@-S M=?GgF$́1"  )PD 5jyM|曅mDXjUfSH妛n2 x&O;4s\ !  (0i$7m:l+=>Ϛ@@@(jիW!4l 4@K,^l&L  @4 xFڢѸ? "s ̪ ?2bĈlůlۼnջMj0a 誯 gϞ/jޠn2|O^IڞtIW_bsιV4HqLP_o|5X;#gux|AƜr.nFyꩧd۶m~a[+ߍ&& uH >oYMf.Zj.u\[>^~?+V4AKwi ~9euo߾|})@5qGkO>d3^ nSƍ]P`0no΅1QL~ҧOW肹 kI FTk@zV A5izo _ =eo. .Ǻ?sW<}ZV3f`Ç7}5I`CTt.pvN} H9s6~@@@jj1!!#!c:t(@@@9Jo\r%;Ӝ?լYO'HKK[<3    k~aއ4O"s@@((Es z*zD%YjiO/H:t̟?_41   @ 聢~Ɍ^ՅH9 ؅Qlz.2)%%%T.   @`> +ьF2i$Ƿf`  5kL+J{@ ŋwznhPF Iرc x~i֬|矛9-ׇh}`ޔ`v6cqqq&-cǻU-[ŋMѶmۚ;LM}\믦h~T"ru/, .5oֺm{komﭾB4x+b{&o_}.j8eE ؿټNu>M\}\mҤQ^3`!v^Zx.[L.2w>ϐn~^[oͱ9 Kڎwbj`/<[`֮][9׌g_&1}POҴw^3ΐ &m dPYfs͸   a`=>-|t  Rwrmqm=mor @zMڵYn@@@@'PN_nV{ˑ#Gz(  @D _c]0fŎ;[ou܋]2   @ g=zg#FDL֭i'x"Fi!ɓM4[nR@@@"G@|Gf+V]쟄 tMo;x1(^  D@rL6 ΦAHcz.۰aC &!   ^.]Ȕ)S&rއ$u'tl޼H@  D@|4L"9޽[Ny]3'p<3rm]=H@@A `k dksY@)>>?v[&''`P#~FOG   U@sפ I$SGq~K*%cǎ%/O@@ضm sbLr&@T";wWY Emܸ2C"S@s9nm۶md-zk.`O?~[ !.iӦ'4ԟ`-H_U61dK5A T0޵} NPI.  O 55c%Ktc Vud@@@cӣG38Ü믛.2t"\`ngy˓A@@@w "د^_)##[@@@XuyjЪ%K 5{   @'N4M/69 _+о}{3\    D [vmI [oO?m(4~(:u@@cb1IPo43P)!DsѴ7 X9s清fn@@@ DͲe:C<@@@?N=TyWG%--'y g޼yf r'F@IDAT$1   \N:uֹ|Qfl_zE9F@@ R#u{Ϟ=J*K/$]wF@@@@+V0MŊaC?pQ-(qqqr1III [t   طol߾tذauLOXo+red@@vBhՋ2?%Ei3@}.Fv4D 7v>E@@gk׮5#*SԨQg{8` @@@ 7 SL?Xv-W^ybd? ,]T8`k[@@@@֭6QA@@ *b.د.nzM7Ɇ ѣRV-    9ʦݻ,70mT4kL$ Hzz$@@@իW4h ->}ȑ#G e@@bT 55b@@@(, b @>l @ |g~\r >L#}.Lta~T"7kt  X~Mt,Mx\`vOr  -PB5joެ3/:tȻ"N`֬YnL.O@@@ ԩS]ne`EO  $P,&\RRRu֙v],YB؎  Oȑ#2uTcQzu93p9TD 6&N   %f7!: 21((4 쓒>`  .իd@@*ФIs>l >}@(c۶m39;i!  k׮u`6h@@@Lm۶zl;z\s5wLe7>>^ڴi3B@@@(ovjzKZ   p|Ȑ!Ccǎj*Q\9ye„ r'_   @ hT{p׮]Y&,j~Dxo۷o:$د    @^ͅȐ}ʂ o᫯2eĘE@@O4)]ԨQ@@@@ x)ONNv   HMMu]FzA@@Y>< ㎜ ՗wҥfl-[=_%   ?ʖ-+UV5Yn/oơ@@@ p rJIJJaÆ~.\(7|sbD@@bH`„ nݻwwy2 7wp=ҤI\λ0S@@@7oÆ C#SJ*2~x^OG˰@@]nݺ@@@"F{N9~#f1P@@Rկ_?樋D_+-   @bߗ+BOs#;w=zԌ)11Wcc0    ?Yƍw E9ŋwn@@ȷ@T}7M62|QdIy~s    v |xE [@III٭[ʚ5k C@@@"+U$䔄@ SyM͸8ywcǎD@@G 55MFD#!   V@7E4o\*T`@@f$-_3ۿ˓A@@[ꫯ+ڵk\{rر+h ̜9Ӎ`    "`7n̥T6{ct7|  }QwԩҲeK/^8p̝;WZj嶑A@@ȟĉ ~*QJ>J,d+:LIIqy2    ׯ `/}f̘!s:Tʂ7D @@L Ďt@@@9s1f9$A@@6˕+'իWyWXэ`    /^{Ml]C^W= YL*U&M@@@@"BVZn6mr취@@ ">oFF<ҵkWVDqåL2ѶϘ    &~(f`||qS 4b(j   D]LgbC`ժUrMoQ~|Ԥ  /&gEGA@@@'(   @ cz\B N`    / ;rH)Vϥڰŋ./~zټy]vA#   D@ڵx7nECiۋ   Dt 6HNdСrQ#н{ws .LZ   ɓD*UDO6%O`s uN8AZhaѓڹh8ⴏ   @x"g[.t)z&;vH=dfZ]t#FD   A sy2    ~y   _n*f8z,~lb   :$W_}>|8R9s_bb˓A@@@rU{~/ccz d@@@ .鳂_\wu j*Q 6L^h   Yݻ͠v*35`7ϭ˂ LYfy睗[Q#   @)Bv,4]W^믿6[h!}G)?fCC  Xu٬QDlfܸqlٲ?GcM&s  n5kք˘.]J9Sbڂ#  @ ] RVXaϞ=.O@@@ CI&… eOO?(]ʦ$@@@UvM6|Qekgdd0@@?#<"=؅QFIbbb&  Aoqѣ˓9~onƌ <    B4z.t&@|zO?jB I@@bG5kģtߣtfL @(\ @_`ղm63Q]?AϞ"  RSSݐ"Xvr!   %K| m۶Ç{%ڵ# 7/&t   @T@6mܸf`EFO  Q&P,egu~/R I;"  ƏoXX1޽n804دM엄   /]^z?!f@/DٲeeܸqRNxȓi"  @xƏ:ѣ˓ɟ쪥K(J @rr3Fv-˗/gqI0   ׯ_o:W^;H`ʕrW=IG>}h@@ ω:J{_5D h޼ @bK-^8;ck3[@@|) 1gPUV%o~(  G@a{ҦM9xKһwo9묳SC-0k,: 2    ڵk`{HrQ+4E'=j"  @|X_W]nݺ =Ag   K no{h߾kcƌ.O@@@"O`ƍ܁H^,q8v%^ػO5*bZ ET,eWYuVpUQUT\Az)z/wxIܙ'-ywb.sDݰZ=o@@\`޽f#~ @@@B^@-n:аaCy@@@v '`n6+wu# @@@ ՓQFAT~ɹs7(g[`ҥf  :    Uj~GI2) (  @О={[nzjM&#G_~Y/y`   +ֹ/_^Zhኼ) \wJl@@@@ >Qג{0 J^dzZM6?X=34@@Z^J*YV ;V>#I %ФI:uNzʔ)2f̘"/^` s   gCoF-Z$;v#Fȸq<*l2=zͫ>GC@@@r+PbEsv汯;^}վ΁x  +BGŊӋ4@@@ϟ/gϞnH䁚by@sUZ4>0xb#14   8-{n".. ,Æ ~IO\rwIѢEez@@G̸UV5}:%$6m @111&ǣGr1t@$^ќXdb  I 11QTq\ժW,*F;~zg`FA@@BT@]裏I&r90at]km۶$5k& oBDG@@@TWg0L  x&b AŋL*o^z͌@@@<={9Gy.@_͜={^v @ҥKylد*BUvmD$   `*{С'@@@ "3f̐zs;e˖A(k(    @.~sy3QWFE@=p7LңG ~q3g~  ƍMj^{DGGļ=K.!###MQT_   ={L⁾ЙP /{f+:T.   [دǡD=@@@@ v!G3l׮]ϔ!  @{.]ښPPA@@-&|)RD5aYdIe~۶m   !/k LC  (bÒ7p|WB4i; @@pٳM^zL %%Ŝ@_CNM| :   YLL #Μ9#~>|Xҥ;6Cن  $$$=UV6#   @ =o=@@w Xد}ab獬@@@ pjԨ!FHKKŋwBUlٲRz)#   ?o&۷UWʕ+K||tM>΄p   Kj ¨x.`/ሀjjիW;A@@@@9U… :@*U H_oVG+Q̚5K/A@@ 8Dxh(    V߈zȣ  ~+VLJ*\<66 q!ӧ   U>(=k&6le~ :    ࡀ{8 G@@K/~,X _bR5nXjԨ@@@|(0gIKKovFPusڡCŋM   Sʕ#iD NFƿ+]v6G@@طokECA@@@8{_^4lPCڃ#  Ԃ{ՉTV 3˛(k(   ^Ps=zK.<`j  @ <@@@@< X~;&o;j$֞W.E@@ f1sLڵ:uJGkd…RR%e@@@@f2n6ӧ~=7۷7a-Zdt@@@@ 0~TI%Yl߾]+j>Ǝ+:uH6!  ({%!#   z˗/T=vڅ3F@@ $&&Jrr+*THJ(瓔:oB@@E瞓y`ktR[XXnڵy   [|&;8@@U~M&=z .h[oUΝ+111˼@@@ :rI6m\7M4w4laH,@@@@ N5Lٳҽ{w9yάw2tPeI:  bʕ'q2E@@@U:   ݻիW7@ w@@@ ɓ'U矗]v:@Nŋf=:uHy:   ~SW)$%%-~˃  @&_Ƚ+:|5U   %0o<9s[n17$\U׻.zRim۶D}8ZjJl@@@@ [NN 8P6lؠnР^l!@  Jbz:H Ϥ|Dzxbٶm8qB*V馛s!_eL2Oeܹ0u_Uzc{ޓӧOKDD :Zh決Ftr1@oMLLw}5OֲeK;.;-q/;  @ xZB\LBH`ɒ%fq   o{`\Zx˖-zQbލz   }vɐ!Cdܸqr9y衇䧟~~ Fԅ~U_ڴi    gUq[---@@<I>Lk >3 0]G@@w}g;MN.]OoR`ApBjQFeؖUWz`5kyl ra^_1n׮]uUV7N>= .,#G,?2~˶_iC~,۸W @0 xZ> BW`ҥzK*t!9  F ZBq#@@BѣGZ#lϞ=?Z{ ™wJ˖-3 PPA@@@<د&Xzzzf)   f1cFBЯ茏  R@2sL}t"ESN<òHIIѻ(bV[x;   @BBɒ Xp)n2eԮ];@'M@@+`-Vĸ7Q2C9rDnvSN:cs='z5k89+^.~eUV,ϟ={[.}Xzu/**?HÆ O>1ۼo\2+̏*T3"":$*U2q2?K@{;wÇTڶm Sb   \W==g)   '.N2xGbqd@@@)_a8xc/C@@ h-;w\%55U= b?F   (n0MJJҙB Y+eد}aNweٴiFD-Z@@@ 8,YR-3 PHLL={wg}VP`  xUZ4r^@Zpƍ2n85j|}v1c\s59N`Ȑ!ul`kZv}:e۶mrsN>->$$$\q'O ֽP˗/7Q*\t,/s$nsy@~Un@ 8,Yb&B_CA@@,k.AjL?;UV5[ߘ t@@@.p7K=j^x1B}@oBQF@@@@ lkw?J02@@.?eyKŋzZ$   $sw> XE;"##>g:"-7c_^N:HE@@@ (][FsVҥKr]w8:uW^y٠  @?~\Ξ=gkyҙf ̛7OTXQƌ#L¤[n8m^z0m4ٱcGFSy׮][>y7X/k+o[oouf}㯸N͇q@_ Z~ϫ3Ν;%/BϗM6Ijjj\hϟy.]jk   ؽ{#%Kg*^M_Q2   k~[-?)k֬c̽͛7O`/    [\Z-/;  .H-[.ΝӾ={_ux  AoioV79X e^P4'$СIZZ,[,Hf4@@@nÇ*xZ*U{.  I.ܪTnL@@۷F_CAؾ}_b|z>u_*4裏E?#9pqƝ9sD2h )_~lm1H>vZ:n>RT@VÇFruIZxci2OK.RHԩl۶MTaRJ_/ 4׎sf>-ӧKڵu;J6mD]oٻwocy\I*ޓkժՕg?   ฀Z,Gjy*>q@@@PP^x=uu/#<"iO@    sxjg|k!  @ZdO?~\g~Sg!  #yfٺuZL23ygGt0 CU*_hQ^<@@@}0`>LPx,gɄ y ZJ.8  Y _+R7k#"l+VSR;[ΧӫZ{:)S;(?∽zC{6mڔr}nn⪢oŎ;wrܹ\@$GE(kk7|SN:azOVE|3S:ȦuQ[dΝa~宻;vսj1(_iڴX"y<@P֮]wׯ__bbb;   8 /^د{veu   aä^z:ʒ%K?t8bh o/ۺuИ4D@@@ *deV5~g8h   7p~b݀ۢE ꫯyK@@@1c{O'j1"""7g;"о}{3.~ @@@\-`򣀓bUp衇2u @@'`/kE2nhٲI;?XN8a嶣 Վ1"/UX03Hxx^_CVQjϞ=tJqWۥK]}vt$Eud2 X תI&"*]uݰa.eرիwvFv!ǫ4h  u*'U^5h IKK66;@K`ժUx۶m|G@@*{n?HviH@@@Y(0a 8yyL'o͛g!   @eʔ;){@@ "##7g;"PjUz^t^Α@    ^pRe PEw.Ν?81@@ikE=a+b>ׯ-[Vڴi#jJaٲe2f̘lTZ:uGz׿/9rHVy|_Rܙ3g";w0ݾ腎}\_B ] /תd}MTɗ(QB͛ j}:y;V=\S\9]:WݯiogΜ#FM꽟xE{ 6LWMf?> w ~$b#  A X*ʚ5kjD@@BWn޽{ku۫^UWQFe@@@eGՎ;gCnu   /kO|{'\X13gf>   .P CZJgҲeKQPiFDDxg@F@ǎjkz}|D@@@ Pɻ最;w Z;@@a^+CV ..N-Z$76>o_wuw^?NR~~9g}Vy9ywmևՉ *[^=so:y:ٳ%---=_qM @ xzںuOnݺu,@@@@ =S 3YQPA@@c]r<&G}$ 40   K`ƌ&nݺ> A"##?#8"СC3.  :   V&J*>&IPnT+S|ע @@@V)#"M4kʯ*C ~X̂ ErСlƍ4hP6kLnf„ oSVX1BV.]dz7\dI}}௸͛@7 xz/ۦM,bn?~pʕEʗ/7?~<îm۶C+ *jٲ+2lO* ׫W@@@U2ժUsENJf͚f   8/PjU s>hFX|YVL    دC}bP'&  @0 Ig%99Y3H8!  B`&L=LN(KFدS   3NjwnXx :5Ud?*U1UrB@@ (׊ ҥKŜ^ꫯ¿III{颀j#Gȋ/<Cܹs?{ӱcGQQߖ .+DNEw5N)m&QQQW~} TFNkUZZ_XX;;ƾ=}u WOn(#Z`ٲeFm۶O@@UWZdIb;w    peZ>0==]~82+VmZ2}:    @~Pמ @@&b?L8QGVoN2E(f'@@@_ |b?WaC&NJJkddd9&va-o>ٻwoM|@@@)SŊCjL6p/ :kV^|IL@@@/ѣGu*U 28!ШQ#iРzϞ=r%'1G|A̛7ϜgNwr\߲el۶-W^ ŽR^GU *')))ڷۏ\n]9hѢRfxpAl~۴iQlF@@|+>m}~Zj ho:VS@@@|/0x`ꪫt ̙3}DGLKK~M@v i:   @wÇ%0Zl  s!H#+wuτ䥭[NgN}])*kAIժU{zD *{دIAP 7*UlTRr17QFI…ƥK~-52i߾kɀ2ĵ}Q]4k=&},4 ˗ -  ݻ܂دz`eŤSN@@w)m۶Ke6%V\iW'@@@@o )S uaWG}  yS塃jC&L[t PX1 $<@@@,Ο?/j4u#ZF5$ͻbѼ*nPWQjjYի @@@"@'02'O^zŋO?tՁH   xYw}'?|bիWSNɏ?(#G3gh xavm͚5'd[oWԺw.uԑ[^P?>>^Rܾ}>o5Whݺ3Wxz'q߼ytufYWTӚ5k&,^X9"<_q=͓@@͵H"E{9\]g?3T$%%I%!!AO}Ȑ!RD 0,YRF׋ҦMtuyeڴid}JpAشiy-mMC@@"`/V~}]W߾}RJ`&sB@@\/K/I.]tߣG w}Nb~   @ -[L_~e:  K O~>>z|eZ@}xh   9 *'O1/ͮ,Ji+U8jj1{I&z_cbbܛ0!   p '>=p@ٵkδ}2jԨȚ@@U j BKZ0---@Vt m̙#+֩Sv}*#t+^Sc< N}pޓhrrrZ]nRʳo߾z{8p^{1:ulܸQ,X +WUFvں(C=$.n:رDEE؇B@PX|*~ @@poj\ShРt5t@@@ tY:t -Wһwo&Ѭb-Z H@@@*bn"/@@\/iǎI&Ta~!8@@@ xb~b ʐ)))f^Oǝja8Ԣ̔@@@]{ *.3w+ӧO9*UJ>stU$  @0 _+VX1@&0|p{DfЯ*Jꫯ_)P9FuOફnM|*o.\،N^㪢VM_Xy6뻕nn?[qGU*eSX1Q2 `mU#V2e\Fi}jqa7vU`XK.o:ugի_  %b +5t@@@bqqq.)ϫ[M!  Oॗ^2U~AڵkZjI>:    @~T=B a>}>~M  !,J'N3gh!Cd!d   kM&֛*zrmj$C2n8`||tսɒ   !*@}]<5kȰaL~a>f@@pL׊20E}"jq*DثVTREC}SYAʩx{~Zԗ[^N4IWnW_+Ӎ7^q8'^1( A kPHwߕM6޽{u ec,X`xYZ޽E}9rDuĉ3^RNe bxQA@@\#`/^w8E  k_Ul"s=UG?^mѢ@@@B@lٲ?/醅#,1@@:~!""B}ѠaB   @ L:Lb«3~ k;;v4-Z    {M2+V4}:C̙3?r#b"   駟# ֮][ @+P`Ai֬WL2r^@@l/^Tݺu%::ڶ.   _oLL,Yҿ8=..N+&OիW;a@@@r+K/_WO>BQ~7b   xQtҺcǼ8*C!  = dپ}>K.RreONX@@@? l۶MVZ7mTԩL;ljj`DDq*TzuܲeҥKL@@@a 8©{l>Gt} 4@@ț@'ߤ{<9c)K/ /~  r~ԩ>}> ##=zmΣ[;Z$nnӦo    (`EC_||g:|/ +"  kŊ+GP%''yry>@@4-Z@@X@U-5o\.\ؼy4nXm!  I駟cǎ;O;իM5t@@@@V_5cǤhѢ^@@@WUެ N:*GOo   ]tZ_zw!*eFDD8С|'zx[@@@hyشi>k2   _ )) RBӧ/F)k׮!6l(o/ @@2 Z1@@@Quk׮-E Q   nbՓB Ʌ dժUn|: @@9s='oVo.=5 XT6m     92/E@@ r]wϞ=ƦFOǷ%J.]6(@@@?Wb^tI =VgϞ^AHMM5;"#sۜCM:ٳòuVS!"   \&pA|O_ Ӿ:ZnԩzA:_'  \.h6ƚ>@@@-u߷*$ZfBk@@\/`/|'xB~iIKKzK&NQכ4n    w_o΅@@eN̙3P) @@@s̑GDo6)Y SRRL5\}&xӧ   دC=#G_~)ƌ#5 u  L*T0}:    Zk׮5nҤA@@ `/[Z57h۷?^֬Yh,G@@ȝC=$111)Sȉ'rwbn:3K :    e{_kx/`8@@@FEEtL   {MV.HMM5#GDD>w t$pBӧ   دC=< o@@@ <#8q׬.\ ;v ח\/t@@@<(]9b  'wVۼy;   K>tήO>L'-sY@iݺN~Ν!k@@@LfF5tغu 6D-:  ]~nll!@@@u%KJJQ@@@,{zOUY֨QCϙbYP @@@:uoѷo.S& >?h֠A$F&    tJ2sد  @ o2ebŊzV#GdI@@%Uj |wPWKn3b tot@@@@bpJSRR{i2DnP"`  ^ ))IX@    xMɓo>=^Æ 6.!  ؽ{&T wA{޽h   z@@|!Qo]礊͘1@@@ K.73[j%7(⩀oDDs(G|B#   or9xOW^+W֭+og$@@@bb|1@@@K`Æ &a :   ={LBدy@@@ g~7e~ׯ'     "E9;v,@@fHO&׫W/4i>eر2`hOq,   @{=s<`tدN޾}{ 4Yp@@@r)`-UDEE,C o˖-W_}U~>S)\p,@@pD@'a=v 5kRFd  f>}< ~w_ x׍ 41!@@lݻw Ro[߿yL@@@r}ŋx %ț7o6ԫW    NΝ;'ǏwbxD@@xT뮓֭[eǎ?4 @޽{ϣZJ*RjU"ɲo>uꪫf͚s9p$&&Z̦z>8R`Aob<NkR=L(_]&er'/G-ZT\aPEDDX]@ťqƲfYv:uJbbb sRD@@@ xb˗I23W>IIIҢE WF   Cz_>66J^ 0@wD{=Q_4@\7)k(   KBoZ5j/ @@@= ~UFSL*THgL@@@@ J,̨5}T  _b*ѣSN:SO=%7x.}(XW(k(sWbjqŋK׮]&wE@@@ T3giQ7؞]g}vX۶mgu_d  d*T`t@@@@ 6md&L_CA@@\"`/璬|ZnܸQDA@@InݺҪU+QooSkZKII1#ꪫDKC@@@j.]$QQQNv֞vv   USUGU<ٳңGQJ,Œ2UE `nN-==]T1SNt <8cTqgyFfΜqjX߿?s }ex.=r+d#66VڴicNqE=M:j1W_}UYmAj*Gop :T&Md*޷rJ9WÇu!?σ*2=rHYl4i~H_|1u޽{u1g;m~:;̊5IdNukw_\隤~]RK&Nh؇~8/@_獝?^P)6c#   zj$?`ZhQO$""‰P  HLL4#{_i#гgϐ\4.xAfS\r&1U`b1@"аaCPyX~˔)#e˖ I@@_*-K fعsg]Wm7o~m6t@@@ w}دO?;'_uQW@!   N (Q„8yi   XUs?)/;vȆ tɟ~I+Xld͚5Vӭ[7y䡇;wЯYf3f<󒒒1(^xvܝrWeСCW˗/p*ZP!I{\0Zӥjժ9]мys>}\jժ\RT)yꩧru:HT뮻bRR\Q?kTqF7wim PǺ(٘EG,˪o6m>\gn3<#&LU_2e[Ń͆:N] dxw=1;kSgW{ _sjo\"N_񚤄~]ھ}W^X9.@_ljpW* w@@@@bcc/?-S@gQJ,)~>Gt@@pZZ|Nc| ;V#ÐB&MBϻ3&f@Mן ͛Mu>@@@ w6ib_5;C>WY?HϞ=/;Kmb!  rz|M&Vw֭橺ꪫL    ɓ' sq®x    @y.kԨ,]TToX]v[oYVo d.dWj xᢊܵmVԂdz*hy_nZ}r9s}rnf8}tiذ9?sܝrW *THTQ\j֬i=o)fLLb.|s[zwߕ{LZlg`ذah]…3ǪP|BBТE "Edخ('fsXW+۷oO5PZ:22K7n]iu*io#F_lدS&:>pw}xQ5$éܝtRfoIץ@&)_밴4D>O*~}FX U?/\bI30   9 P)gOȑ#2x`3bŊ1@@px#$ٴi7b @̌Վ=ʵ; !g[l1'PPA@@ksIVM[n3g[_ރN4{gwC$[JȾ6KeMʒB)$KZ"튢#K%!dߗLg;wy{n|;g̜̝ޙs $` [j%w}SgСCxzj:(       @|뤙     Hʎ\rJC2yduѣ/=~%Kt]M ]Ys=ҧOg^HCtKt"l+$0 Я>SNmUϥ_2?}ٲn:M e[lQ~87T/.;vz/9dϞ=ض *TH B%믿C]nӦu=ٜȎ7n,nXicD5k+޽{~#s>fN}>C}'XI~r枌$\~)Y$O_  )z-uo7*/{FJb6w\y*$@$@$@$@$@$@$@1$ .\@T]~~ ƼHHHHH~EH$@$@~CYEJ/8د      !`*U*AUT+ ~!ى'$qR2k#    =pAqr˼ydŊvZ)[lSH"84       𛀩D_i|    @bp ? ax@8 ۶m;S}Y4h\wu 9 YjFD΅m7nJ7Xz̙ FI6?}#~rψȑ#B wUg' * &=z~UeL>;\Cxc2l0wQ7C4\g L|Aj:e}Ȑ!2zhۤSNRtdqӾp$=>OQܓ_S13Iw}$rsɑ#G' DL=ƞyk,Wos i,Y] #      Ab!qs W_pY<HHHHH UaΜ9%o޼Ōӥnݺ1 ́;v`HHEo9r%JDP%     "ؓO>){hܸqaDL,J$@$@$@$@$EJ /Tפlt:>|), @o>'cέEݬHHHHR@ZZ׹sg駟M6N)+WmJbt1?ڵUQ852 ^6[(?).k}ɒ%jժ#]wCx43OBgyJCŊKベ+W4@7^f!0d8~7NN8ڵ[nu 4FfCLJo$ ?tV .%h0wIĒq:t ԨQ#N&}oD'{,'cd'w_J> k'Q{ ²e&zRi=ƞ5^~XZtUL       vagr2 ؾ}t9^|o @B:+3$@$@$@$@$@$@$@!Sk֬Q!Fu|lZHHHHHR *UIgDV&;N       'MS=vZʕsL ע qi$@$@$@$@$@G K,.\(\rCdݺuҽ{w)ZqAHLK=Dm"f*Ut/oz3=:dժUb g6f`On*e0ko>gs٥wκ]vxիW., U[h86sr̘15k֔uViYdcǎY* ǻW.;vtEceРAb`KC=I~1w9+CO._/^\}Fag/'{,'cd_+SOµg}$r;?s2-,.2s:i&HHHHHHHbG`ǎ9riYSJe׮]ڵmۦt{8    H%xsN$ҙe[HHHHHHH |6m=ϫB =IHHHHH F֯_jʓ'q15U(QB9駟ÇIzD$@$@$@$@$@@*UXbs̑Ǐg oٲe3EH       ȗ/ㄩd05N9kb$@$@$@$@$.qթSG͛'f͒f͚o_.{ᆪş@IDAT-dWpa% +VȄ \ԯ_ߵW[.]ڵb=z@?}ˎ6w[T?p2W0p3+A=4eۭ tR9y򤳎D| Ίi7t0m?orJq⺦u\J3f8ek3~L& åbŊ;-HhVH}L%k%$\~K'OK{gy.J٥*?!@pvxfoI.IHHHHHHbH@ 86A>A_F,HHHHH F;Qo      H0֭s<*SfHHHHH +%KLbx㍪nļ+%     &pUW  zb7;eǖL9$@$@$@$@$@$@$@ D 7%O#    H>YvA?BDV'T]s5ҤI%ThT.Ůu{ڵ#G8J(!wn&l ʲe]%w5;j(6mm߾(P >f܋-jf0_|l%Ky衇u;\[ΛznܸQ'ղTRXlN?t%ZIsIs8؞={\!й]+tq)k͛Zjc?u$?,[conv§[nr7KΝjժzs\~8Vwld_ ˫*WtE;-~(?Ѭ?&o4ɲ,      =3?{@v{ي r֙     H|۷owد       TL_T%    w:fSb$(ĶAl1;#7pC"G_HHHHHH Shذi sΕz<Sdɒ)^6HHHHHHH 1[Z+VNUrfHHHHH }|{K/3<#'NT/ugΜ)'NPl۶M R*/_]6j\ڢU!Hˀ}%W\ij[_~e'\k۶|kbzjڵS5j$ZRBt Oh#ıMϙކÇ׫jeʔq?,YD8;v,5Iض`&?#}(-aFJ̬k׺)RĵCɏ?ʇwܹ]y̟?_f̘5kVի-i&v?{ՓLy*TCʐ!Cd?EzQW3 L7rH[ܻ* {}Kpּ~)$K~i„ ˗O}r3/~ҒϿK/;vʕ+rzM$@$@$@$@$@$@IH`߾}rqy…t9tM=_[6m$HHHHH s=1ġL$@$@$@$@$@$@$"֯_ﴄY &HHHHH),"7VfMYhL2El"ŊK%yf=ztCGHHHHHH \:uŋ~ D3K(6 $č׆Z4S(R]XͺHHHHH LW78Y;w_U}<#[#FCz-O;/.oMD`!}'` e~7w-\QE t_|o߾κ]v~A|m`!b-^9s渲!`x.\U^q:]eo';;&=2?3YCsfΜ)3f̐K> Ux AիWW*UH N3ɴŋifqEɐ!C䪫j%T(a^Λ7Oz)>|ٳdzGʘ1c?XmEwڥbbÆ s!ߕ@'pFg|cm]ՆA &i@شpE!j*P%gdA,6|>}S$>`(_?k_\ohY֬YU?<vE}V\DǍ'۶ms~`->5k֔K vi%F>_ǂ;O~<$Gd'UJn*-(qN4       رcSgᤙ {;G E4 .IHHHH P7%   xXl Hy^ziaq&pY|QgW#GdΜ9 ໎ީEYu>    H5o%KZ2Ԟ< -KqTh$@$@$@$@$@$@'PvmO1*׬Y4^Fσ 6 ߦʒHHHHHHHBț7޽[= w￝ !C#    ;wniҤ);wT" .oV-Z$ ? ֭[>}VKA|SD )^xy%RlYr:uѣGkahV3rHԩS%F?};ڊ3?UO<3D^k]ׯNz.bO?SOs9Ǖtмu}Ao/a;±_~E?ڵ^zu㏮J*E=]u\}՞~mcW!ܮÏ֭[˒%KVtrBZʕ@СC}pر+J Gܹ[:F>GG~ ?%wsJ}Σ>E_J> ,_ڷoR{|XXO?ݓ-kL޽c8+VHTRҢE k8쌱'NT5n8$jߦM_+p-+STXQ}l ضmKnwqjoZZe˖i 42H%0x`5 kגK&'> },lR~}N?o-7|sN?I 0&u,HHHHH bxw@;:(_<ǻ6m$뮻N뮄 &o|^Wb( 0/U UĨ @, hIJZ S'X Y"@ cx,D6.],[L!Hc{3g]@ bEID-T Ul!pځwybW@|GƜ9seǶӧ+nޤohDqbbf"i%fÇ iMpl̙ |}^s%UĶoߞpEm.&.4uTR%>d,X@}32W\o6̽fuAF. Yf{nt b2|Gz$=hI~ ?%I^W>O PnF FMڥKYD| rs}M# /q뭷z[oH$аaCٺu@'*M$@$'Nq݀A,^$@$@$@$@$@H`Æ [⠐]*_]B"Bq9 $3X\3c"svUt•c g\5 $5¼b0hIHHHHH2F a~@ܳVZꣷ߲n:%!Q@K[LL+ %2GW⃴"|r-Zf:{ڠ:ci"hO?;و#dҤI Q~uv'g3_ԛ~+&w@tlqgKonh9`b 'U|G\\p3-0k`6-^@lի+pӷV1SNuD@f 28p.L 2]u_̃ϸni]tQc"xتU2\N4=,T#Pd,$~K'TK ,o]@){ꩧ&c$Cիk7'~3 @ )n|<Ǐa1l0)^ @0~K&_1 @F dɒE;_xɓ3x RgϞ-7ӧ; d M~swOBy3<v x5O.8+j.Drk=V+v+-Qp ldc/3a{4Alpڴij曀P۴޽{%fSO ǟzꩨ޲etwO/v! [oe=F?a遒> e{,l_-;~K'}D臗3fKH|;7V/Ԯ/w ķv |,9@wժU-t9\?$@$@$@$@$@$`V,TP:$@DDh"I9{Vf1#.Bg3qʐ!C̬7x-_PdI8MyW㫵an8L0Ap[tԨQCovk֬Qs^ѰaCə3-^xA ~M $ǏWI9Ϫ0aٲeSb |lT@ n,ñNy܇HH04 &m6M#     D#8W0B/Gsxer KTRθT5ccxA /N|ROߘ`f%$@$@$@$@ʯ)X8A `(h*v!ܩ?Kݵk Lim̈! e${饗dҤIraU'N:xVoAx"g={t|mڴIJ.rOn6Uԃp]Cδ~i?eC 33E2 ʕ3brٲe}\;Y2-譹SNuz[ftY=zT{H\&Lif^Yi'6o<% v2(A`6mD=X:cqo3'_ǂyΓ_yO,/%sB/c;L% z_.E]g}LO"NLO y%H = Z{f* HHHHH ߊ#I hٳgWs /y|M@_}\KKxꩧ9rPcH1{,yJy3f߂|m/*7nT^]#ǎS⿯gSLq@D[n_|#{xY @ຬYA}|rŒ@0EɓtHHHHH e }CT0&8{ςxww @L `LY2e_~QcZy+zQYgY @f'` of~    d$pj2: !nڴ~Cɰa7ߔ>L rJpǕh&^bEdjwyGF-#GTA\ {rw7,7pjJZh!M4 e]暌_0sRjU)VXk ɓG0>*THZlD;5x)v62A$@$@$@$@$@$@$@>0u+ +cU!    &5[̙S#b SNU}.H갅 *Dt N;-!`4OTΌ%K@\r~s7c ÇׯyX_\ mK %d:u'N8w;Ll 1HMl 6>}tnD0( 8U &{ vg嫯r $s۟d\ ?XX Fd8ҹsg% 6^{}Ļ_2wO6|w-%Ily/엒O-{Dܖ-[ >0%&S7ol ԫWO߅9s>\'      .-+hN#p |$/Q΁Fǚfc[F5ˍ$ 1"Mq@صABZЯ޽[u&};v{: 'M$ŊS}?H&̷ k}{#ƍvzHz)<o!?8L@f&`23HHHHH 1P7y@ܠAʕ+O>QO.r      uYNs'Og=۷owcdHHHHHHH|$/_I/A#    S3vJt Y8W^y:&ۢh7I!8jZ(Vs_ҶWO67;3Ftk_zuiѢ}hu?@ ʽ΍E i/_>3+fiB QG43腙ox +M Pk… e߾} `)_x㍐{ŦMt_]$ѣH"* ux b?,\{8&Dz}>CPW}3bI(OnsI~}}~K'}3T!Z(I$bھkHHHHHHHGvRϟ_G)V4NFl`HHHHH @@Lp&H|NvժU1c@L/G6lؠbs6I4kLmų 6mJ$yz?s2e8śmԙsuD^B$qڴizר.UoTHbB`~1o~1/.,YR|Isܣ{Gd*2Ā3}gj'#eDO?A(T-[L *]x =@|_~J@}ׯ?~L8u,VnS} <j G`p*_|"b^Dvy7agviҲeKySb|F$W^-Æ S.\Xf͚%`vZiР{buȌ͌WL$@$@$@$@M|^Tv6NaL0iٳNrI$@$@$@$@$@$'z{T5+цx4       %xh+~cyY @osYje+B M4iVpIW~~O8! ۷3ϤUVovcȘ A3~rr!{馓0Z^wNrrnC8ߧp+^k7@@Qt6 Iʕ+gfv@={]ZA`QL`:,n7ovh1'rʕ:0iӦ eP:tX'{,U2K},/%kJ~}pMf'Pn]e؜9sAl $<`I-]LO?#ТE ' G?HHHHH2N fieDI$0c<# n0ajzwߩجifpk޼SM3}J6>s- QC=?Yn,덂,H 0S5^veꫯ ks疛o9$o9K9sTeaLQ /T4w5kV)W\NX2Z]N41}w!5jԐjժ߮$^|N/@C Ѣ?\͓'ڎyl1bTlYuO}y穱E~ C*Ubzz3ʷ16Xb*{̙Z@b +viGm4Ңr,QڄcXI&9qUo~x osxұcǠ\%^zjsעe{LΞ=k^￯GC˗O ,#ժUij\{j4_ifYICh^sm:)[lϳgVeAܷaÆr?- dV YBRJJ|Ay֬Y#a|g"G}$s6UZ7Dwk3ϔ,YH(.C/bsww>8^/pRzuj̗zW?̚5˕jf͚ҷo_nE[NDvQ_ݥtҊϘ1cd.F8Ǐ\ PD쭷*=sUe˖ҥK4`֠A}ZB۴wmfMb7oNTԼysܹ4m4y{}ֽ]Ws'ZǂY/_yOgKd@:Zh?Toa['      %_hAi$;X׮]|}HHHHH)kS&tH FU& u!CvڥrUF5kL^u8z=zT͛ i :ƕ#; EɎ;d…r%#Jǫވ$@q!qFZj9i:/_\gY:tH o۶6~mMSP:3UfV,իW|*^^tsĴOR~}@L5jH0'0\p>mV{ռ. 2W_4cs330̞o /"U/@f'~1B4     H$6lP̙S*g"w :twyG c@''Pq0ʕe\y=*oWw7K=B#GT1 " a5pm# ]yA<p4i 0u3<#O. 6-`7q"ީSF<>i?Ω_/2g s[/<2A8Ν;rnx^sw;^sɓͬMYӱ#S/BŜ}U<ΫnXwh <}Fc4ǭbS{j+˗/v&       j3鿳O~K'4 ZjB4h99ZZI:+~3gIHHHHHbK`NuP0+ EHHHHHR){gV t}`̘1+Vȗ_~c"nԃC AkFϟoX_DhiMvW8СCfMxի% @)3t@blR{ldF3m5`f `޽{M[nuҁZ͹WJ tHHMS`:3 4! S%`UϘ\A/^0@ԝF$@$@$@$@$@F`ʥ%J0@n'gذaVC4j(i۶zơ 3Nbn6 ,s.#r[.]j*y|O_z7էhѢe]d]vy-X]e)RDj׮'ٳg;uy%]w~;vL{T3;8Ks>i% `+WB^Q3f?4mT}q=f͚6_|\g:/|.cO 6db>Ͼ2byE+ƲCBСCNrrҩoQHHHHHHB:wHHHH@TbH=/v5 .pZiҤk ֆp5-Fe~'w wa @%pi9 sUh    HIYSUQׯw6ֵ+3j(gӲe`h ݲe8qٖф=0O駟*Q>@>ٹs̚5ԭ[W,Ggu=` ۋ)ZK0O?]@ʕ+'Z:uH"ֆ@L]½kזnA0r%mڴ~IŊv WBp|/ ?_kNn&A B:u$ 6Bm_/X0(w~OI~)ؽ}/%S27k~$& ZD/s-^x,X@VZ%܊^4       @3m I.Iĉ6)y3IHHHH9bIy 4 N'P8㥻u&Ho$AO.w^d|w6mh_8x۴0cںuah 2ZoO$%Jp*xyu$_~[Mx#YW^>;o s0~rq)[Wqʗ/l88<QdoC… c^ٳU9sh"QgϮk,@׳I _?HHHHHH  @IDATc"rw bL͚5Ko{eщ誧Ok֬qD+WVϒ:uW.{'+2[X ϭg^y1_/z(&*kذzwXϲxbY|f~w;^ʑ#GTLy:mx]1K.Ylٲi_zdjBɜ}X0gs͝N L7#]D+B}^|E_͛("^c:(S po}&M )|?v0;Q]@ݟ~IVXx@sQ06  E+WT0`P5̬ ۢ/]trbl=> oD':k~K'%k `›6;29 4h@Znl&      '0Rurn@ ;6l0A  @0~ .z dH"&3gN4hzr1y^\pː!C7|Szꕡr1bÍ:1cm{Z!FǍW4aUa&fi !` Z,Y$MyiEl/P֭[뤳=ᘞчPzC'  Ab -4BIg{/xܹs+Q ceg/^StR<722 3iIZf $ ċJQ ;VW.{7xC֭+wqGRzLg͛'gw1c;y?/g&=\'ivm+V(O<\wu|seʔ)Gx.DOC4‡([Żɓ' j?ð}9u*'ѨQ#8qqu /DOga⻈w0 |9mˏw\]kw3q!0jժ|/]y]v|AimG:K<[JXg/_^8^Kw0` q~"arOj{ ?96ZcgW` =">^EVs\HHHHHHHH gYz *o̰"    $Jj 6MJ|zH 38S\rl{, Ciڴix'eFZb/Os5%`¥6|hC~*,ZD9l @o❓D>˗+kITW @L_HHtxÆ *u~xi}ӓ^{ rJygOSdC@+H ͚5ݻm"e˖u6EZSPUTQb%-0aEQUvmR#^zJ_~ _ 2H hF$@$@$@$@$@D&ϛt> "K۶m{rx@4 Tl_l|s֩SG;4~ 9 k>4hG!fO?] k\=2 m;^zI=UٳkNre_T;owtzj]k:q߿َ9rp7m$O?D͚5嫯rY_ }O?j袋wj>x̜9SWTS] )DMܕH .]>}Gc8!FζÇٳh0oqP +a+VP}ãY`Wz"+]vZ#GT"^B!Xڵ;v6lG^/g1:XA}uXvA.]T.\7xZzg@PCFۺukټyW#LE mHHHHHI`N@6maT,Яϱ @Og}Ixʶl"k7g ~q3izO#V2b~p߾}l۶a-Z8Z0'߅ݶ9WY]YdQsևxiyagn,ib[z yqcU~ l7Z\zU:~T]b$@$@$@$@$@$@$@';b?P,HHHH 3Ț6 $?@ A:wW,HH _J@ 2 hC/Et/ xi-[B$@$@$@$@$@$@#ÃB ֜ h`Փ+"s$@$@$@$@$@" t"+G *4O`>}Pw: oo0m琪qڲe˦\ @ɓǩ|_dدO`Y, @#vgC $#IZjoݻw'#L$@$'Ւ@D+m^+6.@ ǿk' @ D# dCTF$@$@$@$@$tDg# %K^zyݻMڰ`Ǩ?^~ ?Ə HmUT[ov us[$ic-W^`%H ^AtW[8bz_8<>Z3M$4ZώPyiժj}xƻ+7xz9G}$]wͫO+VH^%j6h֫HRd3 U+VH6mDErJ.]O/-y;>/Ͷ;]yN:fߋ4       5s>b~X @*oy*m       8oǠː!CTME: @t P7v&!ҊO(fn zmq@\"xNY$#8- oU\9Շ{9(#e^SH>POegK^}vN^_? $S7G:}%    ֯_Z ^`AsK.D6oެիWO&OCb➕*UtN*gty_M8v< fKa{g̯ko}_b;>/9{… E˃ǸmSB#       X3 |beLf D,-?.gN%$@$@$@$@$@$@$@/ϟ?<+@߆2x`' @jرc0:( 3E>s'ήz   :0}Uo4 @ʕ'#̙SjԨ>9>zSWͨj \ :ދk$@$@$@$@$@${{u>!I@%dƌҠAٶm,]T \N2ETYQ< GsŊ2awp[Kvmo=dĈjkcV.;G@ksϹC30{4iFˆi`sj-^|W./lܸQ5ֳgO3+J]´n\ ޷okɓ'+3Ȋݮp]ˉw=/X'>|@[GI4g|O1Y< S!yˏƽ׫hw>/gew;uS1~`:K       CŢ:UN3X ȉd3H P,[,5% HP-Lxfy\&7\rI:udܹ믿͛NL{      ]v!Ak9k~(֭S6iDj׮a܇HHHHH ܹ>PLg&HH D3j[lB epG$@$@'$ɠ+$@q'`g:@$@$@$@$@$`X~F_ED ^Ι3GJ% K/Tƌ#-[hxbWQ1!ٮ];9rs>gLj LWy8רQC'Qdڴiҽ{wi߾(PٖބͽhѢp3iózHYo/wz=0ϩ\gYJj܇eʕ+R"СC5b8p2q ñ={v(kzdUphBTp~a%;vXy] ,9>ݺuoY VZUo2Zy~3ye5^;g'v/O>DfΜ8:~e˖iǝ4$@$@$@$@$@$@$@$KsVbYft ;+"   HAM& ć+=-k (_;{l5a*#       owVЅF6aÆ9Y}qL .SAHi$@$N8!ǎp3)|at<H;%tH  G $ 68C(ө<˗ JӦM-,Z뮻g\rŵŶZ qUyeb >Ӟؾ}lݺվ_~Y ڶm+|ˉ'^Zv*={FIVkw?gbb3ÇUL2<'%K154G[sw5̫T"9rPp2~ϟccʕoW6ܹs>J*ՠ˵k׺)Rĵlm{:}[ !Cd_܃=r}ȑ#էnݺJ‹O@4hhp ,yM4vU D~z5kV4q㜿Eʥ^*7|4m4˺A=hwmK?cY`|={;-[F :lkժU!kug zmbi[?T4a9s'xBw\޺ek4v>/u5pn޶yG3=}@}Οn歷r~WYO> k'Y6hF>OmTmnl4qy N$⚷vZRd^ӹ񳉳B7M*@@@@ /zqWk@@@ 6V   dycR |RX1ٳgL2%H@@@H|BP$O>쮻rd@@@ ~Wu) @ (QBz-i  pMV@ L m+~3F@@RG`ʕne(qg;0=z_{G4ŋE_vQ( 47ͩ"͚5;"Gj3fȀC[{Ý? ޅ NYݵ6mrz)}pS.]=tm0_~ŭ5,c1c璷޶wԩZl:Fɔ5?x{2bYʵq-z*UJԩfY{ɲB3¹GYVY|h^RcX^w?9r[.dտN8A:'oJNxw׼:׃67 ׼".A Go͵JK,;-k*ǵk׮=MW_uCt?ڴ@@@߈h:V<.'o @@ ZNj"  $7T"Eȩ*~菰{ڵ}*b@@@l{pfmܹseĉl4 /4  o涌`.@@@2JhѢn{5 @@H ReR5LG#ڵ={ٳ?coiΝnp˗=g-,Yh_]N> =s4X\Y+hl^ۜC?\{yDRN0A"9Yݵ'A_:YTKN].hΟ??:xjB=1\km?;@k`^t qu5jdVӪU&CFzgW/2}œ9s()nݺNPh Ol^zұcGi֬Y`(ghٲerʴir (xhv:E/[f2bѠ4i$ W]uw3d݃v֕+WUV;p@wf:t v𻐅eݢ^tqٓNT3}Lp߳g,^esF.o׮]yf>6lg2S駟n[h%oA{>,Xk'tR g}yf[@. E4Es͋F):A=sg΅pA_t\?O?{^xA֯_I&2fU;/3eʔqe˖to.C@@@$(Q[3?`}Id$xD@@ Dʽ[    V?n 573G@@@Ƚ=( `Fr04W=<@@@ 3~W*Tpd@@@@ st0+3Զm2@@^`ŊNΝ;bNCfz&4?27ր!D9ofodΜ9ҪU,[4(<t݃ttGؓNPi3CX{fyBA̝; xmkϷSڳ/D4(w}kqԩ2^ 4I@7Σ7}̼5tҥC41a„E 4{M ƺ]hurvD~Xί^Zx iѢEG*>O=z k5+t5ޠw*5M?h_ۅ N0x ʬY2*Яh*}ސ@@@@D+V={|;/c)M  .P0H@@@} &} xRT)پ}=!   Mk^~eg4ݾW^bw\LC@@ؼy[˻y2    9:{͜NK@@Hv;wYfdnZկdɒr}EΜ9mMDL+L +Hyf3|`qR_֭FrW2dOJ(γ3@p,~4i ueҤI%K8A16 ۸?3>|Cj0d ș] 4VϫhO>DvRm9 iP^so@\y5]veRnEo2˕+m}e .Xw͛rnzxk9 *Ȁ|-΋<̘1kɓmٲeGa13UX$5/hs h0   $\hѢn+=HiF@Hw{{Ki    p+`$)^zepŒ̞$j   ~ ܄ʋ/Z@ݻ{8@@Hv-[8U,TP @@@.PLgnrK@@@ v+VרQ͓@bŜ_~q%N8Q>s`8oܹg Y /y"}|wUgXMPya׍L vmUUVIZBd݃v |hiÇ۫J߾}CM-[UF3@aBiCV`"c . ԩS#g!;(߇E&L uƬgl^/hcq; rr飏>Z/iƌN_ }q-z%]v;@ |ZX ׼ͽ6\"L}\x z\9ww}iڴg&>+WN~g19    D/``m.   m3B@@@7";ݶm[q~'    ؃2G;0M{cT?~YƩ+ժUKjSG@@Q|V,[R   i͢H   @`5kLtu2~իW[nE>Cٶm\y啮ԿO>Y4UJ(!Guo|ry~7C o#_dɐ(P@*W2O'lxnܸY˞={U5k&gy;)㭻>K,qP=?ȼc-/woјێ-}4wŊŋy͔*U*d:҄vhYjܸ,X0m-{}꼕+W#<"Փ-[СC@ɷ~,^XM&_~y\x4/FyA{myEz[;kN/j ɛ6mk&@@@@8 $"د:~“p+@@4tP   8n`%>{n׮Kd@@@ȓ अ7Oi/E !  @ lٲi43b@@@l ~~z{y@@@ !$xA5ЮIw/t^]xfQU4i"9 4ydٹs=5[9s愔֠A)VX<Aۍ p ڷo_{\/ ,oNٳlwL1c˭[/13"VO?ɤIYҽ{w&orǯrLyk.1bmVjժ%<,]4K'gq۲f8pԯ_?z񚑊Ӽ$ׇkW$頏߯ީ4<7 _ԩSer]wہcܙ۟3#   @l==B^ @@b olnl   @f!I7?iߴiСCiV   @/իO>q*?ׁkH   Y#۷;.[lf5"   @@UVy2   @VX$vS%Jp-4H70.ԠN@xǍpA@{!sJ*!6n(Ç~͝9NGAg8p^aРA2}t{\{Rty?=zժUbŊ|3-Nk׮'qi/Xs\îf&-\0dI,=AT,'*+W+R>쳐ce  ]pa8a<+VyANyA ^{qSeyk`9{   /`qD@@(NVkaÆn9  D%0c/_U@o۶m孷ޒm۶7|#͛7u   @ 7ӎx}tk$oR@@H;h>7o- "`2eر#b@_/_K9VHj&/v5   @@5kLT5o#/ٛ7PgMh6mŚҥ;9s͂Xnmǃ#<"7pTT^m駟 &s'LDuۘ#8"d[U;iPh8H"ҰaCnСCrw?`{V\AӠܽ<9qGlA-[&u o&4xp[=+ۼՀvmAJż`ޤh߾s΢A)T Syk^8}\xZP4ep͋Fu دߢ   (V޽{|T .  @* $WTSG={    @n ú Gr#k ϻ3    qٳ'{JOe@@4 oL   Xn`%?{?3]j߾}d@@@@ v2eHٳgˏ?货u֢ڐ@@@ l6ω.@@@2RVZn/^   XrUf :4Xj ڡ't;psΝҵkWwy4+ʐ!CBvݻwSO=%Z>ZׯK.u$>3?dɒ2zh)^x||Ϻnl?p)P:t y{!3#LwOoz쮽Zپ}z 5p7鹫=XL}L6~{K,I|R\vekW_;v-"ÇСCCE$1Sho9~-ɺPԩK:vkH"=߹}4:׃6mT.s;}{P"%PNbѢEn     /;޽{?ݏO"!  @l-[i:  dQ43RJcGMk֬)\l̜9SG~Ǿ(@@@L0~ .,Ŋ˄&o񆻤{n   dlٲ kmnݢ;hh. @^|s^GCbΜ9!?CsO]w%#F{܊w}W/4p@9s[%2i@IDATW熷Y^V8fCTJ S{\؏\l`AWoڊzue QrRR%ٰaCvqB@@@ HD_wm~  ^`7K\sMBN@@@VV鲦~/t!]F;@@@ [L&1zhBE /0y*GM@@@ +wBwּys? A 4lP +PD H?,X ˠS{<9  .rJ 5ktdW @ǃvk~9{EbD i-Β{LN8ᄰ] 6ϙUT ;:s.?hܤjժInDc l߾%/_T^ݝ& )o dРANăX~g6d޽{zWs ^!+y&r&%'5`k*T|Tinl=r ߼ kީ2<5J^@?3}'믿ʚ5kjժo̚    @7_|yl#  3@@@4I2xg  ׺uk\f@@W`Ϟ=rm``yh_y3OB@ Vpe+VL *n@Cd׮]qWEMiO?4ݚ=&. 3@@wߔ&UL+WtQfM7O@@@S^zRJYvL:߭pY<֊   @#e@".r<@@ȝfrO:$/^* @2 \|2jԨU:wމ @2 ~O'cըS6 D35-7n9#eJ,6@@ ի :4CZyܺue˺y2-0i$9Sһ@ Ppyt-:P8  ̚5=e|rqw}'lڴIt^&~Gv! @T^]VZ.͡Xb~ HEɅ^XSn6Ѿ>$@-5/G#8'^]v̙3u։L{n׮L0!=P4   @^'=P^`(\[ 3[*w&@@J`Q1   9 7gt\C2;vtXodr34mB@@R`AN'Nt+۩S'7O@@2S`˖-n˔)    @ qN_=e袋2#  @V\rRHՃ#~ l۶M/^g!em޼9d @%5/Q o 52kKS@@@ $"د+]?~oF@@(x7%!   W9IB I6mFmذAΝ^ 5   A`q@N]޽[fΜԲN:RV$1C@@L__twG    gy[ɓ'y2   @'֭svWFx    @8 ɗ/S%!   Ht_H~@@H'ڂ   @"~wgMQH̾۷o/cǎuv>aiڴib*^@@@HQ;oɒ%ST;/ӧO;EtLE@@0~5/?"McI@@@KNE޽{eܸq2d_  ZJg՚5kF )!P|yiܸ:t(j$@Ak^2@b*V(w|wʕ+F {E@@@8p .m7}tg 9;A@HS遥Y    o͓e$ {wI@@@@ ;oR؂UM`ƌnڴi   @ lݺi|ٲe3#   @ر3F֭[''O:+d&@@@ VXO@ QG%K@KHw]:~5͈#O&>@@@HB ؿ2cJ}7HiF@Hw}   q}S߲e/;wau &Vz}VD@@țV[*c<TLjѢԠAbޞ @@SgϞrG&g娕&o2e|/@@@@ uw92qd@@@@ glk㏲k.͚5K6@@R`˖-u)    :%\X}ѣG  M`ʕjԨ    @jí<@@@@ (;MH;??\ 2  R`.gu2^`ɒ%+6|r)QyҴiSԩ4i$k&K.2?܌nݺIƍ_;v8 e\sMe2agY˖-yN/;TvR~}taˋuΝ;eZΝ;XԤI?wӧ/_^z-Ypaj;.rgZi!<߿ݯXլYSA}_}jq)\Rرc믿vRxqw2~9=X袋­߲qF)Yu]a{g~=n6wUVK/N^}rLJmfo,^ؙU\}fo>߿;O+B r-[<X|1DŽݫn(P@nְ0ȫ~*۷iF)">?g aC@@@ݻw_52f&V`O޿{ w+Wq  g{y.[nu@_L Ї=Odv?-ѷ>ه]X~\HW?EjC@ 3 y8PJ~=όV" @t, @8Sa   #ХK1ym&3֫+ikuʹv^@@@ cƌqc_#5 *VԎ CP)@@ #F"s=3ȁ;8?z #F)Sس":('<c5+j0N8LӧO;ә~衇`D7 :tp~$ 裏:u5`eo&Qi ܜͫK"}0={XCvT@v.b9r/QtO>,KaÆN>ҿk׺sUbň~{9'v:X­KVT鰢&l_ iN3a&?jf}ܵkWu׷z5o45i@m 3yڴi2nܸ%b&A@k86M1ŋKVdĉ?^hQL-h߾}L۱   @Ey%H~ž4;Հ&q޿;U)@#e-[F)S͓A ÞOdv?-o5}CϏtî-w("L!@ q-Jw#ڇ-мysiѢo5.\(ܙiG" @ttM:f   %PX1sơձauLKwvi/  M~۾Qjo! ( Hqqn֥<@@L o&mښ'nj;O֭[E,۷nG6Wٲen}ݰrYV-'?*OQFKs*" j*_r\_W0 l~ր&-]TKv&e8/VEc9FV^-m۶I^ F\BS Qþδcǎ_um<(Gvs$u)دmmMzTVٽ:R 6H޽e޽al_:uΝ;> m'} gvƍdEIM,*RYfEG8 ?^͛'{l@ n^epg;~U࣏>\Z   @.K4[] tG,   vH}k3g}س?ԇ=/c[MvLîςX3 nyA۷hmML 9G"  :vڵk0Hrj   @,vW2}{ʕ+R    Q .\X`aa%@@r oD,};? H #Ef-Z$ 7f'm-:ur._\~ayeǎN֭[[s[%دWjڵk)>#EŪq_;ek@ɓ'M7$ׯw> 5kdȑ, ;{lQ3~5k`?3Ўf;]ױIDk@~μ{G.,W,N|ΤT֤u7oɒ%e:zK.RgC=$?ވ+Bw'Eed72PGlէOg~(y   9 ~)LB I3@@ 7, 33L>dîb,}Þ9}܊w(- 2K kQf)ZH';/}|72ai߾}:5   @ :rjeƖI*R@@@B|rSO=%{u Ŗ   &`8p rpdbrsVG@@ %V`b>/K_ݸJ*O 7ܐmY,,Rhа'x"m (O>3߾}N_wwif̘tN`u5   )#`>L,^SZDk@@@[e˖ud$GwMDa75kE-'ھa7"aۂ k}9@ Vow $  (`C_a) @@@qRX1gσ~!`    ) r4`qaf'   @ 841?[Hҥ|2=zpvof 4knF1ꫲvXr3%ف|u?,< ҇=ܙ<^C)g D =t"'p8-ӳ @@BI_J    :.-N\wuIZe   ),f47"UG@HfaѹRɨQ|2wu(P@4PSO=n5_씥.Z(嚁 p#<"ŋ;1uYAXiujVs1?ĨQTV-dN@K 4pkM8n_v?[YGN깐Ilm61;gqL>pA^\~#dQch@O?] $۷oN < ]+޽[t{`ΒYf9nSȦMD?.[rЫW/袋:]`Aɗ/X7mTkw2 潞>I+p9縍$@@@Y|Jߜm~m8  y>+)Q7}um:}o1Vf׷>YÞՄ9 9yч>sZ@ h{m6v   ~ X-NǙ!!   @j w}RjUӧOaÆv=   $ {w??N@@Vwi{hiSۘvq=o߾a\rW^ׇ]/3\`?f:뻛fϞW_}L:a,ÿ*U$ Ymo>ٺu3?2 yfg}e[^JW6iT"SLqK6d"9ۛ!QFǼnݺ*cǎW=?y]`$H۹v߿ m4кt'ʂ `Ns:p:qF:tlٲE6l?tPmG鬯5lP>s'pZukuu׉r<ܾ oA2Ԡe˖`   9 رYdɒ9i%`XbZ   @sg23}umMl\/;~ZH)RjK>X~^ ^CgmC sN=Tѣ` b~ 7dNi)  Us`qgg   "PD ׿}]w6[(@@@@O :&3ȗ/_@@H[ɧmhh 믿^y]Æ s*W, .s= ^zˣ>v}7e޽3Ȁ®:I ̼>֬YS .,X n$ѴY{ ?ڵkRP!'.Tt2a4cvY $-YZ5^`TI/l^xOwd9t3g:۷7C2x`;w9@_f/wVXbҦMkYH^^x;K/$} *d[\_˔)#~Q˛8qԩSG֭['O?'@zkH &lܹ $ժU3f_a]z_4а/vO`wLQ#бcGy퉨D@@@ ~GI%emo#!  *}vTRn $@vab4- ׷zƍv?uw22{uB95݇]PLxDZD87h%"0a۝O>B'!  ~ = Rz,XK*=ZC+@@@ ϟJ6uU."g-[8)S8c&M%   @6:t(.m1cϟ?.c'  ~.94~zfAuu]9ɗ/_u̇p 5jdȐ!NPeˆ[5y+Vt]j5],^ ]t1cƈ kVZUJ(.nH4دՀP()-u֭N9˵'uz#<~G'ȺԽ{w7ЯH \uUc͛7OZhaEڝ֌}Z@ m*;wvHWN8932"dtlI&JA}$;AXx3ZTz呔ȵcEn\ ;( +/ZJB0[&1W>l糟y~q=zt~uurYgI;wn細{ҧOlW6m<5FpVۏWZf͚ɐ!Cg{*|v:餓?=+$׹>裐7x[TMݝIj]v+Q'r z5D)d4r:u~ҨQ#9s$A=7T.{'dwW^ޝ]L|r/8=~}tE,gk_|zEs(V;a)ͦd{3{n-mgݲo߿`ڇ][ߡ-D2A "gYA,c4h}K.D[QFfA䲵A|}Pg|4qM} ^{Az:{Ч5穱Ǡ݇}õ{ |!cjA7#s>'} }HyHZߠKKS*9zw狶ä @/w#Scd/;oƼL1n;!  @lGe!bʕsj0Qp:k,'ޔ4`K ~ܶkN>SygoÆ ~VV\Y4mڵewo+2^:hLFoݺU&;٦^z SNq33~}mР+tpիKZC1>7p&NY9&pZ"E' ꝛBNCW_5p쁊.u?p{G ׭[n. n!@8ds2eu2yUMp筜g6Ij@X ]s[n߾=r\ֻw,^عV;6:f~n0WJYfY1ȺezciӦ,i#<Ri޼Y.z<>3w_2#8B{1+>LiGJc?[o6@~7߈OzL{h믿:AxwVsa…Ni}E4i$Y?!^fC:Gm]X/o^ʖ-U~adwfcEW~g 8׿mx ]ko <|=iŊkyYYZ3g2_K~ƍsU|A; ;wtI'"c2vg\H6_c}zs̘1Yk~^3I>ҭ[l?KװO>T}{94iRO>ݞL½Gǃr/ s ^{͑峜#r\-{GYfN `Ŋ=Ls#@쏵c>Z[̾U- ׷G5Nh#A͵o:5#@i;OtbM { r42@ ~As4^l>hPZpS}Z~A#Z7?޺3Xv8pkS6оC#   G 9HL=AC=9RN@ 9swۆ<^GR]4~<@@L oy틀L {=Qܽ{w_-D\`#^zI4i #;YjF'GS-`: LOC9ZEJo*T1{%3T^jUGhv_u2ZFRJ9<3~KH,.ݿHEz~$g-hʔ)k.LuQpIK_|32LN-[gqE"0_:|]͞oolcϏ˙0aԉR0%!@ P}-HQt%n~z2gΜ\WWzrF~ٲeywqa1`b\teA=Hs .k7ړ9{ٳgwKѢEyA@ɬ[N*ydRzl~;Ձ۴i#~mT';jXvEeDџ+[]EI5vMߠV{,uo^7d??E nOHe7裏D~6 5k{>k˒Z{0mkP"FףZ}YZ9u[hQ}1îP~ԓ2'`x%oܓeOڶoߞ, ߯p}6k%\"ׯGP}*h>/D* xͱ\ ?y=^2 WgA,ߪ'~|ۛ\ waЩdÞ~Y[:'RjӇ=La ͵H?=^l:HyGRb>*;6k=KԩL8fev~7iy{4tT 9d[~vFZ}H2ګ{ >hPZܞԧ5\~}he>ow \ҝe=$R+Vk&Le@@@1z~6lۿs9CJ?DR7"KӃr8WjԽqO ASx'n+J}T?yˎ jAC=2ܞ^}o|yc<@OB ;E7d~abc@@t o:UڔK/~ m۶͛;t $ ֤AMG&x={?t7~qȑ2m41J~>i_/#l+w._ BAy9k͚52c g f]ްaC/<*W̛4ibl0*^S)efH9?>zW.~bE^@wQ4Ƚvw?\[7ysW`9uW&I)@ߤ<, /7xc\tR#N9昐@]6l@ݛnI4i| Waog,ۀ9'\QF=ܓeڡM?鵱B `[ . `w:U ͽ3v)Y2O>dK޽C;)||'R?'kիLI[~ \@svzgo Ь;w,w6G}qhѢ3fv^yϷhS~"m@IDAT stM=X7cYZ+{-繨6D[hAJ*ENv|3AkoZҵ:`|7]=?ނ^å?bHkSJ*ۼy^՝g&>:O~}~x]Cj~wl)XFk`hr}ܲesOܿ}Һu,ۘuumk?xO:$3+Q051cgP9>=o|>g;S|[< \R_@?jY귘 }r3(~9H}3>}sҋ~y$g->;&$@"ޞWn=^^'yV@ z?-[:VgΜ):tKҥs[\ڭw6AesԖ'/v[}o{s;}r7^^{J}Zi?ȾZ=otLp+Vpg׬Y͓A@@@2d3n_>gy3i^ 5T>=(xsu-73uL͹{Ok$Uq1Q9wNy_zo:?獟AC=Rsѯ; W4o:g<_L1^s]&!DߜX  @r 7Ia#<ҭ}P w3#&_$}&:QN- kM&د4vXQ3}ayZ]r%n^3|YڵKG߭Z Y>g_y'|r2m~itҤnZ O2e8?٧3̠z$g 7n8fX7ް{!+Wt~A)X˜C 8F^z)'0{8{! veeYfe\̰5\/sQ"@ `IT%@}犯MMDt3f̐rʅNO'㮫_{5'(;ӓu@ŰaD7`jfH$xʔ)}Wnl~N@9%?EW{K/̤XkLA->9zey=\ݗI|kkđ#GɐG ۨQyA:= U7˃>.䴍2^ܽa:})Krל!.3ѦMdɒ%~kAƚ z_7n,~+f2E>z5[[?3_}U`]j…\Orsr~굗r=BO8MyC[>Ĺg8&. 3;Iu~֦_v"Go1S0Rjݎ>9E<3}أ7dMH>hEvx'qF 7R۴i#[lql۶ӏry+<ŷIAesԖ'HA4NAkoA_z.zԧ5i7\˷}vMp:I58oڵke3FӠ#ty<]{\<24KAFu팤tWYGtp^[)s +sRsm$-/qՏ{&p*/HqI)sKr7l%\__8uŞ:pAhב @$Y|2k2O2Д0CaxB@fQ57x㚌1Лq޳y߹6̻ ,7c^СCz3 y,& W` 6U֚:̀X\FaM>M43FBUYV8.җ\3kezy:Sz.=<ʕy~09_$E}}3 Y1̘1;1;ewP,̠wO7==m!NoGs*_7.8ꨣgey~GqsY5j3EҔADnM6Y1n^1&cDXYw~=2 9眣ϣ.ݷ~w-̺vʕw~$п]fPf|M_&{}xPZ7&#XڄeC #Ὧ={ MWpr8pw= \~XQ&]1z +/ѣ/^/ 텾|G'-K3]-En[pmL&v_mz\~m"3|iA20rUڶm&?4=CӒ1E|/_^Oǻp/w\w7.Ix,O:N[.YdyĻwqݗcKֽin۷ڭ+Eg s C]#Y}7 88C m8.IMbŹce 0x,L=曅ˑcΛDۢԫW/4lsEu{}W^̢kyg ;t`4gnw-(5Sܖ>gkc_ΦS}ɾT?$^sIR`_dYlؗyZCԴM{流j# \y5e2H;Xj2q-+[ aT,tb9R BG'RCvguT}"aU%Ƿ2Ut0_N;x= d[馛zm9sf`r2Y$&%A9Z4=i0u iTr>O2rRܥ^yPedZ HIyu8蟰>I@>}O(eN 6#렑9 $UE7r222 ,n\Y&ktAx֥>|xY\cͫ0gɈ5o uiA><.]% *'Q׹µRs ig|̫qZIrGt(SԽ~_r4sm$"*cO-X@1Bu]:ү,رcUf,j]w =?%\?ӧ!A'?X=3*cPn׮}1Acnv*Uq~F0AǙEպaU1#cJj̘1fCu;)7|z)dkʔ)jΜ9:zkU.#|2j i>1ءg H},;(1{c>vܰd te TùN3cN;/ H3}w5S.+Aq}^:O? ES n KAȜg Q]:eܸq*B[ #P>c4]mFaQ1fXlVf^RNfUsȩ@,~_=H yhGёlRM8Q@[[[a|ߊ3T0竌7uE|^;. #^z%ߥho>gGydi_"\9-W_ya;hKb;30ǎ{&AQIME%qP0KW ژ|7T!}IZuf͚K~z4cXe BdU5j0^V}6Y[~Ӳ.Hrq(ϔ} d_}?Kս˕ϸkr49 3U۸pgD;#>2MyG@GՕe {$ÎG[49,TQЋ-sȰ#qD'Ő$@U@oef>Hr\$ц^xs&d7+Tݜ8(=*169Pn9ZyPw,?8"  j@cf jݲ"!Gv'[0v*a (G(4#ܥ׹B%"$0ב/'    Foe! `CtP<`/S=E0(:h p°[y0R: +s دklAkoFfʲ={;w:F0 aCJ=zcvVss0_}#Zj>x&0h"xnwi'u窛oY93 o߾/)`~CPs=nаŜx~6l+ϑ ꏋ/8"sa}ԩju3 ^p0-懱4={s=hSD1K" @,֬Y㡱XpVHl#P7UVf͚ҁro>srJw>P_ɓ';`18TڑFI房![oէ%?\\p|F^0>S*!B+|W bF_<_h./aÆAg9|*q+ۡ5h@aüai3RMib<?ݻjҤIZӭq"_97;p]eqJG7n(i-kD㲉Znr{܎q50ӷM#n=(Kļiy#=n[{A,Y;kw"@mrKz)-`:uBWدto];J= ~jM7Kձ0Pl113wooV} (u(cHB<_. 3j\z.$Pm P=ڣ/7r]ո2P+sȰ#qFIN 귈2iL? @-Z nw]͘1CD^Ǝo:QOK$&%A9\IUn]E3d5b {a^{M a-HݴiSg;*{Q:e]-b5H lf=QF/ok9vQ8>бG.(a,I0Iˊ&l7֎qK$ O~?^5nK}D=;;Ll ";NdM%v\qB0 o aq~/\rI* ~yCՀ#mjmf?p7| Egk] w"r<Ñe {l-Xc;Cܟ9oF~V`KvF~1K-Îܸϡ< s$@U@" }* @8BFV3*_TXŋ~Ig1Irur?I&(yvi_WY'ݭ|bո"!]]>q1HK.YSl9,ou1u 7I{t Ko9ƤP.2F{N:jdYn7 h87a˃ڏխ[r[lᆪk׮駟s/֭[I Hױn~cטڕAnqձnnf'I۪s>>@矞V%Ǿ\qI)}9~Hֽ)UqWOeް/rW{Ac}-rAW@blgϞ_W0s뭷\]Nu]r#VpLx4wuޝk7M es7Ue W1VeqQ yL7Q`\[*'=W*\rY햗KnQa9T,/H{n- D!`lbo1x dg}Hr= aCk5W\}ҥK=#=o8cQdA΃IWmPy8ĔbTj>2+=Wz4+ظAUt'K̿w;'\jܒ @#q~~˵` U;<47wu-7Qq]>Wl0=g/ɼ**F Ս'.ޅr_{Ot b-Ht'%w !s ґ@!l0W!nE]ϋHHHHH*К#K G`ѢEjv Ylx $pꩧj.^qo.R^C$@$@$@$@$ѣG}'ؔ?_\a<裏Vw&=\qY4hfϞmɹ_^,ag\;g]7rH5qDmq묳aV ֧~_hvxm5m].X8y敾ԩSܹs_w}`kcر0X91a߅J_^z)Xnw]HqwK.DC=ꡇ&(Os9OT00:V(dyO sX{4o֬Yy&6:FtݛvL{ot-q{s/AF|^ϝ;WBV[C uH%&d'WB.v㈃{M 4$Hڶm}rw32+=Wz׼PeZ].qeFZ~X?> B#(M#      ( ׯ:UO<]rGPUq\`tD #%׹B18> LWյ3\^QOe=>iڧqSs9d6Hl{*]^X? D!`$i]6JZHHHHH`-]˂{$P @~+CE' ]bSU!| u'TzI` F O]q5{ 7:ud%gŊ/q #TǏ ݻgywnꬳ҂pj֭[$.b-̮޺̜\f>|9c9F5mg$̜9S!='h諺kҤM"4Р\QYbQ~[pZ,,g;) az>8x +xQX!kwɒ%})7K/mqȐ!jҤI/I-}/H<{A) ua2#Udyt߀z8@I1%^Mk;&=Mӷ}rj|-[Zjt%BW^zͷ̤˺N@ݶJ3 BIMI%@clL`>\pc=N;d2X(]o\UҿN={^}6mvy~axy&hMt} /\N/'я!NǤٗS*9 rYRwH~Sg3ʰS=ω$   (n6uuy]=Zw}\߾}ܘKyPI΁h΃V)<|yڮL)*#GD+9*U̥}T=,3IIɉHqH5I ?ŋ{fo;$@$@$@$@$@$@$@՗[oqZ1cxӸqcջwosJ#5w!l 紎#[6uup\C$oǺeqQɅ}+qVjN qKΫuG9sxvm$/]J{[l$SAZG6؈ş L "c-[;SO){kW0lIeoA} H*(\.\y`4/ToVV0s_ڵձ=\QTڥE~Շ~h.K/).7 ŒAXSMڹZ  2dg /a'v/28`_.|,} h}9.}{ؗ6˜rkq$;ؗQy;#(ÞKt<'HHHH8uQT}Q#FP#GT|o\~o>Tvnqw+UIMsȩ=>bAF|8΁BkmX΃&?Su7QIp ]iMyʖ-wdZ{*YfxNJN-7qqH5I ?> Dc dtA?jС?\ 4H~ sݻwWlA긥UGti#vuW kpM<3uიWյ3е3);2̸e2y57B(e #&9lR"FB-/#ƛ!T$%w %s ]?P@5ux &rPc2:     ox% T9믿ݻwWU{#    H.]hõLPZw ͸ b 棃E РHh'rӧ믿^cZzjԨxJ]I+/epÆ 3z{a-[).8{ sȺ>q9s~Eŋ.0Λ7ϾTFq_ǁĘo&M "]twlv6l3Jq%BO?U0÷M6Ao߾7w\mw̘1z;UV酚 8ٶm[m Nu@enHEUc}+V[oUrK-q!hͺu&8;5ǼVؤf{΋sE2kH̓JǭMy%;~4΃&U;Z q+MiAl AtӬo*f 0s_.{qx&f[a+537\eKϕJ1Cxr2qTfrhL stI$ʋ6i~:B~Pb    (?(S~aHHHHHHHH, 4nXA^R;v:+VW2Jd0{wY`{ }`K/UWO<{SErX$ b nORa.cM6+W7цlp8;#r2t'}*+jM7iݺuP,?,;t;~|-ZJ\y啾XدkI@{{fΜ[͛7׊Q"aCzP>hy4oFcKGѽ{wվ}{/v}O]_$ u2m4w~aVX0l0 5mTaL$˺u sk;Gam_t"QBQz]nMW_}8ƽ Z IԱnXH:sOuM7]w527X7^{٭^Z ~sw:im˙ߺφ}9?þ\9<] E#rᔢ_]q}&#$?zW       H믯'!ꫯjÿ<2s˖-SwqըQC(,dec2mnܸqj޼y:x&MT^.ъ!CdG oPׯ_) @e5)>O$B_O3Fa%3qD1p}|c˖- j!$;#3mGj+$1ϋrg~`3Qʛ)(s #s!=79c~|!HTƛ&pxO(/IqxpkK%ґ@u].4\᱖1\!s@9    h췺>yHHHHHHH q0jk3!Hp*(w\A(,\PGM:U+`ޠAr]R9R'~X'T=6XF Q7~(lwv_|}~.] ڑtP!e+>g}ԩϯc$8ޠ甆vL{ouspJ_+6|ˡc\G-p;bב(&AiZ8ڦ=IO.8 lzl)L 8>bu+5菔Ku(ycС ߋ|N?&q;̙30׾._^8Ͼ\0Š6"rkY/iG`ٗ3$nyr')E3LؗGKI,4o)M$@$@$@$@$@$@$}ꩧ?yӧ럡(;A_p)\sȗ;%QA9Y.sHeZ+MZ9̑[1Tk`q΃JԽHgBy+wΌ'OBFD@IDATpKI8{FG$<Oz왥g@l^:+qW~W<Џ_SC8脴mziӦ{z!zN# FQ@5\(8䍣}G|69dp9-V0{AoKٳUW]{9ml͜1nAs1UVTFڌ38~GAn>ﭷު>SV[d،'ѱ[ PCwwA}~?_֭?u0/rCQk.Am54%EߚE!HF.LfEs ,uV0FM~{r-RcQQj\iLx:/@Ab+-1P)+Tp߱sV3(=>.T<ٸd[62+żrq@I~L{[\$LŽG^yA60|Ѕ It{tU/âJXTVPG9H~؏>gd نxvP 3 ¹B^Eʾ\6bۈ)W;žr6dr2n8Z>#TyOrT;#]yo      (_XTl ^xAwy` '>a=c10A܁ёCѣGk:0['TJRcbY eZ#_Q5{d[}HuSO?$.HtZ7vZp؃J1H&uo!˩NӷZ &Fr0L;N Ji(eY={-WpVL&w)ݻBqܗq دbC R'tCX ͍þ5p5u@znÖq8:M7:Â䶳V2FMBbs)r~N.*\6`aGuo!a_Zaٗ[~OJY֫Z_nر =\r^mvA㎡saE)KVҵx!       r PNu҃E ߻ᆱǰX+DqO>@kٲektpA9j?͊Rρ"i]\$_x.{~g.l/:*U".4ɴ?xˌl̿[nQtd`@ѴͰ5Av D~Ч~ٙ"QɗGŋ{ fm} $G`jҥ^xG&z}s2)ºo6եK}JA0 =ڽc=]dI~qqH6m-ZۧBfukcHE]ˇIܐ!C:rsvmC:wku%}ܧO<9rU Weƨ }U/W\5M0A2m¯sξK67o 8cg& @ PoM \ ;wk}Iamƌڸ Am(^{MժUKAam&3VbZNm>qs43H?Ӥci];#]+ɲn;ڧbuI]{ܸ)sPs9BJ@m$ĝw)Mm\$Q^$e^yQ:ꨣT͚5`XYfZ/UVEe-o4[χ#    0k? @l`mzV-6Yfe]KgԨQWƀP\= #@0 a2>c0&Md%I*݌BF AP礸n2 5zhi,vh4om]7vpaFoy}嗽waQ8`8VmEAtPrXh.{oIQVL-Z(vӧO~a6pcGq]{Zحvyge  GXHvAdYĽˣ+tGA9'QHq{y6Ҏq4}`.ڽdpʔ) >wޮ?JY]fR!΍#.]|a0}[t˚{衇e]'2믿|ԭtցeyt㏫u㵿Km8[<˄ ֜ز/L}9˭?5юrR8NFpm(ֲ(v}eݭޗշ~{9q N.L~ O -[Lˬp<|cdnܜUZ(`iM|5AIy$)dTE ݸ$*U^EH 2ܑ0wy'T 4jH݃ltn ^G@85$%d L51䶰G: $׷csI~d1wFԣ ^p37qƒ7 @ ԨQCׯ_?~I5Ν;W5YhB5ך#nvo{0UKH1y52.:W۝M<3b1V3\^ZIuاu0U\PɭlI9+˔C. FBĶ@u2#]^%I^T#|M1sa8/Ա:uz{gXV$H {]S">' T*a>HHHHHHHH -zq.dWe)oƾpʉa΍?H2Z W1 ap7s+m Xm]vZý=v3-F0@mN:>Ld  ]\2(FqxƶCYܹpPmr3fP0:\Yt($0Pꫵ^{@0^p LNN8D m1us% .tytWcs{~u$wɺXЎ)=-os㏫[óXXŸJaaXJYݼA8^HLXVbСC% `8n.ARx2'fM֩SG1Bs9k׮cǎZun9/4u`߈|r㏫u J7sٿYEmؗx˕K$uo1O}bn/We}&ia&M7\aq0_E0c+oݻ6mJB2,]O7HHHHHHHF9uj(SL Cfa0#(w}6BsEO?]u*!o9?1b\cd|b1i5nܜ-dq<|yj6IԽŰ:ꖕ^92d~B}¢X5k A  (*E7}XgϞ} m@<C=Wa'q#H'|oL!un\)=uT^xq,ўuY~:x@} "R|k @g֚*LI?w5Fj! $8ې/ ^{MǟԬYSeӽ{w/eƐ#gq> ]n!0 $t3tݾD`$ JS0 vn&jJ曁{׵qs1WhT .rG}S C.{\9rde'֭NJF_&LfϞ۾}+ƍnf~۷G uK$\֭[ex@)ti6׹BnkH<$-Bu 7_ZIuM>e*"9q$J%K![^.UfˋTǨz˜ڂa뎁ː!Ct2XWg֬Ya?Eh7EI%    @a.[rHHHHHHHO,mOC8#~:WBTaGn ~IauLfΜKb˖- 9K3w$/(oc).VoO %ծ][uQ0PP(sP:4i/؉' 5ֱߍEӕ^y啾8 cn}'^zɧTfWTO>E?Ӷp3ߩS'ui)(]ܖS .H8,b e ʧ/@H1ȢwɺGcՈ#vL1i9}`nY݋6$mW˽eM[1[}(˘1c 6Z\ڵ `\pP#`06ޯ_X,']JׁcHW#B'=F`>nu(yU%1#9/(7@*΃&?8)\'Q(oyPK\zeZ].qeFZ@ZND{7 Ν;ٸqcdm3(㘓A1'S4˗kp_70E7û{Ko9{#nH'Fԭ02 WmڴI4)6lXo1<yZ.gem͛7W~10Lht)o_gM]G-Svxw{KP0>gx5m4KW(5jx)2Ɛ=;0&w饗xׂǹ<Ч#tm۶ ~$@$|k}QuI' [ Øw}:S FW7x`5uTy?^u\o?ܷЏo1 z M`6RH d/}';ipOGy{+1אyg**ɪOe83)sfu@%球s7j)<-PWHIi绚Ybwto35JMy {O蓙?c8rHÜ_>`s۔d\Z|evԥ,M^O$@$@$@$P ou/? @* QXo? U(va>0H s%o+~aL$ R.uʕ+PHڵw#제dcxjڴiPo6pC_sFrK_4V箽ZB0\6AĶی3ze9[YJ_~۷oP2|~Gy;Ht4矯aÆZ9Ʋ^.pˁ[w$QMG7~WM\ܥ^Bna9Ϧ^,zj\nqWQw:se!jo.l{=蠃mݦ~L_ȵ 7~ nKI@E'u|e.U@O2 mc ř_;R/a_T⾒}9~R.YDؗ+\unyR/̼1*惪Z_.,X]+0$z)o sa'pСCU.]¢ `t 6ؠw-IHHHHHHHjhi"AK3ί%WiJ?KM&laal~M-^X-XsZ`LZgud8md}6g_s2~ nI Y첋gtCՋc W:2 [5\%t95n8u})[Bׯo]jӾ;v`HPoҬqmmm; KMϪJI+8vX0>l 4? @ ;Oo#TϞ=k|~ς~8{P~J;V&;S|~atoOC@u1!`,QDQ?ؗ<&Q7n:|,u{ 9K1&1.KսinǸnI\Ŕ|qHuma ?)v ?ꨣ_\y oy$Xט;RǘɑT~(R~}s[~sB*se+b/Wڒ)ٗs8g}Ҍ/p{U/`_,yߨQO?.mW̞=[b;CիW/8"&Jy$ln= I`͚5^tXܴ7dgqǎ 'vq1)5lذႌիWЉ1M]3qyNn 0im㵸lϜV_e\la?ol2o+ϟe wA`}H=#^j{oo?vڡgSF ﲕ+W7|SaYmƜukav#SPxLU@1ߚ[@rW>ۣӻwo+p뭷.;oOK/o.a/Ws7я=Kn6r 7{va3~9X?~=};Gc$@$@$@$@$P P\UPEHHH :HHH AEԀm'|֭n;vEC񪫮H:,mu7 ʤPBZnze{yRifeqѮ^`,{+x>&|jjz! A)(8׮]x%Eه@K5a;SfaAbȐ!Y}q=f`lvlV;NI6 B=zz3fp 3ﭷe(9Eqr9/Y$2iY7L[o:w7.\e"D1H mW~(*]]>v'auɳ$w7[-j#j#I۹TY'Q1|o ZBb@9Ѹ[rK%# YǺ(E\Huӝ۶뮻q&M f?P>$-i*R}9iRu/rwe_5Isnu뵪З k>(bqWڥ^Ljܸq 㒏>e]E1}E* .㨯2NF$@$Vl]wݥ#   B@zlsԌߙgf΁[΃σJɺޝ~yPɺWzT *ii~O% KGIKs/Z.8nw}τӧiӦ_]D>.:㵑(ιoN,:$(mx ճgO5{la?,bޡCCŃQ={NTwmnݺ &;Cfe{t1͹[iӦj޼yb0* ?Ӛ3ka0oE+tr ߛ]0 ۂ͚5Sm,ZJ_3"+`6z~gq*@1%B \ly^x b~{9M_ TÆ Ccu." H%b5SNym>}})hR/"l_׬Yw=!AOv=>Du\'x;oQaq1 HHy<][n\ qK5]ig~Rxsͭ v[ѵB\>q4 (s /s"=79g.5,FByr{*U^n;HBi &l |A(y5jD/fa[nQwm۶Zq بQ# b{=맚4i{1³;vB9sP*G<Çz'9ZjAF c}ǻ 6h#kw.]4+4]tQv:蠃"̢[Dw"=K,^g%|%KսYcn[-sH֍͟?_!-ơml'U{PWԮ];(hG\Co,Xp@j\X_Ϝ YǺu`߈|w㏫uծ"#;wnVrgߪؗc_ʴT_N~RuؗK/W}r4w*9̙aIџ{V .T{^ct!;y+ @" 5o(xs<7@ e-ACqߧ\s%;qT5RjoR\u/sNL{*Yf^=JB_;ؤAGtjҤIjĉ_T0=*+al 6vXxLH@9t$a|9 Ea0TK/.RmFa//&[q8)y[#ujدڤXٲ%Az`jPo?{;þpᄏ%o5g w $ #0{u\Ʈ~yqC_3@>;4dȐ8d\$@)&P>ӹEFN6Oз]}Q8=QdQycǎإ# `&1iY 5ciOnƹΕ\y&43H?SM\t*PkgY7C2-e9@YWs3C6Rh}Knij {*U^n;HBin$]guT^W_}^j߾zI)F,.WyTD#    (@qߏWI>HHHhРT~}m,+ A$@O6zVe I Fr8)͛7uM^2p0Zb-1_7PfBo@@<(C Pq8\c).0D ^{6m 7*YA\ _!V\u8pz衇|JWO>/߮] 4H7N-_Fvygi(c!۝uY%q[ M@3QQi:#|TYg7XrZd \8BfG;#QiNK;&=M:6\Q~*v̙3 }]%ʺYzߎ΍*ݎC9~5v{^h' E@u:Dg.rGI׮][]s5#P˄kC5J~I%)@ИcD6T3 TA4zꩧ$L& <SA$@$@$?B )ȑ#=o+1>#\;A‹F885tP0'vIaF0 gI.sՂz뭵Pe]6h#tA7$ x(7ިOŢwq:C'`wʔ)3}tT}د̅WFڊθয়~ hN{ĖY Qsˁ}]Ret ہ|{$-{ڎ zOg_Nj=**Ew…jժUڍ7X/yDqߑ|K\ɃܬY|A dHM>(1#}pP`W?h-4>,8nDߢ HhժHHH+IyP΁r4yP8w+l.t%/8*UJ΃Jսxii~OH n8ߣD^A'Xu=ԿÇkÿƍSǏWXn޼y(W\3s '`׻q ϐ JaFFI&MA/RmoQw}6rZPV`cT^q1oÒ%KZo=~_0 VNmWg?E;c]_w}W0nk@'7fA\+m@ҽ!2d]1P2ꫯ*#.5j^z%uG' Io1l˘9g࠴0A\?sO|[oudDG$@Dc(t~=cnu%94Jrc:W[M$vFVe=M?e9@Ws0ܯ6)sCd .-6eF ݶ]JJinIzk7c:3h!~c!c6=>i֞ @!YH`%       (=hR@ co!mٳg{F }}~O?^y8&]^{ 9 BɴK2e9b-A K` J͛7JݻwW^x^(`kV&ȕBT?|5uTaN:/f5q믿6pC_۷a`_Aq_4zۻwoeBlͮ&wSp:-ajeit/a7 _q1nz%{]u{voeӌ2THuoRTDmKXhuѻ F#@cɱ #w{e[UZqvه~"N6"r~ng_[nԢ{ٗl GJ1Q4GwYr_.W9WV-O(iS˗//&:^S fQPDaNDtHHHHHHHH?$&%AL\΁VWĝJw_eψ#I'>䓪m|ƑE3R jJDžFvMG7Lp7x)nٳgpV*{I'dC>̕ՙ^>S,2iy&zjɥ{d;yYt˖-Z\@6?(9& me[c? [k:i:χ~,gXTp }HB#SOuAR* oR\dα@&ϱD,hgOnJvxmcYfwlr'L{n@IDAT.,z|97zdץ].LL׬Yz!񬀿=Bʍs\h[=zu]V- P;w}s]qE" PÇbhS dd67= Z;hOk7~>fwl{es1L[ r?NZuQ]w;ڵkMt~袋`U|xgj. @!l6k,4XGir7ZT;c[U'0+6i=|{=O803ٶUe"֫ݻwXW[o~s=#n|I+[d fߟ˗6,<;_}PGLjĉu˖-`ahb.p¤Il͚5I*I@ )Dkyso*t3_oA @ ="ްXt>{Qd_g뷆b!4[:vF&Eܓ#f9pufAJIp=s[f&Cg$dixs:WL&X^/ρ+XV1{Nw]{u;iӦo*$¿c)`ԥl@@rHg1K.xb{饗k380+\ /_~ &E/ y i l $C$r-\=Ȇ@s/f*2ū[WlG3@votA}oV;_j߇zȆjs5l0Z ,Zɀ_AL @B:ou=0o޼ p; z|ufΜFSyӧO7EI.i77F?j׮m첋} ߻'[gb1ȶUΝ]~m{WAul<~:t=zTkd_YY~}vs=W< f;iK/Ԟ|I)+sLYT_*>}>#pv-L2z @}{ Lwnjcgyf~Q)c/T?G-ZdvtI1KйVH zzM)l 7l՝r@xlT|MoEYDlR6  @ dw_屽n1pUwF(HPXI?իW/b#)?Y9*   QWu5իW!e_ ³@@@zf͚ٸql3x%qg5~er-Ĵ ]Py  c_n]~|@]6,>'d#   @H@{9N>d馛ꫯKڪUܴw}kC䧟~ڭ~ƭ[.K@!(0ߐ!C_~ Ryw^[|ǸUV xI+ꮻ FQ)jNj~͞=>c{ǂ$ufGydՓ^ ~ ɵjrܿ{nw͐adah>g5(ԪU_}=Jz^oT@;w}\SW~} ռȼ>_*σ rAqu;>>8p+V~zOto\ ^Yfͨ,g?蓂JU_%`^0Z=:y PzלxvWs=6|sD?vi97N=ԌA)g-XN?tSNƍ{?3wS5sn*AA    %/߿xɜ9slƌ74 @.w(>  ۦ kVuR K@z衘׍?p,@ Q@Bu#Jdg @>?ɑ"l\ӫk# p~ވx̝5[ʍQ_}7,+kԧS(O83fz֥K n/[hA}Ը&Mdz()u*R)y ΁γs+-˫QH/xpu ~#>~'ZZyǫW~۷>xٶR_|Əo3L DO ~1[+{V'u]3o* |I#^]xyX'{&l^))(\ҡhzԨQ֤I!~9[8Su;߶65@(~g(L@ 8n)Jq,n/F7h>Ck֬quLK C f^l.-CB@@k"    @{裏T'V8#YE\NZ1i2V(pW@/xz~5@@(E>;^-6q<ᆪ lܸqnΛnN?tkٲe+Rf[u>կ_O     P@T@;# (M2:,7J|]#Fؿ/Yfz*µWZe_~V[mU-g)e\ƒS7l 6nAssp }O4_wٔ'۵kW:uW]uu^d߬{nԨ >|> O#k;ҥ;#{3\PpXi7=^xS@ٳg[vd+u\#WoȖ\}Wm `}Y][hawygۍv^n+p?O0a^P@>}~  ;~gȝ5[BLSc1l;}ٮڵkmС/gcS냵me  @A TyVդR   l*kM @@@@@[^z%;sɁ~s&@@@ %-N:$=zig IXbEzL       @b 7n؂ \QF`T]ՠJ^p [xkz(0O_|}wfY6mUVq?3I-^u3(ꑏtђ-Gy$ J_wu>C3g [uX)߫^t'}`\CA(}hRx0:~O?'~|͓?_mGyHJO(tk­TO?-Zd3gt~>։wmРA*YfY >w\S`}ѹ_I    dB`ȑԩSgp@&48isuƤa  I 7i2V@@@@@l 4n vڬlJ@bX{tX\[W__~jժU9k7~sF͆@(g<*UH@\SN9Ůj cƌ>۲}d /D@@@@@ͩY)ט㱔.mˇ@>}\;MԽ]ӧOnݺٵ^^ئ>`^g+PfMk׮{&lPԯG(@n{K' P -[4=rhCm=@. ]d[o)?QDWLuֵ/܎>hWmO؃ WG@@@ unǚ   T:8  wsA$@2X&;HX$;j$rJ{7m=Hi}VJ\`[@x\kX{6eS`-ߞ~i3gM2zM}+V իL3     P8T8q}{7lĉ.o~lwf.W\q˶nAT*ڔ)S\SO=7nl3k֬jm߾}pmftCaÆ6pk~-kLiԨQ/.چmڴ5jbMȄ ﯿ[mGvaU*7|5b` ]<#ev 7`K,M6:묨:7(LO; … ?OO(]֭mw9j27n8裏˭],U//z|b7ZaM4SN9%"!PPxT|_|g7? p=\nsm۶6wܒo{w( D@@@ m~[ܻk]vC-g`q*NK@@(6={'K/ R_'˞{xh7pC6lX%}^}ud>c2}y֧[^G3E@@ K@hc9ƞx [z-ZsjArY`[A(' @@@@@@@b 7;Ok|RllkF  .@XtAuC=z I /B쨯E =PO+ k.ʕ+~'q*hwL5ЯVV0K.4XPƎ}I'gS{K} wy.p_K../lgy{}T +p`6̮*4hPxvi]uԠoj:yd8qbJ_ =۷>앹KZP* @ Ϥ&e!  nj>v >ܖ/_n]tQ15%n]u /pyjyY       @! (JNl̙.ͷ~k5*ĪEclp`lo+l@@ A`CQ jHau_d>kzߔ'Vj׮]৑6l9U@X?.Ti ]j[WtDKdXuA" , Z.\>쳄4h`͚5snا9s.Ib% /,C_~vۃ>h FܤI*e(0]w-sz)[x[w͚56~x}Ar.دJuB4`xꆕg6UgL~5O7⋦ _e˖76="Sd`-Wg +i&"#PP:ghՉ1 jme>cW$@@@@] |T~7mXphb  @'|R~9l+M֩S'[fS}أBO;CƙjjCv:܇ce)@Ym4}K   .FرcX\sQ#W^ye>iL!Dȅ       Px| "*Y&5e\nLvD@(cΧ \|ֿ`3gqgo}w6d@=|`i!Ѥ ?@\r9g϶SO=nUZ ҥKuBt?S7wi  *ճm۶6|R $}Q]DtKS@XC>餓/ttMU\{S7x#QC~u+ 9ȷRryxf]p6tnǒ,@{oI@` \ׯ__    `7 N I|ߚ5k~$!  ([>Cpߺufwc@ Ї=*>e]Ǯm%VY}dC~1}yZ   W_}5i$gѮ{mڴ)P@@@@@@@2ׯM `͚5ֳ=~j&@@H[(iC@NLA\}ݗ_~9cǎubU'ވ>䓶n<`Zkphy~Wjժ(+⮐B}'Fl 4?f͚mV{lڵn1oV-ZUW]T 9|G1bPFT6tSSn66mZdJu㏻ R}A'}4dG@A'Ol~mP^z~DŽWX+z*rYfr t˗>(}2Icz?zWݏ- rˤ6+n?lrY    P|l=pK.?AzN:Y#   b۶m]M15Db"b)W}|aymΜ9eJωoa͂)Ȟ}g.>a\@@@ 1nVoJ_|]yP &^tKVzAQ&ZjY6m:?1%'seh@}?~߾}M/ygJB3ΰzYӦM5un*{ͫ<2e+KuP?6|sС>ָqc;ꨣLxcnӹW^ְaCSo&*zvqGdM\@{׹cǎ.(mb"VrVq =U7*jG&!C=4_˖-]`x9lwbѢEng^swFn_ݎ9W/ `:6iĽ׿cCVe>({x}?=~xk׮ss=~V>N~}ȅ>@@@@xtʧW^yO NYH@@Ȩ2+Jʎʕ+]k^fgK@ Ї}k5kt}=9ʪ[kaU>q@d_8}XT͙Ӈ>#\   .p 'ѣf>u1N,X 6~ &@@@@@@@L@뮮֊H|"kbT7x׭[E &@@@ )&Efb (OmLᄈ2uf۷O<S@%_*/>lΝM5@I*7o 9j( >r"[Ɵ:6pC[fMA(ҭzqEL>=քī34hVd@K voaodǭh@Г.j9'N'T&L,cRaLW~זHlg,\ЭөSJ*C#>BBmھ خ_}U=4Ͽ8mСߺY:B4pR:k>={رc"2iwmU #GU^Մ9@&Ӈ~9D,CS   )pg4N?bUoޣ       a3{'yαbFg@ k@@ or^F ~'nskٲe|9rHShs9z>0l ռ8\~ gw~>_xy*`~7xRQ{E*mTh腂}nΘ1c/ -M}yV^=W@xZʖ-[7k,2]@AW"TϓI^x!(:fę^b-LLϷv[%^@pN?sQwj@{ <@ʦ@ ,pM $۫W/tX}Y6<}qn3M65ܹs]9˗/Y yꩧ@ | 7 ?)(cT7iR&bV, ǵM{e$;M\x_YQ~GӀX/Wͅ_~͜9AEى'ꇗ+z J`Ꮕ?O<̟{vwY;v)Sڟ 0N8 _?rxF@@@@ @׮]v.+/+ o  9dMm dd`"enݺ)}ӾO^>>ٚW嚗~Çw7W_Mb{tRî&sJt"P<Nݿjns}C#!  dS+M^t~MflS6m$       ;ԙ`E'֮]lS"o6)@@6*FF2)z_޾+{WmĈnAz%0VK.$X*8sugϞze"Zj~ h% 0 HI@I k0նjD&,Yfӑe:n7n[uC}hڮ FBxn:{ӉLDs}Ng[߾}o߹)pe66 n .`$2%6X-l;M7vaJy}0VT&~ꩧy^~N:$9wޱpx݈s C|I;2@\GnuS:mСnZ d oy9X&MbW<%VӇ2^aWk(>L }~9s>'}sܱEJE祲'i y JEQzg]C5=1)16dkذa1U 0sL* "PgmHEu@ ?u9XS՗.iV@@ȥirjY0k֬j!;Oԧl1"lo˷g@@JU`giWhzD& >}EK:t)K… RSW omѮ|i   @F4O+VՇ]GH2?X@qJpxV(E^M  @q h]+޽7?n ݿ^ Ic14 4[K @(l(C@JKࡇ2=H   /(5jpcϙ3\-\vmP3Kch$@@H]Oԩ۱&n;3:}t5kVԇo38\7|3N+Hj& gF QH1nt'?h $ݘn<WI50wz+N~7=Ur)v5$]hξpV϶^z(}`a'8p E!𫀂*M4%}UV=&M;i{??͛7Ji]]v%jnݺ#'M6ކϷfvm^z۝o+_TrKkѢEUS}!<ݵkW%xVvMhY *@%;S۾oV7)N|'Æ -[]1>D{3@ƺ   -Q+|nQ^}`F   [ .co<|O,OfN;dsֈַ>Շ]GC2v0@ Jp o}X&iӇ>5@@@ U@ױǏo~l'UW]UխR @@@@@@@"YܹsS]7qG9h   @~~8mURO3]t^zT w/S*o ZK/{W <df̘n.m۶mm޼y.g*KA$w_{]N;-Mf %anԨұl27/ڟ> _G8o[ou~{)L]PQvaW?mݺmַo_ At#3&hذq,@@ @`m[-atS+)zjWpݺu3JD>_>ȑ#mҤIr ><~YouO!}^!bRPGMRpU&1%2#@ٗ@CSNQݫQGjv9>ckմju:vJRSh@?B+@X~Qn{"@OnY?]vpw5@@@2(+F}5&^k֬qEpL\l/l@@ 7wlDdr g}n.Hްa60&;WoU)*H*(k&S]q .tj{`e~`%Mg:i$Y 8T>bx.DT8ovƒ(&4x-/y`r+ \q ncUX/ D#/8rvʯc9^xִ\b]ԾPSÏ(f.] ˗/w՝woӦi@K{έJPL'M4sI<9_5hR7#/ _(VjV ׵҂ЋX./k:q!P/ M57VXUw.'r~YBŷWCZ,X#y#@ٗ@(uI2uTܸ,G}Ar"o!M}g9OJB@ HGu@HN@cX}893r#  "вeKꫯXҶbi/KSQys)UA@(Wpڍ@nԨQ8ͻ 3Uj*;e7uCϞ=j>ȯV&M$[d.I@IDAT>xʕ+'ty}_3A_m4&/||l<~+ >6ב\75u~b9q W\awq:udꈧǏ?ȴk.X_Y*ioQ&Ȳ*ɲ\G@@@ ߷~g{w3P"EQ+3  @8-~g|O̎1}+KϺf#GtT;Srexo5}ؓ@L k,gLd&P- P >}Fe,zx0@@@L*֭ke9묳 -]D@@@@@@@h޼yŋi&r'xܲߖL(@@RبGȕo\s͙3 sgTN4afǏo{1;ꨣ.R >Yf;L'?P}'\~=ý~ݳ3389/{I믿>X裏5ɏ<)󫯾W{=[t{vejVZ/vMA2iՠAW~16,<;ӱ,OA)qܸqQ1`M3&M5kF6E'{+د0s涧zz-.g#5ܖ[niߏZ^mCu7nܸR6>c7/6V|ܹs/N=iӦçptgs?|Ri裏ӟi?so_}[ X]j߾}EuNMF@ >9~ ]s1F@\@atZѩS'sNP  /5koLH 2'@YRRUݻwAr,п>|駟~q PRknT^=?s~k׮) o5g};=V^[eշZEЇ= jr{5p,F JC$*}e}à }cU@4E>}\Kw_/KU4(fjժeu뭷j]BM`mڴ)jR4On,@@ 6|stYQ ѻڬ Vj͢= Z1) @'o:hR?Eɏ[.(>1  @ w*Mʽ uY6x`7ϥ^jv[F*r`* .;,\A[je<2pv)*L'utMM4.;vh ߻ f[l9MAHfΜR,]|'6Fp:c]P^ͻ;ۃ 5XJRVC)2vm}mT̴iӂN9^xn>g}VI-b˖-)S0xwT%fnuNSty-iPBH={t~W07 ZwwǬf=\sy3fy晕u5Sy)V[lg}f .t˾n jH\esgUرcݳm o]$_v)Odw 3#o4q|;~a,| 5o.2;nݺ~dML7q*pL#M(ϟo|Ai5 @;ŬYJM4@ ߫_|׸:$8IAvb ;[br(X?ܔC{6)fj@A7yK@lfSh}U#FGa8Tu}6}&:g'H'LӇWcl)}}ϋ|R}@ Mp߷ٳgY,@pߏj8@۶m /t_ގ?x=*1QLfoV9.ʭO4l @HC2F ?u4V0߇aOQG@ |W˟=[F(]p|2ܟPO|l[r|7<>z5\  @dv% ɷwwѢE.9c[R- ˳z;r!.i@M_͘1mO_|Ũ~v[TO>{̕;SLNk~mWd׮]}߽{w{2 S`  dP5 7'< ^r7(ꯠ#g-ZphU!C|/ >ڗF<:2楚  :~ RܻwoWgX~I&)Y &UPXI{k)I:a:y"suW+JǏȤա٧OÝt^Vtu]./q_:V:+t`^}裏iVxSOTLV Kns{ƍ _.MmMviSYo5رcPK5>vYgnl|'OFNt%z{]` :4X^݄>(:)PL}Dק %\+ ov}.X|;.?l ?^}ȶI*馛*! }W T,TQum @1 7dzU]#eV NRy @7+V-\wfd! /WHyUV=1`aVؾ}{ddV3;YBî&%{J!P4 }sPЇ>?yf)(t]?_C  @"}?/6l>_9/D?~l޼y!V:eXVZn\ Kq  Eয়~4Vd5 @uc@@*ATX(=>E O>j_cM+"^L7S  Y( @괭 p!.R[wVq 'T e .P7,O h VRPZ72``т^}. dd4z}u.q&dγsXt1s|5лN ~N";2 4;|Pp^'g>kuyQR=zD]d$TIF_M'N뮻.fT<䓦G LJB YYU_}yiӦ~Q=\:<~pApT;t`?o49MG@ oW\azO }`bM5ʚ4iRit* =Mz)V-]s6cƌjKUu^V}CA͑=矷Kѣݹ]󃇫^gϞcCR6FKzx 2+I~ /N>ZAxɒ%USmo@t~RJ&hPBE,E: P"~]s51[ӵkW6mZ,@@Znm .L׭[7w/pj*_ K$IdK&)[|H9^#f}~_EI*{b})4~UJϲB} @-Ho֡K:Jv(}(H_8}ݧoާ=}9~X2#@8R  PMA2c-[{yc-g>$/HߏK-5t];pruUW]el+8W}WI*QO<эӐB) @ hLz(24,@2(eJ7Y(@ OX}Oç~OCo@g;]6D. c@@`ܩ4)/-iS;v}7n::.CO ܦMP_'0cvUYghpp|^t""J +$jvٗUSd6j :`Ű?j__>c/uرҍiC/Hke ȫJQ~h^A;07?r V|TDCR3gСC]sަlj/L-V[Á~U#l뭷T[^ E%o)@@@ :)sqʜ%%!  @|h}B{bڵˣѴ8>_UHozϺ_yx>ӱW2r}\/Z'{ϩ8ZYx  bH_ϙHyO[Nz3WA;<#  Wp"_~bOe˖qT*Ua       dL@O|o }Zy<#  @FLTC V,F[y-UWGy$jq-^8r-hp*=MG}vΚ5ڤIkӦ T<#I?[uLn@@@@ `ӦMK7֪4Jw&SiSZ  @ |7rJ<߯Tۚv=1lÞ^uv#^R>R[Y}#EN9}ՊTV`+NTCBz'԰   @9 z<ட?SOY߾} $|]`[       @S(>ϙQ7󶔈  @6~6ͭP6dTQF~eL ˜_*q 7жv[(:SO(. V|RM IE.]Gm֏ݺuKzuRY9 ۳gdޤ7 $!@$Ȋ   @nׯ^{Hj]U\t@.j  (0{ZoGʎUk׮L3!@jAX2G#@C}s"   @ ԭ[Few<3l7}R`       @~׬Y)/dYd;]6D*  E&PKu@ Ϸ:uoX;Ly 63 ǡ~׭[b) @@@( &\ }] cJb N-]J#@@(YO>$h[vi&2+zR"@Sa/D-@DxMT|    c9:w슞5k{LJe.X Xo @@@@@@@@e5?{ҏ]F BgU@@RبTB;@ }5kXxdK\vm?9ME$E#Z~}ԙ"   @ݻw?F[+ZXk׮]m~2   ~jv}X"Ї/( r @&M     A݋{eAJ袋Lk֬Vԧ~H߀ @@@@@@@"}>KynLmk  #@ٗZli~{4h uY1qN8z :u b@@q @&6`W~3JY   _Gvwk. UVJ@@@ g m׮]0Df Y[JCW{緺ч7 @R"m@@@@<@{mʔ)6|3fZt~>       @6|YMl/3쟋֭[TP0  @JM(M۠AJq%*ݬ @ 37~x[|5l03ț~Fφ@@@Ȫ@݃ML3Ur9  @,[v-)k0݅ VR=v*󫛡>37@غuk~[5'3ޜT:>}-Z6xcs=)?tYiӦx*^d5U`E.iB4_6҇lv5 E2(_ЗF3@@@#pWX=\/hm|_ t[Ʃ=@@(L>{xK%釚+Wɓvi'k޼yn6[{f@@@(k&r%=?uLF_~ 6ճ~kԨQ>  %-%MK@@HL}e$~ ~QA JO>1cl3 tbxU{wۜ9s̏6#Ν;ی3駟:v㏦ ,5j;4nF hv[je&:_pA]?O8k&M)sq죏>r˷zk;buJW]uoW/:ڵkg;SmU׮]k|WMǧl~W[FB @Ng+V믿^"33A 'wt+F^W^yz-ӍH5r>``FѣG?^wyTzun[iY/wD?5 ӰaC7cIk/SJ%hQ2qG&&} ,|Ў9昼6=U6]$P([4i_._tnl?cnO>±oab{q. tPZڔ)S\SO=t?<`fͪv]]_J?^ʴi\_iIl8=oY#FzW^f]xn;`GqD>֭[ڭ{){#HL|_uuG[yBowK/奉C )} i+<1Y(@tgt1ܟXU:\S0{LJ*uyF@ p$6s%=='Kʭի jIc @@@ Tt\_ܣ"xF̺<ca *P1w~g9?ԛJbTܜ>lUr賭*7UY˨y@\ .W;NJncoE|gK绢ǩ\jaÂsl~g_y+#'/[nS~f͚uQ*Pn)ȧkw>]z|ߦsŀ+q3ʵN:)n}uOWtuT+5}DT VW)NemW KxA5,, >ggo=sT7{Rrŀ+Gb(cϪr}Eᮯ={/T{s\mN}my6X,5볅O5J )[n%뮻2U,@k2^>U@(2-|ֵ^|ΨRd- &r} eN緜e>ZL}Sݺ۫lꊠw$`TJo HtsWj%\ח6F¿+ ^gdy*J*!>ng?Oܹs6eK?SP3b\}RHI-ZQ([J)DJlY*QH,ɮv(%)lDn933۳}g33=⒂ @o~~bok>/c{ w 2O믿n`:ѣvʔ)钦=y-hιk_>"kMb+vm;lE05v/?>;G,{mh.^-Թ{$3NZx` ?L cmW8ʹ}7pӧ3/Z$";p.` +7=\q^<ms=mraj.%'!{B۶m=?Nwwz!fLt!٧ʘT|U* 0ibKL4N$Pa$ [η^>h__Q~d>iܸqQ28?q I}َ6'   (v[[/       ץX "H߮*# [ƍo/ڵk+3ؤIŋU \i{UV3eٳcǪ*U+"',C\ezmi&5sLe"V² 歶J5lP72V'}-mذAY3ԺuСCSsi`- UR%rJe1Pqk2Pn @ڵk^6SVP5k,: ~ӦL0 (eK(ZAl& cE,W^Eaw衇걣W~zj/U z.>hH؅ +-3~ $N@9o+$[Pnt3{W@9ce:y[v_FRo]"#}1wq.cq :1a|r@n}#FUV1cƨQSjv%y.]{ N98g*4m̙}n8<޽B@޽{kvJsbλ7nrI$g\ /@>.I;cb_E,+g]WHHHHHHHHJ@tn|/+D ߭[7nuŊՊ+1t颷/-@AK5kn"hmv^Zji3(8۪5k֨_=m$|#>o`{H @_sM{O"L 2t/";-ܢG_xg"رcբETFR`t%8nedAz5B֔}W^ZkꫵzFÇk`3l|ΥLv^R1ѯ_?mW\s5SN)گpe'̼SHToT~ @;&>]A .yKW0[( 7.IHH N.AJᄈVre{+0}mmW ߹"Y% )IHHHHHH @i8 0 TT^]! +%ǏFaiԩ-[fy=Z}'aͻ'NmtvK/8mGN knK xuv܄} &.iӦ0p߁ 3Z;1czԷ~'fGܷnANTlTNᜩ]/:9s6ˋc0y74k\W E!&pƯ7^Jp2>B #s.?c0o < Pي~7zx}: ɞ%!Cj @O>_U U9_抌&{v8G0ӆ]2ҲeK]O?mWkm~~dG }vO LJv>eq#5/^X3%\ D֮]fΜ$; vag"Zjʏ1nEVp[P'[⹋@+aA٘5|rM-ts}A>8*D$@$@$@$@$@$@$@G _ӕNwWnuܺ/tԩl y/A/So^? OJxئ$pg )SԪUrBnr]NJI2H}GU_|n˥^Z&/@tʴ98CMfz~IZ(mny.}I A!{#G,1}t]6lܸu]Uf9䤭0TEwYjJpn4yUÆ x^׫WOfR{})tM ԍ~ ^RVRFƍW\8sn]*SYdz>܏:(ϠиpQׇ~Zha_8GNsA@CfdB :OW |뭷@H7f ıTǎmg~apB`lW_'pQg\lwMWSOQᢋ.()–-cr" 0 +}A]N9gl7j8ûqZT&M4y=OxǜW^#} 1^p+(hzl1a,; ('7TPAs9j}QGqaأG{1M*UtpgQmg3 ߰m5gNe%KC05kcI0G{I'et^M5.] ~~%uwh1 3tݺu6/u8D[d~9N3K&       R't]h#t-0|;?|L+[m:qduPRH OJ9Wz~>پ$$т@?wԨQ9~sr X) &i`^ kv}ܰ"Ah;&|Q&nFտcu)H>_z%9ri DwQD"̙3m3 :.Yl]r$$Qѧd*x,y;$/2!S}fZg\l_uU= wqG$MA8 FQ=dLFb(K3 ) {9]O?:uru&urY@޳=|WwyZjUJCϟ;̸_R~ʕq <dxȑ)m1'%WA1|Gdv81 ʋZn喬ƝAXXX\9ga4czԄ K!I rq #H);BPk1 ;D0a =k,}ݢ<8E ^zN-s08O)0'˚ @)wR.oqESNշ|38G2twt8*իW+|~[#|">+\yc[͋O>iMu2oY '2ld~ ﻱUTQb xw`x;IX1J[AooV P+Vql¶!i=^ݲeKoѣ5+z$ O}0WL 짙~lE"@IDATiH (ljմnoH *(_>qw;$ j2fw%+٬:5Ux8-L{*]l ;=}FϨ0vQ\rm$eۍ6vکs=WۑMo5kylJ?òBl39t{-[Mڄ%t0EHoJ6o1uHG@;#1{-'ڔCÏHHHHH 8Qgǜ$@$@$@$@$@$@$Bp p8蠃/:<yy]w_~Zx ZBiER[??X y~1v$}cU~}#O'C U6{ -DS6mjo"x?\! "9眣"*0 1X֮]WA@VZicƌQx:e#! (po<䓵7g>si=P Yc{GA(͢x6/ PW\GBp֭[ߗ_~Y!䩧R_}$A݀+gV| `O>D 2DլYӵd8]z衇1^B9p 8B& 5pM(hx)\ 'Oɳ?n{(S2 W*s@H7f3{X3*tX;$)Jmڴql;;wm@N D"&[d\Q]\vyg}-}sr+ȼ8F_oH }=Avo6ww}W-^X=ear)Q9Ʈ` pߕW^n0./ganҤv$cyǣZ 2 m_YXvEG[~{Ã2a gY0Xƭ8ǘvڞV9[.]7vYq y.Z@4ԉJDsNx $ U K'       WQ~ uq>n-@!7_u(:,\fo,c=6eo-3f![.M+U䖅H OJ9zywؠ"p /`g$@\}![]\tNܹsS}" \ R0Kp秔$vr-Pc#i=^qJ&͐j7 /KXI%+g;~W֭kgZcF8ST.@vaj~-NIڣ>Zv¾"y&DV, 2OIL:3:ݼ]wU:=M6=.9IEM$*edf"lA (b~پO>m5%v.lYIYqӤ %s4zM$=/Q8aBB ɓukժ¿e]f4U9~|رfsus ´9|8@=d ?vm'-O.$    O`kI2@N )$@$@$@#jժm^O.E$Rxkn^ob 8 Pl޽u'0σjժ-[ ۷kx[\Ə|A pVwo(p'JE!1r+\rژ<~zYphȑjѢE:q ~Xi3ڇ I Pb9(([nCp^m޼Y89@9:묬l.Ia_nw 5'pBĸoW}CN::/ysvkE4kL]|!,2 (sp&$=] ᦛnJƮ7"X_o5WЯiӦmV>c 7ܠ.l|wl'/hr,{7-Zggs aktfz\!/f 4Ha UC?w#0:ñ>%@4q<+W! k^ٔôwWlE9 _WAlf_+Ԙ{F`w/ùʗ/'!ϨX^_w^xW{ۻYWsvޥcǎ .2~Pjذ4 `?g~{6=\%ManJ Ž+𾁀fX ")b1 35S F~1HWgAwF mS(s1s38\`±9m̙{[1}Wl.Ƭ[q ; {#q.Y>j(]vNLv]t鐬DmkDt)$@$@$+r.KD tAu!t~FH!7׺au ;u9qDd"( O>dIDN:C@ L ASAΥq.6 G/2 C-wH!лluqO(#n-A(d}vM ^:0Vb_l0cwĢ5k(8;#C!8Hb|ZRlVF@ΦniK}$kfLkRUk?7B4B$?QaBR;{J*ݩ[gh̙`I&j…ZW_aEڦM} 0-vB`I撪W!5A_~ώEQ|@PHHHHH`rFp,O!  OGϋ)IHg(2' @BÑ Pz@@;!!XD:AD![P >\!QXMeCY Jn2Si- H3v;&QNgE( q3VAڌ+7AK80ܐ7Њn/Y #nAIFO/C$'ߗM=2St`+J_Dz~L- $v;vT&Lz(Dע}S |LRwݺuv[r . +pCZj1͒%K4/t6#ez 9. lc_޽U@FHy02/ E ;o}0lm6ջ5KV!QlgΜJ7BI)ȅ.yyuc}$@$PLŽ}1q!ڧ*\A"_Ө~ @3*|F JI¶{ԩo]^O1%ꩧRӧO׎|i& ~@YAq }T~[>TXQV#Y6h@M`$F;nDZƨ` c9ںuk`(+`e mvuj'^ 6T-Ҋb<={64iD-[Lnv\!(:t𥨅PG#88uqnpzЪU+IN2EBݺu_aܬY3*uX8a80g}c g^(>m%3 ݜ5TZNa{]V6Hr,<^sU{TtI}7cU\ؐ.t!GgI% DAN(n{ލ6oc(Y(e~\(mg;I JlRWcvA} cXK)3NQ BĹfcw& 7܀&? \Q1br E1Gp&`B"ejSNɘ0q?jʕ 'Ϯ,"ʱ Naۜd~GBJ*H9Wpv܏fߠ0qԉ6mڴL@vzہ@b8yGXs]sÝ @);]e»tl[K_,n_Dz }@SM|4s>c-u'ާ[a:0v>1g[HIhgu;կƎ."gX[2o,Y( J exq%qGmdW@G3g΂w(kC Ak#>@J !%kAgML%k)CwB [(%[My XyMZlE6_XI.)s7͛glJҺA-oF L@$@EH8BO-E_UF4$@ gT~™ )g IvK`\خ];M%2$ͪs7'7N~RL 0-fNss&T|Ǡ!D_%:9$HHHHHO:#&Cu8  P^(rV RWh=[I$4"P,pπψmݦwR,nܸQꫯ@(@Q[C01cn `<-n;oCɪJ*GyuQ-vCLi„ /TׯW7xm '`:%-x n&qf6lZjv*oEo.Ret"A_i$9hѶ5j$XZ5g{[A)܌b݂ ]Qp6ې:nv+?C;v}BI($\M6:=-pzٳ~2Jjƥ0^AyWpCɞ@kJ=aڵzꩧ{} Dd V).C2BP $Gvu~1!Wd^Hs6]Wh.]ՒGuQe8NnݩS'9bHH ﻘny!EH)$@%tR.B:i\'NKRg7j[oǑ+/`o:駟GF |w3:+ǢAε&8tMEO?tb~7z;@} ~_6E+ 5Rx:/޳}7HQJ$`jwy'`IѦ]v"fڵkn7[ha+_ElXA{5k;.L;ţ֍? Mv?O4Io~$< 5j,ۺQ6ߝz顚yel։usVζfm>̼nx@r̃up,a-} @ŘROz{5N˦҆1t1 ? ]^8$ye5Ƒ1I3 c*ZbLmbrw\B;[n}l?^< %VN_a,s (;䡐|fJ0va_!% -zQ -e3IHH ?cq.  (%QR ' w?^ '~_]u]. \ [7`yfݟ x@nڴi*GDqXj׮n;W]uw߭wС5{ꥃ/+/ /P; ':ș`q˖-Scǎ<Pt;wU߾}l){yen|%3ːc4g^K3h uy!Cg( #0ѣՔ)SCw.l(+ Z)Wsٵ $p?j(]%0opfMos@|i9F /tec'1Q;K׎A|P?hYb&۠˗\Q&Mq\s5ڸ 0pI'8In?ǢwTs]t LJ }j 9QKqnx sjj+83 hJvr&P~}UN|r sݺu[tQfaQe@H}ټ {GkUC~E'@7+2~!QՅ9%kGA}ͦAf ۶5k֤ *"`c,j4v]NtSN gQI:tj+!b!q(.\P҃N(WSNUF_ HQ]k3~s\kc7Ns]>u/.f~69rC\蒛+y5pH@x/BO8Ki~ۗ)]T6x7IڇZ8 wPMwy)'%+K19&1H%K9f!d)id2hͨ#[P?&MRl9K\:3\>aY߶m[os80m6x;m"zj`vbDF =q "A!    N2' Im~h7pH2ҥ䣏>X,j~U̜9Vz3/dU5tFL~:zot'?Ӑ SԫG0΁o֪U+r/Sޫ:ga5~xJ"p&eVoT}4-m(k>aŇ~g;#F䗀Y ի ͛G dE4I&B @1[/r$/ `4k,{\(<3哀awyk"I$9W=o]ݼy0`t;e6s)S;(+k1x1}M; ;xt1W޽{`ѸusQ^\MgԜ~J!Xe?pg7ӛv-Ũ folao.7h@qLSJ Ĩ        NWj:݅\Vǩ[vZ{>M$@$@$@$@L`b\1~*Ӹb/B$@$@A 6J (UF+EÕA; DJ >#8Stzwwaɶ{ҹsg{W0K/# nҭ[74wԩ :+(r 8PPv[ԃ>-}.-[:s XAP}W Inԩڶm#wʕ NwUsNCg|bq y`.ݴi䝒 s.@N8ua/^R%]J6 %JN:bŊToVb"`qfmȄJ@c6/p:uhyuWz%'bx?{ 8̜'Cj͚5'*̝:/7n +!a{?QYw R'YzRanG馷nZU\ٍz;kҥz>%e!@}6~d_s`…3p_L/K?0ctqL3Wp'|1AI~"' X[8,$@$@IhذzꩧtUےu @V>luWgI!wR.&[ntE?۴iSGk'N PP <&>+|#Sɦ0;j'tWg[7n,#2tgU( /:;7BF[Nz z)6 2i$*A~Ŗ"fz2n=^: sCI9#pqnxI (YNi66mS<Ǻ tP`/,@ӦMJbDqF'|Rw-ZaPM=lnsʼ[9@@f?3.aAX-ZZS8FKn$x^3Lmq (fqiʉ{5N׺ژ&=x/H$],\C̓͘ rloP+e6ӧO׾!l~HRJꤓNRǏW&LP#Gs1ǨvۭL0m3R!A=sw ؽpe @F Q~$&HHH 3 Ǐ0r @1`9+q\8gKI {N]p|UAg<@4Qkif[.޻oV5yd^z3̶Já/RcUZrmjƍjꨣrM';s 妛ngy `ШA*lN:Hx@AҵkתQFK.ijs)a e79#t_K@C Q0L!+!~K7o71c͛)CnoXa͚5ܡPsW_)dO@4Ͼ$ &ngW'|6³﮻R_~y"Ƹ裏.s <80;ixw 8A@le)Fc잕sE{UW]zca% (~lMRaZ|믿!  $`'1Ү];(rʕꡇsζbzjUV-!{;Xƻudw#wa; {V[mp?裪K.v߱`hFԔ)Sl.q8V J s`)h~++ @9|&S IH|xB$<|NWj:|խK u+y:ԩWpYܧrK=b?_hҤ{{۫.3H ^_:/ZlW^{VG~'67H~]4}q_ q_@7f͚z=qB C7|S[Ǿ+zcgL3A/KA6xSęVYpZ7h_6mR7o}6ndT8ub$Ppl:nfdy>`` aaU衆ѻ%=ƍsugX=ztʶFGy?ZUf>&9u 3o6pHJ@\cbڧ/ek]TlL{{2' .2IgPsQQs-ʼƖmVo/}t'~1.g֛gS= ~1d֭әM´9|[[|z7%%yx^>e_K&r[B$@$@$@$@$gUP!'uR  W?2#W 5.IHNٮ _jݺq(#wmNu]! }0&eSN9E >Oaf}zԲet68f 3qy'Vwke0{A_/9u_GiXVٴ٫~Jt[8WpDA{Ч={j+hØ{ƌS6mi$B$@@)Ab>o3 7Y}akwPJ0ӣGոqc}o=N]nKxc xVAUxމ h)^xuZ8@:wi„ O>:9x~G%asH\pC1?En"pv%T(?V/),̙ 1^xdQIsEQI9svZ߯_?Wٜ#?y]J@{g3z;hذvxb. c@bZlA/ jǎVXT'1%I9=6=1͋.Hby #5GeȶBObNxn©{~܋/XNR^=`NSƍS/~M7 œ&MIid n u$e3د'V9+ЕO4oʆ -q^ri^ǹHH&PHrG t|/KB:]_q,[W|^ۓWt:;|@sʕr.E6LÇ׺['OVgqF `'w~ۏbN$ 8ޗa НC꠰dg#hѩX~ڎ Nԡ ~޳ڵkk])n[93fϞ䞈LLEЅVZrKB{~XW֩W^\9~ÈL+,;l}OI"vW_} {Mý?,J=԰zaX7|` 69O<=,x>BYs=φ?'_|YeTxyk ~'`k; U_y0$@$PO}jӟ Kَ[^}^6Q~owHrC ̻|Jfo3{m 5Y%͘.}75`sO~W ް79 6l}Nbnc6oIz`]KzbA䆀9+kqDQ9g,HHHH5@!KQcuq鿍7zDXixHHJP~ZʐhﳔK M$P,'}rp>tҔc->7VP6+P}ML:ճMp;g"( ͳϵ`i_o9!(g˨L:s zvY2 h2̄QcK@gɺk)dygfkYƬ~^k|8']s2"òϫtf[FO?mthepwqeX]V-&cg.^r][9IZyҦ5[ :v^m8e̶RL9n)m^4e>>;}1I1z籥^ᮻ* BloH/s2z)҈V\O` Ɩ3}uRbJIkOrް2,G)eK.K'c-ӬKE)~C}-8e:+ \Ù f_GVPLy܃.v$^z7h9OߊŒŒO?KNcc!< 2E .VZ0w'w57.d0R9۲~;5erFg&$r/˂ vX4QX~vZ\ܹsvM"n߶X.a}϶jN6JqŬYR~mY"usc &i亲fΜ)IXN~X;ϕ0Πj=puyHJ3RWH?S[,cY}|4ʳH~?.QnJ,-n[,cv-.[,)˾(^shD_{5-ѾzeV0q}4ΩnNI;/$@$@% ~: d$@$@%Okiezq󝓺ytANwօ_SEAuǎkEF [\ >^veigZFXf6ICtIy, q-@p(ȅ2͕1.{{ϴΊAlvU~Xb <ֲLrl A;vm׹LGu嗧K\ҥK.+HGJ5AO)rmc'\) x)M|c?k 3)ߖC,ׄc.`e2ڳ\fld.^us S}kK/dk P>Yǃmy/ cF5mVNvnq)aw,漽Ӗ8_RoJz8KQw5 浅S[ Ÿ1N1h>a%Ǐy^ɸ?G>]H2)_UL|#D06a~JX-Ig|\Ϩ0va ɛm7Ɩ-[xoŘ9U9a%h=K̿0m3ߒM<;^>h__Q7[\s5=:q- )$@$@$@$@$@ ݚ D@2K{u A&M.4sZ 'V02v=Iy晪FvQf|+WV֭բEafjE+Kr嘥P'"e;}t%K褖Ҷxfae^ZYlX9zVo{G[$Kf^VP e)+h4\!(~n?#)KqTYNTUg)!^OV\pAJqǜqjժz֮]hmz yճgϔ|΍^xAY^/Q@Y|J_~k?ɓ'++@W;A9D;_y怱Om)(W^yEYAS˔ 8C{ZnK^{",ޔ>KztRejժ)+wph޼}t:W#{{}\@,5fKǭyf,2PxzݺúvV7l~˾(Y\:ۃ2ꪔݒ;uCY͖Q((%\-Y:˶y\㲴a* @.zH<:O8w7%JyNJҜ+r$_¼ߛg :8#IU^]7s`SN9EY'emui/>u.0?:tǃWv.o?{)ie@1βܶ e5{R0Tal+xk*4Za\`6Ǚ6lu Xp7L0[oF6Y͛W C@IDAT>\&p@ixﰂ|=СΕ Z)O% @|~fJe^ywng}-F[퇃pB\z M|fXv͘1>tn+V /{7I:VٴQ 7I r~Le4*:Ȩ7WzĨBI}|@?N믕QWaS*M$Kҭߗ:p?z紝>c;ûCڵ5Źm qȡ*zin$Q:ƒK}Jei:ʌS6Z K3矷ᄊΗ~ ʅtCzHY {Ww}e\/e3wKc/FXlM1gi3w7v6 +ܛEs4ulf?$/ݺ^;F5mV9cKNYox^3Fφ)r[Y?IHȳZnV}St{n$(Kz8ǜ5[LrNO$@$@$@$@Jo\+~i麩Trs|2s-$@$@$8aG*g}k/f۹,ˌ?>" W\ BTA`+(ACɄLp/K8*b rI` 00A9Uc)u+]1j'T]>@O>D_DJc%:lSEeAɣ%#Q TqOUV ixB?\+VTIߏR Ad ;ƍM~#0Z~Izpv6 ?CAqn@ c=2eqEFk Bq"5< 3ᄈf#ЪU+5k,N`B!?ׯ!pg[XB\R;N('ܟ([0o<m;z}к 2{ljtb~) Osq xc<)[8JWo  5-Z2烽,8y3! |~P%~pT(%;?8A΋{A$@$$m`}g:uJIHHRx!2̴\/.~sRm1_ }_NtAڦ7m̵.yyäPpSg.v㏶{۶mm_ @iwy睪O>$&Oӡ}';s9V+sUO՘ N{mvne%/lqs cV"|r26?l+!A6o,2 /}Wqd۷:t6mڔIݻztEsg\r9rVM4:M$@$@$@$@EM`;G$@$@$@$@$@$@ 0 &X3"(Dh?PH  Cڵ_>m ([o~η|ajժNȺի+%%Q7C$ #x:#$S0tj6Jv`t/Ťm\@1jtA(D~+fAm6|jԨQh_.<'yqlK(~A~h' @:mG 81>.IHHHHHHHH jN5)s.H@:ү\K\@9;/[O?{msHT\YE?B_@; [B/I$P|ջ%jժ) Ϙ bӛk]A0/ @fǪR{{qy‡3!_koPP9WAUzs+h̷䢟3 r.?q6qf$@$@$@$@NAHHHHHH"`~2?h%U?! |"УG _~y>um!  z@eyE ( دe,N9PH @oZ dI 78G;YgŔxJ:vhs%wv8 #PjspWs @hӦ?z+ 5QG$uSK6Ǟfm$@$a 2? $Cd8  #y;gl1 #Ef:8z>?L"aGmWHHHHH b&       2  (a_/PeD$@$@%B5u$@$@#yܱg$P,koƍK ?qf;.,HHHH 0o)uHHHHHH aV,P sjݺuV֯_?P>f"  &Pzu5zhNR0 Moj˖-j K *X @ F7'B$9Rgbx ,\P}GVZv- Yz2N        Ț@Z HH G|Iyf{衇Fދ>.s׹B$@InjăDZg0nE$@"vȳ^  Ȏbj  !y9) Ewޱ>蠃u$O `Ͷ3=F    (| [=    "?Yf>7nXUZ5/a5eʔ2m)_رcA$PW [瘽"O#P @ڴi~m]UzP: l0 3]{ァ~w6smNywj D7J. f"'9RYgŔ7n]AΝu$Gn~OHHHHZxZva^H6nܨ͛|jw.iIvTK.U6h@aNB$@$@A|75<$@$@$Ph|G_ܹsU~?S]vmUHrA}{fό9HH r}ߦs.>& ($~f+HL&33b  7=$~˕+{զ6{Ŏ 9-݃\6Wgu1Ǩm۪J*t?W>`>*U.L5j;Nzם,YOwlR 7PӦM[}WowŹ_Ϯ//yW̙3={5jx%oҴiSաC uʕԩ:uZLL0L>8oT:uTݺu{~hVXլYSu޽L_U 4~?;*UbEn:5b?YT޽o?h7xcC Q7oV0*uڠeq0?5tPߧsO*sAⰜQ@.[ i:3w}N.\lڴI^aÆsQjJwR7H O ZJuO<ڵk^=~ǻ b#H aV2    (]ФI @_~E[#9P`_HHHHH ^[lQ|Z~Uӧ[=#>@AWܨQ#:6 >S~nZuQ$׏2* jl'|^|E\۷/>#]Ķn.RgqoU>;9{; }ofs~QgaƊiwa* @LzgS-Q,lXDwƌ N(}`V @hѢ"C$/|x;eY& .?gIHHHH2)3#  `f1ckFn3&    !`s:ҥKS@8 NMUW"*!d믿;{wq~J,(ru]Y+nV}oʔ)Ϛw4G~~S`5=z0R|>Dgy&ʹkX;O;|Zf2ڵkgEPj_i( Z%oߒ.(俤hae{ _s5QHX(gرjĉR f;vTb $`?u$ PAR6$@R,Dnڵ׫۫/B7qWm۶U*UR+Wԁ>c믿PKgC:s=y<݁5k*cq3m4U~}u]3`( R8Ȁb{8wmLos=&{C$8AD /֭[E)q8z~QJ_loڴI͜9S!)plܸn.`2an4VP.O? +y$oɭtrDFf8½ܯj}$L$ mc sR+7~;wV?nVzT-PqY{fߡpH8{=zP~]o># 灭       4oܮ ~/{+ G*gf$@$@$@$@$@x' tbs%Y2N4'FE z&MҺ 4tzr{"*t訋:>1?__e]Yշ~:t:9_|z7p:]ƍkg0O 0a3)A.]CM4Q.uf͚95_;{Gu~  &؜R\҄^ E 3k׮U}EWHpI$@$@$@$@$@$@$@$@$@$@$@$@$@$P;m;~4j(m̘Bk!?`"Bm!% #`1W)뮼J5de:oFTʻrAMue#F蠩pVj*5p@5f?jBZd[vpL3k,N~hÿ+UZtY:v*9P>X_mu۳>ۮ{w,X[A9(_ʤ&"bŊjŊe0n8%pz \f6lK%[Bz…f„ ~RTܿ{- P t { @ @د`L<_ @ @ @ @@|M6mڔ͙&m_Kbv.C ; }/HT[[n?v @iN6HSNooz) Fu)3acǎ[2c6]Zha^|@4V0﫯jq>G6-/ OM4y;$\rulTMӧݤ}[c~)_uZס1cƘwݎ?(EXoi>sdɒu̙3қ?~>Du_ti$jkʕ+.nF]WnĉF@?" }~ [$"͋yoZh)@7Ep @ (*U ȾkzInq  @ -[fyFXn8_{nzB( ;rHk5k:̘1#}ᇍdaիW7{֭mNt _٪RB j8sh2ut<3A;Kʚ _'ݰaC+${WwѮҼ˗ͶnkYʿkǎKK10PG&?D?#B&sK@۽(0|{\|_gG peS]=X}iұD|>M |Eq~'+t^zH>@ @H٤I\2w[$K@ @ @ @@AP|}gX8[f[ֈN @A؏5 !UV-'˶?|{VZh}hH¤׷Ma)h;` ф&ݿ {… ʹiӔ;蠃l_H∑W_xv-\.n咳ѝJ/_G`ܸq]vFz]vԭ[FLwQ@; Lwhfmf瞨Əo6dQ kƶ@k{キ-۳gϸ{'mӽVBG\9LzLƍMl 40u1g}Q0 XOXmN>ws[ֺjvkq8餓P^mR|/6_cfo_孠{: d֭[, |aD8 @ @3VGL%7=U@ @<x'|AD bbaȥ_j*Vh]SȽ[ө.鲇vXPFaGFaTuRqY7@~NW~|ߝϷ8#QGms]qimźD}@*>^x.kΔĹ嫬yg6wHe/f]3f͚e_t/N;d]-v];wl,G}4V;?܌9ҊW^+?rhֿ]~,}Le^+rс/#hb$Vy׾VV:Fẏ~hwh~xEgԩUV8񨏎[~#ׁ_ݶSjUs)ع:4BO?t[cZz)WRs4g0 ٗ(}i @ tg~K~5jJT@ @ @ @5]mqȆf8m@ 3 yp-? lcT/.(mJQ3g ^W8}Frj~mEmFƛU0g W^y%bDhՙwyTu~R";|v>SW붧\l7o-G͚5K*AFǧ?qmM7dWh&Ivw6 vj*RJvtRsyY1Ȳ:֬Yc?^{m]hQl#F0{nuW\akԆLn|X\ 6|]xm3~l 9tα7KM顇j Pʕ+۪u- ޽Ǖۮ~Q?Ҵ^A3:.\hE1YW0M乓}_ @ G 'T/MN@ @_̭ _+5JMeh)W/WO{̙gYJP<(fbնϚ#v߾nM4Ɋ~7Zҽ}Jm խ|G~[7pCɤ׭[gYir!f̘1V\޽Sx^j.˜xPy}tq7 䨠HH7͝СcԙҚ3^{{̭K_mLEu_r1y6.^ȏij\A @&PvmӰaC[_~j歷:Ժ  @ @ @ y2́}x.Ͽ˖د^#R @@2MyC!Ю]=F5J0Gٶnk=XIhْ^zn]:[j 0 >8p`RV@Yf2jղ"+Hw:A-Ҵh¨&Mf$Oֹsg:u>D[@J]v|O\ *H"?VWGl~-,~HӦM)3OaFؐn@67+W];0,r v'~>u[Act5yE$/G+R.]aU2ճ%y/ֵn֭k}][NvT97|ꫯl:=s9Ƕ矛[n%Vz`Ry:ݧj\1fĉИ{am)՜K9{g]_wPAdm7n 0`J:V. x+@q*G@ @R#ojT=?񟩤^%!@ $O੧ N:$|Gj O '˽uSvwqG(ׯoduߗ6˨DΚ7oi-۴i[gygO?4:}Ѩ>w_uQo5 .U)C56|Eu8?`? c=9aMݻw7իWwB[!C-T#=#^N֯Y+V0<',['qW=ʫaÆE1]w]p_/V ޖI[vcȰU_POgIv^_6͞{it?0Sv]wY_q>Sq%:VT:WǀkDuL>Fs${uU ,n{۶mDULcr\-Gm ys=g$ZX@ @@VlQ;Wl w @ @ @ d^֡Cl6M[QBWA @(@j$hK/իWzD'xiٲeFXh%,qA y睡)3ᄃEfonL m]BhN1Vnᆨ@O6$>ؿ CŲTŋm;qVZ}3}t;C"`+W6I n%NѐuTV-f9bVcCO:d 1oN@(e:pb Se# ?KHC ~ ;#ȑ# hԩ_`| %IDs?ܹs(M6iĜ}{~z>|}GC9$8Qbmzs '^AO$;%vu8cn}5AֳgO%eXW;]CeY&?hLpY.?w J0u>XΡO?ݖ ;ϥU%u-~r'tYdׯ_.SkV_jU;MbܹsvmJƓY>'7nq!S!MȻx Rb:~qk38!ai _y啥Լ 12 뷓%\bEuOرc򾰽0$jnjH$ g+B77_~i/1H#)*wټk_|aŠb{LHu<^yδ@~k3@t"kŢ# Zٌ@H@Y>֗l>(({i![pz2vi@ P-=㓳xe '؏'459'o[-lPJS![n1HpbVtLԞ% 2)LF֡> zm~HqРAFb,+I'.*-_ѣKjՇl?蠃ڵkm`@t>\Ҧ's.ū7ڶ\ kr|(/6gWWK:__-K< ]gݺuV`UK'[֨$*=5Z"MS@#CR`!6lJU@m.\X{gKw})M bKl K`ں):'!t-#Up&ag_t٭T>Q-R+g گ[,gy4mڴ`ժUKv>T˧P>δ@SDd ~p9+.>|. >(Q ,h Æ/r.]HDo߾\'|QFMpb~=ed[li$KT7 Αm]9AL=ea?_͚7on$ڹsg뮻YU%*SP9i+l/{|wMd_~^lYo[ `nDbGAOt\@''v5y/R8d:wv饗}o{Q{J>.=ނ/$#r3!PWND!@ @H*ȼlԩ; L b ` @!8##(4e]`Ǝk}SK5QwFH?%*ɗ^."3|p3n8` K.ͬZHR]w]Ԧ|A'\0$XIv-&MLǚ -o?9Um5G]vVsܹ qb~ؿo*B#?UxWB0?ߝΓh&?w_ q꾯͟?e1fDZZooEn ܠARޙO.e(dDME3د:NbTC5qCv?jԨavag߮;R[Pt,sF;e!@ @y睃L({o@ @ @ @yOuyb?gҟ_q;'Ld @ b%gb\%ЩS@NF2^{[x<>H(p}56l NC- /Rg Ru~7ʗb.?|ӵkW#E JdWH޽D -YWoRdʱ\QP@? ΐ[d~n;ӬY3:8ԩc{1a̙f̘1Vl\;vپȮ uDB!0dwߙo(x٠AlurU]s%ꛮ{Jpʲ@H.z\2Xt6xwAb pG TfBb dɒ2k]f<ͭ͠j/3bQwuʧkDd3ea0~SGqVH֑Ssp Ԯ;$ޛc7m>|/& gn^aY猄5'y @ jx  YGf[x|_A׬YcO/kܳ XiA:: @ED0v*CB ,tF@v8  __- dcD .jK *Vfi#+gx+%C @ 1&Ɖ\Y gyUusz뭌BC=d6 \[ʧ?bѣ\qFW3b#s2w &){N ol56Ad$8mm+_ZueiСFb$6~GEmuߨI3)޴i$64is a0@IDATK/ j* JH;Eǭ-uz~W^6V[memf>LӇ\g@Z &p@@9';T]XIrAll7lٜd>i bxꩧa˿J*1@Ȗ_ұcG# &;\pnSK=/?M8$+D,t|x=~$pK/-ǏoN:xEmĈ`f2';rE}6}`?Gi=rM>ٶBڿfC{K dO,*ƍ3eK4KZ/~wXRGuܖxc.W4h}vem~\Xi |9 @8c]% ' _wJ;wQXa+K$eީg}@FѨ 7̠V@EGՊn2 @(G{`{W&;V wz %Uk^FZ@  nD lNvrs}L4% +;lTےh'3uTWm7|cJf* qH+s4W^y\d2\:A_|7n[&l7tiԨz=2ˣc- 6 |)pxaH*0~h-[fFif?&zul$]}z*!J*v]S$2%=z H-byӽ{wӢE #4}V\ٝ2SXx4 ;j#8"v+1i[*haϞ=~z]2?6Jd/Lj,M@ @ cM415kִH^ͻ'3 @$%Y@!C )0`ۢẸ>T? $&ןJZAden+_w\zAe{57"}j?ڒ>A#d{yٿGE YdOQVZ5-" n*}+eڿ9VkZޥw+A/\U{T9ZҥKm$V[荛Xmۦy?[Val/9#a: @ @h֬|wiD>Ir* @ @ @ 䀀JI=\Oܜܓ @(Lfu3f@=ܥBz{'SB;m4GٲM65KJDٵk,o_}Us%S,+zm b̙c@]qAXcLdXgZ]^رcD $XfYʷ~9Qdʇ.&ՇlI d%:y 7zT͹bŊF"/Q_~9hfβe\9ꨣ[n歷2񇽾J֙i9s RDxL,]M>}z&ẗ́F @ i85k1,}|_?17qpq%^ N@gѢER! P/uECu{t7Ǐ@=Q,9bQp||;N8\s56?nXJH:J+~^{SNV-u 7lԯ_߭b $dzйs U맟~;D0+$T 3qD{M)O<|3N]7n\{%6FkU_Ϟ= 6|_ʶxƮjO0VJwK/5.2L+Һu_o9&>o<{} UX i` @ 1=SS ٔ)S!ǽ}g'3@ @N xgiCB z<&o~7G}M|njcN&Zv>꣞uڵDu'OsZI$_4guVT9}'".@o>޶m[駟Zљ3g͛lWꞿjEmJsEv@]Yt馛ifH&ItZj1ر{ xJy >ܬY&Z7B[{|/u?2СCm[n.?X wS,}l|oOn$,> tyW/OիWUp/r}qΈ7K@ @@|ٳg'[T~~K!)W+ @#XR2?㾜@@ȴ_C @ 8ޅk^B,mev\2h @  ~ fWOG5]8ӻwo,lYby7̪̀U;찘W z*vm (P>CHBN!|~nYx%M \0&$.iӦ٠6/6u)رcp` ;' b/8Ʀ)bEO%< eg_$tJW2O 0/,1HgRjzajժ|t4gZu.%V  )2(ZY=T}2=Tanժ9C&Q ۭiժU͗_~iyb}`(on~gިG;Xիg7 Zߛ/o .0mW ׺66mԦծ%d{ N ,HZnl׹RmIQ߾}$$.p(FµTzu8BLթ{D倮kS^龠@UaD{Cu W b$+ҥK&5&ݟ-['%w&R^x[o 裏v V뮻r1APw ָu,7M @ '=Lw^SNE ,D%yhdX@u%5_ռKLݺuQGTy2C'-kGqi֬/+|u=X}3c [L7pʪ/8 '_ 7yGOX2i~o@|'ZMȟ3g:tymݗcxQps%#*_>`Wi<3qE RslHY7pcpB{ n4C4W6#G4&M>Os$Nsϙz\vekBïnF"m뭷6'jQx|%.HD˯_"O(V}^y/Z)wf7gڇa9cDM~{Ϗ5\tE)uo4|Ն~f#+V✑0Q - @(deb8 Svٽe#~GCG@q7w"-=ba P'7]'I9^$~7xcvo達ڗѣͰabMtyO>%rɓ'۠%1 )G"湔H{ʓOm]F%n YBsh)_<{,6-A` "#V(T} "6xc#1i3R`=#((`1ĸt (ݹk+ۦM+F}$)?pM{HYbu7Q+wq>'1d][o?*{ʻ W8AfeV$)O5o=hBWc䡇 6I8W]u 5apIA o*%!_K#)! H\C @ 2v5*:Z0B@@l @@?]gL~XW̟^?lEBx Sߪ+_D-vС沶UV7wy ~w1Dm[B۷~3 Uo?n$|Y{o|x[ ( /G (!Ǿ})]0oYM.BDeH@O| ӱcG+`3eC&lvW\9Wx/=WW5kִ>mHWY ߾^z|>rso|%w˗/6;`C <]wGTm 5N:)i(Gvn[YhsF\YBexWxZ6&r@ #o}0YfTzN`[t뭷N s9>',!1@@PL#Fb!!@% \|fȐ!%W 1y1 @@+=|߲bc7^a@ Lyhi=l+ \%2/[#eT|se.]mP !x&Nh$IY"b._..O crD~~9?&@Feuib_~%fez!2={vԬ~?C7Wv%C)V[m-L*8-7^U\pݤwuWlrVXB^|E{]lܸ_Ħ%k?)ImWycmXнT}$+(O?JU 2(m̙樣G¿.P9HuY%U㱬w}=uVXaܶm[+VۖRÇ[^D%۰aC<w:w^3tP~xn֬ꫯl0:$g>7.kuQ#'[bEHruȷ6}߷t}Iٵ@U+ѕe |&'Q\  @ CQF6Fr>Rey}筸rߢ|u~饗Jc:6nٖo[wW&rסm_O]l[0 tul˗g w/sfm)1dw^:mlZnm따իMժUͰaGaǪDGRҭ[7sS;uU~M4.jرc_ۨɖ[ni <>rEqVh]t/yWNW^YdMuiO4h3\x%scզۮB.햮d~\qf @ @&Śqqab|I?B2~F>@ @ @ @gNWs\hd5MzS= ,{vmgI^(xߢEL6ml&IXK@}-F9kCbʳfͲB:YV211cYv=w+VƕN;_|2dbĉ}AuVHġwi`P73Ga3o%ʇSXi{͜9s,͛'Z̯afq2-D5tPӯ_?[D9d$oGֹ$bͱS}ϢkNdrN[˖-߯~5Pqx]ns׼ o>*QaF@dΏZ#|駦vVr|e9*ۚ_ uH~Q^o&OwY*UEC@O @ z6f;)S cɏ?OPh 6$ a @HaÂ" ֌A(foO7(U_L=ӦMu[߫D)c^&?Υ+]-Q >0nI5]R%ӺukI3m37x`UYW!꜑2w P ~oÑ3d@ $FqV67M6M`D~!XӨQ M @ "7ޘ3 @  ]v fJU*U3pI @ P^1iƙu3UTIdɒ!駟ܯ_xU @5i2T_^!1T @ @[u6uTd9Sq  @@& L2L<6;g]@,c+i\H@yLУ, fm hTX@ @@X$u]ezD @ @ @ Ǝ$rOtM!~F @ 8&N`fڵ)0X(!gt:BC@(o(~gpnǽ V @ @ .l$' @  6,(ui ʛ`:{tQ@l\_c{w4* @ @ ,0ru+I@ @ @ @ ի̈́ lofӴiyf.~ޑ/|f @b3FX[lySQf͔R ЧOӥKnѢEJ(@ QD A WV{A @ onj+`駟TP!Wv  @@&#Fتԩc?L4C!p3P-U@N-Le!&56h[wG:@ @" ?E:$ @ @ @ @Bw5֭= 姛+WRg[lf @bb73\Z93r4mB #:wl #vwF> #,C엣 @ P> kΊ._̞=4mڴ|(cXp.!@ u]毿us9F!$?gϞ+@ ʛ`:l-Le!&^0V2jՊXl ݵkW3uTKcv**  @ lVAU . &ol֭lqC @͏?XjԻᄏiҤI @ @@6 Asݻw$ȪUnv!@ !~p2$@ @ ~sÝV!@ @D@b/풂#}8g`mPBL @ &+Wz"s=7)In¨?c&ۣn@ d@fͲ\AUzuӶmۂ @ @ 3| mF\!Pnv|z_oiӦ3h&;mN: .WHO4|GF>3g4k676|9CLŊmnͬX~Ko6W6+W6W^ye洿 9mw}׼{vm޽M"bdM=P['0sIc9ƴl6m5jTrn1qMKm|tdj2;K3n8SNF,Qa_w֝}f-=.F$ 2HL5I+0 w] <}vmj^jR?+@z_n8;cG}l4iv-#b/BofѺcש7xMK@5_;QY^zbO>p"ִi@Wڿ]v5`mժUPD%u֦m۶k0aZqMs.\Xz{\q.~%'lE%,xsםt9'{reS=]y@ر>g>I/RArd @ @Q ̚5̛7nԩZj|+VƫWNnv!@ !~p2$@ @ 6ׯ_N* @ @9%N2%}Ɲ3Cp>)@ %@CP袋 w0Cr2t @ @ @ $H@Xg6?S%Jf(HCna غzj#!ϵkךe˖/܊~1ԨQԯ_?ƍڦ:@OsOۏɓ'@Ȩߎ) L&W_-Q-9/ 40sȢm%2;G u뚿H0Չ[K.fFy_|hZ(0XI@~S]vg?0~e*RЩ$/6rY`-٬Y3ӭ[7sqΜ9F:tƳTu']Ω_7TYL< N㏦QFDK,1~I< @ @ رcp@&֭[{A7?  @@_(ْ @ @~K  @ @\l6lc }gFEN\1hq/x @@Fa\<0fd%cj @ @ @@~/_n$UJ#P*]I5Ff1~iC{̥^j} bzivu ۷JR±l|A3qĠ.}^tE};`L&*Vh/'_~l鴗7D;`5_F}̙Ə-Ouڷ'|r髯2v2e>klF2_uJ:pn}O>9Sp$ZܻwohA:2s)H x;K.|F4_6Cu.Ssםt9ݠSf2Я4 @ @ @ ѣG PMBᅵըQ%3ԻW.( @E:.@ @:> B @ ڵkg;zj7Gpsʳ.@ @ r-C5= @ @ @IՔf"C~J*YQ>}ءIs„ SΗrV87Ts9FwP9adO6Yם\rN,C fϞm}]3o޼2Zb裏5kaժUV޳źgGwkH2_|Yvm.6-Zdoi>sdɒyʹiӌ/nN @ @(R{\3͛7/ґY]2K7Wx4@ "&o\@ @%OfI٥Bk @ GjSN-&;S@  @@s=^aVO]"& jj!@ @ @ &G H@֭[0ze>qD4hpt+a)S*~:|%v< s>0HSVZ5tJǻs:׬\qM3li߾QK.HCvm /۱cGO׉}'jHҏ?mK"-[{РAfݺuAA|<ߧ)LlϮjjժeZlitiժtM;lƏ[IohX9쳃:vq`>iҤ`{XquQ]vԭ[ײoZF{gf駟Gatll6k׮m۶v6'OZ @ @xmC=4tVF ΧwB4 @ @ CX @ G`6 ^t+H@ @ Pnhҹ3~K 8d7@ @ }7|sP_I7?c~A @ @ @&.Z(ᇠ b _Aڟ;L1駟%O> H‰}*;S[*c+ I0bŊVPս?H+Vqe 7ے`q5ty\,b ~k\t!j+U.ӹf& zjsW;|w%OJKw裏6s1{ `{gZnmLREÜzꩶ-WYa…k1K.uELm?g̘a,߄Qͧa?맾6xc;M۾K+|=դ/?bvk[a*z7>k@,>C%ȳ4|/ڦ<#M;5jYj\R%^{H( @ @H8Cבȯ+U^=Hg:Gۙn!@ P_G @ @Y &} @ @ $դv7=j_ ڵ  @9'0yd3~xۏw095$.LF@ @ @ @\[n0~-H'pbr--F>ds֢E ,m}ҥKPΝ{ZѴi`}"Ν; I(N8D1Ik׮%E~(ʉiSO?Ӽ 0`1V7pCMQ͜9̚5nUq±~m{g1׿UW]e|v?od8u\&{.ErK{v_mȧkU5kL{&sUyNXCtYuyFwD`W_}e4h`z9nKw%>#ueMM.,[NJ:>W-bƌcnv%C=dn.?x3h ~gmJdwaX'VZYNݕp9|s%XtժUر_l땠q&MJD(_n&+ܬM{Æ o*/a*U(\ʧ0n8ڵk#ѣGuݺu3u)}ɒ%VZ4Rgm;A&Nh9(@ @ [Ό;֖lL'|5jL'\m= @  _ͣ>vi ݛ7oϸ#9cGyorRፌC @ MW9s?N$Sy!@ @ 9 N.wMtH.SP1@@\\+WY=uA"P<*#3 @ rH ,_Tn!Đ!gn>5kbH իW+&/ $K7QWWwʕ;k^y3i$M6n@|`ӝ:u2ժUsB[A]NWvGmWn-{D,_h|-|/>r so׬&R=#;% Aɓ'`չsZz-~hЬ^%|`+g#G={]9r뭷MfWlo޼:t9䓍5k ~7:?t?瞳_W"aYŊ/Rݻ[=zkuY4"HP*q u]M߾}-mO4Ȳ~wgqFlӽDv 'ئ/W]u V;0SҚ9R|[ @ @ Yb-yA[1 E>RSsL7j™n!@ P6.I6 @:9vr:v P. zK  @ P0*ь3; 8 ֳ @ ,/(lD,:ɟ=n¨?cZ|! vK >9>h @ @ $دz7;޺0kD@Bf{챇y8]<m?mJ"UVlu P._ IPqO>Ĭ\Ҧ'DhwqGӨQ#ۄEHUL^{(X{DRS}ߓ ~}"J*fРA/|oѢ$} cD9q\&{.E`K}}/lY:s@IDATCKU%`;ȰQ)Zn" @ @ $nE9$K=[|5jdYR;̬A!@ Dߐ@R  @ @դ&  @ K@b=0uT~!@ ,bbh* | p @ @ @ d/%dlAv~$ P@˖-%26):-Y ͥpہد2!+AT $|盾KP"&M2:t7EZc ۩D EsVYBsꪫe *0dϥZVZӧ }1Œ?|WA>m̘1ԫW/j+aN$tY~a~ݤ!Gmuuf \w烩.vcߜ Tfc5^zm"NDVH8{<`̙c$|RͬYԺB\Ѿ}{믛_4o2ܹu]c 4k+V4G}o~[˖-3oMvafM6iG<-Zdv ?^% @ @'[rR2UHYzkIB @ @@-G)M@@n Ԯ]vVZgnCn«2J` 7 w$ @ @(W$LAN;4% @ dύ9\~fTh*}h9&p1`9C@w"ۿ @hѢE q@ @SB .]4v F4 G~gΜiƌcE?KӱcG+b+˰L:TZHƶrKӺuk_ץYfTP^$]w@}m=ʗbs)9ޯ^~W~ݻlvy3l0sEn]B✫ұJg)qM'srԨQk5?Yxꫭf:mDM ^"wdޓGFk]v=s$ٳJ* L+.]E>OH^ޖ}MxI'ÇG-2d7|cΝk dUB{%$,_8^z%n:& ehܸ@ @ L6㏶b[ ^-5X"PF {Kt@ b%oO?@zJ7!@A@?c_ @剀&8DC  @ KM6Fh`ԩD3q @ K@SË/?ުHFEF@BD%E x Ȑ/PQ$HT&E D]ۺs}>sks3%KLI0P 3A@ ^ @ @ *T&#+? LL2C}5{6D? 2D{n͚5qj rﯿjc'1X~/۱cLj]]wxhڴip}txw}qu"UT:~?nW ̹0Hͯ\ѣiѢiԨmwM4Tܳ"~c1k'OSX7OtMDb{=+$?uTӮ];3sLrJ;p"+Z;WիiҤ3]رԩS6L8yΟ?ߌ; Jf˖-vl L>}rMe˖VwŊ^~[۶ms%z}j @ @ \^z N $ҏo lٲA::v~I @(v-c^ @ &ʉ @ @ { (Iݺu- C @g &6zhKŊ_=|~P`4[n ]Bҹkw% ,?ݟ~L6>6: @ @@pbaV7n4U\ ~0C dݲi}$"%=D>6l03f̰bz62dHMˈ|s= ;硆 |n۶-gVZY_uD?Bqz;68ǵk6ad:t#%"O.,WQVZ@ @ K/834$j|AG1@ @ 9&ǯk+V̔.]C@@:ؼyQ9 -BC;Y33sLvZSR\Ù4ioː9眓˟mjn~xaʿ իȑ#tB^uM7eTs1ذ/(%J-I=%.y/_~9餓Lݭ`;cgjOܑ,c/do*YbaB>!n V2GyyGޓ?OXAޏ?>\u1\sGqyꩧ|~G3Ϙn VRU iׯ7>WhrƍӧJWAKݺu3 ,U KwѢEFsnݺ9!a{{TX1s۵VEi~|%P{{6{ DlRt/2{nW^y>_ +䬭Y`&M~ &y @ @pbqܹ?H%}*BAgwXH @@M]ԔS]0@!ƍ'#$%LJ @ \wuf=HFU4!\ɀ @ @H"x9E_fΜ9ErL  @@aP f+Wݻ0CI{03kZh3` P7QF:+ #0k,)0t@ U˗&!X~wi$d&QFP l!ի(8qDW4k۶se;0+*8w~rݶ~#ى'hEvv'dʶ>L}F[ADIL$jwuWhV}lj~b/8QczدD%'Ah qQA[ҥKsM5\!ʮ]-%J{͛dDK9:O`Gzܚ:>ǘc9{}鼐x L:fꫯGm&$?7lΘ1̟? KV 6Y_ϔ3<%bD9?+D%جb"IXB̾ЇxIJ,n1}f1bK͛ͭj_*Us~1@ @ ̛7,ZVwIKoNW߽)ޙ3A @Sur @ @nA9$ @ @: S^=;ﯿ:&E"' @@X ^z?s d57ww^z  @ @ @(eʔ ݸqcXzٱc-o4R+ۆoɒ%m߾xv][nmc)}+v%oigsy%9GOyRƕ4?_o$,F*,]Jӷd꺭߮KG'HgE?'#Z}D#ணxqƙcRBZwM78 WZ7Ͼ?U`֭Я5{q m$T46t?|2}MժUm3Iw=0;w½*±v/0~zVΣO>iy+,%}s ^I5}t޽{.o?se5kf֭GJH$/ϵk騣2]tT|@ @ ^zgI/ 6 b?ޱ N @HG @ @ ݂ >C @ @ 4m,\l۶Hˇ^h @@ Z\9.(=@A @ @ @!Pl 'V_z.YGᅬi3zֲe@ Ϗ7]N3uT+h"d#5k<0f̘gd 1s1a 4 ?~1WonݺW^u$Lnݺ8ޣGWshjԨQsf,\z/2. '`+̪U|VwɌ9?ᜪ=+a|ه@&Mk\>lXuDJ}ABL"\s}IHVn7 w4V.U$~ұcGoʕJ*I&-[J[^y啸HW)l~>zhwҥFb[/{cDLȪ+h}d_z` @ @pb첋ܹs P@ l߾l޼Y|CMG @YB,9L @bϘ @ @FYf矷Þ3gbv/ @  bOjz21md=O Ç @ @ @@HVF4R(ViР}E+1@ $)[ pϊ%3~=؄_jUW{a~% &UXVDb^X @ O`…fvGuTF|WJ_>(PB ߉;w]A @ >U'ƍZ @ \8Ǚc @ @@دsdog@ @ qK,1F Hwމ7Fʹ!@Od @ @ @ @ _q,ʕ+C(H@X|\_ȲabI[n _Ve9gg:|~@ @ p^x 3 $җ@a_~$ @ 0IE@ @rmޱcGc@ @ 4ib*X~_KB @@n37뮻H|@ @ @ @ b7n+V P@% m۶%<;w&\[nMN潐sM@g:xB @ !0vX;YŲB73 VP!Hw&L @Fl9 @ i @ d/ҥK l߾/^<{0s@ @IXp3fmRJW^IHt!o @ @ @ &PL`{È(H@Zy'_KE={֭['!P=*AHL瞟Wc @ @E`Μ9fvP`}M2֯_obł1 @#obܨ@ @Eù@ @ 4mԊJWve]w&@ @ /zq oqΫ.ӛ ? $ @ !a3k,yM  g YثD͛ggިQ#St,!@ @ +oڴ)rAʕ+^RLJ#$!H@K/(N9e)VZ0@F *g @ @ ocǎ s9ADz~ r=[/:kzCbt @fI*jC6lrLKN:3e˖q|wQrիW2֭3&M2s5s1Viܸ MZl]lO4G}t6?S3a{N2-[X6?yGݺu35k CSN5ӦMݻw7իW-k6}Q25kf:ud=3fɒ%yU:,ӰaC̫ޞ{ij׮m: s:c0K q g >yd{c1 2Fm-ZdpK.Ut۶mfȐ!c۷ 0?z(*/7UVeqFvrKwy”= 0M{)jܹ:9sohn۴icڵk>̘$Y#'^z'#$=UK}곅@)bŊ3{W<@ ~ <0F*B @syG~A]L @B/0/J*+(~`ر`:d0Dc5drC}\> ,0+V>;v4zwVT~;*ׯ_߮cPpP|%./pkZ_k6\3Oo,[ i E&Mϣ1&~˴Aϫu-~$?dYnA6^by׭)z r/M/^\}ա͙_Ռ92ך#<2O|9<``^_we yӶm|> 8Zxqǁ @ @2b" @ @ @ @(4n'O_*q|!@ M3S5|p#H&oъI7mU\(矛O?|w~FoCAf˖-A MWBO=m3BjT,Y/)S;fI@5oV~_]tQ  bu ~ɟ_ @O~0#*3<  }ƌO># +?/wyV,t_O_z6ӪUbnCدDu~egyfDAKp馛l#8"M{6Ϻvj͛:e0֭[sOf̉w ;WrL&N#srM'>tB |=^c>}0aBi|=߰Ȅ$ :L$AR @ P])(:/ @ V(C?Ę @N2~n:;w~{w ᓐ.K_nAX>nH?lz+WQ sK#)ܽmFϷCr> 30mȭ-_<(*XC~oܜ={n$쫯2ƍ3 s;dx 3q`_85k+/10`@d=W,UN毻B @ @n͛'FVF|ҥ+4C ?TW\qE {]xkcU#;vPDf;$?xSD"I+0Ga~YfRJRmo&Wկ_|7VVXmk=ۮ]K.1g϶З_~c8S >$]\兊)S,ZȖ sαY4V#n}> mqw=lUk1 ^uUa9jTp{)\;I ^;4z9S ^{.+61{Iz(<@L7svgk'aȃ@&:t}~gҘ+ P4~xhOf@ @HҥKަkeStƶ.d8 @ P8|FeUsWb#lh>SF>2/a{̜93.~AcI$zcƍMZ5{7Ν;Ite7lg}|`֭իWXK8MkӦM~+V'ǟz? p ܵr˖-0?;c;n8+\j1cF2;{zV؇ VZ}N @ @Owyʕ+"m @ @ @ ;iҼv{رcy| *xG7ou@ #J7ofK={g^AUȑ#ѫ:ЯS'͛"xjP ?/I&=i$+6$, &tQs!/skCE"oaJC6-j7]LAj׮m g.;pE 4ύjժ殻!(駟[6DY͍!)Əo,Ypu_|'-]4ntVHpT>(H^, õA Px\pKA @ GYf6)" f9 qH0@ +u~vx| u+ GTMl۶- &lt#?`޷ӧO!bŊ9Y /W ge˖5{m׮=uV3k֬pEΓϻ!r AUk}xenڌ=:cWrرjժChv栃y Po8~ZkϟG|*vMڀ@(ŋSZcPK0|F&:=K50=Nc~ǎqwh";u]7 6m}jg|ΝGO^Z}wv]{umzbm/r?;c 믿\]\uMh/s @  x~5j$[@ @ @ @@xԩ+OA3~ @ d~3 9yR:aTH O4o_'Rv˗쳏m姤4oDA{ׯoG \tE1c̊+l:? }Ug}dژV"# 5֬YcuMCԾʔ) hD&DY1d/68>u w=s㎳ʕ3W]uU@PT)Ӷm[ߚ-Z+kРѳ{QK/:uؾXy)pϽq(4 ~Vhc@ @@ӦM><<*ΑC @ ~S2d 2HSD҄@4d(AVv駛}7 /7AviAdwZmX˖-{m9:Am=+0]Pe: Ly晶 /ҥKDQ=C;G@QRˇZ"ǮU:?_|3'Ql_p?#|.іA۷i DȣّGi|ъu̵Hyݺu:С1fn#=7l`:^{ٵYs1w] ._y[o5UTW{J76a_J¼O-aâvVכoi$n,߬Y39&\;s17fҳ\fΜ߷zStis5kVZY>*߭[7~kRJՆ2YIB_}؊ԳTsx5C=T\~fҤIZAs9= >}# @ @0 (Q"^eo*q@ @ @ @@=zt0s=7H k0PCRAM? @(_(Ό9e,?n햲y_,_ܶ Ջm-W@ٌ3ryPY6maÆ&Nb+\ o޼ >kIX{A8SP.[J2eJ1y~\ 0jժ7 *Ws]W>;k˺ng%' PT9|<~yj[lAu^#ay~wFBǪmzN+//uXt߬M+(mm%Ks)ؕ>g4i${Ȁ ?ƿ @ @Nߜ@7' @ $*)a,h@hWfUx&3sջvcIeGߙun7.fҲ, K_dA˻NWZ#~CN\mM$*K 0^lYzOX"KևZI/}=8WZe$NnݺqJКO>ĖSThZ# ;?qASt㏭HErug{: \]9>8|+?[wumov+O?8gW\#/ 4kSO5'NwIO>kؕx]ܹyw/ &: ̱kFWk ՗ZLEm=.>+ڵk?9hKvM瞶-b3]52xȊ/n*+m3@ @H#mʕ+25j$ @ @ @ @H@k>Jʕ}t+c O.]:XdjsM-OZ @@Ta xW9 mEDZ[nv̥nݺA~O>̜9.W-wT. j׉js 4pi۔ׯ_ Dh @"|x ǵq>ی=BM*U< ϸvF‹o Jg#TUVFHAYy2h۶mcN%nf͚ j 2p@0|q51G金s\odY~|풆@:39ꙮ G}HTXAyLk(qAr4 6@i3(@ @@hҤL~BX! BO @0 :4fp!T'MYd#h>xrq-,\SN |A:a|'k!^~iӦq5SO3f f:L>ʕh|Ƚ;l{~_>#MՍK>d,[+mίwN ̛7fCg6C 1d}.+Fkժey-_n?zC=O4;6=YT>զϺ$ԾDb7k֬1rKJE.M/Yͭoawc=4On=Öw3f;ZÕg+ᅴ-[Z]Yf:ˬ^wGkω_xsα<_GBe%6Vk׮VD_4u]g {Ͼ}qٯu՜4>:ǰ'L`e%\x 2]ZUZ5Lb:gk?Ko4z2*U2|}+~͇- @ dEX1e0@ @ @ @<(@IDAT@:7nQ1j!`E^:p~ 7A d˂S^-_|s墋.8|-4+)0C$x_]r0`U@#_WT.&YgN]v6P8x.{n#JY/Ox$,D',H wTXlڵuVp5/k5]覅''p@m޼ٔ*UʎKDCv1ǘ2et?µk+fӦMF rqǙ?4l0s"TqsR!B!e'rK}AF^z6xm$}UhI!)S;cf6Owݺu I*(om׳K:~q"u )5.]MҌ}vM1@ @ @ҥM-^A‹/^H[@ @A?5hwgeB܈&JYJ XU~_?дKҭcqj׮m}l0]iC9W @ 򕀄>w}}hٗ-[6qeVX1f8Ur kI&vqUDK9_hٲN։j|mR\74 2^41p+V%sm%$%J0 2]wʵ=Cl#>V@̑2&Nh9jUZb &z`3 ĥ5O-<8De~m:/xK(G}dW_}e[Q 'W/P'}yp]%:D;ngm'> L$`2Uxpo<\pA!%K4_|;̆ }LBM/̣H1PƗ_~RGB XfoDtLL⊾Э+'qw>\^sxΝ<ʔ)c}z9h&:]st™+SdJ2;v'1왠~/ $C=i$e۴W#;syX?]#vg_su)j=U:tFl)vMTWcϡ싾x*s ~]{͛77Z?ԩS]vĭvp&ve['ׯT6د2moԮ>{~ysF_|X}!dW^?bĈVZk/w- @ @P Uy7[n5{h= J@\cC PWQa @ @ez1hРAVǩ@k?CAk]t0rcc @ L!o,gÆ mU!CLFAp`n?֭<ffƍ6%*(l4XIh]rJ_l mFZW TC='HW_bHos*/mڴ ʷn9P+clhр%{)97n|FYƍg>\}` t?|{.c뾓 a'%3,|߇]Hwz9餓9YЧOA4?X3?_={(g}lRh}S$g G9tW- ~Msˆ @ @B@2 H?~ ;;lT.+i۫ڴmlڴHV"5޽ m4;#xM2<68R:-` dDcK~!l3M41_|~kժeիj`(. jh~GvZs-#Ft̉w s*Y)GcP ̣>jnᆈ3TR%l9?/$T)(o.@Th_A1@ >Nj @ l"iyU]<_@ G@~Ii5@$ Mg:l!7Dcn9| >-_8 _s /O:uy(`ڷoo|]W'^1cW/t[bEsWڗDg͚e~aD%.s%Ch[κĪAFĻ|^|hٳ: :fw%pg4K FŋmӺ΍ԯUuv#z_|Vm޼N"|_&~\=߿͸q^2u0}$?xNG^eB]d>ʕ+]+hB=@h=wLH׌ʺktm:syw"J >,[,ZH~РAiMbz.K7}b!/B @ &&/_?7y'c0 [B <`@b @ @@& jyW'[Dgo=L  @ + ==&]LӡC;mkzm~ 6lX;'*+X-W1J׉Ib;vؼ)OQ1:wׇxF2p"Y:O•:u]cg6N-)ۦn_"Ks5'آ!@n )F=rFlsn檟}9➕ BG}1cL^"RPH?6!FvAc c5'h;,w<־lٲ}~+|`.hU c?xב/ 2Jw-"(qA[&߂fCA l'C7'RhMO]vf̙Ɖg0l ?;vE w饗;Ӯr7k׮5OA= =/|X~ @ B!z^]YzB+źo  @OTR< 40@ @ @ M|fٲev4mڴ1UVM1xh% d&@B' @("v-"`EСC~NZjAI$؞{i=X;'TRQfΜ99",ZȊ$G:j2شioU{z_8a9w,?Oe 64 4M>BۊXTܳB>e?yꩧ"b @5kl|@N:AҥK[_="a%EiK-熝;w8 @ @O@7*ضL ⷐe=S0GO @ @ $J4f۬2oTwA{iJ4=1 +# j֬T{wt<ˍglePV}C;bHs9Aŋ颖k=/ޫo AKz,Y2pg-Ptj^Mև0;~Ν;%J] V"]ty'x砻PљbŊcR 0A#! =GaVXaנTRŖZjy衇Bjn$^֭5Glץ[#OuiOF\*DifV5?p@uVk,-[gH| !@ @(dG?ʕ+  @ @ @ 4"ڵk&Y~`(H@ @ # Z  d'` ~{&+-bi1kP.Ђ \~BF4a[Kpڴi^zkP7E1ѽ{wSvm;55"tb#b-b8s 6&Mdv7Qi M/h$>=e; F:qB`WpD\c4TݳAaQ۷7v=qϫܹsa ǘ=T/ t&~5Ƽ< @ @CiӦa:o޼$ZM!B @ 7񡬂E7KO<&Yg=Ӊ4a /7ARmjF?ʕ w8jV=3jL?m= gD#<Om6ߴ> .- $C]n`^'Oұ&$rڱcG[W_56mhӦ{cm*r?_r}C~3XtgZbE嗃_}UNv8/Ln֬u\;z;yWK:3ĉM۶mYfɒ%9GZ')_  @ iz޼biBwɴ93^@ @ @ @(njƍg'XLskLAM_Ȓw @(T]tm DUGk0`@Ptf3g駟 }'iQI&|ޞ={;./%:-nFAdM;or! ZI'xb.Ǝ;6l0|Ah3/H$d)د^N8lf!1bHl2GÍ5JYHX;9,7Gv7tEx3X=$-[(g Lz 6q<ѝ-[:4W~r :>HOnqFoz#F@ @(LNWc s(ڷ~s-9 @ &MdLbRV-#I,{>۶m˞3SXcZ٧vpBs}mF==@a冎!ۢ 7Yf~͖qe]Y>|^$T%mm=;9so3w: ӢE p9Nd}۵k9hO;k6okf+`¡l2GFAW9Q}+ڬ]TT)WYP s9+V,PR bMM!b / PUVռ$-Іgd'tyGa9#9_A|f_DX.`СPBضO9 bLyX"X WF|Q,wn28qF;~]2,\;sD8*3qVvM=K}61dΝ;zo&u]g-z^{k֬1_|q+4˗V<toqժU#4X/$hYr5`{[v' hk瞛l`e]fi-ếJ 9&~=tϟo%bݺuFtݜ}FyMz$J S>޲eKН>7mdǩu\uŋ7 {{{s]W+V,իoOkN)5x`H@ @ G;hb~ _e}6 @ J@` @ d>8SL|,s دC` @@rMr-fҥU6mڄ-LP 1aD,v5lq٬YF$/@QpX,R,mG*#id !IZHc従gpט?^;/bөg}kd@ ^s7Zhýꪫ̘1clӧ?)0piԩV2G} &M؀ -l5}o," @.7on<l b\H=Xc=ì~7+Z+Po$K/7R[߸qcsW?묳v'-Z=&O5+h"z#FJXyڴi楗^D'%xWNީ8{XHևo61c>#M%kÆ y=Iwhk'?Zt/[pAAF$دoDuد+׋ umӮ*`e#GtǯSf͚ ;(A$e^xqآm6XJWX1Gp(@e$k\Z6ھDRg~vW 8+H̘]]uHw\x9N>uY$Ɖ޳bWGۍ-2Gu^z0{O?5\rmlV*H7qE?q7n;vlpV&_^z榛n2p.[@ M 'aA @҄tꫨd2 /ʗh @H{7n4 )=,ȏϙ0@ :JGV'\;w9|gϞm$*P;E]'T3O̰a̓O>iCh#<zOzM6q>M6f֬YF _e2~o'kKjAꩼ./hŕ%蛾W+bE<1m]~?:кnoCyɜ_Տ_ [yҍN㽶: ~,ۺuq"ZһwkXBܷ}Xڵ3>^'+]z衹3}ҤIZj1=Oo?~pJBr#JVBjНW]}uܕKfk 'gFs+ #ѱI|^n큮)''k&GwM>qUriu ˊ9HWsNz@Wוgݻww]܂ ganκN;4Q@ @@pp$_D|@ @ @ @(l]q"e6fNi/Oچ @@Q&Y(O0־}{3yd;L-(^l-ע},u֭[g>3A X[`0@ (Ɋ+̪UD4u{f=+ҥ >+Wג/'z#Ǐ_\D m6Fה ZJ׮]kϟo(Kx# .]w>|̙3M- y38H (ۘ1c8-[Hw@ @H?_~iԨQ 2G` / PA @KO>FB2 #g}v{XZ2ӧObEkJ?krdr&#- (E̒%K/|<k2ktzEcIf͚x}ݗky @af>s=֭[P-[cW]uyÖ#x+R&ƌ @ AO7={̣!@ @H'g ȗ[1e.{/ւ^{{ { @@#[@M6q֢8  *H,K"E` (O.iӦI̖-[|~@@(@Ro ƍjѦM-f)?~NXHل@HP uNpWl   *{kLqYЧB@@ |7ްv[suaj2W6֭r N0;oCF@Z:5^KEk@@@H\]ϡZjT@@@@@@@HZG}t: 1A`Ŋ]I&eSbpHlOl   $ТE O$ &-"P{6ݻwOh;vLh;6B@*@7lT@@@@'РAӮ];3}t3i$i&SjU:+nΊ3I@@W\5 `ԩSN]6;53EHb.; 1iXIkx.@@@@ qϢ^gϞ&//ש        ?Y~YgerssaX K,[)   PiOw]pOa2>8~(   a7f-   d@ΝmuO?d:vUͪ"  q3yd{}1gq_G%{j׮m'/S@ |!~+Z"(+bV^m5jT+]xѣo;tP 0   $G }7|[Qi֬[-       i!0l0?^z:+xb?Mz*rrr-   fC@@@R!ݰaSA@@@B5.0aa!u@@x˗[oS_2d˂5Zjvk׮=@@,۷,CM8ׯo4     P@e˖MgϞm7B,D@@@@@@H?`ڵyS5-G%K5iדU ?C~"Y  &P%&|@@@H@}N@@@:uN8׳~x2m  ׯYtwi.]`]ݰaٴi*       @Ta3A@@Kfvy۶m͵^[ [VZ`ݺuN@@@@@@ F ={o޺uk_       @q?޽{:/6m4 ~5>:D@@ ͠   ^z~6lu*    @@N'zTgܙ'  (fsUWf͚>$PvmvZ_      %yyyN@@@@@@@T |fҤIv]v5k*C,xb&Mz*[l]k|T@@@ @@@-n@@@zΝ;{ &zT ͖Gy" d@~ܹs-1c=l'aQjժ)       @@Iag[)       X`С~^xS %K؉: 4HyH@@@  7CH   ~ 6lu*    @@N'zTVjiӦl2D@@ k~g3x`;5k!Cd/^nݺի}        P|\nJ)m@@@@@@@+VQF}7lМz;MŋmM4I lRX2A@@%H@)6lXz[@S`ƌl̙~+JHGɓ'SիW |     )[<}wFŲ-4D@@.lذR\{m۶ Uߨ,Y2SNͪ93Y@/R1zhjժ@!Pblb@@@3]36ۘn=       $[3k׮ݞy晦VZU>~5kV=͛~!@@(aJ}c}O@ H`„ ~VNj"] 77O_OA@@@btɆ\L>1Zfbq̛3B@@/+>oݺ:*D )} }f .^bСF?@@@@\}w…vyyy;Qf       P\xᅕj dKw=͛AP+UTqUn@@@ AU'f   DQ_Lد   1:wL0׳~7mڔ e  d5k̕W^>dSV- Fp@@@@@@J/Ts1nYVJڜ       Tqɓm?رcIXh0Ua7ocu*   @6cd <@[mwF !d E]vQ(]WFد>@IDAT   1:uL8o3R}dL  @6 ^DYGu9㲙!@oHؤgϞf]v1%@T 4mwߣG>[5 JG   @e(~:yyyN@@@@@@@T <#޽{:XpL~lPJ_   [ҷ:'" Pj׮mx̏ cG*ac   B 27cHUUV]G~@@X 4vRF Tl=#͈ԓw}~( T@~(     gmժSA@@@@@@@ K,1/qƦgϞ}V@۬Y -7oW:@@HLJb   D~ׯ_ @@@@/мysӢE {ĉ~y6T͆G9" d@޽MAA%kMv)@oP4C@@@@@@~]^^SA@@@@@@@ Æ 3ZwYf*A,b([lVB,Ǡ  @܎@@@@ @.\@@@@/ЩS'3|l23sLӦM.+f@@]`f̘1A!7xc08*Ús=fĈ6+ jw݌9g1L@"gu,g   @fϞw@د       ͛7{Ջ.(d,Zw_=\qUn@@@ A~c3@@@ ԨQ/&SPA@@@bo'N$+V!  @ ,]\s5~>YO-N's-\L:5s'@R"P~}kנ N@@@N[jT@@@@@@@H;cfϞm=#RvNχ*w˖-B@@(ae+׭WZerrru @@2O~LWc)    @1 uEa'tѷUV۴iSFϓ!  mW]uQ駟nzm̷ [^שd@:uA̚"ʕ+]ZLnnnmX @E k֬.7   i#'~dž F>       Ix}_\rS<0Yf)͛}d`y *  $,@ota˖-@@@ &@@@Ν;y(7[ ٸqcLy"  |yg<5jd sf+Pn]C~=EVU>Cӵk׬3E(_h1ٳ|;eo B૯=)   @;@3g,///i       @L>|vm۶5~xNC֬Y4h %ڲeJ*N@@]ubnl   @T0wQ۰@@@n;ӤI(~7mrPG@@J*^tE~4M6 a(@@@@@@b ,^ج[ήnժUf,G@@@@@@@}QWc_pvh"S6͛7yy *  $,P--ٰ\kr;A@@/r70췠 Ȉ@@@@ -:ud} ͝;(8Kj~3f~  "0`/ϖ3rkԨazr3B@@@@@@LpCS~~_T@@@@@@@Hum5k4zJfd7K^%7''' t  @ Ǵ)#  .: aN[@@@(Iĉ"jժߒG@@ Mf.;\3tP×qK֭[׆Z*]ȸ@@@@@@@ ¿OϞ=ۏUVN@@@@@@@d fٲe˿ofJfdŋ-[^5kםTR+!  @BN@@@.Pzu_OA@@@Jܹol(fã@@Eࢋ.ᬚW_m:t-Sg P~}+VT%      d@xq07??O///ש        L~ww%:X`6lɮfJbt n[hɮIv  @ q)B@@H@*ULnna|$@@@%ЦMӰaC;h!5ҏjժ~M6:@@< .4W]u>jjժSA [PP`Dv6       .NgުU+_       @xU߾}}J -3C@nj=}f   @ T^lذ[@@@Lԩ=z7oYxiڴi&OT,w)8C@@ .l2;3<va4;*WXaj֬SA@HL~0hHݺuMnI[M:}\FN;Vlʕf,nr:)#j*3evԩS|v&{3f3gNf/    :07 ZiѢE:       .0w\k~7onN9 R/@oF  @Eʹw   @ ԨQìY,|2   epaĉGQݥ~7nu*   P9^}UEӦMW3ʴhРB5kSA@6m2O?//b/_n/޺uks衇04کiSzivuW3tP@;wyQ7}r,qogaەuɯjyUpYf7x|WF q5dOK{]غ-ʷ;]v٥z(o߾Ef~2tGVy?mڴ1zlb?SԿ"Ypךz|0ML>}(Az~fֹk׮O4UTZxG[W B`Mju^ꩧ̴ǐ3lvmgc}#7~z>+u~sĚܧAd>vRʭOs5טG}ԾW7JVE ̑Gi'> {KM P^w/Rw[@@@H3֕ٳgnkj        ."ݵdO_7oE슾JA[@@(a5   % (WEz     (וlU+>   ˖-3\rC=d7nSA,a~)}9묳̔)SFA* 6Y@;zQ6[o&;w? j>]1cLqGqs^^WyU^xo;uLA9vǏo?`^z%ӯ_?[o*o-=z{DŽAOs.?k֬)qa~۰_}?^c9HدB^Pհ(QSO5>͵B}},ʈno+7^+kWB%+c}Lϋ~v燂U.c~VZoDSN"J!Ѝ__:D@@ w SA@@@ pׯO0@@@*@do%~Ko@@PpߢExN8s)H ?5]3sε]ova~f6h~3|^cv0ۨQh?OꫯF]W6mԙ3g {t<3,iZa"#jޚ+ eڿ4i*ry}8+Pz* Uo.p{ٟl/+wŶ݇~hwn&MdDX~lܸq>V5*P9, 7Ҽ/_܏qF?}.vڅe˖pV[Mԩ뮢#FػM6UT1zN.Xoܸ(d6ZyBwmhK\U;$ ֬YmݺuuZܭ~2PAQ1rDO?dD{<Ѐzj|fm/*=J-׿{쑬+U?ӦMaT"k_gZQ+s1ŽWrE@@@gw        @Fi]H={͛'gI Us&k|>O@@L 7U   RwQM.,҇@@@t N[ 0aBinذ@@R$~ްaC#h$taʕ+3u+{^}殻2UV{we*SN5&b\ɝw9rU|AsGM63f~{άZ\pB[Σ4Pai۶QаO)|뮻ӗ(j[=Ʈr-fݺufȐ!έ o ܫW/3~x@>}F+/ u ϣ57ްpe- Wm_|ќvivmf.pu‚g1g}mf=bg7}k _ C0`yEq㵊{iP\+ZE!] xw=W8뽎oĎ3Pbz(.@\(!dfڵ6\uQV0h #    ̞=o~PA@@@@@@@xC߾}}J _}}G1&7  wL!sC@@@ իW=dxC@@@ (d=5k S*v peƍ-  {Gx}H  *mEf~B_~_C1vu[F /9[;찃 [.S);'ؖ-[Ɇo6.dY!:vh^Qޫ d=W_}UnݺeU|MC1s[vmu Vʝw~u_P+Çw"/>}z,,V̥ۼ6W 4v神[TwJ:u\*Xo/:F5/XwZ-Zd?ߛ=X8裏9& W,-r駟okWZe>Siw*ic.Լz=F3gδƿ[ I=zg; gwqƙɓ'۰yLݗ_~i>]AYf=X9RALb>C?^Oq1a㻸RNYwcMVcot裏.ꫯ5/o5ᄏ}'9XJY]_~8]w=Pn]kc?~\~m@;.tNc~~"Dw wǘz[ǒwimǡ;9w˗ʞW5VkgyfۯmGnsZG1yCA@@xh={_OA@@@@@@@ RK,1^xaBңeŋ(|簶Uೞ +^![oݶ>|nm8\awQ|XVZe.lokƌa:2k,Lͫj-[۽kf=(Lϯ{̷QE#G4zb+jղu9Ƽ``7V݆%\t"hv:LnzsAÇzY=-Gקt(ʿBJ$z+((c=;cŪUڱ)Pk1_~y;gǡ;9w|v 򯣹}[ǧ°#O\p9Sι:O>dzB)   p{])       $C@v#weN>dtKi"0oi.fEA@@@ܹo:qD_J^?ʜ@@ p:|PRM6m* ԯ_ߏ_OA?{wP@O?m"H_禛n˶mۚovSO=e.\]ijVw?1_]+`İM6 Wz V~xp 6 lȫ`[^p꯬Dw\uo̴iӌk( ݽz,lzy;ڪ}|\爞:bgǹСݏzNk>k׶޽{u   $G ''vF^(9#@@@@@@@lxwQc?3:g}w}o.% uHx@@.PO#   naد.VVt"A@@@4il@~aQE)    )Sh훾ed^A~ M Vk5k s9dž*$Rgq7\{qz{wF]PN,w7.u6k̷H_ 7nOCǻ^}Fgҏ6 p2SHm/{6W۩zњZtRۏ VCI&= iLuQ+[nuѬ۷oo/nn󘷕*h믍~b}L% vϭ;+t%N ELtQK!i޼9l`qgCK;Dۻ ؽ\z~7:w)V?ъL]wm]wz-ӹ)6^C5rl~pQG]_|ޗСC3<ӆ^q~YyW4=;<3̺`Wӕz* "usÆ CunSvvl agqEz΄A'{*U2x][7nle U`3 m@\ܟBZ3~x灂]Yf`j?Sݺ`W>א%z^yl2@؛o9nK{Rܹs[zHA@@(W5Rv@@@@@@@}^Eץ TA mѢEJBد@@ [<%   W@GsE     "m믿 ǻmek.(q[=Ƌ  M_|B^$`*u!9,:J[6mcךs=V~.n"Ho!ZZWܱ.s+Vp#A.ҭ[7{Wấyκ}Tg}fw+h*{mwmǃWخ{/7.*|o߾"_zI|ӑI{IѣG[Oy;|5Uܭγ W{ nhw-@@@8~W?w\۱DA@@@@@@@ 駟nw7}a80 @@*BZE}"   x+r   %"d} /:*I#wk J1L@@Xf9s|ܝwivis`P+: nnCXK/1cƘ)S:wl~bwnx70V2=[,fR^=WM۲WA]w]\s Cb/hk/Ӯ];oG}Q \dbz>(Cuӽ{wͥ^ץsbY+#4=d]aǏ!b>?ZO>V\ԬY08Z t„ fɒ%fܸqf'NYΕRq癌J3rH/vWW6 Qԅ/nh/e m@f]h4{ws ̝V\ɓ'۠z࿕w1r NUHGW}nUAé.κuօn\ /0֭ oK{屎D]t轋^G\5gG+Y;] 1OP@@@rK6l`WneG       ؼy2d_SO`ܹ~{*KXO@@&P "   5kC\~SA@@@Pد+ywAo]\-Sʼ@@ htݺu3_~ye D td. &I0 4iQСC6lc{_t[+l$쳏_b/+x,eѢE~VZzT{~Q!}aq߾}[oe^|EۤI .0OC_ 8?^.*:tL9X C ٰ}(pc1 UqLƍm+†# {S~:E>?^G!*6l0^퓽@W{XSbFk2F;VjI}]3yd3sLsGI83rn]qcvm"u ױ~xׯ7uc Ҩs+DwL/-0w7\ۄK(w6D۵W?oa:F)   ð߼@@@@@@@R@ߩrE_d ԩR~>s@@L+np@@@*@[,+L   T@ǎ}F&VV   @VZezeܗԮ]O` X> f\]wtn2{lZKC13 L|~VZz:UsQM6/Q*z;%~QZo+N?.kx㍢ c,)M(b}9߅Θ1#qX~}Sfbua 6lX̶i?o㚁$S0\{~uO?|6_.~m yInjJAA}S0D>~…ݬLahhɸ[oe~͓O>i8'npV]9Fe˖,Gaq>}]cQ^i#y8ryEݏǣ;=E=HsnjЂXۆ~'ecYfћn4ou޼y,;Kŝ۵E=@@@ }]qtQ!mY{d8gNvɶ{+UMy.c/sΛo%URu)q_ݺuKfO>d;=z]L>P_:L:ZYw°_ÑeʕE&[s;a„6NBzrI'b~qu׬\9;EӦM]"J@] xݍE:[lA~)S|=*}މ||w]_w#V^/x S 6UWoͫw?*۷ݼ*   i#m@IDAT?Y       d|.rCȪA~*U{idE@$~3d.   i! ]*    @.C{'i077׏pÆ N@@R+{'|^z橧|}H0?J&]T3~m]2c n QV{챦cǎv~w>sA~ ӨR4]wt6S2â?vygӵkpuu^{~qn>?Gum|r3f̘xw_a=\oOwWj)hZE#Y޽{G}^ǿG 7Tw;4hQxn|Q]`#Z?x_`Ѱ\2|3tpU;YnݺU-^d#G4w-q.P0{U^' K'VSÆ }h#/ }(wј~)]^ is=g<چWRԯ_ntM6PWw[qƶY4Ow=߅s{M'Md\QaIqX|{oSfM;~ (rpk=)   jש        PȨQnzksgw쯒̙3Ǐe˖J1/  $@o&=@@@ -܅4. e    .WsNˁaPM@@ ~ ]"ȞJ5j{[lSn7x(K>}Q`#R|=ի- 'P,}٘?Ǐ/v{1.i_nVsꩧڹL={Ƴ(.+춫V*O?ko\;hԫW/Dh (c9v{6-Zm^ Y+ U˳mY;e9߅sбn-G\{joSy깨>~:WN0s91޽{1wy]s^Kg~.еP@@@/~_zuӼy@@@@@@@Fࡇ23HZfL@:{@@(@m    )PF (.C@@@*@Kgb\qA>   .]qS3"zVL*Xw}GJ*6? Vxiqs-nݻ -V*WA[IM]wUƯp" ʰ@a x, ;묳b>`Ji[~bS _yȐ5m 9/wQ T.(q\E;*VQ@BV%uuw9aa=r_q5j۷ ^ (0.2 ?6a?a=^uÇXuۇ.\hFv U֭0gΜi~רMqZ.+YJ ;S ;\s,hAu|٦<4hETb1Yw~m :1[mhJ.lkL%wۻmܺhzMoL^lڸ_K  u}G-svZpYNf 'ָ\х-[W^yu=_x2eKm0}e pyzd?߾ׇ? l Bˋ*K^z?ѢE \*^ǁ{{hv}|8;lmq*nD;e=߹1_2]tw]ЯwVr:XŭW@x]Яv@_^+8h: 6$\uA:nӦM͹   P]Dw@@@@@@@T駟6if?L?sG:y   E gJe,D@@@2B~Æ  f    ^첋駟W^/8^L|4%q;D@@͛gvuWPTy(Idj3Ϙ3}yw&}@@@@@ fvz[dnu駟nƌc;ϩ!CA>?ӧZ@@Hw>   @ z[~}u    @"غ.p EIf.PPPPf{   @(G;V`ʩJoPr~˗//ǒ4 \_x 9Fu*P7J (C܍vPXn ooonݺfwDבr ԍR@m('Eغcc=-s"d-2UqwWgϞY"  TP@ӺUM|        x7|o޽3Pɴ)_P۵kUѵ\ ?[q  ]F@@@-K    @f"i&++wƍN@@VF۷oo|[C [l)ٳg}$۲ejDt . 誫*}E xɀ'!7)4 @@@*^0l@@@@@@@x:+/hdggW;DaaC ?   KnZ@@@ L"    @ao~~9X*}ԫWw_OA@@*:u6ez4k֬J&@o4M6 6$<͛7', "IׯOX1I%xU7Ug͖@@@(Mt       >|vU9ÓZ֑EEEf޼yv۷OO$G@@ q~cI@@@ a֭چ    @Y{챇oR ~ 2eX@@PgCsAMhf hpҥN жm[裏&}F{1[TH5~-]4պG@@@@@@@F|6      '|,[̎SO5ڵ!#glӺux6aoo   PO2CD@@Z~֛!   v˗/7ý0欬,?7:@@H @vZ~N8!b$Qe˖~mK,u*       a       )PXXhF7q:$֡CUVJN!  NӳE_@@@B ]n]ZN"   @ zWի@د  @ 0L2ŮK.žXZ)d$AUV~-z *       ha;v@@@@@@@f֬Yv]~mݒ^VK.5k֬ԩS (eBG@@~3Yd    )%PNj֯_R}3    ~t6?  @* 7Ό5v1;;ۼ FR] ^)       ۡC7{@@@@@@@*$0l0u]Tܹs=Dǎ}=*jJ@@RnZN#    4!5֭K=@@@Huż<_OJVV† |   $O`+9rڵLT~,Y]oIP@iӒFV 1EEEaĉfժU1@Z`֬YUI  d@:u~uŦ@@@@@@@D&L`ܵk/s'`T GEo @@2j6   P I:cE@@@r:ud7on~7_9j*   $BsgK54KY /вeK~=EWcd U/^6Q@@@@@ "~۷oo¿=       @u }~7pSA aF@@2SvfQ!   P U!z   @ء̟?,Z(#DZa_  P`~hW?Y1kAZjB*       P"~;vX=<       @rk3qDΝ;?Y1k(9sg|jժT@@@ 1-R    P ]~}i͘   %?o8∸KF+((u*   Pq? <خH8~L+bր@ nomѢEN%kve#BVġj{jG@ @׮]Mf   @a:tc)        Pw 0Ԯ]?;wT   I 7)@@@.wݺug@@@H@ ''/ac"SPA@@9ͦM d<  P-Z0uֵ… zl uft  PY]t1Q@@@@@ sİjPG@@@@@@HD`ƌ^m֜}ىejY(   d@B@@@z\ Laaav#   @ 1zWAe   (**2s;w]Y=7\AVZuv˄V&@@@@@@Ha~Sɡk       @ >_K+4Hi:]g϶kfmLک jS@@@bu+8K#   @4 ׯ7 6    ܹiԨYf+)۾~Rt @@41b7nqV?oԩF#hӦ?Yxrt*}ٵxOyT}}Y" PB`w5駟6Æ +ц  TgmG@@R 2cǎi9:       >ҬY3ӯ_H9}yն_   @ -#C@@Flu5    @" 3R0nfϞmV\i6mȪRj,۟ 6T   (n&Zjgyl8Pد͛ҥKM֭<*#pB3mڴ#AH &M~,[A@ @@@ 1z[C@@@@@@@5vƍgq YfnN@@2O{N   @ D@   @NN -**2W^i>"cׯo>b  TN9i&ۃ?zfH DolSuM52uI/@4K>RD@ 7o6k֬IZY   P"׾}@@@@@@@"b Cu5h\qIY/+L~3yeT  D 7 @@@@~ @@@@crss=Cfee1Z*  [ȜuY_ %Y`„ fKZY @MUVFm[ @*/{   @F Ϡj͛772@@@@@@@Dxj*ygrDV25D ~uWTi#  @j9@@@@ 0wݺu,B@@@@T??//ӹ.aÆt}G@@Zno>苣cƌ1uԩ>q%.\0Ye=       [n棡       %kGw}v_^[]]ai"aiBH7@@H~橢   $]6N_@@@@ Etb\8n~~~|ݪ_]| @@I̠Alv3a8*L@?&G@@@@@@ yز+ZrU@@@@@@@(c=f/^l۷vm˵|m^V-s7ƻ(j mٲiܸq `  da3B@@@j[ 0'RA@@@ɱK)K` ՇދRs@@(,,4gy?e޽͠ARt M̍@@@@@@t5k!6oש        3`SUԩSJvm7ӨQ0Ŗ4i_JJm~KLg   T+?:@@@@@@@:tovM7:JT   0 "   [ ;;\vSA@@@*" wL>^H}ӦMnaÆа,  /n:s 'wO<\{?n@vlد֬Yqab< 1KԮ]haLnniҤI8X&xзo_뮻F|roo|fզ}fw7snrnwu}ӌ7?#m3^x?|wAj( .yw<(Ε~9ձV;0⋣nҝ[jժel"y䑨DNlٲ+"' ,0<cSNqX;I.MMy*nټysmucǎŦ qg~E?4zL5Q7.^ve!    +;?@@@@@@@xz-3e\];]v5\`̙^@uKQ@@@ y{&@@@.аaCN]t   $K ''׿b$k{0W   @l~/*0 sHb޼ys1%0rHXE7p W^f 8qb&h?o?s[L|M_T}^*_>vՊƌcTQq>[n!5sO'6PQnN>ݏ/3<ɓ'Awߙ^z~6YaQ貳C= >܆2>?~{hCk/X_|яUoa U%K(l304]eW /І|:>a TxBUâGSN9<3K~i1?T˫>h o+7^+nWϿB%*W ~QZد.U@ )ߗ_~غM7dcҤIF1@:Dβ=W&zN(|Z{lܸMcǎ54 T; sdh<yj`E?}?RR@>zjl@@@H  |5%:      ]wPWয়~Mwa_  )@of> @@@tAEW֮]#   PدZT$-x4hoiÆ N@@ k _QX@@iִg"  T _v#   @2rssjg[Ņ߄4۳G@@J૯2W^yOS^{5—u(|j/:d3h w}gŠڅ/So&OloTK6lԅ2+,O>47xNWh•5-2qfM^0v4x`se>O?9sl4_tEڇ4gyNR?O゗,X`gH=ká :xZŻToRf"E! VQƍspBӦMRWQGe6olf͚env{Z#z~\:SǷWHIYkK W;JjczvZT'mU&lG ce    3@IDATu       @)~+7xq'sӸG il;  @ "4    @*dggnBr@@@@ Y999~U~_>@@@T%KN:(dRꫯ6'|rn#jڵ]R@%H,{~K쬢rF/'|҆j_^"W:~xӭ[7=E!Z>/֨6 w+Uڷoo$oه+V]Zwh Bn۶Q0_~W_tO+o m>m}ܸqv-W .W@UW*cǎ5 NU"cK2o zfRVE:G){mذƻ+8qcnDЯ/R=֢G}d]@yqs}dHeZ~Μ9v}:ҭ0j*lڝòe|]vXYQ?\sB'N/NܹsM6/|6,ψD}?4 NfVy=ωӧjq- SN5&L0}ѹ/KUw-Zd{|&\GfذaI C zkI~=(vPd[?Ԯ߯ma} gUksϵmdeww!zUVMXl.,D(N;9 e P'l ~ ~)i* M#7uR@g*_|wGhdoöygիgC8c/>KUwzf͌BͷrKY7}ӟd7on=z?~yWPҎCҴiSW{]aÆ[o H3Adkٮ ck% W_\Zw}m▶NS8ۉ'XT53fvŮOъ[VovW\a;G{kR{^Ez.3㏷Q֥~tr!vz^k`۟tIM6Fuhʔ)uf7}>#C+sgvZNSB[lioY T>lrrA㣎:/ּشqvlrcG+&Mu뭷Zw>W:n{o{u]C֟;:tNӾGWNNiժuT|dQ;i닎%ҹrĈ{qD+5\csų:_~ٶ{LIw(@@@*E wkVvX)       @f y~@_w(+~Ja@@|^5&@@@R]$$G@@@d * '矓*_O6]Ϥ  @ 馛ĉ۶mk^z%Sn(ka5} s%~̞=ۮz}1;L S'|b -SXXh>C;MAt:t(6:\wuB6m2Ç̝;oCakJ8=lm䴲6=/z ;.ru%+o)q<Ȣp>&Egi'=_ gYO'2S ߺE*dم^+(<ϥsmn=mڴJ>q=o[wx{UW^mBYتpWʲ˗/A U^{:?)xXAaQȸ?o& VNYŋ)}XB'ڷ+wWBf-}KFS_pުUl B|?Xŭ_a7|]׬Y5Ȝ9s42{ W^}U{p܇z5/y}HVZ&;; 4C{q}}XK.-9/;:Lw{=k?={4O>d)[s4x`޻hѢbtPyd>p`90Y)^{Ov+quwy{"O~i}{=X3~x{, ])Pw+,&hDCw'r@F_GgSaؑ Y]t9̙3cޡQ^dzB)   /5)       &ϓ*ڵ3g}vi͙@ }ܕvUG@@  7\   P}V=[F@@@&azU܅ 6[/  &/{Ǯ_3cǎ5[nem#[m R(oP(+]vuը TXl;w.6/}J_[Dq}]`m5zO klom_O ~~UcƌNۇm+ZrzlUQ}Wbu –nIꧻ:E VkԩSvOnwnkѶkg?taÆgUmq6-[Ul&Nh\999 @S!w}W}K/[ۗ`swpOl}C7'jo3 Vٷo_3b_-r)Dk^lҥK}{Ī ͔)S#4VwQ+yѬwqGȱcǚGyl->A(dUadgg aP۷;0U+e-8?+e{*BRu9{ Q Su/ꪫfoTP {lع[`w WMߠA|҆E{iCus$,/} Mfms/[ ./L.XAaKƍuc/͚53|uBn;]= \:K+ VxpxTg郬zУGp-Z0W\qZg֬Yn{@\`l7S!z~1C35]<9m(kfMJUw\91 o*͛77?.8ꫯ}מu|=گ&ayn-bo?/^1EzoҾ}{hs믿:)v@@@HH߄X@@@@@@./lǯ\tE5ւ'.E@@|ڙ?DF   @ ԯ__T-_-"   @& D7WCA@@ (O_ vj㯹 RQh͛k.#s̱am lkҤ}ݍU(6i$g'F]v%M|a_VZz=ø}Xaqa HY)Qڵ Tg0XnVyVLʊ+\ؽ"o(PAl YS`9`b.McU@*9昰IMaaY 7.U=1g) eRoldESsFh.kyM$~uС]Cy뭷nzx. q˕\.qpҁozWXift>yTi]!_~ym Us}YgهH̲e,{pLN=@^["ga')lO?-6[?v w\B8͛ΪP].VEk^k;< 27xZHV;i.Twʕn{HdЯk`ݻۇ[AAUݾ .}{mwmK4.Wh+Ƞ_V wskS]UuiԨwtnݺT8qw?u&rpU_\8Wi| WrA2 vg}΢   P aWJ@@@@@@@L뮻pbߟʔ12palz۶m+l@@]n     f͚ !B@@@h׮ptt-aƆ u@@lڴ(`GE<@RJHw}76Wf|6ݟBzXڒ\W6nz\n:7\}1>蠃l8ƣ6;UP9|G~ R ͌\W:Y}mNs>|a!CDkS 7W c..Y|fW7n%s,p dtW޼?7˗/k8|smEY{N::OHy:oze\Bh;0\sꩧ@͛7^xX1c*\(Yװ; yV)o|Ⱥ}KFվcNqzxnvĭHE}lpBj,X`{^]{p\7*uNl`w~N;sms%&}C3b:O>Cf̙F^^}oWC0*;Bŋ`z#za{2_ݰ6Zs=ԩS[{O>#8Lܡ.z묎sk ώV];]1OP_@@@r o`[6_XXx˭       @}-[}ׇ@yyٳgŶ~.N{@@HSio   @ GLNA@@@Hieiu~˄z *  5T@f.(n2 3PPد+r_Ceq۰al(ؽ{w@d;)1X}GgAg}!b{u}Uо+VDUCa/ T 袋lr6Zo߾~)*z{=;[v ^G 3GY݉Zu=GYGUMWx+:~{wLj~ε/ʪ]x+kxW8b-l0 3ֹNy? 3*ҲWXM!' CJ'x!22vXϨ_|QUnPT+[% $O6m6X}w6?rZ; 6MzXt,x+qoK$+Cy.\X8v. }X^{pd҅]QT-*zGiCUnzm5kfyEνs/jpa]}Coh88{饗\` /mX°_oܮ{w~Wz#  $G`޼yoճ+MSւ       CgꪫLFR[!7^roZWDA@@ [1?F@@@ [xq   S 77/c /`mq@@ .ڵk#8<.uٲeG!qal0D3lQ>/0-ZMt!C)N>}Z8q@T y ~z~ap;apzY!C.b G627û[](@@@߻        @O͚53]vYd#;)w~>\u!  &ѿE&   a7@@@_ ''"]~4hǠ   5Q૯2CWѾSAS,)x768C:؇If(¦]&ӳgO?ufZl醒|Q?U$dPӧGm?a{?1Je3wq vmQZ$Wn.疬%'ƘR1VQ 5k !\4ib¿Ech"Gkbgisi+>fϾmL7n 2Æ 3=9#L׮]MNmժUYeuvgqF;/## T N;Tfc   P}V=[F@@p%kfH   T@&֯_ӕvp߈   &`@.ye??Fp@׊5 ovSΤu^z\*_OhGu]nڴi~0yyyJp!𳧟~:[vaZ ?FmmE]d~{;Ka:(O* t966mVB#˷~k,Yb'\~z*CUֵ_PI{[ow7*:|gYΝMw沖aHSTEz4o܇O81†9^{8WhJ޽}طPCs7DU6`N<[b%GguEiN˖-+nvk[Q9':l%W_kBӦMSz*U*rމ6N2Ǐ7zmAϜ93Zs;-???NۇmUW!C+Ww*;'PA@@r0WS;RoU@@@@@@@b ̟?d*76W^ye̶@, ?c^r9}G:@@Hw~   )+аaC۷͛7slg   .~֧0:poGv2vuW{+VAa5k줝w~R 6l7`7zzs+̤I]};{1_wG}U\UnF;[gdIWqT0K._ԪUv)l_Z\x& Iw~b%UJ;ߌ9(L2V CuHv.6:CjF;>5S?sX^UV\i `/^lA `T*2VO<`Rak֬Ƣ & T\p(s;ɽVw_gngԚچ׮]۸O>u uh]-ZͣǻlWNiѣ{'{ά_>b̔)Se݋ͫ㰴ަAcС%n]py   e /tki       Pc ?4o޼ƌ&_ F*%_5"  P3;F@@FYש    Їjw}wٳgG Hv*sFi׮>n@@K@m_||رc,lvHTm۶P h k,)+VQ3<6ybo0w/d+W_5 .4V2 袋Ln̏?XlY`7 6Sy[omrrrl=?HQ*o8>E@ײ&:Ϸ*Mu>s駟`߸v9ct.Qy'MPmx PaʑGg T|c@goۂV[i:n&/y; ?>"q)07)PUE` m8eFEǍtSѾxs_ve& մ({챇#̇~hm]nZ+*ӦMNj,Yb#ؙ?*|PWyjʥ^Qof{>|ꫯM|W*|w6k,UEK;C˳;6{@0aQxnEy̶֙9U˖-_l+P΋/hخnt%fu,ۢEl~轁+]w</GyW|9sszAΫwys^K^~쬳2z/    @ ﭮ$G@@@@@@~a 0ϰ#@Nb9@@HUz   @z D@@@@  хUM䅧XWjS3T@@d<v+6Qe.PvmӮ];3gS0Faw +]x tUi;TK.Ćb^{͆ŝxGu1coI7,6}~GazVQX+Қ%< //Q@_u)HN-YYY V]wUUh|uݻwnơ+qܸqsO<+zꩧn|6=Sym.=3ƄsG 7`b[ɴ1ko 1?~ѭ6mژ{(U`d񛗗gC?~rwm]ϕB5 b]Z|e+ݼhюÇz7UcUa=ztJ_ C>O!zMҭEfڵ6ՍǺ> [o7q*ۅ薶YW+ Vjew=8 믿6{g8yPa};찃FlgϞu߷|unzλufZ#-PzO^XO>FێV"( Wu*76Æ 3:W5PnゟU1}pWY 曕o&#^y۩S٦A30 UἊo8VWw}:k6nXwKWX/h.r~̫jyvzFu)Q'46m1؉p[… m࢚)NA6]ٳO?iDm.] |{)sMXkea~NRR:˭Gk橏⦻eݻ)וx~][\v֭k*l]+Uf:t|8/\i<-[fvqG>*P[ k|em_AӦM3't T{ \=E[ifLbIҥK}`^ZἊ>u흱wQUy {齊DD]QPT]E, XuQ#WQD,{ ] PM2 d&|5̙{=T&s7g[o{u=}>Gؠ_W^hѢ,h~/̶r^{y۩l0h 썋_ҽ{w*K}XB dYuc>]gx3r_m5ZSñcsZj&]X>]V5|W?OT^4 o6-6+<ԫWO,Ybk֬YlpY+M}^Ҁ_-(sN >c߿V3g\`P%[3uj~&ӱmu6W{5WC58}~c&$\ϱÇ˹瞛~sn#  P !!9x'֥        w^y #@֮]ߍS@@@Do)8e   䝀 mҤIf .'#̻'@@@T= [n۶͝o6' 0X@@r(J]t Mnj#?x{9So{L^KPI =Ѻ~PF پ}{A?C2a\C(/ mBqAbb,^X4N4LSC(C]V^-6l:uH&M2 !  n/pZڴi 3O ՠ;vQ DԝٰQ s_&/ 25[nNWnqF,u4l9=f͚5uV)]hA M8>4U?c %p=iIkh˖-]mt9^ zVZUZj%@şܥS]?Mڵ M6c jg={˗7ԀxjӺuLQ?sٲe3dF߳V\i*Vh<)`oߣ/R @@( r+C2rH3ٳgKn D@@@@@@L`ذaϛՙ^7mY/=W>}̪_|Q|A_Bb駟6ccǎ!1.  @ Ą7   .PD 7dW   J@O'&?q<'66KC (  D޽{sA06zH2sC tdk5/ 1ꪫk_ B i PаDht$iܸ3 ՀRP#a[6!j^±-^ws%7J*ҵkwC 4>rwIpk( ~cC@@D 5|nN@@@@@@@ ߍ'Md&^hQ6lXC`AXv{\ծ];(S@@M~C~aT    =zḧ)    @( hد-Na111  ދ\# Dw5*^ ^zM t~NBD@#z-GSlYeC"I{:5f͚!N߄ӽXCYPw   @$ l۶MK~K,n8pթ       < &ȑ#G'5j(x8~zozPBG ;rݝ9sթ   V   U|4@@@@HOMb$))IRRRs@@̞=[}Qӷ7uTi۶mPED[Gz`͛#}̯ M,e]&z oo| N:… WӦMsF{@@@HHHp'MLLt       ,ĉͤ).X 6zLM׍5 .'a3@@_   I -   hٲDGGKjjǧY7bccMca@@l ,[Lze>FOlfٷo_3XreӦM]=+@@Qp3   @X(Q_GA@@@$кukd˖-AK~  @/^,={T#Gw=SrRdI37Lf      @HHHp,?pm       D@bbfE#FDdY ZI&~Cal  (f   @tt/^\=*=@@@o m&/k ƺq;vթ   ۶mnݺIrr>0tƈ@ ԩSG-[&[n5!yJ̞=[?G̘  @~ 9sᅲ#GT@kM6.    ݻwoD̕I       d-/C'qqqYoZXr۪iӦ~Cal  (@o8k@@@ lJ(a~ɽf @@@N@~mѰݻۛ!}]X17W  @ >|XZٵk%\"x 90>Q8qBo.j i0Lƍ# ࿀3o!z     @x ذ"EHժUTwvu*       )('N4ӿ!1"2'ʬ]`ժUf  x3qTgΜ&A@@,X*@@@ȥ@ɒ%MIII@@@@҇f:tƺ(  ɓ'o˗֯__fΜ)E 3<_nݺn7ntu*       6f͚=1mjܤwT@@@@@@@"S^#Gu]G h ]zN:RX@"tbv  Pb "   &@oѳc@@@ @ڵlٲrA{~=6f  [7 *_|!zMA x~ׯ_/:tNCPniҤIPA Ornҝ:u6@BEYf2Ɓ  @RR8pVZiJon       -o>8qcѢEe=_&[nd3M@rhEjjSA@@ύ@@@Ȗ MII]F    @Zj%?رC+*UߡP@@u{LNjYX15kԫW/ԇ ]թ@E/@%'jˁ~@@@@W7aիWwvT@@@@@@@"O矗$3[j֬ydF!!|r7p:.)**ʍ̙3N@@o3B@@@ذ_Vrrrv6     @֭ݶK,qP/^ _GA@@ D^uyg袣eڴirh) ]n]dNY!      ŹZ)Sƚe       Q{I&9+VLQc2%l27͛zW {! @L "   NJr=rxoT@@@@ x~SN9x=3  9s 42qD޽MFf͚RxqH~<{?~ #0-[ʴi̬{=y E>}Ȱaa@@Wm۶תUmZji&!׊p      D>O4`ѿS]-ZpPDGG!:@@O_ @@@l ,YҵKJJru*    @0҇c@@̟?_z%Ç˽r&%חK͛ԩSsZw-V A1@(]yqT@BI@?DA@@8@BBkUد~xq)ZkO@@@@@@@ v)'O6)^ 6,' BZ`ٲef|=9\m˙3glk@@S f   dGTRّ#G\      FIbرc]O-Z @@BI`ڵr׋zm3<JCd,8 ߓ'Op:HY9p%PB9܊ )p?oJ…}a y#piINNΛ@@@ B[fM7m۶Izm*       /0n8sN%J*?)fǏu֙5iDbb'+::ڹ(   @o)!   'PdI$W   C@ܼysY`_ޜ$ZCrBh-6<@@ؽ{tEoҩS'2eJ~#P6l `Y~GW[ ~L@ 2ܻwߕ[n%C  W++l  #pZj(       !}vy뭷\\Cy1Xj>} E;P#GEد !  C9   @TR#G\     ,֭[SSSeҥM-^ѣN@@пuUlbg̘!  @ ڵk]       D -W艛ӗ8H~)       #Ö́~XbLeܸ7oP9(   ;~s   d)=h8)))˶D@@@!`~@t>bcc])))N@@8ytM3uڵ/RJ77wݺu       @ 9sFonfWV-$' @@@@@@@غuL2̣tC@ ,_ E?7@@ȝs[#   ɾ9@@@@ XOzC@(xz.~| 䫯U< f@ 4lЍ_GA@@@@@@ؽ{8q̋߈{       SO=%'O4mx)_|Y@ -[ ߨ(7v~@@ o:6D@@@%Kt\     ,͛KBLK, no]_Guu*  efg7X4~@OeJJ~t      @ $$$)Ź        ^6lSAqC 0ڰaz,s*Ujް԰;E@@  {1!  D@R\9T@@@@` hxn L+VSNkWWlIIIU@@zJ&Nh#\tE2vY رCnZ@@@@@@Km۶q{C}VY-7o6       cƌqNzE)[`޽g-Z{w?:(3g:D@@ ͜"   2@@@@ [6ˎ?.Vʰ>JcA@ ɓe!**JL"ݺu+(hԨի]       D@BBLfas5l"֑QA@@@@@@R@ϙ4}t3+r :-[an.T@@@?6c+@@@ȎaQ    Z@~MfPp=T@@KO>Dv /H>}m* zM6uZrkݦ  @$ ȏ?hRJHL_d{@@@G aucd׮]Rzuv6       ! ㏋ *}Gdɒ!0*P,YrLWvKs-  9 7dl   @J.>|թ    hժ^<|ۡVuCғS@@k?r뭷9a?ȡ@&MVru*M`ݺuoڵkeӦMRD Y)^{l2CSN 6dXk-"͛77xC9b+WN竹,_\kK/ۛ?,_}&&&F$ 642eʸu]Nϟ/:pA37}<_uUҹsgKw1 rС4c%MM6-Z$3g4]}r%{ٳgE\s\tEG@ o[_u}=D/͘.\(IIIg^';uaN>3>ϵ{rml H ;!    mټy~.@@@@@@@ <|I3f0V{1pFnx!^!7   v]ƀ@@@I@Oi=5    ,֭[?v CBo @( ,0D'N0뮻dܸqP)#~M6u&QPB̙3裏K/$'OO>{̼h;oP= NiР 0T UEn۶'yG1cƸ߹sfڥK(0]3?*׿ҌC1bD=}w3Ϙ};paGڗ-&4@ٖ!Yjx)Ș6WoL>]>3e:+S7Pݻ֭[l˵o}/5KұcGٹsy9գ=   /`~ *侳5knٖM6_lor       Fz<Ee(PTH"=9\CoS@@ \ {q"  aay1h@@@^B 'dɒOTT+Vi=z4@@"K`͚5ҵkWIJJ20ɓ'G$ ,PfM)]>|XV\3ejxE/Z4XS6l(իW?,Ǐ7Y~}32+h3|:s=׌y.f͚ɤIn;k6H g?ժU IN_6n(O6}QFMm#>RJDThÚ[С,]|keٲeҢE _ϺLCSmЯ6's c}֞®DZ~7El/^<ܾ5|n%J^~dkuCW)STR*vڙ}_/۷o7_Ν{Ȇ L>Uw>a5Yu_>l0s n^xMȸיES}ڢ!S}~ؒY>׿kѓR4Zv}ĉ,}ڱq!Pn]9sl~v[Yv ݎv    P0lد]@sͬSlѰ_        @ ojic_#[=JqТT|VǢ1e@@ȝack@@@Гd)RĜPO0LA@@@Ju&СC'-SN^:0cǎ a9c@@?4@HC4MW\!ӧO~@ M4_Un* n: 7F2#׀ѹs ;w ԰׬ʪU$&&b|&TqYusĉMh|r߿yӠ@^4A'O]v-UV .zI_5jdZ{|6n{;V\bW,X`Y Ny*ƍ3'<]5kim z]>TRf͚ ~GҳgO|̘12hР m z{rJ)_E{|AJ}>_~u|E6<g}6g> ՠʗ_~9;f=ȢE\k#~uyEC7^Т18Ր _ϛ?nsof~Mmu? A cѿ߿?c稾s.!!!yQkNd4">|3g޽;1FJ t͛gSNԒd[C l@@@0~'sߺu=au`v @@@@@@@+0w\o"w]M ǻ}xAvB#f  a}0:@@@a0@@@VZzDPDf4НP@@8t\}ղzj3C * ҥKG茙-`~u+W2\ h`-eʔ<'6mlٲ% 8p+WΝ;ү@[lYLZJ.z\\4jLO s;p&OdsZ4dP/Ztb.Z߱c,^X!Sl~peŊ.k׮&H7}m. z׹sgHݼE?ڱzC}m:PFyI?dG믿;τk8>D+*Uvڙ f֏_QةS'9sB kLO*TxqsѠqrWm{!>ׅ&M24`C^sPi癬ߤwRre]\|ŢVTXQ  2j(gfs|f֭[ wm:x   $Gġ8=9NpfL  %pQр:WfMoLQẍ́"hڴʪU\ W}ǮWCJBԩS2~VO@-o'Ot!W^y 2-NQV-[M{OongzٮQŖYfjH\۰_w}aLe޶@e˖ឳUV+ ԰H-?ST3gY߼ys` ʁdͦ+ lذa E૯2[hɒ%M̙3pB7o[hm-䣏>$H":11Q>FNII11cƈٳ'M32p4G}T $->LM%f 2lڲn:Zk6LNjBY_|Ey饗7 Q4k̴WlذA4Q"C\vea~{4CeZ44SNiyoh;UfEk:tluwyzj;j^-[6Gz̟~ۿ݂Vv*7A\~n4Aj@H rm Xqƹ։'}\\y0^{M+G{#;w4a;x`5kȽ+? 馛2}/nݺCz! `g}6g}?~\z饢a6|gpߔxF}ǎ+Es/=>S2|pחIm7t˵b, -۷7YQ߻mfBx {ի{O>}ϑmnj+c@箏W    )Ӱ_nSOeڵRr?;       #Gtc㩼n(piY|كߧхcr&QPA@@o~cC@@@'Ptiȑ#&d-   QUV;v쐽{ > ձ=zTJ*dL  a*Ar=zo@4aÆa:#VVZ+W\#A@I&ə3gdʔ)梁w7_/(2t l_f}j[ p? X {mR梢!ذΝ;譆/mRGA/:={U "YP'> `ȳ}h;.] ʥK޷ hѢrWk~g7Zyw|̊*W%We˖-rwHLLhW\!z4o裀j7lY_:dž.=z ۵mV}{}۶meѢE&Y_'>HհyoXh>/nҤհry7   @ضmmlE~myj        @h ̘1V[GqZZ`͚5iiݺu^>`ǶQ@@@ wѹۜ@@@@lW>|lY   LJ(S@@vw@&S?{~ҪU@~@ 4tM'&%%h}( ˢVji8kϞ=Esx *k}iKV͚53ڱ}8p }dwEJ\S\Tlدמ<_'Kۅb7A_~Rpą!|=zM60B {G>jW^y%˶vaٳm󐸶Ǐy1Zl2]E}=zw?h-]ޯ\Cz_Ǭҋ:lR&Olvqܹsӄ=}U wچjE]f]nnx_G/П} 4`ĉ\,ס!CdhSLr=3}uA7{ǎv3gPߎ;Yoxa\rYgϞYz }llsv׻wotiunڵf}^̵/ҝGܽAvYyջ:   Qݭ~wҨQ#dժUN@@@@@@@ 4RSSenpcǎ-;{ޮGn=Fӹ@@(1^@@@,'w_+5   䅀GcΝ;nsŋm4   @(|Nrf͚%^xa MF ^|9OBu111?2m4ehadΝOd:e˖O1by/@^{MFO7n(Jrs[9j@o謽h"ٻw/rvOn#_8qu]VY]s5a~zj8pfA~vClEꪫbС ԀJm3h .+]vuCY Օg 0`y>\KO?$ ]b Zm۶rJ\zY[o% ,ݙ>;&YP!gaɒ%f)))O%C6[@_a5.vel_w-5k41~~AI*UܲHck}0*C{]vkAZנ"Eh5lۢyF_O3om]OvGɥ^jW]݆ `]֭[7*    /˕+EiӦ~KA@@@@@@m?PVZey%B{Č.R/^=o[&oدBA@@ DnsF@@@ xO=ٶc=    [VZ.,YV!7ƃ D>*2jەW^c 4 r p6˛ٳgڟYz6{d֭v +gߋ^y`ܔ={9WmEHmj؟zo;>~Dži a߿ \4Y̶oƬpGu.Z / CeM/Q^n]iذa+;;PF o |7Zjf}ѣMTX fyE ӗכEl{ҷ6   dضmYXV+},Z߂E       @ O@@@[pkf   @ +f'gRD 74IB*  P@05-2uTs @ Zhᆹl2Wv@IDAT@v=BM&7xDΝjc`/o_}؍"3axHnݺI=L/"*T0C 1>k o@Y-/ ew ,HEOZW_"ߖِ%K>5~3mpܱjj_o]=PRJǕ>jW Բnݺ4'$IO}i\Pe}ҥY $k| _|ƚai(SƏfv׮]eÆ g\s5no%**{3˺W|0Jrrp \O梡_~ $߼y{ul|ATƎk^tloIy2 rݻi^e`v>g5U@@@!?ߔh{QӦM͊۷ˡC|7b)       @ L2E6mdѹsg}L ` oj׮-+V [1(X G@@ swL!    *ް_ {q    P0bbbyfׯw!6ŋ!)  F`ĉ2rH믿.zr @d x~.]Yc6y*(*;vۛ_|Epa !ܹS.\.֬Yc8 խ[Wz)3r',l1 '2+flU9ia ,ALZ 6(]6a֭nAu:n8UkW)Y\~f :FhX=|X@^ YW͛g[?_[ƌ&J*by ]+fjժRH*w8fϞm~{N f͚F/G~!X6ydٲe|թ    y!кukmy~=,@@ B|MF)\hD9sfz_hѢ??KǸ6lH38}Oբ9 ͋%u(~ǣ'妛nUw ,pVא]v[!ZRRRܲhرceƌn˖-suoE:O?d i-W]uT\c[믿N    C߰f͚uT@@@@@@@4iܹӌ{ryL;?N>]Hf  @@@@D^k%F@@@hժՒ%K\=*b aVk@@ =Z~vC{C-[Q9rD6m3`Ѐ &HV;xCw7o!i@=Ѽ?hwƨ6$- {+p0`h0o{?wқСC5gxncYp A3[]msf'jE~+ 2ydQ̊o-ZH"E2k{欟c3 ȑ#ExGa˘1cIS2{{7F 4H;reU9eW=aoaI< /rskڵ2|1SNM,P7ʖ->G75ΤRNWne ;^zu5c]vZ?6#p-GyDs.77ӹsgSOetrԩt[s@@@)m678W?[wsY       ;=g5qJk )=,~:6"?7  $Ne   ax1f@@@"Gun2Jŋ$'':@@+0m4ׯ 6l<ݜv ;k,3 A[nψZ`C<ҡCiܸ,YR6l / T\p>B eQFAqY 0جϛ7Oe!3gΔ'N&r-~ד3Xb_~$$$dXnCϞ=msrȻo]l;#=w7( 645Kiofk_ݬm:vYl/`BoH7QComȡvح[7)WϾZӄ WxlڣGeóT7 V<{raodĈ}-_2-c ~X>9n8`^zҠAYny5j`ާ`ϵPޢ7py_ՀK.D^x袋D|ro-s}=U<!jժ=FY~N/M+W,M6MӍc|˖-޽{eRBM}_}mR~}ϡ?ypSL= ~h u2M@@@ o —~ϩ+w-b       m^zemD7h۶mXx%7J  "0@@@"WkOef    j-Zp'VՓy~=j@@ I>}L8Us}5C@ mYtt4 jatFY;3瞳F7zhٸqc>/ccǚ֧Ɵ|zqiVڠK.&W?s@K(m @@GvL'O3<#{ϣ>ņjʻi 5y+YύM6NՐA믿J41`K׮]m5k}%ҩSj^zkHfV1f !}ꩧ?0ᢺ_ahdVELcN~s-<"]د@`}N&pnd:lx[梯UabzO`cccM7l9 տ_MدJƍek`6mژp\}5ֆrWi6歡7}Ӌofn2ۮwi[~wmu;Hھ_kh%\bo޼Y֯_mnx^{.z /tf͚vJNf}gu/ʖ-yzj9sLkJnl~m]675W_|TU@MPH& Eb[R,kW "]WWA]{*݂ EP 5 q&LBf2-3 sSS̽zKuZ/OEWRELb\4h5RMR~uG@4UZ$7ntAː!C|v+Vo'Ҳe] }\z>l NcZ_lX.ն.{񫯾jw MMM7xC8 D\y3n;mqg5UW]es-^74!v<۷owAz:Ԅ {?}·l]gΜiQ-l~/e@@@xXn~QϾllYjMX       1cȎ;Lσ F`t_z<_KZQFk0ѕ0l@@".PG| @@@Гկ_POzol   D~ĉfh_}j*K߾}͘.;j| @@ :4H4MˠAg=/K@_jUѓuݫW/(mZZׯ?`7x?,[oxao&aQ^=9ꨣ\k B 駟s۶m! 0KÎ!mݺU,YbNZQn]B=/{:]x?F@@bQ@ѿ-ծ][6mG%#G4_tl      L@ܤIsvŻlR4\C5xE]OuǛ)p C0v@@".0@@@b\@O imk@@@@ l.wҥQ[R%gsNW  @Qy.<rb\@C9Ѡ5k֘0pt8oMVZ ϣ @h D/=Pѣ;5Q 7nl.'))I7on.~zծ];w+^$ w f;u@@@&+?,--`^7k˒%Ksα7F@@@@@@wm~kt[P`ѢEnA]V\   &'g/@@@8@ʕEO߃`@@@B"հh+)))nHٮN@@_} 09p@y{X-`[/zn (a+V e˖xdcQ,0hР_}ό!H>1C    %7=ljjCo׮/pu*       _4W^]n ^($`~{B:[o/m@@@?ߏ=@@@@jժ_?@@@&ZlGKrn(999N@@s̑Ν;ͪ3kזk֯P 3w!T݄]oo~~~X3@@bQʜ@@@N@~l߾=ƀ@@@@ >222LmdڵrGF+WƒT@@ۧOѓjݻl7\@O]R%ٹs,Z(5~ w,3ڵ腂 p@F9K@@@euֹ饥? 2e/ ;vt\0v@@B !*F @@@qw^ٽ{wϖ!   @4 a-]գAد  ?AziӦI 0B|an㏲m6       L7TWҾ}{R@@@@@@@/0k,yM 4C@b@@p: *   NjYYY눖@@@@"l^lY[EfqrrEKvvvdA  Q)0gӧرÌw2}tXbTA!@dڶmdW      eG۵k' ^kܹN       []w}/_ݦ@loժUyNPOLLt:@@L @@@a۷ok_6F@@@!YtGKrf(9992$Ɓ  a ۷oiӦf=a--U@@@@@@@ ذ_=sڵy*Uc1~5N       ~ [2w\_˖- / v@ Tׯ 6;t Eo1  ?x7   @ U @@@8ꨣ~Glٲ'aQw0 @@ ۧOw޽{ AK2!жm[7ŋ:@@@@@@(;֭3=#\rK.f|7o^#       wo4z SuRϟ߱cGW/~=@@MhG   @L crL @@@[@Ov֦M3LٺukT ߨ;   QmơӧO+Ft\t/pGE@@@@@@ omfXΝ;]fϞT@@@@@@@B+/_m:ԩ 0 :~ joB_Qdyyy~9  v5F@@@ T^ݵT@@@@p ddd-[PIII1ɉ0@@ u5;m4PBFD PT5k֭[+      q/ JۥK֜9s\        @+wywu*D7C2R#11ѵAد  @Lǎ   \Fnc~@@@@zzqҥ ʕ+asssaH@@ ۷o_~NwĚ@vܔ,XT@@@@@@@ ֭[T89#ͮz}       !Oڵk]7"zŋMGM45k0 St  @ -3C@@"ի(    @222\˖-shذ_Kvvv4 1  Q>+ӦM *qt бcG7y:@@@@@@~L7ȴ4WbOsNY`AͰ       @ v!wٲ\r^] 蹷vm#oonnn{i@@C )>,@@@aw@@@SER|yٻw,]4Xa999>%`@@.Gɀd׮]m :u*AAACSNnwu*eCߖ+V2J@2#~7O?T1@"%?FkE@@ʄڵk8{I'/lڜ1ctŵO@@@@@@@ =믦?_ڴih ̛7ϵkaIIEyRA@@   %dee`6A@@@/,-[4A}޽[*VhpoM   @xw䬳Β={џz2yd~}ɐ=wzdƍ_H~~$$$DAƌs-X ʕs;=S     D@ffؑGV4זO?TFior       D_~E4W{ b4@fϞܹB%11M#77թ   @`(07B@@@/~bc@@@@zzi=//O_)))nW  SN3<j)Sݻ!6;o.~m#@@@@@@(u\h%--M5jdv7o޽;Ц@@@@@@@ѣGKvv. 5 Vn:r AIIIU=@@J''ҵ    Pa @@@*!/sҥҾ}_Tg+Wv*  1'kɅ^(fnwK=x,&̈́@ l:u7|7|iٲe#9iѢ; ~nmϞ=gu  -Z0@@@ j233XjԨ!)))AWeղg3g|AiF@@@@@@@駟'47K,m       q-0c yA +k&zw}gٶm[9C{.11фj/@@J'@o@@@ hدݻwKŊK/"   Ȑ)S&-[Fo0qi @@QFȑ##FȽnSAB!ЩS'0aizΜ9Bo(fʕE"  ^zba% ˓PvA   @Xn{jjҷo_{LSzi~J       r#c˗/nSA xau%چ$%%ɞ={DNA@@ [:?F@@@6Wwضmԭ[!    LtҥKev*)))lW  Pnf7nj/@Ν]fru*-G5S@T\r]/9s6,@@ \=¦@@(sްߴ}r衇֭[?}IrrrP1@@@@@@@ &O, .4SnӦ4}ZfϞFafnT@@@ 0vc/@@@Wpد=    ,oe˂l!T| D@~~\~~z!~b@ĮAf'       @ dffz0*z"۾}d֬Yh6@@@@@@@o}رR\9w (`~ڹshbPƔd!7(4  #  OY   /P~}9FoZ@@.Hz)sBB@@@@@@@ V233ԩ#Af>}|ݷz+        z=;թ sΕ}u-ZqFA@@@@@0 &hA@@@ ddd-[ꑪwT@@ʎٿ>}tŊeԩr疝I0R)oYbjnL@@@@@@Xn޼L)555$SRtݴvZY|yHQ@@@@@@@ Ə/6m2S<쳥}<]#3gt3!QPA@@{ V#   ,~%I;     tҥK]=RoovvvA   deeIϞ=?6-w}ׄ$!hҤԩSǴ3g/u4      X~{^ZZZ;_ pmO:թ       \_qƙ d߉-3fQx≮d3XsB@@ @@@Yx;   ' ]lYX|y?&7w@@Ѓ2w.34WQ@H t a|H@@@@@@@uTWvO?OyC@@@@@@bZ{;v92D4ier!#-2i޼Ԯ];6&V,4[ aE@@?tl    {!   @h6m**U;wJ4,SRRd۶mBohsZE@B!~zѣ|y=?c9&& වړtϚ5K222n@@@@λ{ gqr     x~Ҋ۴T֭+]t~+|lٲTm3       WzLUtwôc ̙3Ggfҽ{QS x"  ah-   8C[nuu*    @$uֲ`Yj GI}F@XrS֮]kvNMM?X6mcH@~mv_{&q$d:u3"7n,͛7-Z.m?>sw.ߋ{xbYh>F?۴i#_|4jMf{6'՞./6+|Q'x;h iР]駟ʌ3!CHIN,oi׮ 0}c㫯> SN1#SXرC믿޳`W^,<ꨣG g5jKo*U/"&L(.rWHz̶ƍ];(v_rrrB 2b4@@@R߸ۙ4   Q-n~/˗/Ν;Gt6l8;;;s@@ h0 jX ,Ӡߒu@'ЪU+ѿk`˕+hLhR5^L5xpy饗DClKR4ultRzvt[oe7o<СڵˍWCtR` O}̢`jo>CDOPTON@IDAT35@$ }zK\oQٳg˰ap>32rH_ͭ~MN' LX= =cٻ>x`aÆѿzj U4[o5;8O?߆ 5Wg]t|Z4Yw]`}i<~xѰJ5d~e[8qy]muݧO!?Y@v@ h8}Ug-'tlܸ|V3f=   Ĉ~lK~:,=~??yd~-<       @ .4_{7%>o'}  2(! ĵaq}3y@@@p z`=0@@@@FF7DKدP@@W@f;dǎfoz`&6;}׮]eڴioɲeh/ 30:\GIeR 5ྸh}Ha{ u-[N:~嗢{={]u ֐B?cOJ͍ c]\دwے֭+\^Zb_ׯ_xs;Hw,c/9c:B zAmvv̘1C4[4Yf1]5k.fE+^m۶5Q{T\VSNqa+*뎺RZb?;6hn-~~zKV*V ǚ}IcNLLt!k_~-t!X穁ڥ[ 5˶ym:D@Fl;A?oo7a;!   Ĕ@ffOQ_ JYѿMtEf͚%~m/P@@@@@@(Æ s4yظ21pzLUkiѢ~1oBoL@@ @@@[@Oܨ'ܾ};aP`   D@zzEh qٵkr!# :uwy. M45 L( @ Åi@%azOg\F.u_?so^qE+V=йm5 =za+W뮻NlƤw2qDRqlvZsN+UA߸|g- ݷo|i&SNPFnVs)G-z]}d-cc̘1>s=}tyBB`V]V8J*wIg4]q]wUW]u6vz=_z%O b7-p7pYW_}u E;EtmxM7$s @Gy.y5bŮM}MxDOpeҾ}{M0&LpiaÆf }_`5W;>}2@@@@u֙/_>,'=sMدv/˸qY"      ~ ;8MyͲ9a={暾w>#݉=Vsyy@@&Y@ڨ/   eTC5#ߺukF@@@Xhݺ!n4qvvv,Q3@@ &{99]i&|A1q2 b[@~mрJ ^VZɔ)S\]] /F~&MC?oH7    TnC](W^y@@@@@@@L nj#6H-@ 1tVc:99/IN   CНT@@@_n۶-@@@@ *U$ҡ믿 }ᦤ;ې   @X4m_| FXbX@4͚5#84{-Msz>(̯(}+Ճ^[<ѻ_~UAի`ڵkvt協q饗}SMРnߧOs D!PY pEc GC1rJJ*9UxHիVݼ%c؟,#-:_/gݥ]vRn]y-[ΓUJ&MgϞrGJ͚5;` 6n(gy2m}ꩧ.j9qDpECv>`  HΝEզVZrW9E^ZX̮M[YYYr7S?{ 'Z[:t`֪U+;v4۵huv/(52;x7l<bF@@+ͨ]~7gO-}       eJ@l}ԩ|{>no߾   @i-"   ী =9,@@@@FFž={dŊnزc[@@ nIF8/$%%eT@hѣΝ;eܹ>\z۶mYF4xE4,Nj 1cYߺukIKK3`iO6a6TC/` K/$ׯFmJ2}t[kzz]6W^CH@="/kVq(iڵ\V^mN(w}5cI&R|ysuVMY mٲL:[dGh0Fꫯ\:F}8`C?xm!bzOIoU4<7z-]_z^^ 0@Ə>$''K LZúnjoŋ{WGǭ.\Ë/REsQosÆ rwF@@@ 2337װE]w@@@@@@@7wq[:ʂl23tqxc˸F@@ p[%   aڐjժn@@@@菐zH~#%O  o *6l0#߽wҥ !"Oow_{F-)82~c>e  u@   čl۠A;E@@@pӰ_=} a_@@@ݻwM'|҄5K@8 5Q()zٿl޼لi؜ ʸq[]do:uSN9EFaVm]4d\v>Z~4f͚ɓ'> Uy~<uuz>}˗jc4 *j@PkuJ>O8~Wx ,U40Xazo̟~I.ѓh_xҺu뢆:f}ח]vɚ5k_ ?p3&*x{~y!硷 [`r׻f5X]_ ZU-< 4vڴi 9҄>ON;4S  ՠX}-׬{W_S\P`]ioxqBBB֭kދ.\(z4iR~5LX/ؓwv}0ϟ;Lخ]YA}׀ŋk&:E6-)-XdZۤEWNWF    " MKK ۴˗/o~O^u?@@@@@@V=7njCe\)Gumms   _kW6F@@@'!۲e=    t6mڸ657cǎH@@2C6OC4pP\#1y(sZتU+3n +pp $z]44s6lذb;Ҡ? cu)=1aVlV@A]'Ćj_`]0n:_{R}j+*msy;/cCChh䣏>m;ao]Xaå#gvC/~gq+ U7TCvYifip9scq:^}r t}U k^4Q}'M;vYf{}G_,;vym:kg6\Wj}SZ5nnj`o߁jP}ꪫL?rqo}]" (TpЯmPltbnn޼YkWʕ+`g ~ҥK7-hxs{k1b~]{    &V~r%~iW      ij+۷o7zܕ+BA 0X{|DYC ۷/&@@'   OM{,|@@@@4~a!/j  @ h`M>}o1UTӧK㕄y#@ Ck˓3giCc*0aBKIJ*١g wKzݯ_?ygĆTkXݻ]&&&msԀR-Y{{믿ʼysfhǟ$.c###C+ch+9K,k-K5TQ)*0nk}Lڢ';իiO|7{WȨQl3!ր˗. XgI۶mg?x=f Pk ж5 h@nI/mM#.mw˾+ $FE_'F1 G=_m۶o>N\L~ɑg}V>SY4] r׺~\4hݖaÆ3yG?4mT4ศrwĤINp@f]`C?*6X߻:   !Iۋ~ǿtRY`>YW       *zjvʕW ]VZ厓Ԡ_ =xי'  @B0"   5kt uT@@@@ fzkFl4$gv  ЀN:ڵk!~CN >o L _-\s&m.hsȐ!&T7<#]sH7j-s1a{Z|&O׋޶Ż]Vظ AVV;EQ&4ֹB s Z R~}'z~mQFҬYhnqh(7k>'z)[~;QV-󚣯;cǎ]f5 TO]d70^ +@ : o[6nhBo5V/;wMDbʕ+mUJҟALn˛oiƮ Ƶ~u]gB5F穯zٳgFCnz9o7aփ >Z4}С/gH&O5^3tAp K=6   ,馟\ve+      ijtMRNx`eT࣏>r#ٳC%))M>*   a~q1    t~   eBI Z%Hl H?7acׯ7=4iDΝ+{lzY@ ݺu ڿ8p 7os\&.X Fp'|bfCUO>k{ꩧ0dsaxlhxjy](T>S1K.\XY5WLm6VKܲe ]`]gnD?v t('pp KY<5G/7|_5PS? wu'`f q=Xѐ]['V:o߾v_\9?ޅO4f:`\F߇ `^M{'Hfs+X46ʨQkx_4g1߅xsZHd{Ѻ}|(@@@Eu֙iUZUrKJJW^q߇{      DZ`oahȯR(8L{Ljv=>і\[@@ 74vA@@@ P{rX_OtIA@@@Ah  9)SH^$++ }2giذaE @*W,'xiyڵbŊBeMQFrakw)j5kٳqk.:tZjfq;lܸQ-ZT&nw}g܂ظی͛+ReE+Ÿm 6WC5P5X]~Cf֭e˖i}oE_1cHZZc뫄,_` Pڵk {RbE7&MO?%5TF˼yD3fe fyoYǎ+>GZje4h ;v˲ s{'~'Ҳa0ayyb'muRRLJ~ܴiMX   @\ ذ_i1T⾛??@@@@@@@ Æ sC뮻Do Pqo:n={~6@ r}@@(+{q"  Ąa1q72 @@@bN ##iٲe,͖@No@@?s9{nS߾}MaVF(Cwy R`Ȑ!ҸqcӅh ӲuV6mMVYdI5ZNg4V _N[oX 䱡!{7nX5Vk-;ؚyf{OrssM=Ѡi;( O̰0Β#0I d; {̮8z" ?XYENMQ{SjԨaNhz \p^_]3ZF|w:mE߯.\hoZjf?t{jٵk]k 5jL2_RjU9S͢SJNNL<ѣ~]>t|SA@@@_f!555b$Cu}o)(       @ ogϞmݼys i *Я_?7w}թķ|a߾}r} dĈK6nn{+-͛7{qnrq)+.Luv+p{/eQ{[oGIۆ cncmc֬Y&"ZOHH 5֢azr'K L=Zy'E*?̙3Ǭ>c|EmiÜ_|"Cc@;a'kݟkʢ q맞z)qF77WZ%>wիmoEnM8QqƢA.իWwMz4ixETMjϮ+|mC׿«~[C֋*۷ db?o/o߾] &.O^{̽+;wY&h@@@2"F᮴m}9sf@       @rssecJbbM${ ݻwoLy"  J    S@O#ק @@@@ ʕ6mٳ姟~2$kL6pX۱cG@@ `˿o7w =zMU JkҤ\҄;RjX.C/l /.N(ؓ}ѢAqw. ӧ.]ȃ>(T\Y+y1cԮ]q۴iSdڴify%##mJvv|')Jd;woRV{O_xN+ֳ>%}t6}=6ϙg)͚5xE~*}_fsI'ik07ƨ6P5jlSNW^yE4,]V! /r8Ѕ"AVT!CurQGᇢO/`Yo&ECnj#L\Tm\~uOMM5Av;k硶IA ܪoQ~Wkf͚~󾦯+ڬs>|Mӄ!/nzk9˗/כk,}]ڵ>*w נk믾g lO?wg+VK.D?p/y~?jp~޹g4\]t?^vmZ޽{q۶m}RJžA:y{q'=k|h6nu)V    k֭sS'"Y -<ߡFrl      R駟6ǯi'xzꩡ쎶7WR|y7e=v   {"   වLO'9ݲe    *=jѓwdS@@ rrrof3a+㉁"@ O}QGYg"L_e M=xy饗 veՍ5\ScNjyi5T@c~w12vXMu WMII.ЅG뱡5|p)j,6lWѣGMiРw^ykWp^tE>֐A2|СYZ#&Үג}襸ҳgO fСQzאn -b̃ {ׄj+dC=T Is<{`fطcZiq@$9y6^4wΝk.7< -\uKC|l;E/j2[ [L](z&}嫯2ZA>`u߼ys緆!/r뭷i~vnfyI0آA̢:NTV̈́ gee.tKuLjʖ3ȑ#e޼y7|#;v 3֋&   ċ@4) ~/j*iܸq@@@@@@T@9ƍS  z<âETu´Crr^M   @ ʞ    M a   J{by D\hІ~#q' ĺ͛M 07xX u h -޺]f5Fov^6mRL27h=YC4ir:eoJsa$n+=//ۮm^微Kۧw?onk ?64іjݴi T۵kg$m[5K.f5kdʕ71mznv˵~衇JNb @>#}po/W6wu}k3L[G4cko^{'M?u{6Fq}z-8׬c(o#PZ̟ǧҮXB4ŞD?ؠ_}jX_sֻ|rnk\8zΝe>Յ E+| W_}U?|׌injj3p뼦na?.%l߾=tP.!ŕ̅oWgΜ)?ymv믿{vX   @ dff)yWw X%; -]rQۆqHt      \ Hբwo߾}B%Rؿi_~&-_#BA@@?x   ~̙cГ4ړ?{wgU]>E YʬZP.|Ls~Zfn * W44*Cʹ,IM33LQd?= }^/{yƁ{y @ @yx'=ظ$Lnpaқ9!@XH.F 5/ [wG @|VX\dIloD2Vuuu3fo:+tw }ewމbn`2/i#@pM ߅͋!o',}~KgV0ϧz*m.< L;84?%zt?t8l3cmdl_zxףk׮ۦ?wܖ>f̙2d{>}Z]/y/_dp;Y6_肒E~E2x} ]2eJO?=1 @JYਣJ.W_Mޚ$;P^b.]Z Zwk @ @ @ Pyɵ6mK.d@h~6lXu]i?O>de6rWȑ#8CT @ y! @ P`=zd+̝;7z= @ @ZK`wmFr*#l`}ѢEV  @&>9䐘?~ږ[n>`|(VCСC>7|3;׹"M74' @`=m]g=Oq [MvaOs6hI4<'[~{&×weƻZ<4  @@]]]ZkUUUׯdMbĈ /^~=[. @ @ @ @GN&O=T~ ,g #}?a;޽{u"B|_ګY?O6<' @T*gsJ;S @ @iɠVL~z= qW):tH @ @ @ @zxG>z=ђoJ/|_'[UUU|_XveZ* @4]ߦ9 @lad @ @&~[c M^ha"X(iw?<~_}$]~1jԨK(СCaII&ŷB,#'ܹsp -Z`=䏍/Pi?#{ @ @@9emlY\ ;w_qm'\  @ @ @$P__#Gr$עo>{, P3gΌSѫWRl#/57rʼ䔄 @@ M @ZKgϞsb @ @ Z~vհp, @[ mwv!.~M*T:O @ @ @h9ӧg?%8Rf @ @ @JXnoig/nN?/!}pT4Kr9 _  @4O9 @4[Gٹf @ @6tb-JM}x%K3%E_4hP$%[ݣ>GqD9UhԤ9~H @ @ @hlb;p_[z @ @ @(EŋDž^~Wf@) $~sہ +k ( @%`o؜D @/`oI @^ 7hk~`{@<$@?[̘1#=z뭷z*ݷ;-p!744< @ @ @hPSTlcܹx' @ @ @ȟ@]]]m۶/q3;6ӬW\qE̛7/+HG @ @ @ =:.].o|#f/j- _"[堃J r>O_re2 @@^ $ @ @i47G @ @(a .,|V @ŋ#kͪ?sg?Yt1' @:thzի{]E @ @ @ L>==o߾ѦM k#FΟ??6 @ @ @i;HK޽{\pTZ |@rmɓ!C|ౕDV ( @%PpnV;N"@ @!`oiN$@ @(V[Enkkk[k׮ٚf @@&PWWkvYvb„ qeEUUUv_`ذawuW  @ @ @(cΜ9ifH.|GbĈ {l@}ci'x"fΜN @ @ @ $Qm07NKKNΕ+ @ @ @ZeMkfmSN)zG)/:,J~N oN( @ n^zeѭ[챀 @ ɐ<-6{+ɰ Pbw_s1lٲ.~_o_b()0lذ3fLY&~駟^yU<@eޥ @%,Z({, @-- @RԆ&G;#fϞw}w|ߌ]wݵ(}E @ @ @D`1jԨ cܸqxh@ &_v߲|ʕM. @ 0^p @ @@q3+$f @ @H涖6p! @.}/= 2dH馛V:  7ܰ$OS~&۴D]vYNp4X쨛o9?6 @ @ZW-آuYջv\rI|k_K8駟F @ @ @GrHk-!%K^ow ^b @6@T @ @Ξ=YF @({fgm  {  @"jժWsN6cGyĠ &-'N;.ܐ_W-n% @ @ @&xoK?> wQ2+ @ @ @?~|;It[{oaŕt!#07 @h@f$ @ @`}7(  @ @'>ڵdԩSC<$@*H`Μ9q衇O}zf) mӦM?>ks9'>޽{֏ @ @ @ 0vؘ;wnZGK1y{\m۶M߻[Odo'@(*~P  @T@ [)>  @ @@o>3mڴx饗bŊSNQ]]pB.%7 @h^x8^Kkرcqqm #@@9y1jԨhhhЋ:hРH @@vqH @ @(R{ơw_̚5+=ܸ~ @ @ @hmqקe$ת_z饭] U`ԩ|'[>~=򚿔5WXr0 @hSI @4WB^ @ @jjjҒV^ɰܺv.goK[(x >e~OXhQZާ?xgb]v)rD8c&L @ @ @'ۿ%mL}cǦ+644׿Xzu V`) @ @ @]C铛oy$mM{M[C9~fSJ@ PV7  @ @u6llYfe @ P,9k׮)Cn] P(|+o;֬Y.sQG?})Բ @Z;vL;cʕk9. @ @ @+pH$[Mj?ScwNxkIcC @ @ @hhh3<3[K..]dA`ڴi+ѳgrh+=t!:鼲JF Pm+g- @ @VHNnlٲ={vף @ @{a%K>[ @5kV|1eʔceӣF PJ]vCF2wܹġZJ-mMr7m/"F @"XfMT @N`YR|o|3]n̘1{lM֟ @ @ @-)\ϦK0 Fђ[@s=:~x +bŊ @ d~L @ 6,NY @ @< t=rxcڴi IϵĖ Vm- @NtPեu9&NrH9'qM 0aayzfΜݺuS6i @ @ @JU 9RԿ;ǩ^{m,]4Q?mڴI @ @ @ @-[w^UW]LCPNa/ac7 @& DpN @%ЫW4՜9sb͚5J+ @ @ o555id]W~,X=O(I/vml[l]LV (7;r˴~8|rkQ? @ @ @ZM&^zil6O>Ǐo5[  @ @ @ Ppp@>:uji{G] 71~ 4 @h @ @-${#0 =n-C @XEz\mmmv#ut-`oF! @D!Ǝcƌ$N}sqfmV&]j-PUU#F|;Q__'NQFvSX!Cn ,M @ѣGij @C`[lEjйs0aB瞑\3|J%u @ @ @ PboV|{Kn۶m7:P.O~8lذ,[ 7w~# @$`oL @'ff272 @ @y2%~=q!~ +7 К/c=6웫#y|7Gb~_  @u_|q:=1a=a6 @ @ @9\Rv}ַ\sM$71bD&L޽{3I|}_bl馭^SrH$ @hass @`޽{g9z, @ @E`-V[[be5`[B @B 7O /K$cM<9FY%%@<Yn! @ @ @4_ woqٙ;vo=ʒh,*C @ @ @@ uYf͚ѣGG>rkQ?RǙİaòX~:d;/_ @&`oӼM @&`o(%"@ @ (PSSf1cF̝;+7a @/pUW~K'>O?t|_,t@28âgϞi{o̞=; @ @ @ $IM~^aqEóόp)#@ @ @ @~_ţ>v[7 Z(bŊ{ֻttP%2wmQva @@ m2 @ @@~6l,ѬYX@ @(&ܰߤ)Ͱa P`䂧>:>HnޚlcSLۮKOСCi+Wƭޚr @ @ @X~;r7-a {ǐ!Cxq 'Tq @ @ @ 'z9rdW\۷ ɓc޼yiKCN:S{ydP @ <7g @ @ ݻw㭷b @ @coF! @|@]]]nqwUUUŅ^&M7C$I'mc7|s6T  @ @ @H>Suob򙑏|#itM}%@ @ @ @@^k_z4Wrm(F'fes1Y,X@a˗/_A @ N~I @ P~ *+ @ _,aK ڵk X@(?._.]}w"k#@r-cO>}zL<P- @ @ @"a w߾}c„ g}$) @ @ @ @@3ϟcƌINaꫛi_`ܹ&_t+WءC~3  @& d2' @ @t-roz͚5+?Ie!@ @Y`vۧY[jo&Ͱߜ @@)tM>ٳrf2eJr!P  @N9n! @ @ @4MR&*_NK:4̙40G @ @ @ @`-cǎ>|x|ӟ^Qv('rʴ_icֺ^ٍ6(;İߌB@ @d2' @ @ ;M[o/L @ @< k.vq4K/+Vc2w. @+t''VJ w}g~*UFH~oa @(gիW /PV]pa׳ @`Cf̘{GzY:+|dM}(]8餓k-fTN @ @ @߿+V2Kk.|{8s[fq @ @ @ PɵVJ{5jTT{eBjj:ujzAbvX*dxn[lY. @& D0 @ @| ;Mf͚={v>SE @ț\Y\ Y ,(2 @6Xw]NO:uwyg\yQ]]% @W;wN w)TB @ @ @Dׯ_Tae&~cmܸq l @ @ @*QGx m=y5k#P&L1bD >\`607 @haM&s @ȟ@rnn{7s @ @iabݺuK47 @E&pW?xʶzӟÇ/JCdMOS-Y$n| @ @ @@E 3Xvu׸k6=xg @ @ @K>8/<:u=(7+WĉӶuQbرc{Y, @ @i6 @ @ S2 @ @@ 2Q @ H<&uY\l_< 6Z :뮋+Vu#@ @ @ O5ko߿>SDSN9%;e˖ŁӧO/I @ @ @@ r- / 4(E@&MsMW8â{\R'Ñs[ @0yn"@ @y07/ @ @H>V[X qr1p͚5+&N{ @ @ @w 曱zt_%M馛bȐ![op@,Z(} @ @ @ AϏ /0}:}|(g[o5kNb:v|, @ 4~h @ W~rm @ @bIKK_*x]vMXfM,^Y .d./Bzhn?y;6ڴquy"0rȬ* @ @ @>X.{Ro>~SqGD}}}f# @ @ @ @{.3gN{1x1xK{nbȐ!e_h%-[ @&rMr4 @ȫ@aof^sKF @ȧ@no6ך+,X }%@@2.<0r3ϤZ  @@ α^{5K  @ @ @ n~c馛ɓ#HO>y݀ @ @ @ @"^y啸;u_~yE:hnHl'pBe5n;ve17 @haM&s @ȟa @(a(Ny_|qv!SLۮ8V\ָ+X@ @ @ @ _m6&M۷Ow?; @ @ @ guVZ*}4rׯe-rʸՏ;mFY˗g @ 4/G @ @ lfQUU|7[2 @ @@>Zs… ي\ @xbw|0=:ƍ?ϢK.A P_isO>d<٨ @ @ @Qwc(ڴm.첸}G @ @ @T><@j 5jTE{h2&MgN:thٳ2c;v̲-[, @4Mߦy9 @Um۶ѣG4ay @ȳ[nݻwON6-ߟ[n d zkk%=#qg @";/rرY, @ @ @ @`#믿>{"lwܑ= @ @ @ Pqgd_~yt){, P7xcI'ł0wI @ 0 @ @ӧOa-m  @ @` lmܹk]'.! @XlYwqq'%=\ޅXRN(Qm]Zc=O=Tvl @ @ @-#ۦM][2+*'|r\|i q '/~.Zu @ @ @\[n^x!]gРA1|i-׿5v! %˦h @"0_% @ @@e .H^re̙3- @ PR555YӦMBBUN @^}H~a7'~e @ ;/3fL  @ @ @x@no޽]v?\po}+Xzuq1y : @ @ @?~\x)BUUU?>6. kSObA:uꔝt, @ 4~h @ wܰ$̙3_B @ @@Wڵ1w,v @4iR.ϧ+t%뮸k\@ @>zVyx'ˡ-= @ @ @ȻUb֬Yi=9$kcI[Yre :4|rhM @ @ @4Q/9sg >< 'Pzɐi]v|+DTܱcǬe˖e @ 4/G @ @ wR  @ @ ֹmW @@^V^FJoD<3qGu- @ڶm^xa\ @ @ @+oĚ5kץqTUU&LFfoc1 @ @ @xOԩS\~ӼN+Zn%K{ltҥ=6gGn[ti. @& D0 @ @| 7K\l#@ @@2]viy-[nYl 7|3g7n\mذaO?l|GC~c=a{ @ @ @@E e}Q/G|%VXCz}A @ @ @@y }ٱjժ#GF~ʳQ]h$P__^{m*N=F *бce˖e @ 4/G @ @ '9s, @ @M} M UaHi'HAsO~;wD[ 1c9hhh  @ @ @1cF`oF yrĉqQG'9䐘4iZ @ @ @o~<@P2wԨQӜN|@믿/})~9Shjjj4WoHN @`዗_~y>[oْ&CO= tT#<2r_~g{T } @ @ @X@]]]߰ߌdHދLd~{ @ @ @ P~qgf%w){, P\sMgł TUUFmlٲ%q @aدo @  `y @ @I Ȏ:uj;dMb @s΍?=H.tL}7{4hPs:Drkr|n;cչ @ @ @x~- ;cĈ]կF7=3 @ @ @(V[n%^xᅴÇk"W)Sğ4>g}R内/]R M @` `B  @ @ lf\ploƆ%s6 @ @V|۷;iϟ @&\USS=Py6m⢋.Jѣ4K{wW_oI @ @ @$ m˖\|m駟&hhh3<3.%t @ @ @E)_'>`UUU?>6 0nܸ=q[~rZlY~B @ ] @ P\7|(~Q  @ ~d; 97Y{Zf @ N 3fHlG1cD>K+.O;3o޼| @ @ @@I L>=m۶ѻwOn}5_-=v8餓b> @ @ @+8gΜÇKh+?3-?;wN-Y$? e!@ PRW/  @ @5k֬XjU" @ @ l&[Hj3P @xw_r5*{>T.  @Evy8c55vb1 @ @ @E&PWWVԷohm\pquE27n1-jN: @ @ @ P$?OԩS\~ER2^+5k֤ ~Ѿ}/Z!+$?Omҥұ6  @_o*# @h@rqr%qfΜ@ @hIt kVs~/^[Gb @z8p`L<9m.IѣG޽{_:"@K#w~x饗6 @ @ @h ˗ǜ9sҥ%͚zjyѡC~8vm1cF @ @ @&pgĪUҶG4V@r;#k׮B% vΝ+VpJ PVE @(~o_  @ @0`@mmm; mhh ;| @@ \uU1dȐ>}za^"رcL@߾}#>ْO;b)M @ @ @ZE Z~7%6lX<|$MǠAbԩ\ @ @ @ZT`Ckn-Z@rodm}߈d-:uʒ-]4 @aoH @ P0~_\%&@ @l@MMMvv!n&:b @`m͋:(>tbr{ND V[_u$%@ @ @ P uuuYv ,nSO=nmz̙3xoɔN @ @ @ jV3<3[ܸqѱc챀@9 ̝;7n3(v[Ν;gQ @4I&q9 @Fo߾Y7x# @ @bh[UUw^>}  @@l%Kd @ @ @*IWRuK:/;,.XfMAז @ @ @ /rh=#8bÓ@DO<1zU"N:uʊusF! @ $~` @ P~eg̘ @ @@1 lVѵk״ڂhoh%&@e#ƍw=^=zC=wlz_ӢO]tQi5Z @ @ @y07OkI|N>:}6,%\_ck9. @ @ @A`֬Y1vش6mD2FRy睸v۷o#G[~.]ڢk[ @@[.> @ @ooF! @ @T* V ,7o^A*5  @={v~1jԨXjUW26/M!@cǎiǏOUݨ @ @ @@_7ۿ%q t!&N\sMm6=O/~y @ @ @ @;XpaZ'555W UW]-JW=_~-\Ae,׹s%Kd @0wI @ & M$[㋖  @ @ h|@2PaPc= _iCmڴ??~E򾋍6lGNK}k| @ @ @$]~3~z<#ѣG4+ +kIH @ @ @@}٘0aB %\d$Pbs΍뮻.}qXSnaK.-UJ@IDAT @ -C) @ P:t^z/Z\ @ @.xi Raaիӡo[i/oy7I/b.O'0rqƞy?~|5# @ @ @"n6gϞr6T`LS-^8 '|rXbC; @ @ @<|[ߊ4Ә1cGy*KcѢEi'pBׯ4 /*M>?`#@ @6 @ @ OΜ93  @ @| 4[[[c8< @/0}2dH$oY&obڴi{W(Nvŭm\pAY @ @ @@ 7o߾QUUUl,[1bDn~3' @ @ @ @ӟ.;)EX@+ $;v~+UR6dɒhZ @,`oA#@ @ M&m @ @bqm۶i+6 P&MdpqbѳghR PN;-oٲeq'FCCC1 @ @ @9fK殣=k"O0!nԩSԩScvᄏp L @ @ @ $~Ξ?~|vl@ 3&/_v\wۧO2[ҥKVŋX@ @ V$@ @h|r]]]Aג @ :tijժ Mw-! @*B PSNCf7~z'>;*A Pw#oX[n @ @ @u4^u8y8s߅ QG_W# @ @ @7H<c}mŭD^z饸;*J5|ʥ;wzB@ @I6 @ @p/Rn|rV @ a555i+WƋ/arva_v @,\5x6<Ș:uj|3  @@)t)~f5*f̘= @ @ @(G5{-֞>OƳ>G}tV bv{.' @ @ @ @pZ\uU۷pL?O+;sbM6)*˫.]d Q @4I&q9 @NEʆYf @ @ aI%LTB P2KL6-cǎq-]w]v->J q '.\_?-&@ @ @ Pvm|m5Z u9&N?яb7N}㳟lzC񆆆"@y @ @ @J[ଳΊ˗Mq6۔vC'~:>}iք\mŹW @ `oJ{fUy-{bQ)2c'17{0(Kl;%7 5Lb&^j5 ( U)w?7ƁiyYg}ZQgo @hJR^\ @ @gÛo۶mcM7MXhQ(\8#F˗/O 2dHKp W7Ƀq}M %@ @ @(>---->㎋W_}5vu4UV9_b9t @ @ @SO=SLIj/.TAFʮ=ztt!{-h:t @@a h[ @ @ ze،B@ @@EEE]S4M&֭[f>1y#Fċ/  @@> t5~g%yd @ @ @ I`feeeTZֲs=~n-Ȟ~:th{y[  @ @ @5kbȑYj^{mt){- P=X$ cvÇz9S,[,g @|7>- @ @@A lVѦMF~ V @(^z6lSYY$ui$&%@9%zc ^{SL &Dr*_ @ tAq1Ǥ,\0N9唆Ni< @ @ @$INڶmcƌI7TӧOŋ㏏#<21 @ @ @4\?y̘1#hvKkf ^g}vUW]4@ǎ5( @6H@ r1 @h:(--M?~-df @ @@# TTTƂ qLU7Yx͚5>  @3gN^qWڵkdկCmNPo6,]x W35 @ @ @NСCٳe }:Iߺc1xxGNI @ @ @FѣӑZ䧃@L0!x㍴=3:b)='ܹsf @ hA\.&@ @M+лwt ˛v1 @ @A^  @ @ @@UUUZFYYY!S5t%xᇳ~|ߍc=6g @ @ @l%\I8bwI ?]vY}nJ7N:e/]4 @_@[ @4@>}5,X @ @@ $ ꎦh۽{5$ @ ,Yn<{3 XଳΊիW^p[p]Z`K.DeG @ G4FZ @ P} _`A  @ @*ЪU:th޼ybɒ%fi2 "ovK/or^QYYGuTdQ K~xs1iJ .#FRzr!@ @ @ Q8~3 rxG^zy 'p@̙3'oj( @ @ @OsɖdM.c=ٻw8 䜮si~˖-<%G @ W4OF^ @ P7?~Q( @?4u֥M~S\ @&Mɟ򗿤i&.Hr @7n\ld_h @ @ @@UUUiii K`ذaoı%??N;_W  @ @ @u]K88DE$r83:t落4@NE/_` @6L@ r5 @hRoV5Νۤk @ Xu~MXӦt=& @@n |Gqacٲei?1z())dGYgϞ1a„lN;-y쵀 @ @ @@ 췬,җzz/{HN?8?җ=zW  @ @ @ "inm۶c'V`̘1-}c9h-rΝ;$~ @6L@ r5 @hR[l1o޼&] @ @(//Ϧjf=z7 @xcv)SdyG? {vN@|Vn 6,=Y[[Ç^ @ @ @#,[~3o̙33ό3f{'tR7?^ @ @ @4PଳΊ+Vq1ph8x#iI[o5/L&%.]+U @i\J @6Z`mMǾrʍ@ @ @@s 2$Z-lݳFG @ wO?ַ^fmon;n2#@9"0nܸfml#I @ @ @ TUU{Fua],^|u]<׭[wqG 0 H^; @ @ @O>?pZ[lG.J N;OR'1x`*9 ~%K@FR @ _%[ @(}U&.X*V" @ ni?-c̙zF+IF4hRW^y%/GҠZ|u$@@ {p vq9o]O @ @ @y#P]]ZVV79K;s B]vM~Gq'W_Z\I @ @ @ v8㌬뮻.t钽(tɓ'?ٻwoͮs_עKPfR!@ $K @("m6vܹY, @ @@EEE'|ofoQ4ڵkc̘1{o馛ƭc-huMJ Y?qZ㏏\ @ @ @|XhQ,[,MW|6<֭[ǩf͊c9& inň#b…y @ @ @B7n\iis3"$+wرѱc쵠e:w%dɒ, @ P?~* @ l77o^k! @ @@C&sL6!S}flrpIIIz3yA@=~FO?4Mf]vW^y%kPزZ 7K x#y @ @ @ /UUUYY,(L-2~_SO=N\vmL81 ?c͚5Y @ @ @Z>.,5hݺur-ѪU6Q|q $WWWE;߉C=r.]d.]4 @O@9 @4fFm! @ @˳oBӹkkk5 @@ q1tӟ&RRR]tQ$ : @@:vw}w$&ѣc h @ @ @$~߲fZ2--GrOӨ0x…8vyx[:E @ @ @hT . /^y'.Ҩ@. $;6MCi\ηsܹsVf @@47  @ @@7[hܹY, @ @@EEE^eee7Foc(4x`tIQ O3<W]uUm۶q2  _WsM%VZw\$? @ @ @r]:KQߌ(6mYgof|ߏVZuO>=կas) E @ @ @/wuWZdnk)UG`=իWG:]tQz [PK.K,b @~N"@ @&ЧOhej[ @h[noy:˴i8g5]xq[ozE4>C ٚÇs=s @.(//O'L6Nvv @ @ @u,E~3 {xb]wj2eJ 4(.p" @ @ @3dO?= +6,Ϫ.W_M':thwy?M&йslKf @ h[?'W @ @fh׮]il"@ @A"?wyf=zHkƢEm^ @Xpa}q1DMMM:hJ~=U @@}{ 7dtOxꩧ;u @ @ @ZD`fu̶H"mqSw[ouʕ+뮋~ŭWn<%@ @ @ @`Cx!C SN9eC@^ ̚5+.򴆒;m۶y]S&ߥK%Kd @ h[?'W @ @fn>Xtim1 @ @ 5MWVVn4g\ݳsY, @^G‡z([,i;cƌ @M'N;ŵ^.nݺ~~tf&@ @ @h@uuu6IYYY SUVqǛo^xao>SOMOo[8&@ @ @;ŋǨQoH:ڵk㤓N+W}ٱ.CyYc׮]_ @lfj @ ,u~̙,kZ @ PliӦeqC~*h<p%K㠃{/gϞ<=zI @6Z3όdc#Fl\ @ @ @hjt.]D?DSNqWǬYbذa4N !_9G @ @ @ W.:{\U^[`sϥq7kDaME P4GP @'~Ӓ+ @ P'PQQQFeee74췡 @ xcС1iҤl3f̈aC &w}w#]{" @ @ @z5---.)6>}SN}'+gv->={vv^@ @ @ @ WfΜItMo̕A͛FJI{ۣ}M6^k׮%Kd @ h[?'W @ @fY-F @4MHF(5 Y+Vȑ#k_Z̟??}K.qw~r-?;+ @Yz۲5O?;wnZ@ @ @ @ {=Pw޹rT`]w)Si֭z(rJ{9 @ @ @Q3ΈիW_xQVVV j.RO>9/_V8g"ȟ=Cŋׅ~ @ PO~ 2 @ М}͖3gN  @ @,PRRC ISq۽{l, @'0uԨo9 3cӧlj'x h'pB:ǒ%K㎋5k4hN  @ @ @4@UUU6]iii |3gΌ[l^l>a„ׯ_\|ő|? @ @ @ В'Oz*Mas9%ӱ6fH}'5{cƌi-q۷vڥ}qF @f @rT`2{X@ @uI`r]6^{FIWFa4 V.(sx뭷k:tcǎ'|2O9I7u> @ @ @P`Ŋqgg+g?M6${- P^w^ZbVoΝ;rU[׮]z/^\Pu) @@sh @ @(feΞ={G @ ru~ M(h(&!@G`n5\k֬I}8Hr @'ЩS$M+鯃 @ @ @@.TWWgif@}:v_|q3όvڥjjj ..nXre}s  @ @ @F3fL,X f|2I@qꩧp@-t钾Zdzg @G@( @@~UϟWn ,I @plPc5ѣG6gQh@0յ^kTVV%b^}i7l  @&c=K/MI~o6lX,Z׵ @ @ @/.)++b իWg?z+~FIII:ߏ#G;~g7յ @ @ @%0wܸӱm۶cn<GdS0 w!k)֜v횖xb%P7 @w $@ @M+P7i;o޼] @ @F:thj*y`C޽{6Emmm  @ 5kV^qƪU ߿_z\ݦ> @@s \tE.X ~5w #@ @ @ sY, 1};3fΜG}tvrT:4Lwcp!@ @ @Yg|Izg8wqWei&СCUt5O?.L @!6DX @ Єo}6o @ @@. t%n4ӧڵkf &45ku] /"IcQF~ @ Zn3M|qmW%@ @ @(8 kQVVVIAISx ^}8蠃̙'pBqwIeo  @ @ @4Pc<#,[mU\r% p!bŊWN袋bvˏenݺe/^ @X@/6r @h~eΞ=; @ @\H&ˣ1Fǎ]v霵OG_`ƌ{\+WL&_k&}3m&,3<3^쵀 @ @ @@s TWWKv5:u[㷿m Yov?Ls=f2 @ @ @Ocȑ믿>:w(ddYf%.qr]~-ZTе* @@c hآ#@ @$o#A @hvfӦMkwSSS(ի㪫//%Ĺ瞛4v @/p!ĩbŊ8cO>T@ @ @ u~2I?x[4yA @,,nHP췶!KF`ڴi뮻%\VJ4hP_۷/  @bcvJK}s)H @ @ c .+VYXv)D?s׿ķ~;[o5V\' @ @ @ EN\qe[~8ww}7~ĺuR)vq|/֭[Vf @@4 @ @@ l6ѱctz" @ @`#***I8.]4֬YS@wiߺ߇۴i^xa꫱nd݊"@.о}xC).v @ @ @4@UUUbYYY 4Wx'OS|Ȗ[`Azꩱv~㏳ @ @ @>OsΉd1bD|K_K'P0k׮;.>ô>8N;X YŋA @6J@ߍb3 @4;.4wXzu,j @ @@VVV6p oݺuhѢF$ @^~W^yeСCcԩqWGv d @ 4(Ǝ>|x̙3'{- @ @ @ 7---mO^?!gw⬳Ί>}UW]{ @ @ @ <3_2=իW(T1cēO>|?iҤB-ZٯW, @@#h @ @M%PO?y52%@ @4@EEE:裏<=9jjjX@D\2.c=bƌ)I۶m.;(G1lذŋGV*I @ @ Y eeeY, [wW_}5?hժUBr_%\6=swmԬG @ @ WN;-kݻg U矏K/4-$ٳg[Tuu5WߌB@ @^֋E @ @e-[oe @ YY=n4 @_quŚ5k/M~ @&Nuq9j  @ @ @ZL*[4ZJ j1cƌmڴISYtixѷo8c-u  @ @ @rH`ܸqwKIJk >< H6,fq%>4$@( ~ T  @@Ie" @ PXuǴi 555= @PVXg}v^1k֬M6$xbСR: @ ԩS|x̝;7{- @ @ @ UUUٴY, +nm)ybԨQѵk4>ɓ'Gr־>h[.WҖ @ @ @@3{dɒt鮻 Z@ 7.~4={%%%-U@F4 @@ h[dr  @ @ va,z+ @ @\4hPm6Msڴi NG555Y, @$|8$gϞ޾}瞋_ @NO}{EGV{O @ @ @.P]]٭[ԩSoB%5\ ,1cV[mMAI&5 @ @ @ W y^K LIKr(t^x!>쵠0o @ @ @5kSO͞#A>8#}=8 䢭SNѦMڢuP8 @wcԌ!@ @(0`t㏛qeK @ @&PQQN駟̙34@,\AsLI yP&0_z̝;7M}M7n)}٬y_>$W @:w=Po>]t_ @ @ @@$'ieeeESB C]vq 'Č3G}'+ދK.$zI` @ @ @@L0!*++ӂvy8 8'k׮aÆEuuu\s?ҩB޽{Zf򉪃 @4m.i @ @qӑ֭7|s#g1 @ ٢u4d'60ѣG6& @|8p`L4)+s^{-F[0 @+`̙3'>HJuc=7bȐ!}]q)q @ @ @@1 hѢN=أ9^>h\s5iI;-ܲ*/u,^8֮]['@ nK  @ @@Kh$@ @C<27&H6j9l @H[bРA>7x#N>hժUv^@qŗtțo5ݐ9\K @ @ @ʲX@ z7xc$ o۷oV̙3cĈ4>b{ @ @ @x⮻JLa3& ̝;7?Xn]:u]{wg5<z葦k4u @ P?~* @ b  @ @ 3ݸ*~FݻwO3Zpa333b=38#-[&[ǔ)S* W۷ɓ'G@rWJ7Ϋ"$K @ @ I#Ժ#i| Ph;w#G}'+6n~ @ @ @@SO͚^y啱f^2"H+V?<6#:f7M 5M򬩩tG @ g4͙B" @ @ lvѶmYf%@ @@yyyYr e nn c+WK.$vyxZj#F7x#=X: @@> $ {qy#9=x$ @ @ @@uuufJJJ҆m&[zƌq)Dr3ΈYfe  @ @ @ZN`…qE j*Ə%%%- 4^>`JŔ)SsMsIGY:ɯ @'o\E @ZT`wLOb-  @ @"40;*++Ywu뢶v0@Ҹ??b7|3M]v1z6mZ^ @+k_ZZa#UVpJ#@ @ @hjirt-:v˙@N +~޼y{dɒ[b=8{ @ @ @5jTԤwq{6oV#Ќ>h\|銭[/STݕR_% @9/oD$@ @/@gΜ @ 7YI†nn +?p 4(nH'WxW/鯃 %%%}Iz3heO @ @ P Jmڴ>:}٨O>3ͯ|8bm.,%@ @ @hT^z)t.]_ߨ@. qڵkӴ8蠃r)E4 2 @'o} "@ @B$zqGĻロܹs7n\NCr$@ GW^_::t5qĸ @ @ @ @4G}|I^iiik!,0tHM馛Yɹ/:.\IO,o3[ @`4-R! @ P ʛ9sf  @ @.кuH6J9sҥK7:e7 o4 Ђ&LH72IzӇ[j @S`wN7[NSֽ @ @ @@4(R]ȑ#c֬Y?1F6m֬Y}eַ_~1f̘x @ @ @4w/R:!C"yA!9昘={vZޗ4iR!z w… 9e @h @ ;c$q#A @'4ݤ7:={fc0Q @ x{SN%Kn_*ݠƦ9Iqn,r8m]DR  @ @ @!P]]MSVV?VZcq͝;7FɿCbڵ" @ @ @M`ܸqѦM~((s9'?5m#ĦnZP5*fz wWF! @ ~!  @ @@ o>n41@A @,iӦe=zȆd+K.{.M/٨Nq| @"cK^O\E @ @ @.]yivR@gz=zt̛7/~7h[%& sW^ye$: @ @ @6^ࢋ.>(`ذandFa &M7ݔfضmۘi\w$ϔ'M^4^zu~ @ @ @CW^'Wv9nzr Hw<ӳēƿ{wZP^'Qx5TN @ʕ @ @E ?s, @ @r]`v֭q´i6:=zdckjjX@rAwމ:*oŜ9sҔڵk_|q$w\HS @l׿uo>nq} @ @ @ P'~߲~ }*dZ@ @ @ @ TUUeKKKX@ i&9xGc޼yqeMb{ƤIbٲe @ @ @"cԩi#GAJ,6w}7,ސK.ِ%@*x8b=W^y%;yOYfqר뙌 W_}u|鲵idɒNz @ @ @y"P췴4O2&hݺu|ߌz(y睸馛bvʊXlYy睱>D~+g  @ @ @(4M&DZo12֮]Æ inmpJX={fC~mN @S'  @ @@ l&ѿ47x#V^{Iʈ @ 9;7iأGt7 ghfx vq?~|$>%G?'Nݻ7sF#@4@w? Nܧ}/OhF @ @ @|裏O>I7_?Ey@ȑ#c/ƈ#k׮Y s̉K/4_W{˗g  @ @ @ 0uԸRt7xc1"8묳Iݺu7߼[_^zeڿ+ @Ko @ @i҄V\oVn%' @ @ޝ6mZohP췦fC4H`o|#mr{su)}_=أAL5:o!;/Ҕ @ @ @@ TWWgeu]c„ _"ǭul-nݺx?Alq 'SO=k׮mĬ@ @ @hASN9%K+L/i,Mn;vl:o۶mc1pF_DŽ#fe|Y, @ @4| @ @k$k\~"@ @|6l={L߮˾|K,իW. @ Xre\q1dȐx'=xώ6md @B۷owwr?nJT  @ @ @@o[ZZ '@`cڷoC,X 0`@6ղe⮻}kѧO ߲  @ @ @0aB+iEqꩧPuJ!q矟QL81.0;! Ozꕝ7 @Ko @ @7> @ @&PQQxw>ذ=zHuEmmFaO>CK/4ɑlt.Leeeu @w}cYOvWı'6C ԭ[7QߌB @/ (<$@ @%ȵ>(J @(f͚eq2$/Ovӧg} "&O}gSWZ596lXtqE\ @8㬳J\`AvaEy  @ @ @V@R84Ix%K'&M?xp k|At-ׯo<1{^  @ @ @' _qs1뮻\&snr!ߧCv\p @9~MV= @,Y@%K @RQFQF4Ce"@ @@b?7תU+{ƌY_Eŝw[mU̦m?k&W!@T$wN:)Ϝ932eJE"+ @ @ @mذFEVZz7&Lv[l2 k…GlAyѯ_ll @ @ @ >`a͚58\X.#GuΙ3'=.w-,Wl~NZ1dO @`]F( @ @@>o2z!,1 @ @Iyٸ!CdԩS'>mڴC~uq)d߿׮];x7bmp< @*U?pi} tP̝;< @ @ @o([Am2G v=sÇ /0~eoG;FK.oŋ1: @ @ @|X`AV@ƕW^e [[!<&M:D@kv=>5*Pvܟe=8 @U모  @ @`VDQM^ @ @@A lֱk9\6}\+IO<1vyxyJJJcO?4;H5 @իO? 6L9 sE @ @ @T`cǦٯ:T` (<*.5jT 80N>(srw[4j(= /Q @ @ @E/pmG}N;EΝ>g V 3gƾ_|Eo}jժU Y0]a&"@(r~ @@b(NȈ @(U6l:bĈ7orr9~F`ѢE"M4{'+P<o}WnŸn @@hg5j;9H @ @ @ 7.4h *PRRmڴI者0aBdSNv̴iӲX~;viҥK|WLrK|n-t @*oIʕ+' :ݻ9H @ @ Pf̘}]аaÊ!E!PjtG}4&O=P~ϵoϞ=ӢIѣso{%@ @ @Rݻ7|O-[;!0ԩS 80nݺѿhVYAիfoI ̈́& @ @V`---]'w6 @ @oh޼y6ïnvӧO: @`YM=hӦM|!%%%׿5>8Ӳe>c @Y Y̹lw}Vd @ @ @*q㲜4hu(5jğׯ_L81ڵJ~X.sύwѺub̘1  @ @ @ ^yxG8ԩW^ye,@KXpaq /C_ߤI}('kw%4 @~Y%yw  @ @<Xkb-L6lX|y0 @ @Kh֬Y6hȐ!YY;.q PV yn?/^;}+{> @2o . hѢ8#cРAp! @ @ @ 0v, ~3 E)ݹsxW#onVZuqYgEFb]wo9Ə_n  @ @ @Hڵk65\jʶu@q^{ׯ_4o޼s VI 6mZE' @'o}&""@ @Kř?~$5 @ @@H---]ur9R`ѢE8b̙A͚5ow}7]PBH 8پ8bȑ+hv @ @ @q(t@3Έwy'FW]uUYovt-6l{zQl @ @ @W x1|]v%=_9>`Pjբo߾ȟ#M2eJ# @+[@ߕ-l~ @ >﯄3 @ rjժ.ؔ>t>Irz5O;*IҢsm۶)))?>>ҥKT\Ȕ h߾}ziӦž!ߕmj @ @ @@-ܙxmYwy]~Ѵi ");p8cM6I"O3fL6F @ @ cǎ.,=,Y7;d=@! \pѻw4*UĿBK#dL<9 @ d~b/ @kw1OߌB @(f͚~1z厺v1.7 P!,X7tSlg9'߭q=D:u: @]jժOF5*oo~f @ @ @[~4hq U#[ą^CÇGϞ=cmNM޽{lѺu/ @ @ @E[n1gΜt)͛7_Ì!W]uU$?IK WqAm+LzeO2% @ d~b/ @k-Zd)Q @ @"P!C,wԊ.7 Pa^{!3<3f͚q]wӅ+ D  @X`u׍g}66l9SN1U @ @ @*cfR7!@jK.O>$ ^zi4mڴMr_9mY$_~irl @ @ @~$пx'ӽlA\ve?a@a \wuqdAqqQGe:V@wf)J @y @ @Xqi|IA m#@ @XYfٮҬ:uCDfΜGE,0a„8#c=LLRTRt9F"& @ /ׯB kNy-Z  @ @ @` 7.FzF@lqСC{h޼y>t6l /0rcl @ @ @͛]v z*3 BsBO tIٶ)P^lɓ'g} @,]%@ @y/;1Ν;7   @ (0Ӑ!Cr5W0(9`| P|ϏA-2},VZ;} eo @Td~k'.]s @ @ @`6lp@&M .W_}ulٲ\~i\y啱N;EF[n1`XhQq6 @ @ @'pצc\d\4rKt=窫:+!]Ѣ#@(v~ @@o_yJ @(>ƍG5~kiӦ @`ynsΉٳgԩS'4hP2Md @ hݺu @ @ @/pꩧw}&\Wvm?iwɟ\իW\xᅹMV@ڵ#w 6. @ w  @ @@ h"mY_ @ P͛7O\xq :tBVw &@@|qgoj׮]|ѻwYf_ @` qq-dviB @ @ @P`?:{zʼn'=\L2%ΜQF9s'>:۷n-l @ @ P<O=T/MAѳgIN&J{t%˹GhV@IIIl&M*N @ Z@߂O @Y )X[C yUd @ @&ЬY,仍ieN>}y5 P`…q]w߉',XfѨQx'W_M `jB&@TSO=5.4ŋ1  @ @ @@a ([؟ GuT<1ux㏏uf)$qiEroa{HSk @ @ @@a ̙3'N?,o9jԨm(>}I']ú W^8D`6J3I&kh @b?o @ ZJc?~,oQON @ @@Q -[ZZ\-;mڴ:`(,o-Okv\ve1|8C +! @*^]vMO=ãTC @ @ @P8>GY($5\3:vsOL4)x83c6+F}ra˖-aÆ==\̛78 @ @ @@a$Pǎ>Xg0>6QHnK[-^8}sύ/GlXnazyߤF @ (6!@ @y/кu,g} @ @@ 4m4*U-$)-OSwy%@@a =:=kbСi%%%qQGň#⢋.d> @pn8cҀϟ:uN"%@ @ @('o9b^w=n5jT|GqWDV"0ƏwuW~܇~}'O J @ @7tSaߞ 8"W΋zɃ%6h &M: @T@ߟC @ F y0y\+ @ @ ^{|8*.\1+T @̙z'oٲeo!@(d1{';4.:v^$!R @ @ @L@ߌB<n . &t͞=;z8#YuqeEiiinW @ @ @ ¨rJ,X *иq%`/ @ @ @@ ;6zQfͼS`T<O<1~>}zZcze}=zv!6l'tR/5 @ @ @` 1`4d-SWt" t /0ٳgn+"Fe4iR!@ @ @ P0ժUˊ$qꫂ] @ @͛gYi;5jæM'@<Hu]裏 &Ѯqg}sLy#@XVUO<{gzȌ3} >|Y0 @ @ @ ƏFѠA}DǎVZ~E޽/(7 @ @ jMO֜@+½馛˶u. 70;unl @-a @@VҠ/^>\Xx @eH2dr1Ԯ];rLHK >蠃bذaqW:묓W1  @`7]0qʔ)^{ň#V B @ @ Rf͚O]&'@` TT)Zn_~yƘ1c;}7ع6wxk׮f6lguVy%@ @ @V@R5۷_g35'\gIKJJkRgqƊ;gG+Q @XbKd @[oe} @ @@ buIӛ1cF$7k P8K 6i$xm6^|۷o4nܸp) @QFlL>=/:w"Çn!kHc?C{X%@ @ @!0hР{`]wݬhjaD/ʊ,p8w)CJ?5)@-g|* @W~ @XF~~e<0 @ @Hw]vHiirz@IDAT+`9srk0>{,z8ci jՊn- ڷosf @U.zŋ/-ZH=qĴQVy,NH @ @ .@>}رccȐ!qWF6mrYf͊'|2N8ᄴ(o{nkgt @ @ @_'KM .^8.6M(P`޼yq衇ߟ5WaNE`na$6a„7 @@EP"r'@ @hԨQv;M  @ @P5k:u2+0mڴe>@X= ]w5?_|<ԥK9rdt5TzsV @*7o1~ @ @ @b?oC ){cʔ)#QGecO2裏kMs׮];>ӂ!!  @ @ jn(--MO;k ̞=;o۷ozpjO/-l r]6`$3 @?/x @@R !iɅ@ @ P(bIC Y.2HU.0z8c]v~;;{>`wGZ: @S ^d䤍;6]/ &@ @ @@b 6hG&\>#ɓ'ǠAK.VZEJ?,7SO=;wM6$v83^s M @ @* GiwwuWT\d.B>}z^+iԨQ#:u*^O3L.\ȳ @_/~G @ @Y W7 l @ @*мylLiii_ZlߩS.m  @` ̜93=jwvdg}6m]_ @@ڵ_~O3fLm6F  @ @ @ mРAE'<@֭gϞ;"GuTԭ[܉ 7tSt!j֬O @ @ @ t-Ν;GV~:y$0~9w}7*|x$_,KK4ʵ\AܶWXIGǎO?MO^RRGyd1"XguVmPF PɂJi'O=35 @ @ @/+۠A 믿~zqwǘ1cO>o1:tkfEwߍ+"ڵkjJɼ[{쳁: @ @ @Hڶm_4Si/{G$=&Yf1phԨQo$ۡC @@&oFC @ [ !x\+ @ @ 7oƸ`6l2śɵS^  @` L81?hѢE$#n &v{%@ \[N6mZ^{-< @ @ @Xo6tR~W(nm&u?|h{ۗK|ѯ_8#9aÆqǦeN4X @ @ @"W]uUFժU;,_dy @ @7|Pv뭷Fs^ y[n%/;S5M"<\[Lb  @`(Z؝ @mf'i @ @B]v4h uY&ԩo R>رc^fH }'Ij @XYkV7?H,>#^Y4/ @ @ @]]XkFk. SN&M;9ssNQn8Cw駟k @ @N=zĄ 8H0_:t< J*#.| S,~@Æ cǏ/8 @@1 ([̟ @ @ YΊf: @ @@4k,򫯾1c,SCI9sf$~4Xqɂw\$?/EkEֶbl @U!PjxGs-ZUqz @ @ @ǀW`׏N:|G,,Go\.3fv[ouԯ_?:꨸{bԨQ @ @ @J`Ȑ!qm^zz뭫C`v}xkv @ @X}wy'jm:kELk+D੧=#&MפIx뭷bvZ!@> -\7 @b?5 @^{+d} @ @@> -[ZZL֭[77mڴC.xtAdaݻnj3҃\s8cԨQqɶF @ ?;RhDsɷPC @ @(\ߍ6(NS4IE&\OoѢEz/s=_}U W\۷Z\{>:Ž7|8㡇cǖk @ @,ɓ .H+))I ZNc<"p 7ġ~m:RߎƍdMˬC @`G @Blߗ_~(r @ P[lET^=MtȐ!˔p:uqSN: l/B[ [dQgŵ^5k\Ɍ"@ N:x'b5L#H's=wqZ @ @ @͛ӦMKslРAQ*9@*Ub]vI )_o={djժK{ԨQq}_Hl㎋|06 @ @ @/t-n:rF۶ma DYg-JO\IU֪ YM74;knݙl @b  @ @"H-`K/Yv!@ @U ).ٴi4dAٳg/5zec(t T> ڷo:tlnѰal @|ԩS$׬Y3 wߍ6m_| @ @ PPǏŋ1+[P`  D5X#v}K^K ,+ѣG&_hԨQ9ra' @ @H5r}vqׂ!f͚'K/x (bHѣs] @P . @(o@]&N}Q1% @ @4k,2YnYӨ[noFCHX;#cv_~9l' =YM @"nŀ"|^d L @ @ @@ 7. 2w]&ۡC/U{F^_Oi1vE~_ƃ>'pB4i$ׯ~xqgO @ @O`޼yq)d_wuN:G6m^HèVZ<#qΰ*HUR%=_߃F @O= @ @:t吻`!@ @@oސ!CbK%2i3Έ*}lƍǿCߌBE+M3_ukvRx*ĉwt%6m=:un){X`A6 @ @ @b\y1r4w=9昊,V୷ފVZXNx#ۘF`E T\96lN;z= @bE1J @{ウf: @ @@ ((8o6ޒrK̟??!Y8[oÇǟ()))L @E m۶M$|q7! @ @ @,q㲑f:0ժU=#.xWLWg}bu)g1}۷oyѲe˨Yf$k!\zix @ @ P|}Y\s5ibUV1TF1eʔ4-2 mڴ)<K`El43gΌG#@ @@ @ @bhڴiԯ_?&LoF̝;7\sbHM @ @@ l/ҥf̵S^  P.\?҅Ԓsm׎nݺ9rc @(dq_|1;?-J5jTZrŐ @ @ @\@UNk5X#]>YϏ?0] Y`1cƌ,ٳgkIK:㎱?;fOJ){HITDFei嗑 @ @z @ @@1 i:I_R  @ P묳Nlfiv}QZR]s5F~I{TXO<m]x≑+[Jܹs92.2~+y @*@?=z$n @ @ @ (f @@E\rNqgF߾}cڴi1tݻw~cРAquŁuI=P| @ @ @HzWҠE]TX hf͚;v,Wk׮s)[4D~n6z謯C @Pן @ P:t2ׯ_!@ @@f̙FZjuM(T*(r^x!ZlvX|Y:u?8mQ_ @@EիW<M3<{;ȓ @ @ r~+U~j"@III4m4N9xG#w_zNڪ\/O>$_l͢~?1nxc…厱A @ @)W_EݳzkVC`U |;}sVZ5]n*U0@^ 4j(+ @ P^@ @ @@Qr4~c @(z\$!C,5\ӧǢE:[oڵ: k۶m'rn @*@pf͚iѲeH~ @ @ @]`ر 7Тf$~c1eʔ~nݺĉO?=viX}q% /f*3. @ @y睗~saž/ KѺuDvڵ_Ν;W y])J @~#@ @E%PVu]Ӝ e~iQ' @ @8~mߤ3EVXСC6m믿hѢEdkm{Qm 4n8 ~3  @@C @ Hׯ_lVE @ @h޼yPiiiNOM:5ԩJK.G}4/^[vaQRR!@ @da?K/c>(ڨ\ @ @ @ L81-ZS XիW+IM:th 80|uܸq]wݕ` b]w6mڤ-Zjժe @ @ @X`AtIz_~yԯ_~$׿w @ @"رcIRW#@ @n뭷^!C. PǏOhzGlkذas='-X @Lf͚sũo3gft @ @ @ -XI*U͛G׮]GcƗ_~Oar>yxꩧ⬳J.D'\ @ @VM7CM'qK.+Df%ѣGr~58.۷BK@r-QF)_|gC @'P @ Pnmz,<`1cFԪUx @ P͚57x#]端5~N~E`qWG޽J Ojժeu @X@*U[oME|G˖-~-4 @ @ @e6hР @*dM"9#ҳΙ3'yx7㭷ފA_E4t_?6lN'?I5X#W @ @cƌ^zG&$ɫF`UKqGNG]wx衇\w+fň#bܹ1qĨ_~"p @+Z+Z| @ @ 84 3 EݺuWIH @ @(0~($dͅ?IN裏~>r)M0!?}o}ѺuI& @ @ PfϞvZFp7Ǻ뮛mXÆ >8FN|_GϞ=}w2Ye9h @=$TUPXPTiB " R+( bE:TPsrS<Ζ9;F SjN@@@`yGL/^(?4"   @@ T\Y; MQQQI88q"cىx@BB̞=[*V(ݺu Ν;eԩ6! @֬YO>{OBCCMߖ,Y"5k֔իWU_       Fs@U@,DDDO?-},X@^z%iܸ5(bcceÆ 2ydܹ/_^'< 2[qڅ    >|=WBӦMdu\/N:v/PR%پ}dɒE.\ !!!ŋ#GK&z m[e=2j(ZK9   >+W4J9rTǎ+ HP       ~8p@ ( 'O$@V >>^v!VI%Jwa/իWlٲ%u @@@@@5kJ\\.t֭RdI n4h;vC#""dܹ*m\SO=%'O6gۅd@J(!̙SΟ?s  *_;F@@@@t?l DzwC@@@PZjv|bB 'O&2@k/^,wq9eݺu姟~~@^h@@@(R,YD "AAAcRF Yn]@@@@@0'N@=E@t{W*z#G2g4h4h@g'O.66V6m$tMtDܹaÆ术Jr     /W6MX <M}P6c@Yd1߻GǓ&{@ٲeM_9v5!  A xE@@@ ڶmkWH    7 86I ݧNe ! ~ҴiSYf݆Zj… ?.'  !",X@ou]zG#i      k d@@@XbҺuky7erywڴiҥKRPb ?~\%KѬY36l|rQs@@@@@I@A:4)((HL"Dqqq{sĉG%J?Cw= x@2e޽ΓA@@ B#   (tܹܹsf`ץK$[l}   >&a8**')T)@XۉK :NoTG)-Zp)g@@S@'ݸq\wʕrUׯ/J @@@@@H#hJ)  uѣ9F_^֮]+k֬1ˁ\-2#,,Lj׮-jղvF@@@@2L`rYSdd4l0B)۵k2gG>+ǜ^e{ d\c@@/ د=4@@@O dΜY}QO… &o6mF   i$жm[J3f̰d@@@@o0қ;v&:8qDZuyR^=q-W|&xy֭8#  !@'X`,Xr瞓e@@@@@@p P; ~"4kLF! .~3g{M4}d&7o^)[o^Ə/˖-@@@@@otnք $6nF >>|o؁~w:/((f.Ϲ pJ;w@@x@@@pQN@ t@@@|DZjv̨()RH-w;H @z {ouTR2l0Сc@@|W@'ݼyDFFŋ%!!^d̚5Kʔ)㻝      @"`:2 @<#PD ѥu֦'aݲvZYnYoܸQ.^h7:F4if͚RV-^̙>      #Fͩ{<䓩 pѣGcǎʌ3(mFC%K̙3իW`B  >)'[M@@@@ U!!!&+_~eI    @zh_+i 륂 ڻN8a ضm<_9[ӧO7:uD_O?\@@ (R,ZH&L`0k֯_o>L:5ZD      9[ @RV:ĉ͛壏>>}w!Yfu޵k|2p@iԨΝ[ʕ+'۷qҥKٳ.籁    $%e3Jɒ%0*)-݈? :אWP~d…HE RLs޽{%&&&W4@@K nJ.@@@HJ@mYrj#@IDAT׮-k֬Ip!   &D۲xbiڴ/+q"i%_9R+/./tUBCCr2   6mvΝ;6iD>C      *PlYٽ{ HP@_}i7 ? ʶmdn:+W$%KJ͚5F:ɞ     X;UV.: z 2Dz-2:wǬY~v@֭eܹ۷K <_)5   !   իN4IVR\ss7e\@@(Q+W x@LLr-7WTInݚh7nh&ѝ={S&z hQFɗ_~)qqqnV:tCdbA@@x 4HLbw:o޼2i$i߾]F@@@@@E9rRbEH@@45 L`_R/^\t^ ’=@@@@@tT޽M˗//QQQ9sf0=ݻm۶;l-ZG}$峊X#@: hwWGӼyGM@@ަ2@@@@Ν`ӧO~SU\wǎҴiS26@@F`2qĴWA@KBCCͤp6m]vɕ+W YP!'Nd@ؾ}2{l/?C ~ZefA@@Ȟ=LW̝;*b     @ttְ0;O@|O $$DV*!ϟ754€A+Wk:wIYxZ.SɓG5j$O>\ @@@@@sΙNtE6l&Iȝ;wVPAV^M {T' cX@@@BP@@@@@ZYfӧe޼yҾ}t[$@@ >|X>_3@+د65**JjԨqMCCC%o޼r9q5)@nT@o^yo$!!>]4Hz-9r   Nv̙裏J^ǏK֭)Ry y@@@@@@kt삕í,k@`XY|I+zϞ=qFٰaYk^:eX|Y̙3kU^]"""D:6$9@@@@@{-Z$g6 ,X;{K˼Z?0~8`k׮;H22 17((̵m۶i"  e    ^={4~iӦeH#FWw@KUV/Y: pkN sH @jt"* w߹ \6A Z]C@@ {1_,1|0o6@@@.\X={WN8!gΜH5kfsJ1      @FDGGՆy2  x]~aO65Ν; z`BBݻ,sεՠ cGuŊ%44>     d#wt1C>)gСYnÆ eƌE =+W6~/]$ҥK{Oh    )J@@@={-4i'   x@%,,4'***TO@^Z5k&ug_w5Oߔ`r   $)ЦMپ}˄/J*ĉ]&MBD@@@@@Yv=v@x ثA>}Y9slݺU.\`7L6M~i[dϞ+ dsDΝM9rudd)N\ @@@@@7o6i-YfSzBw}T^*cƌKm:/J @@@ t   @ tE fJ}oH޼y#    TVM̙3r!)V5t1לDʕ+eȑO?/^\yڵdΜe   ϟ_f̘!ڵ^z9trہg}f&;nG@@@@@T@Rxxe \W@Ԯ],A_ITTlڴ^=z:Ĭcbb>=Ι-*:DUuٲe%$)5N@@@@H >Gk.K/Iҥ\#N:e?ͳ{ǵjղ 8n۶MZl}E  wU!   msH4i\xQO.f@@@p~0 :YKb|݃8GX_](Q :Tz) u   ͚5[!SNB';gϞ2fɓ'OZW@@@@@@T >|؜%K)P@I  @L|fy'l'Oq#;wX9rDtYhU$J*5.&"    @L"W6VXjS'-X@w.ǎ4pĉ%{vNg_KB@@    {OߖK̙3Eo∎ΰ@VYԩͣ] xT@ZI}ݢ -Zed@`zcE@@G`L-   x@2ey`d?z*ګ?Ο?>b@@[' *aw=**;3ujGKয়~QFɊ+".]ұcG *6@@@ ]ԩ#k׮w}W^~e&?.:tiӦrp     dKzD@Ȓ%ԨQ,>|Xt\py#ev7^\9;Xb1d@@@@@@_~]v @:GΝeq?|Rpa xFڵKv)W\-#!  T6@@@' ֭[Ke޼y)˗/7K^yɗ/_F5z@@@@@@ @4¬,k@@ CE͛_|Ynjk`kq+۶m3ˬY#+W k-$@@@@M`…_n*THƎh4K/$&LxsfΜ9eĉI ժU3~۷K}#@@4 o r @@@|]AR~}eǎwI-2[GJ@@@xg l@@PL2 S֬Y#{OrႣDtq+H ..Ntҥ^{ pvbŊ&o۶m{sy@@@[t2ڹs?`޽[{'_~5Jzoyh      mR ! &5kVUYm;rlٲyOիٳf oÙ>࿚Pdɒyy@@@@F@sӧ ؚ7o^{ N7JNd֭vqÆ O?%Jed@4ٳMã{!-F@HC!&B@@@*͛77]9r<#]    Gz7ԭ[ץw  kSA \bo>>׬YSVZ}    ͚5ƍN~/\ N~ZMfnomC@@@@@?8|ݓ0;O@vE.M4#v&Cc?HEYE,e˖ʕ+KJZK6     Ç۴`/h{V6f5eɒEF-O"##EReƌRR%53دݢ  J`b$@@@S`ȑҢE ӹ#FH˖-85B@@@܃&ցB Çĉ Dٳ2i$y뭷ԩS.jҤ ۠Ar6@@@_(Z駟}ʆ LW{YhC ji7     xޗi%Z@@r-wuY}[5˗ɕ+WD\L9s攊+ B <<    */={Xӎ_~YJ*mrѣG˘1cDBCC/{Wi ܌k1'Ot }3\@@|U`n@@@< #H:ud͚5yfꫯm۶K"   7&PjU \paWox8qL5kd@@@;eڵ2sL3 Nhg$-:t 0@fOݦ/      J$X# @tiڴ常8ٻwh_{n;u+W6Uk .luoVa@@@@Hj.RoDEEIddlڴnpjO?]@?"""3g-vv^!  ~b7   &0zhM58Ȓ%K1_@@@2\rI%de˖Dj_MԩSR@/A:tHƍ'|\tɾDHHkP]N@@WL2IN &o!:)gI&/,]vDB@@@@@nV;nV@@lٲfiժݥWʮ]\k0``sʕ+ܑ7o^;pŊZ-<<    i&-: 6m Ș1cD)ּ&}n_y--G E[jZ~=~SA  (-'@@@nBqr=ҥK͠w}W tWT@@@@ m`D۷OJ*rB 'N دAؽ{ \g'YdH2d~9Z  ܄@l̄ݺuÇ%..Ntr^zɸqW^mۚI6n*NE@@@@@4)RD4 @@ q̙3K*U<ŋ}vٶmrk9sF~w8'O;TwF@@@@ӧEO޽u]7| N?kJ׮]e˖-vV*~DDDed@j֬iwnݺuҪU+{   $@@z+   )0aj2zh8@)<@@@@h盋GEE]pvǏ7d@gtϘ1cdΜ9&X9rHϞ=eРAr뭷ZŬ@@@BN*3M#۷7xCF%=Pq@@@@@H@\\;v\ ,,,L@@ g.j2… >t0?{\,Νr *؁m&2erJ@@@@k͛'~)/RtAKdذa2qD{:tPt@6~z+@@ o=t@@@"""K.2}tA?C ?09£| bŊI[nh\r>|,:@lٲ&xWZ&ȑ#rQIHHo]J(!YdIRFמ~ $%~~[jem{_l f… uy䑾}J%V1k@@@/PbEod͚5 /ȯj'?ԫWO.M4 @@@@@HqS|" $/DԩS,Σϟ?/;vm۶`۷o7kkB;zj8˳e&˗k`]ʔ)#    ~8Xwہtyk)ԨQC>#qcc-PT)wA&'د?@@ iIڇ   ѣe٢7`|&]w|I5gΜRtiDTox$(((sY'ĽOʀIJeDozٹsݻW4{@F͛7-[JƍE^]/y2כ=}Y;:l̙vJ2 ,0;0a4j.Vpʹs캬aJJ*f@I=~ֹ^b5S-˞={7aܹsҥK.Wu5jMM>vZ/eΜ9r!:tCtl}>tI (p1Ih@" :䞖,Y"sv/vz_@Z>9iZS'6  l^P!'Nd@{t]rKC5=p@ݻe'    A5?S6m*u5k     $'mf  xN W\rwY˅ L`+ 7n4f So֠ʕ9r8%    C#G^>Cyt{N}ƬYʈ#|!!5[fM3^ԩSG(QŸL@@HTOʼnP   HW^1>5O?-6l_~0mMQV Ç7sjHfIzJt ;d#-ZT'{2?|c?hzW]QHmtbҥI6ٹ[o1cHΝS|:ɋN ^{+i:˗gSZ\֭|м.1'O fͺ}.F 0_^ZĜ&6luM0gk;uz'{NGO?g<:;}<{fse@Oo7?_I,o…ex@LL|2vX3ᐳŋAIn$[l]@@@R p};ϟ/;-[YV2jP`GYf)      @ >+[Y   p-Hڵŋuw!ZݻWbccǯuq&Xb.` tJ@@@@O2e~{ABjt>} ӥlٲ$  ԪU._`~@@ dJ   &зo_ ^5į`S||lڴ醛<'yh@ZAկ[oa$ЯEr^do{4t f˗˚5k\@Yf<8&9zzowNYmɵ NRjUȹs\M_6J .Ȅ dɒ{$AUT3fwʇF!   lR믿S͛77Λ7Ow      .mX+$2  Ȟ=<:tѣG ?ٺu̙3G^yi۶TVeq:_7Xx[ҫW/iԨ*THo޽?^.\hNg    C111ңG45J/C=i!snZZha͙3 l22@j׮mbv   $H    pc2e>@j֬)2fyᇥVZ7vt&i>vjA@?0m޼Y4h`WXV5x~;ɓ̙3.-jذ 2D5kR   $=jJ3yִn:\rsIǎ%s7_)W@@@@@@ZigOt@RJfqY߿_va/X{ӧOqL:׵/@R9Ut @@@@@pUСCW_5q;uds:z{>m.si@__5k^*o|v3~}ܴe!kާz|kɣ>RXh i&pr{J=د^[ädpC;i[n֌{1uV˗/pL>]bbb}?|'igٳm:2د]p&@N.A59`JOMP`-j ?AzB&M ^d[ w9&{RiO>={ݙ|}n ~v-XdʔIs?~-%d޽{e~b% 6բE YnݺV1k@@@ 0 |>7]vI׮]eذa2p@[ojE8u cͦ  #8L%!  DGGۍ d@@|W@ݔ*U,:ߙt,XZ_rEtN]ܓQʰ[bŊBB@@@ݻw˨QL!!!yZ25Ԛ]^=dʕvՅ zKڵkgA,nMtnGcccE~@@$H6}E@@@ :ŋMP\ӧO裏Ry5Ϟx$ ЧD4HЁY LѣGŋ}e˖I…2>4mTk\rb2Oݓy敬Y`:x,Adr%=yEqv]׾UPA&O,}Zj<t'xB2"ri~!;vE͚5ٳL2Eti+{(Xҁ;wvڴi#uo Pwy teՙyy/;2twtSON=NZߴzr/Sj@H(;urа@ ~ggן9sfر }:~w@ݺuXT  &h    :ҥK˔)SSN}*U3gJMpRJ4F'?W^e;dm6ozɶ{\;S5Rw j%Hg6uzhI _|QtӤ]vIZ=Ϭkd>YsZAmbnӦM} win۶M|Mc5~h H L<˗/hptzmug=n]Wz3SOAzC/x>z9שS._z_@WLK8[~\"gϞL@B pܹ2vXY~Ke߿L㲓 @@@;o;vv_|=&&FfΜi yDHWFwߝuR ޛ{_  ~"`  @@C͛\ӲsN kٻwTyѣGE~Y,RdI$e˖ך/R˱l    $.pI4hsԩWرc2p@5k̙3ː!C̜Yd I ԫWޭ~u!  $@@z+   7)OʺuD^|Yz!ټ%;uK/ST8S%k֬"wASrk.HM\J5rZ&Oj~)`ϟiӦ9O1B *Rrk [lgpXɽLig̘!.e;yCzׯ8'Mtzd].+V.ի,X`M+w@3     ) d@@W>C.1:u\޽[.^rnxu֙}/:tLs㎳e~8    O矛˗O&N} weO?e cJdd:GTwvZGEJ  o 77Z   @ yIeǎAi7n,Ku§A!Óhg͚rwmm_?AZ~.u5X&OimvA^*:ɰ3i`=۟ijl)#hxg3$-lt@5u;Z$z}݌3D:S>}i g%mKM`%Di@IDATtСdz_Ma% 5n84jQYfM -K'3~z>}M zzr}c? (~/j۶)~d@t駟˗]Ȑ!C{u)g@@@wwݻKnD'/^, s~>ԥf͚&~G={v0-G@@@@@[vz   y:uy9WE losnǏ]t^gҀ&[g`+ pɒ%%44y8y@@@@.^(z꜡$й:_z%3ywilڴzoƔqFW7$<r%{Wť_~3O6o<$|Μ9=ȡuBDDד&M2jvI޼y}7T=m,ZKw ッ矷3r־}\Kh|A+k%JpN w\rIҥoe˖]sM^SX3g\&1@3gt9F4ˉ)9rQz#33*U)wz|a{СA|?\^VK߾}'4W\ڝx>z9ש}}=_4@uV {1. J˗˸qd&uye>sY#  NФIݻWL">}tbҵkWyg}&8&!     8酅nGh9  +Ŋ3}ҟWʞ={L ݻw=rnhCeɒ%.u~ XYnMt  @@@%#FM̘1qqhrԩs@hذL0\jŊM T  3-3 E@@@t O?$:Fhߺu… \rX~ 0'| >\ǎ;VevMƅ#G䵺4iٳg'zx5e˖2|G(sʕ|߿,'u5p   / *U6}2ydYvD:ܭ[7СɓJ@@@@@hÇ'دMA@@2g,+V4{t̷{`kԩSE?9@V`]塡.dz   dΝ6qDӌYʴi2Iԟ:?G~w9r <`H @Z ԯ_Ks-k_  $'@z+   i,PBѠfZ\50mz& Ry3G\p.׌2% 26c+VZhcǎɪU9N~feڵk'3^s[is) h"ٺuuyL_x{=):q;ۥa݃NOI┴qٲe.Ջ8w)șiȑ.ՠS]qNnñ)wG>͔)4i,gϞ5c4ի>ttݻ_srON-bO뻛Xu:?" Kw{ҥr 0/\ {eٶm n{?V@O>}Pxq~Ҁ$@@@{"##͢~uʾC' # $ZN:Iƍ%888p9$/ʤIt@R*вeKOSz8!  @ 8kg`K@@ hpD8sLu>_Seg)v [LN `w0@@@@ U3f̐;y6@||Ϛ^ނ:adgw3_L*$"E1 f1,Š,"*aUT# ‚% jj{zf <ʷ>t:V|KW_}VQ1cƸ\p]xI f x p  N[9B@@~kԨh@@T)ֈj\*bxI~5sIx/vuҤIŊN\^=S[*U*>    @<b袋s1!6lo<Ŏotfn-c` ٳ^|ErժUhԨ=IVfȅb+n~z.ZcS@@ 7 kő"   o9/]Ǜ: 6&Nh,6Qh?SMj;gΜa+VjժoT[?0|nZGR)?ر#jv^g2ofƍo~n 4ѥKNNth$c"*~=}Ygw}f@>$a&M\rA@%}wLIpeƌ{ώtVJvC  ;ŲP=2KgM6eZ׮]dW?r=~3}$ްbŊ@@@@+0uTwJgr[]ΰ/k=q otP뮻lٲu۷,YқL@qGOH4 # 7WA@@@ (`[o㇒-Λ7N=Tԩ~v'KqvW:TT)&ĶJpy&&7 |^\C=z)ieL<ٔK/ /rQ{ի?YU\ _:vhY%be֭r'ǁez DyQO_W[UR=.& =D\niӦi/Lכqx8ﯿ[o$*xJ<וp6#vsJU%w]"l7 {&|"Iu8wj?ϝy 4իW۬Y믿Ǜ*Q={NEA1R)۷oL0 \_u?]Ig7/b@@@;0{GlȐ!>&L;v6{7lrvZ=Zj)@`+v1(@@ Yf$m(  D'=uGZF@@ $K8zɟ߸qc3ճ➄K*U2%+@@@ib')^{͞ykӦMlFZۼyקOt քb}ݻc߳gO6l}3c" @^x≦xm;'8/>@@[$[@@@B(nzKij|;KmUmԨQdgN׷o_0V;M@%ZpK`^3gpIy N5yk`NԨQnWV,`j۷c+ݼysܹsmժU7?A@@`o woɳ_@@@ a悲3Ɣtvg?瞳%K: T\ٔK.ٸq{ſGaŋӇ:*yGiJ)J8dcjٲ}vꩧɓcXI7笅Q{%kΎ=XoqaT.Y8W$8q;Ҩ.H<-O%Qq*N">$D$zEK8YNƿ ہMl޼6lؐ0uTcH@=imVAS- 2~x>ݻwݴRJv%]̨ߏ:(3Q_ڎ=l?-Z꽭ON׉u@Jzy+VjvK,iG}t`6OOW_y;^}U?;J}Y+%޽K"@@@@@ըQ#6  L@s1P %U_`q߲eK ZZL ITc=e@@@esSRX:t)W{1IDr-+V{Ǯz+QD9 '~޳g@@ _o r~    Ŋ^zYϞ=^ܦO;=l;︪:tqYfnKJj2aۺuDCuh MIM͚5czd}q X~wiK.:u'c$<֫W/XI.gژ    ;U]2eʸUuj;9sM7dsONxS\=  ڷooÆ sG~+@@By7   EN`.U%(Q5%lٲְaÄMWR8 ;vllfH?Cg     J=5jx @@@ J,i7v5kYti,{5\n]x7a\vl-s'rK\NSUb`oZjqd&   D'0mڴߺu*UN8ᄔaŽ+f{g]v椓NÇǍ_[@ ˋ)>q<;C@@`w︳W@@@5\7Z8^*p⟖-[ZbŒnګW@ߏ>6olʕ˴]t%?ʹlk7mJ.=jKDDow:*;vgVcW\q5gh'/&.zYfiu͚5z˪,Z&OX /4%nnРѿJ ^4 +߄:,[,"63c$Jw~ ڸ7+qQ>3]+^ۻݺu3ofs=u]DwZvIu~\?cmС[%6W`{gުU\R{}@%A^$`oۈ#\p*Ur7]wuVV-"@@@Wmڴ1Շ~Q_7\`A8gA7'ҥK{';ې@@@@@HI@+x%7!  ]=u衇z'f:rYx{ğXK ƅ^hj,deʔ@@@@ SN۷ow^}{ꩧvڞF`ΝXqz>jÆ ֫WřS\E  ʖ-ks\9@@<z @@@@ O Q>Ts[rO^uP$UOIE<(!KV[F50czFL+R'%>Wm۶ٮ]lرo5\cJ\^bEo3 mZ=N(Q"]iPG}%ݴiS`7n.b#`J @@@ 绤o͘1#v/y3ϸZT)oJ;vtI&,9D@@@@@?oyw  PMx*ᯗןX f9sx תUw_oU    ƍ~va؍7Y{g .|vwDk@ :ur~ĉIF[B@ȟaqT    @jJf`Y%Wp'0aB`Z}޽;0?]~}g+W İa2%=#2mձGmD2ftAJ+;MI*Qh[n[o5X|*RVf?遯DO?u ˕~Yq%WСC+wܽ_y (gw: Sn=.ŊN;ƏoJnݺY l%#z6o۷oo_~K4/۴iL±] -Ǎ   @:\ͼuV裏Yfh+ұcGҥK,ѯ+귒Embi6AL@~d@@ @~   n9s$vL5Q:9*ʞ={ cgΜoʕ+fpbܹv^{~VJ)!)4k.2,7ձGmD2f!Ag}V\pRH6%Jjz瞳o6L5%=E}%T%6[j,vVуV̔W թ{;07qȼH ߳:˷_JK/VT)맇᳿Z7 'Urp=:]V-9ϺC9$ߟFG藍|DuF}'> z]"믿ޞz)٩W67?{L@ @:u즛nrߏx۵kE@d;% ?HUL o4%@    PXԇwޮn۶>c{w_~%vWR`}Znm z{cGQU7o3׫W4@aXf-[̖/_TڵS.yqOԷN}WKf)   EO@7}EO3F@@ (jz㏶d7> ?#nxK,Oyt?^z@$0/ G뮻2v$/bl٨Q>HY^g}6`/}(:thl][^/֭vasٳM ƍg ,px≱%+W_ퟕt< r(jw xŭs.@i53w^QgNƨdsJw^݂\}vĿ_% JA>'y{뭷LEk3p@;S?$]Dd׬Y3ڵ't]vzɖ_xvM7VQ={4IKVy{ciHoW_7xT&\S7^袋jժUb H~/i^r0u??F-^ؔT8\NO6}>$*Q]I'd7n̴k/T_Z}f)hjVgF   I@T<~ϡ   Y?ޛO?bkkcGCr+zvC $VB`p\x0@@@$*tՏ]vjдXڧOs}^zI}u,ӆ b!CS@(ЩS'{ꩧ\`=˙X9f@@+@ߢs    p>Jq _~A &XdBS씃:%b o>v%ZUJ}cnx&+Ma^zg'VL+(:2eU֭.~Yx.J*dmfG={VQPdE |3r+b˗/`Ɋ_m|KT{ǛS[nYPK:ߏ~3Q\cN|м~uH\p]|ŶfpgYg @>ÕLwi=ŋ۱6ilٲʖ- Ϝ9ӆ(h}.O3@@@̚4ij߾}]J%4i}G6wjO]omۺt'As'LxHJߚ~d;??>h=a 7+>섁H}6mm.˺u\x<+|V~'O诠JXzx6vؤp7]wާ-[ʹi9Q],X]7+pʕ֪|yɞDuj?ڧ4h+C@dj,C@@ ޽;_5\@@@ ~$J%?辰۵ X1H0'<=bŊ۔y   KŘo~lj\rio7۷wV~aB 9:-s}饗{KP;Wo@ x~uo6~ q# $@ϔX @@@?xǎd pzc޼ye9Ii֡Cuqۈأ4{27SA%[SN]d^VV-ﶊ+tD99DwմiSS%%UpϬ:#9.¬Vu˕>/L1;%P F|N 'ݼymذ!Z{v9$跈=ull/!j֬Yvyٔ)SL{i{ @~>KWo<|.͢ӎ?R:vemĈnԷG.QG_8   WBTUVZe|}Ǯ*hWҟD>s1V^[! P`~7;mƌ)~?i+Wv&H}ivŋsu}::ggMp^[ VJpNV@vldɌ¯v&;(St}ER>dˢNu aq/_n^z=o!^i@@@$+W=$M@@H([˖-]&޲eKdɀHIiv(   %Id)رcJ*V+ȓz)fabi2qDmٱw_K\7U ]@'ӫgU@@ Г @@@@@Onp_uPRJC遝ds"QǻĤ7֬YeݴTxڵkt(=Jd'uAeZ@Jj%Y2K=ltj{vG>G^Ύ߽6kJFK.f EFe5ѰaCI ۸qcM*Udsq}i\qVZ&~1;{Vh~ Y^g}F}'>ۓY{GJN#2rٲex<@+澿N:餴aduvDCF@."{L'T0e˦V^m<9~@zP+k6irFL    @@@uZUEtdʔ)z9lΝW_iڵk{^_?m ݻ˔WwGSBɓ'l=no?x8_Y{k( 'in[}S7om]oΚ5ˎ@- ˪T`e&D@~twO&Mc6m͛MyV,0~:U;#p.psd;w)[?YݰIS<ܶ5ܵk)+z]{m&My    f͚ b6   @&,磾?^sPZxj%PU(   iҶ+TҁUSXn)i?̌Çۍ7h+WO41c ܳJuԟvaٌ#Z@*iY!=`G@(t$-t/)'   @H+UΝ;DwW2%Aۻ{ܡ$z^ թdɒ.xZݺu݃أ4Of=a„dSZKRJWR"ռ(JpΜ96o<`RIpkժY+hN:]vu/ڟ?X”4ZЃTZrXx?ZkN:Yd:or~ e^gyF}'> zM6lD J&uV{L) WO<ѺufrJ@A U 66Q‹W^y%HD)c=.W iڴۅ^H@?    AvF.U5^_ u_t[u̘1nH}g%jÆ ov#E`{㏷[*Ubc׿즛nS2_|1odJE~9Jڿ@Ru>:dkxp t~G-v} ~w~A׬Y3eӧM{QGem۶͔tZ' =dj}TӱK o^G}Ԟ}YSv|6j(KY @@@г^Q7@@UV5U׉W֮]? 7}ʮ]F}jժdD޴   @NqvgԈb(Yٳ3 : iocަM{衇m۶G @]_bEO> <'Ph9@@͚5-޳Eχ$͇/    EO@I|"?*׾qbŬ~& %YCQvZnb[r-PߏQ\|]=\SZeP :Q@ȯz߷;vUl\t.];wnट|ɤ-+&~]%_K.v'_8   D(?|W5k_|a_~|mݺ5v-f*J֭]0?T4h`{MΩDϫ'Z2eݸ~9re&MJh8gCJٲe@xAt;G7oߟRG_|Łmg_DҥmĈ7~-Ʉ=kDYu#`~#xqY{ fofҤ)&QTR֤I{'#8"ps9S@@@ oF  WJ*~ƍ&PzjSo㮢^x5jw\9f"  i 976lM zFH=P裏Z߾}Zjz@IDATVYv 8_QM%ٳgm&Ν;[%\޷zˆsJ,v)  P.2{ Iq6Rhe@@@@@@~;+ٜ=\ @~ 7p :4WתU+S Y (DNFᨣfe9T;JO۪UW\ٮ ꫭvځeL    @ TZGѽ?f͚K;}t[x)W6md~޼eZ-\_.t B9O!=c۷oj}gy&n_$=z0%ʯf޽}Fqi|.yw[;wt>b33Fueoո.Z(j7Q 'M$W^W)ŋN ` ,Нz6f{?ҡC_ Wܖ(S]J/ov~Տ$cQ\ڿ+$ﶻ+{"ϥ   E\_N(   @aPˣ<ʖ-[\2~L˖-]vԔ$h[AcwVZ=Fg #@@@17sqI\ %([nlԩ͛7ې!C졇-Q_3xR ^ꪫ2m P*Vh'tM4>S۵kWΐSA@@O5"    E@`޼yvYgEv޽{G> #_O>&L`]vu˦$sHJA@ (8/{S'|bgy)IOĽ$2e=c6~xߞ_wuvy8   L@[nWQ3f7|d _Ꝓw֯_ߚ7on͚5 5/$^; @TV\iJ`ճ>% MԬY30'_ d/ɒqzծ]uC%ݰa)БW)$%a={ɓ'g^gOj(OUniY @Pby%Uy"O[jUk /(g @?x8SN0 0     @ظq-X sSPJ  @8餓wߵΝ;mĈVJסp YB X>}r| OA 1c\2;v$[u26lUT)z[nu 4wف%Jݻ_o{l`    Pp'w+Vp ;N%K)p… ]}뭷MM84i7 Xɒ%c1dGॗ^2$6U 7ON~-[ iH <(s}IK1+q 2>}uQϏMk$ģN/_ dvo{38|7}VFɇ;xNi޼2Q]:Yti?IR@@@RfοS;k!  [@=PW?vZjWUVH/,Hj\_/5k4%V=w#  ,S<omT@(ۊd+G*y#     ET@ _yٳ3}K  IgΜ9>T%P~  bwqG mfF}f+yO6_#իWU 0   @;wv;M6٬YbּyL?E $,/0O@֭{XU9) @2^x!uv1śPWgoaÆVlYq*񹿄}֯_?SB`վ:_ud 'K-={ɓ]U0/ؔWm~-}FǞ"46~N Q`]v-NzJucwڵ͟w…~@@@x~˕+g5Y   OJ*ޖ+/޴7o״zjS1cFut[-y5'ִ?9;    @6mZL}x QF- k>ݷ~v3ΰ|b3A@ SN6~x[j}֡C"()# fWsC@@@(zy.^') t}QkF>}LW?xp@w 80l0;S}l ^Rlo_`v 7D9ۧzn&@zMmGVD "@@@@(%KF*٥7\hQ xOUy着iꞎz:u ҩ( PtRW^Ʉ7n ,Vҥ󼉜$T &xMavӚIۙ3#^Gy>@N*J.5jdeʔ V VZ :UFJ{YgeJw듨_>S`%/[,S#-5_]/فo}^Bp2`ͯVZ`&@@@FvegoW_} ><-B߂b~5*GD[zu2dwq9j@(pd:7}Β0ʜ  PH[_@@@@4lfϞ]CD(\s)0ϠALKx鮓iA?7@ |ֵkW{wurdV.۶m . q<;'?d:/lVT);s]t @@@(J8gyf+WT˗t{տssŊM{٫7WqI\35Ogy.=S vuĿ͚5 W_~~z:a$d(/VZe:{>CγJ*eZ'at\ڷ/Y$p~x`:фKڵ#  $LUd   䁀ߩl2ޔw.!ǫV={~ΝO?wJJ K{8 a_D2@@@ iӒ[Zti{'.e4,pm?_UVce@ tlŦM{B 9?@@"$@"bs      @VtǍ++W_}eʕjS# C' ZN8TWe""vZ;/+@W(ꫯv Tf   $PdIkڴ xSA9wѢEJ72[xq%V@N/7T0NWZ>& @ L2%pJvٸqDի'c?'KƩJ*oЈv!0oʕlٲ#GjgϞV={yŋ-Z6mĒ*>g+ᤦ)ٯαaÆ6h S߁ɓ'*؊$^#Fz1Ǹ9+S<߲e}Eq֭{-H .k箿ݻ{&J֛j:LS~wSrSq@@@bK1@@@  ᄆ$pǎ%鹪DE/I5QQ>8v,^`2/@@@ 5SF*NR 0z+D訏SO= RJy>mݻw8y@@HH̜$      о⋦͝;;vlj  y(]w=#)Us|JRPN;%v-b]v%En0@@@ -/)Xg׮]?JΩCU7n M(O?7/s%^婌l2jv4ib .rQGѣcL>=Ws̉-H*GbŊ٩ W_uLg_M7d\pc~d(3g5߾}4,Iש ${ŊW_erQw}U/ 7ܐRIS:f+VhuͲE&߳gO`=%;   d-@߬X@@((Oo(/7i~DߒjDsPV-X} XC'j   @Q6mZڱcG3fUT)u ?O /`wqGҿӶ3B _Kʽo92p Knݺ88(R oP     romGy[Ubkp H{uA׮]Q7k̪TzP4f̘a;w+W@@CC@@@kTDpK便K&mmǎY&(Q<@W8KT\ժUlٲy(r_RML<,X4h&fΜƆJjQgy&P׿]8ѧYZʴj.J/Jn{YJX^ѱuR[%qWtŋ[-6}qUF^zɔ_6m*l֭ʳ-SLo۶my~ܹ&ruVl{]Don JЭD%T .$ 0   o|"  UtҮ?@>:[J^:!Ѯ]Lo挷yɀG!  ]@͛0v l+p=|-bΝ?vi (Yټys3g}6{,UI9Y(=BA@%{ ~ +#     (رcNݻw[~LA @~Pu]ak.uXhL8zi7oN +ŝwiJCA@@@@JL՟|[lq A$^pMo -,yN4^T)*Uu z-\rd> #\5kw~0%Dqj㎳aÆz+ᶕ{VM8裏δ,ܮQg(ٯWիWoq :,ҶۢERnI&.YAlҤI.;Hf̘;s~ؼq.}`f.'{}oOugF\e@r֭[M gY%Zj<ԩ֭o^~6ly޴iӴ++禄[mEqQ {媾z-=zK^w.^^Տ_q=ߕx_?pdg;! @@@N ~=    Y ~Vn]W˖-sI~C*7꧔l۶/^jupIWjUӺ@@@ ? L:54oƍGٸ:o)={ 4X% p$ Bࢋ.r,+bC 1=߷7Gf  !{5kB#@BRr"      @~2eM6~Gk\@ȹ@mذaֱcX# ح( os}Ev#G$od4   {S :>CQUVeJf[vzty׮]}#E+*鯗W2eX$ƫrk\U B5*N"Zzu;'MXMSU  k׮v-V{(W6WC%Ϊ_ݣjO6yZjX%gi&SNd ΢iQe%}m9m&-;_9%Eǹ)'4SPnYf͟y`~%:u,T9]#}3;sL   $P5h͓`   =w衇=jOMoذ!a꿤{3gLtA{$[DA@@J@qϷgy=^tP`„ vd\+Scƌ[ƍs- DRJ֫W/{m6zh q  EYdE@@@@@@,VKXA5~5 7#)\|FyHaGޭ!zjUﻝWضobW/q{Z`}1iUԌ(P`ڞ}6jM 0~']vh     @'ǭ*UڤINZ+ꞔqS΍7ƪwf䵗&rK@J>꾝Q7PKܛ ziƽ:YI/i{.(#{W Dr)ۆek.ZIA94%^t$ *ٯ|vG8{YWZ|V38#[o۶Ə~G[7liK,fK9wRI<~:[li~z6yآ D򗨮S#]lYkԨq'Nh[`M|3+ϐUVŎ_~1oϣ//_    D'%pmF5[]zD5dIIkR.m&P|olbg}㭓yz 穧IA@@@ lz>?jz {5Tr?M6ƽy*~/$NUCA.PիRbt %YTP\ԩ26NƩ`HVtܣ/akd:tt6HƍMuoiӦMt m۶޽{@Yt" _JHϞ=;b:^N„/W.]ju uj'ᶕX */R~},7l$Ɋo/+%p@Ռ@@HIKx   @~Pb dd [jUs&k֬1т \MWP!ן~vcb  (nDCgz4$ Ŀ̋ES+N E3 2ꟳËEnqq!b$&ZG1Fn^̑<3??vgdxQy׬֬Y<#Aaf't}'xb7n{$9G  @b&a       t.5j_ލO<䕂 }=<yg0s5/ٴ[:"j\}˨k2 `=v>eZF3 eێs溭Txm O@@@@\((*qdKzU`qPľqO+b,h:Ε6 #RjJұc   @Q}")RMv/S}y/_nϬ$DyJlܸTϟl5Xb{ZZNQ@@ Wzx%7^|oZ˽UB]^GplzP2ne$3L`ANx1H$ŋ9zJeUu[M3ԩS/q$zvvF?zŪR@s~5wȐ!$ 0  PH[_4@@@@@Ç?ؖ.]#GkQBE  PL|ٰW^/y7'!%-E_dMHfjVDΫs 9J5u^nlGY:{ソgtmg*A(/)oNJʜӚ? #ȟG҃>zg GqPxaF @^C{ ^YhK@dɒx#ƍs=7}0    @43~TBTFs+G%kܛ0xPX5Ǜ3g=O?t;3ܸ?1q8q[@͚5ݬY:yZ^xa}3x({{֬Y&:棎:}]݆]mhN(a[oeF>}6; En߾Kۭ[{F7Rѱ4h㏱tߏ:f͚鼸Nsr~KmߴiS+]t..L/Ym+}wz*gM2g#FC⍬_gPDp+IoFwUKIIԋUո?.<^xu 9iXb[>iҴpƶ%2$Ѹx2ܹ(':t Q *F7x#*9r;S]t\UVu|֭k^b_* ӡL P:wl-[t|7駟ډ'XOC@($-/.     SBFo^xN9$;p6kժ JPux|E+)cjXFp?xx3b\7DTpώ?~9\g:cz`=QT=m[f4ϿSվs[2b轨r‰w*w׌krvn69r$~sȶ    .lIc~t.'Ga'dQ٬-7+W^w5kָJJ6MN?ᬇwxovc{b~ 4    o/u bѐ#GI޼)9J q#_Yg#&;y'u>/{49H_9oY7yE05yG:SG|%iƾF}D֮WnTE%hYdJrJJRFE;_7?HHLW^*W[ /    HG|˚y(           Ht_<2tPAC=$_u'H`%rr}qB7`O|>qRL51b;Cs'UgQe.R||-HQ pX/o<\>bq=Gj8wʾSTQe͚M'Ο?ί|PRb(~lHHHHHHHHH "KՇMt""ۆf͚ h ʕ+Ue˖&P1 s̉FN *HB\{PNx4Ծ nBlڴNٷ3aoҧOgy N{ŋ[z7ސӧ*]r%e,:ENU6 >3~1zS `9MbHRR<^p͛e˖-`׭['X  b7ॗ^!۠Ah $ oɒ%eX +SV.|L_+G Ռ~ϵ}vA e)eE!, ƺ jHHHH i@`B r`LD}K! $oyJ M1o-VL6(/-~ l2*Sns%= ג5kYܶ!׈)c1Ń]>!>Šsʩ_T ,Ŋ\pydq_ EuJL_^͛'3f̐&MڅHHHHH n P7n?vHHHHHH27}M̕p$@$@$@ţ_M&;voFƏ/۷ǮO$@ H|-ZBf"9|/pGA<֙`SҏV"J~##a50D|c"0׺?}zOUDTEPެ ~lne z8tP+aHHHHHHHHHH ԫWO=.gΜчxn߾}}o%Nj/h[g]pqB\r*w CıJ*ns(a9"A2EeweʔOeq9]NBAV\ q/E m?U=ܹ %J KϞ=CڵksR-:q:$'N#FȒ%KTK\l빐 V/8kԨıH_+W]t1m Q_O]{Gi$@$@$@$@$ 0dTRfS       {%իl ۻwoP1`#|AoH0{*0B޹!`#l1ź*K#   x"\tJ}J)n+~ LnBD*ݦp;2B⼱tn4 <5h?mL9m;n9{MrdZIUT~p%hD׶9Ɩ-zV#윪I귒M)g]" d"%Kt]waݛbs,$I 9<|\+T ˗O;wrq-^R%=:w۷o7gAD,(H~xHHHHHHH I iիd4 $<we˖z`ݺuM*TYJ# ȁq^囤"VA_bFҸ ~E)\[13BԔF${F@X ~+W6V-/ ɧy>䁍>pÛ@;!( #6E E2lXHHHHHHHHH ,YR :f`G.]vH;j(>|@Ǐ/B҉݇/C8$fn#Q"1YSg! H ! fQ')8A\jHނ$bŊZ8Yp@?#0O! ͛ˋ/ M7ݤǛ5k6AIGIHHHH 2k @<Ȗ-*K~QjWV`[1u!p.L碬[.aUoᰢ00C#  ⊘~#h5$֩u.AƌyCG@2e# "Gr?Mͺ? >~R+k!Roj$ $ `O7o\UEuDD>CK=#{Oi֬Y+ꫯ=ܣUBÿv!85CҲ4?k, P?Tv*|I\Xj<ҫW/-]n]}bu>:uJwn4K,JR.x@IDATgyFyڵkMf :bȑT~Νbu-=9. $/Lϖ##      $:IB&   $0x`9s>|X'~QF9X2!8Cw8 o>K]Xa OJbH"GPہpU&Su]^ ti( A)A y ΐ[HHHHHHHHH Y 4H & p7o^6lt!dU$"شiN8\[ *Ss˖-dV gĆzDSN"u7Q~-P!ĊH~C4t4cun۶"i&Mt[f qD$VFiӦ)ZX@(1` ) @D-)摷wFpljĒq&we|: H.CQ.a!+1`A'S4کS"6[%^p]|y D̔?q @, ;R^=9s[ 1!Y z 1t "/iڵM5) 5jYx ׵,^X:u$bㄊҞl7M}iN:n. @o'NzW^)9ql#(tAyD|@TԈuA|My%gΜyĥ=e36!^R%=͛7˪Udٲe믿j'h]KvcuqW $)&a @={H źI<>ZH  r8*?%KȊ+UݺuKG2< @0ØyLO>`]_ҥ"FS ?契 (*ϷT+(Il,8E9evCK,Ă ն凩Ecr8i?HHHHHHHHH)+ hzʕzj-weʔžjH$ozE]GOq{ K.cDfA" KLH6/&LX[S$Du:t[N ~#ě .Ǐkz&HbuMuS`x%PZ9RtQ$Bɓ'OFDXFA"$'^?THHH2#[ i$@$@$@$@$@$@$@$$/P~Cmp *}QAY~fۺ\Em3f̐ѣG˽kVN+hjWu ֪UKY#h"W_1bsvCy2d:by>W_ٺvUWg}&E{߶ 1c(gNcjժI~umo^zumc!VRzcC" @y8<       !СCL,~zĞ DiF7<D @f$?KÆ nYdюҶm[ 7:@s5s@ !_9S>$ N@}%|⋃C`$D"0g_ٷ/ 0w.nGAp'6SI#        Hx[re]BS'ΈSMʕӥy+X]H>nI%d $%ٳ  6L̙#SLS |o.^zrwJ E$@$@$@$)ǏR7~?'HHHHHH@޼yUZ%]+ 9ye3C) +%ŋp0Q:  D!u-ٰAdF{ٶMGtĥ'y܃H"\+)֑[$XA.`~AY$}(*9*U|)ȌkH@~O?TI)?|ᇮ’Zcx 8T,?W\RF ywK.r%hhT=tܹsUS"?BZ녛w?Z;.ǎӧ{g8G,798x`-Ubu>P^{5qׯ/~ɓǶ ߲n:ӧޓ_yٳ3s.3k֬LծM4q]oV|ݻ }MynZ k BNC By'wqY :ŵ^ $-)GA $<|I=~ df ,ӧE<(n  ?3f<ӿ|ȑ#2vXҥԯ_?̾@\8z n]JP 7n\.zAj "֠C̗1q3$@$3E AT~{P ٴIS{D? i8&9sS6IHHHHHHHHHHHH s@$B9R.]Ak)1i'H~b_IHHHHHH ȟ?Kh* $z+/9" #R"H_]j'ݻ˜9s-@@, cQ2|gP }U<*HHPyĵ@ˊ+t2ѣG˱cǴ֗_~)(H^ԣGAٳg&D+ @:صkH @ȢԦ/!@9+:uJ f#`-E \@3Ǡ=/hYHٳoI$+c~EއR>J*"U7LԿ @׻ o^_[P6l9q"p#GD.VȂpZR tsJ$y@LS |r<dNR +[ŊpJsu eՖuSH"D={W_~ 7 :u[oUrȑ02ddkC^p祥zXƍ w.]PB:{՗??[)KܣVNbTcu-9YlH a!( @<xGdС)s̝;W&O,[ǮO$sHL@"(FblQT=(ti:,{Ɋ$@$@&K/Bq3/rL`Q D~W^ ` ` d]tҧO>|7l}sI޽{%R |8F    olu       &1re$ha`:`,C)$vJQk۶mmw0C(1`[)R L$@qD@ˊvҎdY E3o`%  LDP5Ev"`^\lOX#H͚"mV < @2ȫnOٰaC%~B>u?Eq:&fY$ ϖs"˗/r3:ŀ'Xf+W|͙v"0sL]1Zj\39?GvѲXFu~j[鲀X-zhpiSk՗g Fbu-9zGrC$8(8{J$@$@$@$@$@$@$@$@$@$@$@qM {kmݦOK˖-%gΜqovB*5A1+W*M "8F|*& 7 /Aq ٹcs:tXǐ?Oԩ#RIHHHHHHHHHHHH yW/z!?L2Ex Yh w?ҿy饗]v%K0@lYk Γ @bȖ-mVyI~믿փڨVW__~YIfIHHH ܹ߅RȠL#       HxWpa]UVq`fq z9*S2=ZƎC^Z.]Hom?~' Աi\p38i͚5sr]3`yS<^z*z~Ȑ!2c ڵ>^P:prƵ^Hɺ$@A@= @ 4H.RA@LvI@#D"cGJ@ ٻJSG0% @rK.HOYrȶmZ[EP>Ι3o_W^ݶ.¦Mlq]⾌jׯΝ;K=I&r-"bu-=&. @ror| J]}2n8SPh$T̡? (_b &(H *T^[sdmv(g__1 J 1A:%K @bhР|w2{l-;o<=$ke(KN$@$@$@$@N`׮]ŋYfx        ț7@A~bDͲs a /<2ϣ#G-NM)X`T\uHH .YW0naBd]|qJuRawc  H8H/նnQ:@qRQ5D~]d,_1[JQ.#h) @~UɅN*@]v '7gh)q1~x3+ֹ-ر#@$8Գ.q ׹ٮsuzpud"M6ȑ#駟j߅A Jn䮻¿GR>YծzbTM4GĔX »^_UuEXݻW=P7/B\*y\vW E'>۵l7VHɺ$@Ab9r$@$@$@$@$@$@$@$@$@$@$@$W+'N}_J,Z${wv):s_2!OWҨȅb H d͚U?2vX- %K{'y捧/SHXbs۷oLϜVZe8\wvW1԰ EPah^tEA?˚5kq;vL BT~Ciߠ GyÜ9sZ֥eE,ǭ!U@k׮*UT-ϛ7O #:uJF !ڞ={v)bu-9zGrIH2L6J$@$@$@$@$@$@$@$@$@$@$@DlٲڹfKyH!Sb{Dv9 *)b*Uru$@$@$@A@KժҦMJ _(}YXTCI|s7:^p}. @<hڴx2rH/dP1?^o-]gHHHH~! $f ]!       `-S.^rqB82rWxsJaӈ{o`V`3oĀ1uc9xiS !n4fM; ~Q+HHHґ}T/r …ᅴC}yG{Dӆb@B#8 =z/^\^uݑܹsof2s-X@0*T"r !foR5!j\yHÆ|&* % $@$@$9Fn_9VA^AJYegMDPFOk)UV $@H 3W۶mSBͥe˖7:C l2VBĉl9_|Ŷ-|M͞=mYp}Ν[ 8 s"/B4YhڥHA4nv*H۷o5kִ-Gc!磳W_組W_vr)Sرcvs3gjQ;:7cq-=?ΐ d*T7K$@$@$@$@$@$@$x l0>+ݻww}i?σUU*enbx[6ӦM}*r  [~}H>@ nZ~fe5kL})[sSɓmmE[^};{ ׹IS?wk~J"9!$ i飝z-'NLѰJaٳ}1jUI+|HΜV   %PaM5+|:?,eovzԥMv/njrJ$@$@$@$@$@$@$@$@$@$@$@$@A@[oɃ>(?$,&MRfgi6mGg     "`-qٰ3$@$@$@$@$@$@$@$@vUL][/ ! L ؈;>}:x-!2BDM!HUnj@0e3'Or# ĊEV&9"BDȌ+2Q8)ʍF$@$@$vm_Q:JmDΜIQ|ky"M4n,r)u9G$> O͛_~X%<.Eq&=zT+ty.={ֲ7@Da v~G[mږ NqՋ.H 4Vő*<0v~vܩ~nj{_lXbh,|t(QBOŦOnc c\n4hյ^09K$dDcPIHHHHHHH %Oݺuuٺuyٿ 80dT"w^:pu|N-mjՒ *G 2?}vl/!2=w}]B$VB-~ZgoCEm|C!q[ nb^x@$ixh^mq2 u/^F&%b-IJ'w}W4yd}/4H-|? 8О;*Á1bʗw˵$@$@$@@6-oGy\/6nA1ussU"*?HHHHHHHHHHHH{„ cVHjF'NԾ\HBg'HHHHRE`+pHHHHHHHH@6Tw'EN0 6f̼ɍSjEs*.CP8Q26INڵS=?ŷ"g**,[&"|#ps=F\Wʳg#uYHHH@oWе'|ˠE7kȢE"*֬AEnIDfH҉rmQ ƍ?2/Fׯ__*V( TשPi1'\%eB^ry5yjժA?g(Vyq"飭!2htX"B{m[oɓ'>" y^M1[8 9G,G/z1h87neנu0K}jڴ̜9_oZdfk:Vx'|"8' O#D#x7K$@$@$@$@$@$@$@$ʖ-ɔ2?!CSO=_::ҥ^jLW^Nlܹ_W^ ݰatM9<!JxԫW/ɶm뮻NrP'-+yiѢݼym:ukFʔ)z< eٕ) -Qm={ ӪWW 1S/q:$@$@$8py饗dԩ89 @1(/r{g -iop @(^(Һޱc>_Gxրܕ+EP  x d8§&M2eN2tPdHHHH](Y3$@$@$@$@$@$@$@$@$ @ y"1_u)HD!́YV#/}\y 9j7DMKQה0KAo!Ҡ.ג /u?G;wn3iz^ldhݣG/uرC*T`9o6VגXcxG~'Ls7P 6L{AD`LM@=" 84Ds &Û;wߣFPJSb}HW_aoم/;&P?VaqܸqJ"y]7!ܥK//s\wʌ:nPM@ڼq{c ^Tj<}Sx}pq"˗,Zio4zRyD/\P'ժU??honڴIn*UV,an|{ŋg΋۷+g"w֢W"!VȪUt5jЌ"=Tۧ… G{S;P$׿ 89Ñ$xZzԶ!a+erkwٯ8 .=YD@L/AP1po"jr= x#(0 tw@.ݺٚ/@[E'GY4            \p 9ɓur]$uA;S<س/m %   H1VT)3) @* GJ9E`F$~`/Ǐ|PARԐMu[ץXKb}<|Ǻ ķT@ރU&xA8Sѣ_%Kyڴizo߾ZlR'VQǍx2nM9ΐuʼyg>L6oW'M $e={Bp:W_w#3O>{ɉ'lUda1cöHۻwo4h)Ə/SL ^:8_8*b!5V/^B2$ s(/({=c5⵸/`p}~/]T :ٲeQU8G?[%2 /hq~1BFᾉ{Sr,Q63g_qGc5k^h*iFc3!-j=s挾o5/PЩ=u4quܷ{衯^zI*W X=+㏢D~-9,D9ǪI6ȿq>\    /z ٷO32_/~ll7 7 A0陋 @5*,)'L?|pY`ل!HHHH &)o=8r        %Z`G" |!]uQg(Ra$AiU= 9Z *M7sN>Yr<#Z ~apSDLe`9rD} *Up @@; 逿FTK~A4[|zҼH۶"=K$fFPXbH={ѣY<Ŗ@Z: ™g=X.>_h f>P?j׮zDmGKD8Naeu"g6/<ή:u.xgTQ?/_Ɩ-[јq3:K.m5meaJ6sL=fj֬)CfN.Ѹ6N !|0\@}O@cǎr뭷Jٽ5I (ed"\@IDATlHHHHHHHJ/ Ap2Z[ժUtѢEA?ܹsO C8`©bVy5,^^:@<2Y<7n.[m˨F{oQ矷~.ZHn?$$3Ayӕ2ϥ^j)!>DR+qMA®XgԩSzֶ̼ l֧vFϸ7m$8p6[l9oM,/L?/yyWZx)Ԯ];SYK(LK(kgpO2ٳ-Z vᏇI}w @"0bxHHHHHHHHH q ĎP"52)˘wC^H 9} „!oD!\@2;͛W0TfǠjƐ>(W]uOhժU4QZOS9D :eK[nNҁHH23hC<Ǿ"*}nhS}%}{w Igk-((kHfXZ$[\G;4h΃n=&rLy@0sBpԚC=~#2RNZ7Y{JlD:G2+VW(Vj?" uE2XJuÚ۶Я_?3z}]߱c$"&p}}֬Ym<#GytthIرCCxG)>\^xa$VSIkO? &gIƛ֫WQS=zLc۶m3 M7ݤ~᠋4L)@Tzi֗41>@°PRg OΘ1Cn6>2CV@C>}H_VYxm|FVZ2l0iذ?#ѣv,衇U˵+^>#o;YHq1={fF~2\R;X[nkPnJdΝZwnE="΁g}Vv*HH'G}TB :sNR96{9cAX;/tg}駟?Xsk̙ZhmԨs6Ez-=~L0A'xBkՂ` J5Ѱ~F>Dre__юVȸ\{x}oy(rZlk(  &3hg _~eCH KEEݿD @*mQi(^2uHHH⁀I}D @gt(MbEŔm": V$#aHHHHHHHHHHHH2%~۴i#o/!g͚%CHHHH2dɒk- drx?os)& \|<D8K$c)l]܆>h#_+#4B߯dʗ/o%KDF3'-8A-r"JۆF$@$@$@a O+OWs~t yEQw)I $<+VٳgmD)z3gNAh7qbVCXW;Lp4`0+/_.ΝՊdhnB<oяgX}Lx6αXKuo֭i&۶Ċ5ʶ Mʕm yƑª^7PT5!Zr=mL\ve˖Uߵ Z_dҤI:O-[ۧWV-g $@|'yV#       D& ` "O:8({z>1 /h`ʕ+_r\r 12 6c2Mxcg޽xx5(TԖwyG֯_kZaϕ "k{¾X߬Y3yw ʛ "?i?X4ڇ0E;聈.͛" gXcZ{`Ã߳A[17pҥ; h 3r,{M]˾̌6l!wϞ=sʶ帶x ꫯN*I;ựcEƌبտ;i\}  8w&vR8$.Txd~u#wq$C jp~ܾ}lذA;BJ!xH \Opi gzA:U3(6>W#n_}F$@$@$@$@$@$@$@IG.~4   K̙3wq:ի… k׮^=Z'Ā3K"   @K x!5c\fG~pufg:A%2N`@uޭ^4ShH9.r Oi@0 -C| DR]pH6ҨcT ȴ-Is:0I] >g@,ѮDHtM{> |EGS"r":u˳=IH BD_ܿv:un8q1B,Ybݤ!5gZ@qZ-^y䭶rURźr"ާQ1 ȏkyAzIV\Lƍ_~Y:tfXg~w ;}їYwU ^-kUV_-xܹsg{H"je#5r~[ 77յbqqņ@ݺu9s={ʔ)sOcUr;SP76[دHHHHHHHH lݺ5॒9x pbMxZ7˚5m;0BC|a‡}`~!t< ѬctyɃ}mҥ_jh:~u\3dK"/ܹs'b\﯅'o޼yM5-(U44gR;Xt/Hqצ_?^Mo6ߡCBfڵ)k/[$1wj@3a+={m?tQzQ;+ⅧZƍ>-Kg/׿~XeuEq8é_}UfŊrW;^!Hts;+2y$!F@}uWE9k-- 'Ԗ-Eڷs)4AʛΣu]'z-[Hv:8^`t5{Y ;ruUyezaT=B f1MGyD-Z64֤I48l0dtR2wN[u1=9ŬNczӧOk,8jpzꩧ"r1N:]cƍzzl#`k-Z(&"'bjҎ?6=/ XL)^~ڂbLR`}wʕ+S|~ǂȑ#RUub;6`g>{q/X@{1,Pf.ym-ł\OWmQV?e!7㷊('WQɢ~|ў]. @"{  @/ʩz!AR^$\zO.4{D$@$@$@$u%KF}6H$@$@$@$@$@$@$@$@$@Nȍ?r81Jm1b?r.,Q FW(Fwn wXlrZ 3_}.˗B$kH_FdQ1"ǏVn:DF5; RF/A$=ri0QGFNާvXtH&u9cD+PʙhKo 16J?^w|k*%rCXHH . ַH䰕+W֜aHFNJپy2wU44AM|{>[_t;丆!#|nj?|3^}YAC p׬YSW.a\~7ukmOԚ?ܺìֵl7gNӗW_-(PСCuyUoV2~vaϨW2m(X8[~ D%p6f0|nV1ֹsg&Mnp6Mip;ӭ^-i=_ܾâ^څ I{Еzݻ= p79e& O!Ge<[xה?-/{sE$چi< (q%r+3_w߉0_ 㶈 BZ       gHJ|*̾ ]G G]vR^=>%lܸ9RF$@$@$@$+hTRfS         Kā"J2eRG2vֱ<Qxb٭`e:v 7_ʡ /ܳ>+/yGJsFFT) R*ľK dD&Z9L#spht?+b$99Iz/Xc},nϬWU+_Qin壏Db}CD4Hw Q9zD.$Ir͚5SKiȗۡCj;8r+jЋ/8\U|i\E~s@ s,g{}4E efnLG駟V^rqO2EPB8t!>Dk)1Cz}g>˾}?:uq@ xSQ -ZT ի͜9sԋҨQ#-N'V:|hB?8*| O?i_@՘uXgD0׋u5˯sCpBǫeq/+V&l|ZP^'| bvo5f_Z1 1„ '4Q,ufF5'fʕcqƾC`7{~ | zȱgagMv >+/ ݻwo0`<}Xh۠@JkTj|k7)ƍ8E w]_}^T\ 6,ѥ9s&7h@}=z:tzȄ gN :OO? ;o<ɒ%K]JT\~ oVJ* ,ҥ+?l       H^}UF$@$@$@$/.HBEqGeΝ:2zI$@$@$@$GY(k @ @|A3ł!f؞yÎ@gB>X= { _PKnݺc=&3ftCE6lpݍmۊ<#o@,ǎXp,! ._\hs=ҦM9|ux-[T^f .D?SY` 732JļZjy˪9u-yc{L d@FlRu2a1bc4? ?bieHHHHHHHv!=(o] QB<`/{c2d5x6 feu1g_2^j7Px__Bhj+PLfDq/o>}d=G| Mk_bbMö;6pC!D߃J,-9Czw"򋯙S?dɨk@`Νw^{E0H<~{=6 vyW^y%^:0 N0@*\=mÆ -[63^a~nСZH.;vc~N6M5kf$,1}o.=l`P$mu:~wjԉߪ:tPJ3bŊnYaS3 .]dz !}NfUN7Œ%K^5jUߞ<C8`n4wJ)yi0S _AΟzU䣏D>$n1Eʕ)$@$@$@$@$@$@$@Bpx~-$ҦMkN?yl޼9˶ @.lٲ!UC UTzW%»Vc@ǥ ̅3,O<*$@$@$@$@$@$@$@$@$@$@@,3O U\UO !`Ăqy51"ӤI|jm7ٶr1  /(Ңzf2WcEc `te 'c:Ds 9 t>(X>z_~Y⇌-h[BX(1>,$6 H%NFlܸ &6g'؆8z?~h N.v!^{syF rI7QxũhØˋ8ڿmɒ%"닥HB>H* ##Gt v#v\ < 9u-k;/ =vXyꩧtƥKj-Zū6デbmbl DƃO3iݺu 5~ai&]Cm{͚5Z/_t/4_ADʝʕ+M/@A+P W+VlLVVwBÇ1mݺե`k fT/JqC#b`hE:" 慾|A9s挋`|p~h'9 o갲ߣ>/UϚ?^F&x%лwo?~[ C"*L,ӧoOljy3kA?wiHvتNMR08䭷40{}(Gc2g,b5v.q·HG`=zTMfSN( `C~bc>>lR|I΃|t97A0nNr*UԄIJz>Rꤸ/$,IB{2 ׇ;_._bbjBT_O^O: ]Ys+QqNʼnȌgY"q"HHHHHHH";7.C$@'7o^=!G"?Bx Xܹs-)\Dۅwٸ_xQW,YDF$@$@$@$;0F0< DĔˮ Vؾ#^=֖z?[}:I2]U<|L1LBwv11$c{e8gS(#s 9$;;,*>p\7% *\ߟ1ES  X!Q1)? C|%KO0c$4\SP5{Kϟ/ j K 8        gm6㏃*/NCP* dP+T;28sb7]@!=mڴx!Wti;Lҥ>YiAয়DԿB%:zSW]J\Կ]otzic!JZxqCBj_EժUK jx]o%`6=`i[Cng5m޼5z "7G7n!8믿WBy\ﰽ{rufu?޽6VfϞmJӦM]-;,+NuK5\%M?]11cDǁ~(Mp @]~ԬYS1^) $   9ܹs~VH$@$@$@$@$@$@$@$@$@$>1cFDzN~Æ UV:&L߾}1ci$}rJ6%qB9 &`Wh40q:cDG xK}&^NvR!1.mDTC^,;Hٲ"?cfsHHHHHA=l߾]nE zիL2 Ưw-R@       )ׯS (ɓ'm#SHv!QRʪx˯*իWc Io_䣏>"}vmơH"!D|g:=o޼R|y3+?QgϞ={Ȯ]t݆8kʕP Jo՛`?~cߛ6mkӧƒZX?^}UѣG{'=ܣśpp};w[ΥC詧 QN:.(Z/;}9z"ICle^(}Y:uJzďiCݤI} >p?\j۷O B@/W\~ԩfn䍔ee^۴i… gծBwv (\ H>O/3f;qtA>݃b,YjLԋ<7;D㎉X#&{qWQR ox9ylذLϜ9^uΝ;t /W͕xܹs.ve;7lI|; [d<Ʀ^nܸebrȡZfVFk59B8TR6jP6g%Ro3 8a͜徤M@LQD|2NW=S\Qb"_+2~I[O$@$@$@$@$@$@$>_|"H`zTA:L' +q4G*U豖_{sg-TPt4^ x%9W0̩K&׼I$@$@$@$@$@$@$@$@$@$t xO|*yU(J设{ZXb0IGc c:0I0Jqτ:׳[A"?,*>=".+Rϋ &>[!   pbO0AmG<*XŋҥKeʔ):~Cճ%1zb,       & ] Y0`-Y׮]]~wҾ}{0$D-[h7n~BtFjT-. ˖-+WMf 6Ԃ,^X۾pͧIb -uV`,UTA^\_ }qA;aŋvڙJKN?F&9sF7q)QJ7..6tP- g cK.wK駟\PB ~E]Tk- m۶Mz҂z~2Zgk{ r=CwǎJ kдiSyꩧ\Y̙3G`$/h\4iyn¬5[Y):-_|ܹskr͓FY{uҟc;ם!  qFkmsRZׯ\-`g 7~!2qrs7}VZLȑ#֬\O|'9pO?q5KLgϞ]*W&\[`8vˑ#=)ۭZ2۾}cٳUi֬Ltd_wSH-;_c""UL&  *1v1[PH$@$@$@$vO+Wh?v @@l`?^~ydxJPA?@)fΤo0yGZYa31L&qB CS}&3^ /]-C8o׭XfHo#    H >}zyeɒ%3gNDիWO.G#_% Ç}*lݬ}n'KLBٳi&`$"! Cov}׽e ʾ^IMJ6s^wezZҥaÆR=zT-E2 "]Ƶr3fͿI-|Kc _YX|ҭ[7ի.˔)f5J*㻎}Ӕ%Ǣ!@:a yxnA8 /_^~gƜ9sdСrIYrZ֭uo+Nuor #дH";*H~㊚ 0~vժUqx7|-;ÿBy @X `ay1V$          x+Cܻ[5j?+WEqcQvj"gHM<6 0IP0q:c=|MNP^G?:WN=0Z'RqK$@$@$@$@"[n`g˖-\(!@(9QtHHHHHHH"5kVWSų\(eUV|ʔ)TX1Q3SPm^Oʔ)xci;M4_|H%ڂs}^G 9=E cƌQe4h%"O>)J <ΏExC$U=.kzsBo_|\t}]wImZ~⋈#LZٱc)R$lAxvm"1wq A~}1weA j`#<"͚5ӿkӦMkxe')RիdɒFR@K@.x 4ȥ 2Hҥ]+ ƨAk.]4( ,Z$ҵM_,C_HF& gb VkذuSߩϟw)W򡯟uG\Y'EҶ_*J zv1cFy7ٴ~(M4[oUW./Y4"@IDAT&^&`MBגuٳgݝw&@&߸q<bk_pyV̦޽[6o,s1Zh!l}?yl_Ygɒ'LOiɞ            @ltՒ%KۧO8Oq<HHHH =j֞'Os+$@$@$@$@$@$@$@$@$@$@$`'\w'xdʕri;wtAwQӻM^DNЯy8_61Il0q:CcDBL=聾׍tτ:c$hM^?%"g> @2J\+YZ5O񣑀$@$@$@$@$@$@$@$@@+W$ @x%(r\|!h9Xg`aǏ7V E}T*7N_08*##,~˖H%$_|fw}6W|'`ٳ^@s'>I'oۺukyg ѣGkbŊɈ#ܹsFZO>>槫RoܸTTI{֭+}uI FrfcU*lft_P-I'7cH#žyF}:HHHHHHHHHHHHHg9r+VH1{x@Ο?sH$@$@$@$~ǎ3د+$@$@$@$@$@$@$@$@$@$@nxļĉ۶mskժ%)SW?l)jAܮNDx#^6&(0 퉍&&"a̫>`, _=Bh;~\m[cl 8I.7m$UT\tIqyU,teGO tHHHHHHHH  `kYdXHI8BS_Ζ*Uʯ=(}<>~aR[/_'oDkDcRL"}'zR-]tϞ=+7oN02lذANHLYM>G_@ 5R}7xC>(kS.%!hu,<W. ,HTjׯ_?|^ 6tEWpmG=#2dȐHqǭYfuI?o(oF}BUkW\xhƍj9+9w5jkϾJ.UIQBժUe֬Y?D4VJ_~ɤV0;ikzN'ם,3e2/_ uy)HHHHHHHHHH7[nDm @R'ԋ)O<߳?:Edɒ:HHH"50uƎ3v @ܹ 1BrenwƲiƉδ$N>wK¾3g~ZjDCX˒%Kz$nr-W÷˗/^}Q7C@`9|?ٶmYFFaLD{)Փh̅_hL2ٓ"n{ڵE('ժU&c[n&ʾ3@ no*79(IHHHHHH"1L:Uq3F (6h@I>,OmȞ=K~cxuwߕw }1w 6Le&\M<7+6m +x&v(Q"~{~ᇲk.ٷo'+WNäTþ+ uYbEy衇|͞`P(g{&&dhժ.]mǏĉ}:uLr)}x?WR%c\~#}g5qw͛' ~Hb,]Tj׮-̚5K p4    G Irb+HHHHHHHHHHN /_p3fg\1ZpE(#&=a$1$҉ڜ3xtgn+Ңq"!i4v˖ u&wyy9ٲeܫx/Y`}bEbu> $Y|'wDN4I dy}|m\gӒ8!߱c ObzT\Y֭[g r8|ZA'OJ_wb ˗>}zwYݦ!}2ed ;sLye ;p?^o$Eٳ˜9sP&TPA֯_oV !={.OTZȆ "N\¾"76}Y'q/1}]L#oR(!tQDlD v @Ү];ٶm9d4i;Dk<>|5:9!g=oժUTw6p@**:bc,wرҹsgkrP%И1c*kT~uyWrܹK/Ɉ#t>D &y|]{`@9O6MVX*L$ AYkN. 0 ^UtkE\Oʉ't\)R0B"`o-͛7\\o4s㘑$P|yϥaÆr7nϟ_HF$@$@$@$ǎӵʕK0F$@$@$@$@$@$@$@$@$@$@NXf*4-` ПhaΘa~3x F/Hze~aE8K$@$@$@$@tFo&Gի^zb@iA$@$@$@$@$@$@$@$@$@$@$@$PxĉX"tԩce߄~%zL#Xԩ#ɒ%'%ǿ.iN]/V#`/ۏ=jzb o&Y9~xTGkO< Μ9c" ]M6ϸS9${O*UbŊҳgO[ʐ!C +-[aÆpxOnuO1EߦدIHHHHHH"ӧG8g 4L2 @x"! {myR@ geʔq["/}G;`tE̙#fQo]rȡwoٲe F-RJx?;wʚ5k4g+ܹs isdw%nleUhQϡö;_k}X_l;wNeCw7MN]vj._tuA)?}JY $@v'HVw}JnG#   <׮]3)YN䵒 D5$T[/IїPDa,haI1>ҝ3x VOHZԨ!.ȥK"G#    K[N{_~_X:ui& XB5j@IHHHHHHHHHHHb7RJ/'O۷Et;: 4p+{) ;D>3"`<U!xnVZf.)"۷o7;fW܉As<3fQv]sG@TjH"5){!7n?7ސ~Zg{%W\E ~DZ_-<6 Xo>ޖc [H$@$@$@$@$@$@$qƎk OF<?33GoÇ#F3xQti%.* s/_.={ԢXswyс%ڵ3 ٶmtQnݺ ÄҁM"^:/|@Dذ >v뮻8glLN{@#rRLNFCaWʏ?u{3]pFٳg\ Zl)J֭eÆ w8 '   'y1D$@$@$@$@$@$@$@$@$@$@paKqL%c8{F5I$t` gj;gBqhHǫiBU"Ǐ'Ml5 8AsWX!>?u<rZ$!`-bAXYľ+l        Io ȨQ\~#YdҬY3S JsΕ{Tt,Yv۷oWSTe8p@;TR2|R%! 2d[=qI] F$`ZtypN`/Va3g}Vzu3=+xok.-]^f=ʕ+.\;w<{ߟ`=+ C%ߚɓed͂ƾZ ZG`>qFAfrF?x]V;->$=wݺu/`>.I_'xB?I&%HHHH ;vtb& 8@1LC$Rc:t ab>uc=      ;ty]vջ0gW^yŞI~ȉf3IHHHHHHHHHHH ZԫWO$@ׯףO4' ,Y%ucǎ ~ʖ-Bb.8|hذK>MvAeʔq | 6O?Wti@6³(d\H!9I݁T;wnׯKӦM%ľK|ٖ^~z @`g3fC;խC*U*NBYJntQY=zt0 u]:/Q"g̜9O;Ss "v.HTO%eʔSNlxׄ6  *x:Աt;We˦'y j̙SqBybs~Qn]>nm/xv-UT\uԑ%Kj_uծ][_+5k֔%Jh_LωMj3Y;O *XoGyD2eʤwqfo.bŊ+W.]>/_^r!*UP{ a 2v<L_xq3l- x7jkѢEk6'޹;6^(`Æ Ҷm[݇ ( ժUɞ=o7cBoѢlٲEWjU3\Q%$ RV-{q6m\ơ @ =zt"o޼:WHHHHHHHHHHH JCɊ+ߜeF20 ى&Ӂ1L׏>ucBg=PUḽjX0HHHHH 0}2p@CJ>}t\S3+I@h# $ l$ @zaPY3#W"qE(WZ'``^gРA.8ɓ.iN"E 3j?#s;RW4h ɒ%sq>sٶo ʕ+]\v&r_~q9"mڴ:pKbm@:!>aw@0>|H1p7Uqi$@$@$@$@$@$@$@$ɣڵklݺ5>ϟ_{1]iȑ#Acǎf9n aglFrD/#gOeªw 5M {x̙Z.cAA?z!7n7ړ&M]ùsO>q+wd]t~Xݫ'?O}\rTY! vׯk׮ ڸqcMHUreYj)BIO~',4H+//,۷ϥQ8T6{lpޗ:uj<{S +tc㫯<6nh/ 5wZV3ڊin,ҟgh-[&V]?n?ggΜ)0\C9Uu}^kհ kϚ>rh$`%{K"Et2D_xk cLaD @ TWC"j(- c Нha1$t659gxLf~ߋq4     g@2z+Ғ&s͖ @@P̙3kΝK[oQ)*l*eIbjߺq^zb -;(Znet]%2'xtVPwyG ƏXnO{5jpR揄uG~,| ݻwwquƌ!6QF8;D&bDJp @%Pшܦ@tԩ$DP_|E3AѢ$6 ӧO;x`b;Ph[?Hw߭ۉ}tYž~W7v '_z%{vzj0KBԛ ~ .ٍto{ڂ{Ο?!V;rH)XjO.|WdI]G/Fvj rɓbqC`7ߴ"C Gt9qg=(05jΝ[?kA)Scv DRH![h7 kڵVo#F&LC*&ڌM6i[,kAc jkjժNܻwo-"ݾ}{1ĩ }09cywm۶m 6^oͺY1ֳfͪůWX!46˗/~c05>w @ P7Y! $y͚D0iu60 &Nt` atq:3|XKYc4     S>CsybN'ҒIl% @@P5h D/fν> #{eR5y|'tp]}dIGڭbɚp>+iH!EFfĭi3e$UV5v#_|!:uri Y:sׯ/ϗ = =}]}lٲ^wħ~Z:t`րxbs`s޼y2tPcS/wnlꫯ]t/͛מFk:J7hI+/^\ M0M>(WJA>z$ |ǣ @6l,X@.^(;Bjy1*{1)]tC O.]:SNŊ-Zܹs;I<Ϟ={|M@k1E'՘1cI.x~n7[3xGwɒ%!ɚH=O=~_E?/[CK_~YAJ*6GO}.\`o~AdɂM-6 #G"~=XUNQcpT8TwH$7,cƌƪd˖M ^'|7nX{1^2+_k3Ho-?jժ%5k#O /"}m!;RJiGyDwMj@q4    oxv         HڶQ4EO5KF.I$63Iw40q2cDW _ ' |p:׳|vPiSqc{n L6M-[F$@$@$@a"yձfXmCNoƌ:Xk/Jb/T"}Z~WVM<(˗/I&[7C<! ʕBˡCt cjk)Ȼ5`wHa څ'C'|RΝ;'w^X]~\ |MMEǎeĉh/&[zmsӉ 8׃jEE &uTڸMuTB. @5k]vb<ƘQ \ AYȟ?Gfͪk=e'{HYoE=5=GY`KFxlo^O AN3ЯQ|ԩU3g^>g52"Ċ!t믿jb?xX7ٗk//T7Aj}(gd?U^]B8PaRkZΜ9?F`Æ 4?,k׮ܧi$@$@$@$@#`]l>X3 @PCD;5QԸ&Q)DŒ'" aXѺ&&Nt&N3N\G?F]5~_ jMq~"O#8{C#   `(nٲ7{l='u֬YLXaGIK$@$@$@$@$@$@$ ``b2/$ % $@+%rC\A!`B .)"eˊ?/" }F~.. m<2`3~! ڄ "'pt+Wn\zUf̘?fb+dAvQbH=zHC.@A^3R nLqwy~c/YDJ,i$Eղ_~Z嫯*~v8cU_E&>7*gSQbq891'w 6HHHHHH@Yrj˖-ZhScܶm6-hZJ*T ۷oCTްnݺ>m/_^~cҥ*sapa3f4V_N0H)*ƳM0zge̙=,T;vL ⸯT>{lm_ .fGm:uJ֭['ժU-~ s'ksry㺂h|OB6 Æ 36UPQT 73Xɗ/KΞ,vN;w˾C+V4׍)$O͛T h_e/Rvmsx/ mVj֬)*Uz/ ^Ӂ`C/cŋ+VÇsCnŞאn#6Ҭ}(K3flڴIòw2i$k > h$@$@$@$@$@$@$@$@$@$@$Uj1e-YEX3IB1.%hk0P/c8!c: E u#>Zb H6"{YO$'%i-# ^ֹhۊ7iDO D6vmI^} @{"B/Ԅ()R /'O&iY4 t,qq'1C@ǫg>xW)2Xh =z|?XfnoϝFZ:u>trJ9v={v- E;ӫN3VQbG'OJ bŊCCp 2roVįjP歂甪9>6'-P&Jkr;@˷m]M}'{)jNp'|r y\#       h&Pti)Y+Џˀ&gO2ž|>ա… 0`w2dL4)QUCs={$pe%_Jҥ1뇡oM:U_cƻ &ȠAL-j# oV@֬YmcW!m#KC31& t߬06m۶/C>H,Y]珥:t쌑#GjAXjcqJSڴ`SDuC\dܸ8Qd"sEI͚5̙SCM$Ոs|h$)6>L[7Q|LFDE\ C ڶ}v-{uLijM6ɘ1cJeB%Â(ԋ{j!_|Q#6 ΆY|4X8|'47#V\_H~l9"BÇFIjմ[nuq|͛7\29aEŋw" ;vqS4asK  7|#n{R̲Uoʔ79PJ apZhaKs~'s+$*ZJիW]/Bg=$@$@$@$@U7HHHHHHHHHHH DJȹs"kֈ/7W6*$ D[ b:0I})RKpXmבwG>)SDzp!׼yE-)W.}$;w Szu駟:U% "ys΍6Yp54idʔIζztH{            X'#G12{XorD6n9S/ΝET=\3$@$@$@$$<7q ߂E֮ol$ ɓ'kJOڷo ަ)+S*b#zzw1L:t,^XVdIi۶mb(/'y]իWA C{ MHsڴiFv)]H@XAװ]Jڵ}u&ɒ%٬"my.UTIҦM.V*Yfi#FK.n9sF Z]^HBG+f̙^}w@4ikPӻǏ<լYo?OklFpZ ρpΒ%6U7VA`~nSRJ%f͒3*(?Sձ\    7( HHHHHHHHHHB@ )Q"ӧ>ᅦ%VJ$@$@$@a%py3~T5f:IHHHH\4SN*ɓ'Fr풙QI eTzMIHHHHHHb<1N6b믿D^p -[&֭3SO=<~w!)y ٰAWDFAUDʖQF ə3nB ;vNT߾]tqhcI$};Vv$2~7ӸF$@$@$@$@$@$@$@B?>"y9Df ,(}$M6ج͛7=ǎ֭[{ݏ͛7bŊɮ]  ÇeϞ=rJپ}>2!RjLL eh߾ g={f 3 -]49(($sqo3SN945>sLxE2epc…7oS0GbW_ ֟4t:y=zcOCX:o{%K 6Vw~-[]w:HSu>S :f= 7"){։&֬+/5k/H-/us:u|b:*U8:t?u]x8 F>|8:t耿ڵw}gH@f9" " " " " " " " " "V,3.̩Ӧ9&fBiFdӘm1ۜJ5$z<$No"&'Z͈ u饗ƥ, lڴ ƍ˰ݺuGamF`;9)z|ߞ0d۶t=j6vP1 %@Ќ~9Osď;d(ŦWXo q;*SFF9xeKݻwcʕ1kԎ;bvl8ΩZ$X##{ek:͉@f٘4ȥ!7hJ`1uT0e7hƲ{[n%Ӽ?3Zl.M Ǐ;/ݶXI}݇ݻ['˨Q|/K/&K$c3:Kil}A[fb"]v/Y'yVdؗd*V5uݵkzpM7ݙn fͲf/矏|ks۶mnO{m y << 2h6?DHH3bshTL~Fݒ/a0*=Bx'84e޲e5u?n>p 7XkעYf&;3g4hf]$ [f< K.K,E]B ^F<͋@{rʔ)Pc[]@ l޼WH |D0Z0z4pU/esY׮λ|U;+# ͈ԑ"'1r:D_y579"~_ Wd~kEhW_}oJ" "S pjN3{{>hO}.]PTk#U۝;U+z,t+H4>4,{)hhregO iJ$ `ᩧ*U8b[Q`teIUMi۵kŋ5, kgϞmM } M)4er#Oev|>\_%p}6l-Z_oyY/h?O>dӟgyNiIMh-ߝD&{qf?{m׍P~ݼ=y<ީ\ry7dHqP5q/ }gΜiM+:N4 :*Vh7Ӝkk>-7FvN:v7p>|8Zha;YY]ΨnQFX|9Zk̼4u~i{5;Hs^h"/~ɃSNis-ߝ;^!'\&UaF^oۖ\Cr|ĉu4?Ky뭷мyswn,h>,ϟ^"" " " ")FJPĊWț)eJOgӦŪdWD@D@D@K&f6jno@07gD@0/;|G^?NF" " " " " " " " " " " " ٟMf4"z)FK1ҡChѢٿIBy'p ݈у޽0"0@ni%aT%%Kf͚V: W@t=JJD [G1sxWnk:tʖuj*" " " " " " " M/י#4ٹs5R5#)h_ϐ2@hʔQBDDǎY(sǎ L۷odž ,kA/_ޚv bٲeFw QH9{{C%2j(0 4Hwjg^ښ8\r8Ә|S۶m͂K**Tp?2& ٫\\Є/32^~Թ^z>2˹t<Bv2Jxy`T#G0^ GaLWלd'4`<餓lNJƶ( ݥHbSm\IXF6l!/͎R(阯^M6UV)}S1ƫ˙L HF4u2e5,_b'cUU'6\ŋPB٦]j@"P̙@Ϟ~ ['t t X!@@prNu=s&ہQ]-[颋>;z-&1c`'?Ğ={дiS|WXbj6(:wo/" " " " " " " " " " " "Bnv_mǎLb )< ~cBg|}1{6ЪP2УzofD@D@D@D ش F@2RG5ke/Hi;vDJݺuKae￧\UI@z{NƏJ 0rH,YVfbdS[/_>PN.`T^#-'C,ѹ3hёmd!0op@J>K9s3e,Khț7/&Mdg:47oތ/wu8o8 s9Q= ̋z"|߳T)ǁ^H`j8q/qdD@D@D@D ؿxUKs^ npݠA*Wvh*" " " " " " " "8ROm%CZUJ@zN|NƏJ Pti :V:S@ P$l?0o" " " " " " " " " " #д)Wsrڻ5 S04=س'vБE@D@D@D 3۷ÆjLJli =̘4hѴ]D@D@D@D@D  ,X~!VjtRhw*6'G9on/" " " " " " " " " " " "rnV{カcǎň#R ٽ… w~;0kc0NrgWEdw2j@N%`I0}:f%;cOW\@!pyӨQTFKN43fLU(^xjG']#D y|Fnk4 ݻ'OU&~_KdC"pӊs9y9 k4͛74n C aUUD@D@RuE^}:ޚۚ%#Ν*UܵdgJ´iP~}o;`qs]x9۝R5HD@D@D@D@D@D@D@D@D@Xx1(Q8)3i̛=Q BS9r_mۜd^~Xa_{9ƿ-Z8wŊ<^j@"S8{o '7ow\Z#" " " " " " " "=\p`)Qpa#BcTh" Z iUI"\^xԬY@߾}Ѷm[TX1*ڈ@o@U_D@D@D@D@D@D@D@D@D@DGzu`H੧S1c~p6'0qJZverB3" " " "f&M~ؽ;ጧ:uڴK]kD@D@D@D@D@7UGF;SǏGjլvnyi~ϹTKD@D@D@D@D@D@D G8t^6aիk./_UT%\&M裏Nhƍ=ztuJ*{K,1ơp4k 9/@Plh޽ȓ'uѯ_?EWQdI|6c4 p…xwb}S~Aqꩧ!_>\j~'P"JuyԮ]۷1w\r3uW_jLųΑruf͚L Q Z^{ +W?xt!]~~v 6Yg.|=\kmL筷 IhڵSqTD@So}x~l=I} ֭NM .7c[RFm>1cD1-[4rϡey8wxᇱo>{vk#@7vlud`.N[Ff͚\9_#[ .ʥ!1'M@ 8x1Vڻ1eh߮5" #LϷߚd/_%JX-+W]uc4&={e( #xG2Ҷhꨇ}dR3=(ZjRnBD@D@Lsα^m۶={Zo$T$==FNS dFM7݄KJc^Mwt4׭[r 1i_?MPţ> 2f0z-V [oջ:*ˬqƶk·=z3<]N<zSO=eqGdĈ<δo>*fs'LYfZjA~_{ݹ Mۙ,xcii6,n6cw؉lF QVc̜9*THz$X礇 &/1vX&,_gLO? ̞ s.A۷;M1ڵ/L~SD@D@D@I<2yֈ@N'н{w+l2fǦt)D@D@D@D@B@fQ$)uaÜ~_yy|-[sѲ-4i6$s ݛ>[0: 78-ֈ@2HCY-hj|_~e\nDxj2Zjիy?7nƁ\gG7Z:dӨ83tv'7 \FE]Wk޼լcsTslH"  кuk;V駟t(oaP" " " " " " " 'ݸ]eFmڴ~'sMpGc͚5`ڵkqe4-SL@*Un)ŋQV3ZIUvlcԩ|M(UTF{[JPtia͛m6{3fQFXh #_|֌wڅ+V`ܹur@CZ9a"#he&p:餓+W.4sLe}f\o>c7]v7[O>;H5MV@&cժU|bI:'+K+8?̙իW]Z \|F> Fx=9G6?OoT'ŁƍOs" " " " |)`EɒW-[:/ǁ  p#a K.+D@D@D@D@"' " " " " " " " " " " Oਣ-d0~-'1:Sȿ)D@D@D@r83tӦFvhR !'Ц;PyFD y $B7͚5RC~]66l؀ ?3ѣ`f!0shF:ds,9Ω ꟻ%ojrtP\5GI:ǖ."mz&La>,XGJe~L{$!Cw @])2 MzqAa7z &8S9&;\L<.'Cٿ˗/G޼={y&rAĿkLo3 wޱ׃y7YME@D@D iʕ ;v;)ǏH gk˟~>dɑÙΘ̳yED@D@D@D@D@D@D@D@D@D@D@D@D =Fu֘4i֬Yw3j@ 7ȴ@(V f'Q)S?i_|$9D6Io)D@D@D@9wtE`t M-…Z'q~O2BE3fqu8 7oo{>LC_ ꙻmHuC.Z(V\676u]gjɇʱGD@D@E`})~oܸ͛7ٳȸ>Ze8p>";`|Vk4C?1i"BDqbٲeT=Ԙ1cnݺH5jo{_ٗ4e7/<ҥ X8Gt3qE+4 4|M_w^PC֘_~?!Ӡܹs7ߘG7׸ }g4;C}+V=y~Gc4 ?s=7lؐi~o_2Č;GLbQI{Y^Ӽ>;(~v ;nݚQ1ieFw?1z=h;6/}8+I#`ꚽ:0 Կn45hҽF@mMj{꫾UV UV~ K괗5q=z8:Ѩw Y1շNvf-ZsQ-܂|.,v(Q;w4h)S r)>lXb1K4 H:g91VZe/28yf,\Eț7/9o<4\a'3<3~y]pmGƍASN: 9 ڽ1CзzeG4͒ ޯhy^zVe6A{.xohԨN;4)Sw4 g .j:nܸ4bp5غ޽v80/ '`j;뮻G}es?sV<RP@dx駣q|<8ENCSjT*b\&) ޳yիֻQj{U ZkvO P`?믿Fv5\JwyrJ*e?Z3 ? ܿe˖Xh=^QV-{޽ZN˗}mٲ%c4I BbE_0)Ыc7xƛ9@͝/u" " " 9)c۴)x0S&`tA0C{6m>-Gc{q |衇;HC5;GuTmZD`A+1c#ۅ,1:Bs} _r 0808GjND@D@D y HwoMQG[I`w6ҥvو0z0:GiND n)mnj4kfv*acYmݺծnjr%ˡꨇiUnzGㅣo⭫裏t UyN V1N{UH495G\.\7|jf3͛;B Vc _y啨#oEڵF;uęy@u!P̙3w z;ߦM66?}첋\fN>^T?*G'VqE@D@D@D@D@D@D@r,1yxr\2n[ iӦߡCq& AW7\\4i:\`>FLnmy-Mhi6nLvںut’9\}xG映wΝ;B`NЪU+Y\g?{lԩS'`9ˢ9+ ?_}hv]]囲> ~3!:͛o3/o,fXo&vl=#:t(~4E}c\9-og!;kR׮]r^n;>4e;;[N)_3 s=lݩܥ-=p:-nx O>"znkxqp8h9y0*Q&Y5j5Ħɫ7s{?nL2~x8%p-*?~x߼f/t5Aпc};;004Ҷ˗|aÁ㏇<ӓ]/ͤe%/…<N8#kwy_!O?0͠v!0\`G>H UVsLs0N@jp߿{-QE@D@D@D@D@D@D@D@D@D@D zu0Y2fJ;Z%ޒĖ5 d^&F {K!" " "MF͇+t/F믴<ʹRp,{fiҒ@v$+hnM7ݔ%t/wIrPtɎ*7PD:Sw|VveE;^_Jsz*zwyjR;LwJqC /7± _|]z5o;gF;"f]Go]v=8\wvVo\q0h[4|嗱k.ߺPg>S#h1gxHij(S *d~h2caիmc9Ƙ8F\qv2}]zi5$uΈ?‡~85٫W/eзqQ19'tk6mq(u8߽C<zC̙3LzY{(0+`رviuaG֞={(?4݌eU۶m8$@}͛Zn5D3;h6{UݚS(ϣrv㎳K;ytfǝ/Q5eF˹&6l0k-ƌ3TRW^%Ks@ ?Et5{gs0# 34[6ش<-ľPӭP>px54OD@D@D@R'<03τ|somq#f 0z4ж-`)D@D@D@D@D@D@D@D@D@D@D@D@D@@ +-LWK" 9@,u:ժU .J]p˗7Pt#Ɏ*7:Do]~e>c-lWٝ'3^nѮsV4#9^3&#z>8gq+W {RQj>:Yݻ^1cMf~.X95je˖YrjJĉ{}>2PgPuku[ƃ>hw5תU+G, ul5> 2e ooZ7pj֬i5h, ,ho?`0d1mM*K*-8̐9L;yгgOUV5;cȑvv2-[ 4@-pUWL&j>UT۸O[}v{>K/msaѢE`.;cEqwXsێ ^锗ۑԻwo{>ωggM9_R%|(^8m8 ~ّߌ̥ .̔y th1ʌ6mlْ7x^pwÍ7h;50NAi2y?}5gUر2#>_ Wn ~i\)8!T@(8Z!Q r|Ǣ*D@D@D@D@N*!_" " " " " " " " " " "9j0r`V[ƚw#Ǡ%NY0T9 -$ǀ٪" " " Y%o3QJaƋ.8DH1N: k@ oh/54HoZP!{ק%z^\22QT';ܪ'Po֮~1/] ɍykD_/欶7uE;^39QJI.Ԣ?p޽;INvr >ܚ-( ~5#}0c.Cnv.<\]NiH!C؇\uVvƚƇs8ht+W.*|HәaWCC&Mҥ]ֻ̈_v/\Y4 /fܙw03CCXm1fGzYo|i\v>}1uAoMzcŌ"͊itrJkZLV7x2.|H?^moǎ`f):ydg/  ܻcwf4E r-3^)&" " " " " " " " "1P Gc5ܗ_"d#0tP}-Zĩ$3&QD@D@D@D@D@D@D@D@D@D@R_27m9^FHZF HvMsJn]Gτ<X!" " "mwI4oFA]0ꄝwOW\F{h@N$o7Z4>jʾYf/7K}9;2QT';ܶ$Pok,ڡfp: E;^33z\WbENj^kмeDK5%osҜ?~Z`fkpj?.o8u\7oA!˧a; ]OI@fѤc$@ڵY"I0g,5h3<Ә~,k_Ν;CZ>ݸ}]næQt|裏i`hFѢE٘OG$!8ĉ3y&g L߾}DI:gˌlCVܹsK.ڨQ# A3L뮻|ghl'?o1O6uص ^$wk̿$YUI_z7" " " aظqoyO 60?ED΋D"P|Z/" " " " " " " "-L'J㧢UGD 2Lg>ۑ" A.p\_^{ 6mcu,$" " " 9~sWE@D@D@D@D@D@D@D@D@D@bIƽLF%ƘIwgL'kw5(|N GkND@D@;~7)91ݼ9V- P>M)T(CD@nt"EMvtViӦ~n$7#hdm4QRǬ['ZW;n{YXhrz'"k&;Xj6_E'U+V r 7?ݼxF7Y9rTȚSH@P 4~;#>}XSƽw5jT#[]zH_;آw}77nlȳCPd֩S'ki`}hĎHBvC8"UH8F|ݕVt 1i`Ftx5{ Tsb}ի ۚPQT)4o`0wA{|\wСC*;u;Rl_v< =s}M7!:?~?V\kʕ :m6aQnq!Ƣz,yܹ3R2 QGeg|i@IDATsn^MS@qʿ>|xj6DNՎ/w[/ }o4a~.o@AӜ)R.ͥy/_~ف?vM}Sc8t(n̯ZUSxx'^8" " "O>!CsA&~*SD@D@D@R-[|, 0oFInk |Li`VgE@@ZG5LQZP|yH*h *=NܑHY_Wk㼻W;lٲAn۰aI]wڙ7>1BY9~rF[PukO?}z@vy.XacEB 7U@6#榵8:Č3bU?|k4_g=vY|0FW\qc6mУGԫWϖۭ[7\yplgԐܹs~6tʔ)tΜ935aYhq֬Y3/0#:pWvL><&>g('G 3},Yc9Ƈ&n|`gwFQ`u&xx7?@l} x^VM6]|u\ $Xl5Biqk||E\<N{cQPq3͓'hzעbŊ(Rm/M1S@v⯿ĉcj@*LFԷ2$Ly`2?|ˌ1cfW?2-V̗M3" " " _|s.3/,7\S߭Qm{%ѯ) Ul8Fطoq+`XHIp(W;@T 0]wSwf9Sj0c$yI'5jM;3RM H[1&kצ Ti# w#K "Z'" A [7ګ3u,!͚5f4~9:kFnwd-쬶)QZP|y,o։G4hc^{M{52Ҙve34w}駱fkdڣGc.fB rvH"lROQH9k- -k7#:i|M8ZS%߿?6m;~8|n>w]^_[#l=AC]~-Uo Zn pDp~3kI&?öFGܼyl8325ktg6M:g9X4KBG9^z)5PI-9s&p'Yg>fHG#z)dԡȎ˻{>pD_|1q(fQ]W^y-!/B׸7SF .e?Okc[x9ŋU;702k&GQT)>Ν;s45>ʕ.^``|`n!l3z`p;`?xmE+嫯xy`4g t?c E 2,F8h](R]@oK3FM[7qڜ ϧx," " " " " " " " " " " " ٔ@׮]M?4q~I@(\ҥK% e?H,66mS_[f[o}Z9ƉC5C:*[(V [zOWoOnx%GhN ԩTh`uhhM[r'wO] 7| 0v,p009Z)"b͖רQ\s@gy& `̙Ν]vF_&_xLG=Q:ى*7#շH8^ڮq3jW#9|ZbjHn^<^DW;uus٥g%@13>wu/_.jgy\xw64vdFǞ={'6'߄ۙ?^y@|ڴi6ӢE |XjU,42e 6n܈}-[f&3nf3Ю>B{e*cmq7k5jիS"f 6gɗ9xV;`Y\`׼O9ς4 ύ7,k_Y; EJX ~q1ǘDO{͛yW^=+{… ɓ'8ӽkVf-fAw?c(X` u:3J~ sJ,6l7jժW֌бcGˑrP*6qǂވ\qX\rٺ;E~f4~s=Vf{x9u8p 1*U2/!3rGv0)D@> #Ff'B@ A#`z_ NWv_OoNg?EFNR%Fh@R0vařv3p&_2w\ ^ň7P4k XFVuɾ袋"jFʍAvT:t>osˡ ' ^; %Ιqvev~>srs{@31-믿&,}əu]vn-3vf͚.^>h@ƶmlQkСCmrK3gQ^os7Uiر=k6et@P/_^{5Ef^mغkpw9 @\835%p?رcꫯ녟1oLré-Yĉ9vNh~*Uz ͛7w7Tgoyo>5]?M~3BRv.fҥ0󎡯wz].Vj? xeoL֝[ܟ?W0v /1di@8x?qeHuZ>y@.|3л駎|FsX~j3 x` %ΩSat+pbNGnݹsg۬G(0~=)D@D@D@D@D@D@D@D@D@D@D@D@D@۷M>o^3" " " "  }7ʗ/j*" " " " " " " " " " "Tyi5uŠ0c;]Mwڵ0:l< >c۰!p㍎&0zc}9*" Q&@3%K͏uy8Z#=@)px!Ԍ4_w> |O |e8{~ Ԃ@ p5HYUգf͚aF Q/N=TP+f[wޝdz뭷S#78p?^\9i7{o"\>mOw,WW-"oQgF5sj7>kQleLk*LD@D@D@D@D@D@D ڹk4+u WR􎔊u^w$vvː7|[~ g^ښȲ?'$xf5l2k\T)\,c˖-ӛG4L{! ٹ֌eM]ɛ4d>-cޛRpxƲ~;\!49$' ƴ͸7o﷔9Wnޜ40`5Tg1o/'5_m0+tmu( \-s0JWd̿wywy_"cu/QP˒iYtMx ӆ]5kDZ֨QEb]D@D@D@D@D@D@D@DO>^jAQH~Rrh%%>v#@{Muc%K:"'sj}VTd@, Pwq:^% TVr2+5kPhQ{oʊ jӦ5e%ExD8֩.h7ܲ#/zͬ;͠|}(R?\]X)c'%d}ȑ#y:,c~/^c=6a8bWID@D@D@D@D@D@D@M,O:$Fٷ4*e:3RX甁*JXF6l!/MR-kPpEAU>)ZF{UWrLsߜdMY'Ю]; t|W㏃404ކ6j޽ 5k8q8۾`yr&-iclM?^iV5uܖ7H~[2 Lw$7:$bĉ֭5/3%{oCj7h@ưQkGܦSC۶mm>(⋸D@D@D@D P TD@D@D@D@D@D@D@D@D@D@D 3Fh{9)P^[S&W&4 ;wL,QYj&Ŋ?@2رƈ\/uzjTSjR)D@D@@}:>Cc+nL:5;79&ߤ:&Kl6#8J,:isZ{Dbٞ>k;;vkV;w3<־Ir*J*QF9sފ8^p9-A \F 'dki᜺;:`BëaP_9CA@@ ;^<30:[e Hɓ3HIԏ@@@@8x۷/Jav0H{ݻ7՟iϸ+Hd=Ν;_¶ zgr4Sjz o(+х\*WUWk,`Gj+̑c U>U0:i;  >v<޻u^op+WG/JE>TC=oPUjPar ^Uu$Lh^K+VZ?޶m[.k׮1۷^ŋmzϙ3PGSjԨWX1^4       d@ۻ?f+A@@ ~S aS@@@@@HoB8HMXeن 񫂀- 1K 8T8!@ (44|axz>2CA@ \)LL;?Ofv(Q >ZhaC{qVZJaMoQs @@@@ @kzŔjE%]o4j q/-H$5jlY۶m[n':vX{,o޼ @Pa\YbU ޏ)dS_=l'yG*Lcl:uQG=uQ^y&C",R[۱#*3t /?5jj\Ԛ5kb˗Dcwyu~a{%Ν;33P }zHmʕBWZyivZW'M/Ο?kVfMSgyf&5}$f@@@@@@Hg+ҪTbK.ٳg۴iӬiӦ|Tv D@0TRw1     Ĥ+`WĿ/wFM̼G@c$UB[Z4&T? /C5JߤDch̒CS@ Sv:27>V5&IxGT}Ukfj‚ @D7,;`#h(݋~?s{K4 Vu*̓^_|E`e۶\"6o @ݸqPǝPϝlT \TƏTRrPm۶+kkɒ%?A/Hn ,pXzӲez0E@@@@@@ ;>}XN^Ho} Ď+WPPC7       Eb#5>xx%^yJS_r$sUh U!B-@ 3`M655,lP۬YgϞ6d]uՓ^b+ɷ^zYfh"mŊ'B9|Z & TiժU-_jL^A@@@bC`РAqri'tRhpVV7Q(֭sx*ޢC7zo`_ۂ lҥYre˖֪U+˓G=Sv6Op㏇v@ֲpB w{ZVreR8/bÆ e˖{Y/5kڥ^cy{gm[NG]/#9owxԋ о}{Kƍ_w{zO-[FY:u>rgL]) Ċ@졇rf̘clРA\ׁ DD =BI3tDP      d9ܡ2eԤNnڵq޳#DŽ/H`VVTK75Qx -i$ӍS'DĪ2%9Bc,P@hoM^7 j;3u%`SBP0u8V^_﷎'    _8b]݀z'ݘsN*& 79J      u]t/^colm_O@`79>I—y9;KMZ4& %> 9'6ј"X#8%+VRX#Z84?!>TgK   @24b]pW.t&tq~#N@@@@@@@PkK/j|}©q jqidԹ@ 4zUdTw4S(yo LMkGuѹft eT\ڪVL*3WsjrR[ձFY d1d[!MSG"E̊; _ \N -_} Q@… C!7\d+QDa۰a1>skܸ/u'4U}ںukTR{짟~ڙ+J2҆+WnJB'4Y>895:ڽ=Y'V&N)=N(7JSLq?7}+: S.54B߲e܆OA Rz_i@"@, D R#p޼yv9%sm  @lڞi      E@m5~Շڵk_STlS-Gj'X= {`%iDckd%@rS$$8%Ѹ' -2ﹴK3mP UqH4Hbyj󎦢B5 ej~G§ѸȑUo' #l4~HB3@@@ {|`w#wP@@@@@@bSkqaw}|*2T@D6F~C#0`/XbԹƫ)yf{꼑EPչGe`n,L \YS@WYƛ4zQ'ͫc%@Po͛g_C蹿C?~z\xqkҤ[B-"^z4Pkxa1Ӝ7:]kJ 5Uʁn ')F^Zj#cG#@@@SN9ž[jFz{qj < UNmf .:o*UAf+7|K={tuo ~W#Wzz%Kfꐩnݺ٤IwFR'M"Ϝ93A/@e{wަ^8 wR$,Kp)uޥK KyЫ`fGT`{OjSN/6nܘHp]w]Y   @r>|pU۷m۶V^H+!      %{/_V^m3f̰ 6X2e9Meu2:D:uv^GqpwgzۄB'^yz1tC7#}1?u ݟh͗,5z!ש[d@P6mڸ3^m *PvرjɡTf͚_*U_7gN8{饗\^&O:rʹĬ+ Q؇BA@,B='kW P[fMS-l@@@@ BuWXW_Yba)d>n| V Nݻww駟yG ‹U̪N]Uf)X2e,zkVy衇j^ԑ3xGs'|^zM*>nDs~̘1~د^w7T4h`fJtnk֬tYu?7˞Зwsux+Uw'u ^x րQ>MsrG v:?{C_J*`\u:ʠ|r[nk6!IXi{C_꽡}s}7k98_o?Q7Gu-Y@mbʹ:@@@@@.C | U_|l8 ?Wm袭1x8/IA-ZS<@E^рo_~}o ݟWyLl̙.\Vۿ67zm+WtZ_ 6Ç?Z>駟ڟ-vSkΆ yOslz7n/;;U2eըQýw|„ j*:4رc]{jS?5yCF. c=;୷J48۷=Q^S1b=٤I4i)$ APcyd  ~7     Ă]\1cƘSlXQknyaP&74fZѸ!s. 1Hg|r/do\$3cLo+'4 D h(L{/%v2eʸ_ OlH,oٲ)@@@뮻\9sq)w6g1#!֏Ao\      j+~G PGu"Q瞛CA9z-vdp@bQRJڽ{w2pXΚ5˼AuK.uUk ߴiSW=xGu݋-SN<ze)\@ ?lߢWX᪂ RT)_z2S@@@@ 57 HL0kM_mpaZ%1`F;v옑cesN9U''4:BT0U,X0l#O8SQ}[ڷo~q;& z4ۿEOY,X~{no8Sf ޻ }{>#``yL<9Nدo__U/`uьBG/Sqy(Zĭc~Wt:We,2~ɢ\`yٯJ[vyס9sA mBx /7ݻwMJbL@ ~=c.{6p@+[lܕx d37W/d@@@@@]HMY2VD&[v(}{!&H~V(\} (`jSVjU߿k7vxuץn'    hLÇ>8tPk۶wy ” L&l      @T\م/Ds @WQO<#We 4ؼ|55Ga(~ܹ裏c=dLlt5kLXZX1 ;ﴷ~/^l;w4+֭[7':׺]vVB5jdwq[dɒ{ce@@@@ &LתV?>^z%Zu,X֬Y?<4l o"7ot=^t][jժS~ֵkW IaYr?<{Ioj?3֘/@z .jzGz@@@$*Udt먏_&O&[ wdE@@@@ ~wӀd^ .T<)C賒;^QFY#c pTL_O\/7o^X 3fشi\ՠ^QH\˼p٦M0ʕ+{2":uꝒ-[U4ߧQD0@(PjԨa Q]Bi(    @z >|ƦիWK/2 zӥK&XXѽƍO~OWk.'|͚5c~ׯ_:bرc-|]wr̩Mpϟѣ]¿352L=zeqWZ?z;CT^ݮ?вeKWu4L>_믿\Gu~T M4f͚(YO@a fVԩ֭Ngj\ `k`/X   DR@^^=>|-Z4C*1tDEa Jt=q饗~7ƪ2o<۹s:UnFS / |MeС. tРAM\0AUJfsjvOބJ\ZjSN9ŭSD woI&?㇛Dz?~ǦhTg߿)[Ӽyf B%xl/@\O~W2)ԻXbQ?8yRzjC;<ʔ), .ScF˃A1_Z~K$9Mq9O"@tu+_x   ݏ%      @ :t}W ?wŋ7tm\`nj! Ī/{vYgesbOF m6m\R$P"f͚ew^#q LoɤYR'0E  YA@c?gi{!CW_m/%m͏@@@@ 00A#|8v$ B0 s4,OKA=\Ӡ?}Vfʹ픭@*{ﹰPXdIӠ:ꪫ\Y\/l˖-j#Fgq5mԅ6j Aɺ gVmժꔠ_,\+VÇuV`WSj8jȧ`     iիS&UufLj8ϩ֭[PI( 9uT5 >}k׮ܹs;={ȑ#>syWڵ{=PYr-Zt -Z_<\tEnǺgv@yυO5~Bد'qdZ~}I0כ}J*Gz5oc~:n&woOĊ vmj9s?C6O