From cfd8521c307e58917ac2e9d8db08c57ca75626f4 Mon Sep 17 00:00:00 2001 From: Zack Katz Date: Sun, 25 Aug 2024 17:45:05 -0400 Subject: [PATCH] Big docs update to simplify and expand --- docs/Client/01-intro.md | 151 +-------------- docs/Client/02-installation.md | 155 +++++++++++++++ docs/Client/configuration.md | 135 +++++++++---- docs/Client/customization.md | 2 +- docs/Client/hooks.md | 2 + .../{ => namespacing}/css-namespacing.md | 7 +- docs/Client/namespacing/index.md | 18 ++ docs/Client/namespacing/php-scoper.md | 181 ++++++++++++++++++ docs/Client/namespacing/strauss.md | 90 +++++++++ docs/Client/troubleshooting.md | 17 ++ docs/Client/usage.md | 62 ++++++ static/img/client/saved-reply.png | Bin 0 -> 66890 bytes 12 files changed, 632 insertions(+), 188 deletions(-) create mode 100644 docs/Client/02-installation.md rename docs/Client/{ => namespacing}/css-namespacing.md (87%) create mode 100644 docs/Client/namespacing/index.md create mode 100644 docs/Client/namespacing/php-scoper.md create mode 100644 docs/Client/namespacing/strauss.md create mode 100644 docs/Client/usage.md create mode 100644 static/img/client/saved-reply.png diff --git a/docs/Client/01-intro.md b/docs/Client/01-intro.md index 72b47a2..88f07ae 100644 --- a/docs/Client/01-intro.md +++ b/docs/Client/01-intro.md @@ -5,158 +5,17 @@ sidebar_position: 1 --- # TrustedLogin SDK + Easily and securely log in to your customers sites when providing support. ## Our priority: Be secure and [don't crash sites](https://www.bugsnag.com/blog/sdks-should-not-crash-apps) {#our-priority-sdks-should-not-crash-sites} When you integrate TrustedLogin into your project (theme, plugin, or custom code), you are counting on us not to mess up your customer or clients' sites. We take that extremely seriously. -------- - -## Including in your plugin or theme {#including-in-your-plugin-or-theme} - -:::info -### When you see `ProBlockBuilder`, make sure to replace with your own namespace! -In the examples below, we're going to pretend your plugin or theme is named "Pro Block Builder" and your business is named Widgets, Co. These should not be the names you use—make sure to update the sample code below to match your business and plugin/theme name! -::: - -### Install Strauss & update your composer.json file - -1. [Install Strauss](https://github.com/BrianHenryIE/strauss#use). Strauss is used for namespacing the Client to prevent conflicts with other plugins or themes that are using TrustedLogin. We recommend installing via the `strauss.phar` method. - 1. `cd` into your plugin or theme directory - 1. Run `curl -o strauss.phar -L -C - https://github.com/BrianHenryIE/strauss/releases/latest/download/strauss.phar` -1. Run `composer require trustedlogin/client:dev-main` to install the TrustedLogin Client SDK -1. Run `composer require scssphp/scssphp --dev` to install `scssphp` as a dev dependency. This is used to generate and namespace the CSS used by TrustedLogin. If you already have `scssphp` installed, or are [using an alternative way to namespace the CSS](/Client/css-namespacing.md), skip this step. -1. Update your `composer.json` file to integrate with Strauss. Follow the instructions as detailed in the [Strauss documentation](https://github.com/BrianHenryIE/strauss#configuration) for namespacing your plugin and theme. See example below. - -```json -[...] - "require": { - "trustedlogin/client": "dev-main" - }, - "require-dev": { - "brianhenryie/strauss": "dev-master", - "scssphp/scssphp": "^v1.11.0" - }, - "autoload": { - "classmap": [ - "vendor" - ] - }, - "extra": { - "strauss": { - "target_directory": "vendor-namespaced", - "namespace_prefix": "ProBlockBuilder\\", - "classmap_prefix": "ProBlockBuilder_", - "classmap_output": true, - "packages": [ - "trustedlogin/client" - ] - } - }, - "scripts": { - "strauss": [ - "@php strauss.phar" - ], - "trustedlogin": [ - "@php vendor/bin/build-sass --namespace=ProBlockBuilder" - ], - "post-install-cmd": [ - "@strauss", - "@trustedlogin" - ], - "post-update-cmd": [ - "@strauss", - "@trustedlogin" - ] - } -[...] -``` -4. Run `composer update` to update your dependencies. Strauss should generate a `vendor-namespaced/` directory. If it doesn't, you may need to run `composer install` first. -5. Follow [these directions to configure and instantiate the client](./configuration) - -#### To manually include the autoloader - -If you chose to set `classmap_output` to `false` in the Strauss configuration, you will need to include the autoloader in your code. If using the sample above, it would be located at `vendor-namepaced/autoload.php`; the code would be something like: - -```php -// For a plugin or theme: -include_once trailingslashit( dirname( __FILE__ ) ) . 'vendor-namespaced/autoload.php'; -``` - -#### Vendor directory cleanup - -If you find the TrustedLogin directories in your `vendor/` directory to be undesirable for some reason, you may use this configuration for the `trustedlogin` script in Composer. - -Replace this: - -```json -"trustedlogin": [ - "@php vendor/bin/build-sass --namespace=ProBlockBuilder" - ], -``` - -With this: - -```json -"trustedlogin": [ - "@php vendor/bin/build-sass --namespace=ProBlockBuilder", - "[ -d 'vendor/trustedlogin' ] && rm -rf vendor/trustedlogin || true", - "[ -d 'vendor/scssphp' ] && rm -rf vendor/scssphp || true", - "[ -d 'vendor/bin' ] && rm -rf vendor/bin/build-sass && rm -rf vendor/bin/pscss || true" - ], -``` - -The script modification will now remove the `trustedlogin`, `scssphp`, and TrustedLogin-related files inside `bin`. - -### No-Conflict mode {#no-conflict-mode} - -Some plugins like Gravity Forms and GravityView have a "no-conflict mode" to limit script and style conflicts. If you see -scripts and styles not loading on your Grant Support Access page, that's what's going on. - -The WordPress script and style handles registered by TrustedLogin are formatted as `trustedlogin-{namespace}`. -Here's an example of how GravityView (with a namespace of `gravityview`) allows TrustedLogin scripts: - -```php -add_filter( 'gravityview_noconflict_scripts', function ( $allowed_scripts = array() ) { - - $allowed_scripts[] = 'trustedlogin-gravityview'; // ⚠️ GravityView's namespace is `gravityview` - - return $allowed_scripts; -} ); -``` - -### Testing on local environments {#testing-on-local-environments} - -TrustedLogin won't work in local environments unless using a tunnel such as ngrok. Thus, TrustedLogin will display a warning when attempting to generate a login when in a local environment. - -To disable the warning, define `TRUSTEDLOGIN_DISABLE_LOCAL_NOTICE` and set it to true: - -```php -define( 'TRUSTEDLOGIN_DISABLE_LOCAL_NOTICE', true ); -``` - -## Reference IDs {#reference-ids} - -Reference IDs are useful when you want to attach a specific ticket ID or conversation ID to a login. - -Reference IDs can be passed via URL like so: `wp-login.php?action=trustedlogin&ns={namespace}&ref=[123]` - -When a Reference ID exists, users will see the reference while granting access: - -![Reference ID is shown below the footer links in the Grant Access screen](/img/client/reference-id.png) - -## Logging {#logging} - -We recommend disabling logging by default, but sometimes logs are necessary. +## What is TrustedLogin? -1. TrustedLogin creates a `trustedlogin-logs` directory inside the `wp-content/uploads/` directory. -2. An empty `index.html` file is placed inside the directory to prevent browsing. -3. New log files are created daily for each TrustedLogin namespace. The default log `filename` format is `client-{namespace}-{Y-m-d}-{hash}.log` - - `{namespace}` is the namespace of your business, plugin, or theme name - - `{date}` is `YYYY-MM-DD` format - - The hash is generated using `wp_hash()` using on the `vendor/namespace`, site `home_url()`, and the day of the year (`date('z')`). The point of the hash is to make log names harder to guess (security by obscurity). +TrustedLogin is a secure and easy-to-use SDK that allows you to log in to your customers' WordPress sites without them sharing passwords. It is designed to be easy to integrate into your plugin, theme, or custom code. -### Using your own logging library {#using-your-own-logging-library} +## Why use TrustedLogin? -If you add an action for `trustedlogin/{namespace}/logging/log`, TrustedLogin will let you handle logging. The `trustedlogin-logs` directory and log files will not be created. +Customer support is a critical part of any business. TrustedLogin makes it easy to provide support to your customers without the need for them to share their passwords. This is a huge win for both you and your customers. diff --git a/docs/Client/02-installation.md b/docs/Client/02-installation.md new file mode 100644 index 0000000..ba40468 --- /dev/null +++ b/docs/Client/02-installation.md @@ -0,0 +1,155 @@ +--- +title: Installation +sidebar: auto +sidebar_position: 2 +--- + +## Including in your plugin or theme {#including-in-your-plugin-or-theme} + +### 1. Install the TrustedLogin SDK using Composer + +Run `composer require trustedlogin/client:dev-main` to install the TrustedLogin Client SDK as a dependency. + +### 2. Add SCSS as a dev dependency + +Run `composer require scssphp/scssphp --dev` to install `scssphp` as a dev dependency. + +This is used to generate and namespace the CSS used by TrustedLogin. If you already have `scssphp` installed, or are [using an alternative way to namespace the CSS](/Client/css-namespacing.md), skip this step. + +### 3. Namespace the SDK using [Strauss](/Client/namespacing/strauss) or [PHP-Scoper](/Client/namespacing/php-scoper). + +In order to prevent conflicts with other plugins or themes that are using TrustedLogin, you must namespace the TrustedLogin Client SDK. + +We support two namespacing tools: Strauss and PHP-Scoper. Choose the one that best fits your needs: + +- [Strauss](/Client/namespacing/strauss) +- [PHP-Scoper](/Client/namespacing/php-scoper) + +### 4. [Namespace the CSS files](/Client/Namespacing/css-namespacing) + +TrustedLogin CSS files are namespaced so that they don't conflict with other plugins or themes that are using TrustedLogin. + +Follow the [CSS Namespacing](/Client/css-namespacing.md) guide. + +### 4. Include the autoloader + +Make sure you have the Composer autoloader included in your plugin or theme. If you already have the autoloader included, you can skip this step. + +```php +// Include the Composer autoloader. +require_once trailingslashit( dirname( __FILE__ ) ) . 'vendor/autoload.php'; +``` + +Make sure to **include the autoloader on all page loads** to ensure the TrustedLogin SDK is available when needed. + +### 5. Customize the [TrustedLogin configuration](/Client/configuration) options + +The configuration array is where you set up the TrustedLogin Client SDK to work with your plugin or theme. You can customize the configuration to match your needs. + +### 6. Instantiate the TrustedLogin Client + +:::info +The TrustedLogin client must be initialized on all page loads, both the front-end and the dashboard. +::: + +When instantiating the TrustedLogin `Client` class, you need to pass a valid `Config` object. + +The following is a minimal configuration. It has all the _required_ settings, but not all **recommended** settings! + +```php +/** + * This is a basic example of how to instantiate the TrustedLogin Client, using the minimum required configuration + * settings and hooked into the `plugins_loaded` action. Adjust the configuration to match your needs. + */ +add_action( 'plugins_loaded', function() { + $config = [ + 'auth' => [ + 'api_key' => '1234567890', + ], + 'vendor' => [ + 'namespace' => 'pro-block-builder', + 'title' => 'Pro Block Builder', + 'email' => 'support@example.com', + 'website' => 'https://example.com', + 'support_url' => 'https://help.example.com', + ], + 'role' => 'editor', + ]; + + try { + new \ProBlockBuilder\TrustedLogin\Client( + new \ProBlockBuilder\TrustedLogin\Config( $config ) + ); + } catch ( \Exception $exception ) { + error_log( $exception->getMessage() ); + } +} ); +``` + +#### Hooking the TrustedLogin Client instantiation + +We recommend instantiating the TrustedLogin Client on the `plugins_loaded` action. This ensures that the TrustedLogin Client is available on all page loads. + +TrustedLogin calls the following hooks: +- `init` priority `100` +- `admin_init` priority `100` +- `template_redirect` priority `99` + +Instantiating the Client after any of these hooks are called will cause TrustedLogin to not function properly. + +:::warning +**Always wrap TrustedLogin Client instantiation in a try/catch block!** +::: + +TrustedLogin Client instantiation must be wrapped in a try/catch block. The TrustedLogin Client throws Exceptions when: + +- The configuration is invalid. +- TrustedLogin is globally disabled. +- TrustedLogin is disabled for the namespace. +- The current website lacks expected encryption functions (these _should_ be included in all WordPress installations as well as PHP 7.2). + +Wrapping the instantiation in a try/catch block ensures that the site won't crash if TrustedLogin fails to initialize. + +------ + +## Advanced + +### Vendor directory cleanup + +If you find the TrustedLogin directories in your `vendor/` directory to be undesirable for some reason, you may use this configuration for the `trustedlogin` script in Composer. + +:::info +### When you see `ProBlockBuilder`, make sure to replace with your own namespace! +In the examples below, we're going to pretend your plugin or theme is named "Pro Block Builder" and your business is named Widgets, Co. These should not be the names you use—make sure to update the sample code below to match your business and plugin/theme name! +::: + +Replace this: + +```json +"trustedlogin": [ + "@php vendor/bin/build-sass --namespace=ProBlockBuilder" + ], +``` + +With this: + +```json +"trustedlogin": [ + "@php vendor/bin/build-sass --namespace=ProBlockBuilder", + "[ -d 'vendor/trustedlogin' ] && rm -rf vendor/trustedlogin || true", + "[ -d 'vendor/scssphp' ] && rm -rf vendor/scssphp || true", + "[ -d 'vendor/bin' ] && rm -rf vendor/bin/build-sass && rm -rf vendor/bin/pscss || true" + ], +``` + +The script modification will now remove the `trustedlogin`, `scssphp`, and TrustedLogin-related files inside `bin`. + +### Testing on local environments {#testing-on-local-environments} + +TrustedLogin won't work in local environments unless using a tunnel such as ngrok. Thus, TrustedLogin will display a warning when attempting to generate a login when in a local environment. + +To disable the warning, define `TRUSTEDLOGIN_DISABLE_LOCAL_NOTICE` and set it to true: + +```php +define( 'TRUSTEDLOGIN_DISABLE_LOCAL_NOTICE', true ); +``` diff --git a/docs/Client/configuration.md b/docs/Client/configuration.md index 6ed3608..07559eb 100644 --- a/docs/Client/configuration.md +++ b/docs/Client/configuration.md @@ -1,3 +1,9 @@ +--- +title: Configuring the TrustedLogin Client SDK +sidebar_label: Client Configuration +sidebar_position: 5 +--- + # Client Configuration ## Minimal configuration {#minimal-configuration} @@ -6,16 +12,7 @@ When instantiating the TrustedLogin `Client` class, you need to pass a valid `Co The following is a minimal configuration. It has all the _required_ settings, but not all **recommended** settings! -:::info -### When you see `ProBlockBuilder`, make sure to replace with your own namespace! {#when-you-see-problockbuilder-make-sure-to-replace-with-your-own-namespace} -In the examples below, we're going to pretend your plugin or theme is named "Pro Block Builder" and your business is named Widgets, Co. These should not be the names you use—make sure to update the sample code below to match your business and plugin/theme name! -::: - ```php - -// Include the Composer autoloader. -include_once trailingslashit( dirname( __FILE__ ) ) . 'vendor/autoload.php'; - $config = [ 'auth' => [ 'api_key' => '1234567890', @@ -29,35 +26,57 @@ $config = [ ], 'role' => 'editor', ]; - -try { - new \ProBlockBuilder\TrustedLogin\Client( - new \ProBlockBuilder\TrustedLogin\Config( $config ) - ); -} catch ( \Exception $exception ) { - error_log( $exception->getMessage() ); -} ``` -:::warning -Make sure initialization happens before headers are sent. `init` is a good hook to use. - -**The hook must run on the front-end!** For example, don't use `admin_init`, since it will not run on the front-end. +:::note +### When you see `ProBlockBuilder`, this is a placeholder. Make sure to replace with your own namespace! {#when-you-see-problockbuilder-make-sure-to-replace-with-your-own-namespace} +In the examples on this page, we're going to pretend your plugin or theme is named "Pro Block Builder" and your business is named Widgets, Co. These should not be the names you use—make sure to update the sample code below to match your business and plugin/theme name! ::: +## A more complete configuration {#a-more-complete-configuration} + +The following is a more complete configuration. It includes all the settings that can be configured. + +```php +$config = [ + 'auth' => [ + 'api_key' => '12345678', + ], + 'vendor' => [ + 'namespace' => 'pro-block-builder', + 'title' => 'Pro Block Builder', + 'email' => 'support@example.com', + 'website' => 'https://example.com', + 'support_url' => 'https://help.example.com', + 'logo_url' => plugins_url( 'path/to/logo/image/logo.svg', EXAMPLE_PBB_PLUGIN_FILE_PATH ), + ], + 'role' => 'editor', + 'clone_role' => false, + 'menu' => [ + 'slug' => 'example', // This is the `page` attribute of top-level menu item (eg: `admin.php?page=example`). + 'title' => esc_html__( 'Grant Site Access', 'pro-block-builder' ), + ], + 'webhook' => [ + 'url' => 'https://hooks.zapier.com/hooks/catch/12345/example/silent/', // Zapier webhook URL. + 'debug_data' => true, + 'create_ticket' => true, + ], +]; +``` + ## All configuration options {#all-options} | Key | Type | Description | Default | Required? | |-------------------------|-------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|:---------:| -| `auth/api_key` | `string` | The TrustedLogin key for the vendor, found in "API Keys" on https://app.trustedlogin.com. | `null` | ✅ | +| `auth/api_key` | `string` | The TrustedLogin key for the vendor, found in "API Keys" on https://app.trustedlogin.com. | `null` | ✅ | | `auth/license_key` | `string`, `null` | If enabled, the license key for the current client. This is used as a lookup value when integrating with help desk support widgets. If not defined, a cryptographic hash will be generated to use as the Access Key. | `null` | | -| `role` | `string` | The role to clone when creating a new Support User. | `editor` | ✅ | +| `role` | `string` | The role to clone when creating a new Support User. | `editor` | ✅ | | `clone_role` | `bool` | If true, create a new role with the same capabilites as the `role` setting. If false, use the defined `role` setting. | `true` | | -| `vendor/namespace` | `string` | Slug for vendor. Must be unique. Must be shorter than 96 characters. Must not be a reserved namespace: `trustedlogin`, `client`, `vendor`, `admin`, `wordpress` | `null` | ✅ | -| `vendor/title` | `string` | Name of the vendor company. Used in text such as `Visit the %s website` | `null` | ✅ | -| `vendor/email` | `string` | Email address for support. Used when creating usernames. Recommended: use `{hash}` dynamic replacement ([see below](#email-hash)). | `null` | ✅ | -| `vendor/website` | `string` | URL to the vendor website. Must be a valid URL. | `null` | ✅ | -| `vendor/support_url` | `string` | URL to the vendor support page. Shown to users in the Grant Access form and also serves as a backup to redirect users if the TrustedLogin server is unreachable. Must be a valid URL. | `null` | ✅ | +| `vendor/namespace` | `string` | Slug for vendor. Must be unique. Must be shorter than 96 characters. Cannot be a reserved namespace. ([learn more about the vendor namespace setting below](#vendor-namespace)) | `null` | ✅ | +| `vendor/title` | `string` | Name of the vendor company. Used in text such as `Visit the %s website` | `null` | ✅ | +| `vendor/email` | `string` | Email address for support. Used when creating usernames. Recommended: use `{hash}` dynamic replacement ([see below](#email-hash)). | `null` | ✅ | +| `vendor/website` | `string` | URL to the vendor website. Must be a valid URL. | `null` | ✅ | +| `vendor/support_url` | `string` | URL to the vendor support page. Shown to users in the Grant Access form and also serves as a backup to redirect users if the TrustedLogin server is unreachable. Must be a valid URL. | `null` | ✅ | | `vendor/display_name` | `string` | Optional. Display name for the support team. See "Display Name vs Title" below. | `null` | | | `vendor/logo_url` | `string` | Optional. URL to the vendor logo. Displayed in the Grant Access form. May be inline SVG. Must be local to comply with WordPress.org. | `null` | | | `caps/add` | `array` | An array of additional capabilities to be granted to the Support User after their user role is cloned based on the `role` setting.

The key is the capability slug and the value is the reason why it is needed. Example: `[ 'gf_full_access' => 'Support will need to see and edit the forms, entries, and Gravity Forms settings on your site.' ]` | `[]` | | @@ -67,8 +86,8 @@ Make sure initialization happens before headers are sent. `init` is a good hook | `menu/title` | `string` | The title of the submenu in the sidebar menu. | `Grant Support Access` | | | `menu/icon_url` | `string` | The URL to the icon to be used for this menu. The value is passed as `$icon_url` to the [`add_menu_page()` function](https://developer.wordpress.org/reference/functions/add_menu_page/). | `''` (empty string) | | | `menu/priority` | `int` | The priority of the `admin_menu` action used by TrustedLogin. | `100` | | -| `menu/position` | `int` | The `$position` argument passed to the [`add_submenu_page()` function](https://developer.wordpress.org/reference/functions/add_submenu_page/) function. | `null` | | -| `logging/enabled` | `bool` | If enabled, logs are stored in `wp-content/uploads/trustedlogin-logs` | `false` | | +| `menu/position` | `int`, `float`, `null` | The `$position` argument passed to the [`add_submenu_page()` function](https://developer.wordpress.org/reference/functions/add_submenu_page/) function. | `null` | | +| `logging/enabled` | `bool` | If enabled, logs are stored in `wp-content/uploads/trustedlogin-logs` | `false` | | | `logging/directory` | `null`,`string` | Override the directory where logs are stored. See [Logging](logging/) for more information. | `null` | | | `logging/threshold` | `string` | Define what [PSR log level](https://www.php-fig.org/psr/psr-3/#5-psrlogloglevel) should be logged. To log everything, set the threshold to `debug`. | `notice` | | | `logging/options` | `array` | Array of [KLogger Additional Options](https://github.com/katzgrau/klogger#additional-options) | `['extension' => 'log', 'dateFormat' => 'Y-m-d G:i:s.u', 'filename' => null, 'flushFrequency' => false, 'logFormat' => false, 'appendContext' => true ]` | | @@ -84,14 +103,29 @@ Make sure initialization happens before headers are sent. `init` is a good hook ## Logging {#logging} +**We recommend disabling logging.** + +When logging is enabled, TrustedLogin logs to the `wp-content/uploads/trustedlogin-logs/` directory by default. + +1. TrustedLogin creates a `trustedlogin-logs` directory inside the `wp-content/uploads/` directory. +2. An empty `index.html` file is placed inside the directory to prevent browsing. +3. New log files are created daily for each TrustedLogin namespace. The default log `filename` format is `client-debug-{Y-m-d}-{hash}.log` + - `{namespace}` is the namespace of your business, plugin, or theme name + - `{date}` is `YYYY-MM-DD` format + - The hash is generated using `wp_hash()` using on the `vendor/namespace`, site `home_url()`, and the day of the year (`date('z')`). The point of the hash is to make log names harder to guess (security by obscurity). + +### Using your own logging library {#using-your-own-logging-library} + +If you add an action for `trustedlogin/{namespace}/logging/log`, TrustedLogin will let you handle logging. The `trustedlogin-logs` directory and log files will not be created. + ### Default settings: {#default-settings} ```php -'logging' => array( +'logging' => [ 'enabled' => false, 'directory' => null, 'threshold' => 'debug', - 'options' => array(), -), + 'options' => [], +], ``` ### logging/enabled {#loggingenabled} @@ -103,17 +137,17 @@ Whether to enable logging TrustedLogin activity to a file. Helpful for debugging To enable logging in TrustedLogin, the minimum configuration necessary is: ```php -'logging' => array( +'logging' => [ 'enabled' => true, -), +], ``` ### `logging/directory` {#loggingdirectory} _Optional._ Default: `null` -If `null`, TrustedLogin will generate its own directory inside the `wp-uploads/` directory. The path for logs is -`/wp-uploads/trustedlogin-logs/`. Created directories are protected by an index.html file to prevent browsing. +If `null`, TrustedLogin will generate its own directory inside the `wp-content/uploads/` directory. The path for logs is +`/wp-content/uploads/trustedlogin-logs/`. Created directories are protected by an `index.html` file to prevent browsing. ### `logging/threshold` {#loggingthreshold} @@ -152,6 +186,33 @@ There is one log file generated per day. Log file names use a hash to make them Example: `trustedlogin-debug-2020-07-27-39dabe12636f200938bbe8790c0aef94.log` +## Vendor namespaces {#vendor-namespace} + +Namespaces are used to isolate your TrustedLogin configuration from other plugins or themes that may also use TrustedLogin. They must be unique. + +Some of the places the namespace is used include: + +- The default dashboard URL for the Grant Access page: `/wp-admin/admin.php?page=grant-{namespace}-access` +- The WP Login Grant access URL: `wp-login.php?action=trustedlogin&ns={namespace}` +- The user role created for support access: `{namespace}-support` +- The CSS classes used in the Grant Access form +- Actions and filters (eg: `trustedlogin/{namespace}/access/created`) +- The name of the constant to disable TrustedLogin (eg: `TRUSTEDLOGIN_DISABLE_{NAMESPACE}`) +- As part of a hash for the log file name + +### Reserved namespaces {#reserved-namespaces} + +The following namespaces are reserved and cannot be used: + +- `trustedlogin` +- `trusted-login` +- `client` +- `vendor` +- `admin` +- `administrator` +- `wordpress` +- `support` + ## Display Name vs Title {#display-name-vs-title} If `vendor/title` is set to `GravityView`, the default confirmation screen will say `Grant GravityView access to your site.` diff --git a/docs/Client/customization.md b/docs/Client/customization.md index d406d11..957f4d5 100644 --- a/docs/Client/customization.md +++ b/docs/Client/customization.md @@ -1,6 +1,6 @@ --- title: Template Customization -sidebar: auto +sidebar: none --- # Customizing the TrustedLogin Template diff --git a/docs/Client/hooks.md b/docs/Client/hooks.md index c0f77ce..ac22a17 100644 --- a/docs/Client/hooks.md +++ b/docs/Client/hooks.md @@ -1,5 +1,7 @@ # Hooks +Below are all hooks available in the TrustedLogin Client. These hooks can be used to customize the behavior of the Client. + ## Actions {#actions} ### `trustedlogin/{namespace}/auth_screen` {#trustedloginnamespaceauthscreen} diff --git a/docs/Client/css-namespacing.md b/docs/Client/namespacing/css-namespacing.md similarity index 87% rename from docs/Client/css-namespacing.md rename to docs/Client/namespacing/css-namespacing.md index c59a119..8b2c323 100644 --- a/docs/Client/css-namespacing.md +++ b/docs/Client/namespacing/css-namespacing.md @@ -1,6 +1,7 @@ --- title: CSS Namespacing sidebar: auto +sidebar_position: 3 --- # Namespacing CSS Files @@ -9,9 +10,8 @@ TrustedLogin CSS files are namespaced so that they don't conflict with other plu The `build-sass` script accepts the following arguments: - `--namespace`: The namespace to use for the CSS files. This is required. -- `--path`: The path to the TrustedLogin client directory. This is optional, and defaults to `vendor/trustedlogin/client/src/assets/`. -- `--export_dir`: The path to the output directory. This is optional, and defaults to `vendor/trustedlogin/client/src/assets/`. -- `--relative_images_dir`: The path to the images directory, relative to the output directory. This is optional, and defaults to `./`. +- `--assets_dir`: The path to the TrustedLogin client directory. This is optional, and defaults to `(vendor-namespaced|vendor-prefixed)/trustedlogin/client/src/assets/`. +- `--export_dir`: The path to the output directory. This is optional, and defaults to `(vendor-namespaced|vendor-prefixed)/trustedlogin/client/src/assets/`. The default way to namespace files is [as a Composer script](/Client/01-intro.md), but this may not work with your build process: the default implementation shown adds the required SCSS package (`scssphp/scssphp`) to the `require-dev` array, which may not work with your release flow. If you move `scssphp/scssphp` to the `require` array, the scssphp library will be included in your autoloader, which adds bloat for something that should be used one-time. @@ -45,7 +45,6 @@ If you'd like to use an SCSS mixin to namespace CSS files, you can use the follo @import "vendor-namespaced/trustedlogin/client/src/assets/src/global"; $namespace: "ProBlockBuilder"; -$path: "example/different/assets/path/"; // Path to assets directory (for loading and lock images) @include trustedlogin-auth( $namespace ); @include trustedlogin-button( $namespace ); diff --git a/docs/Client/namespacing/index.md b/docs/Client/namespacing/index.md new file mode 100644 index 0000000..40bb509 --- /dev/null +++ b/docs/Client/namespacing/index.md @@ -0,0 +1,18 @@ +--- +title: Namespacing +sidebar: auto +sidebar_position: 3 +--- + +Namespacing is vital for any instance of TrustedLogin to not conflict with other code running TrustedLogin. + +There are two parts of the code that must be namespaced for TrustedLogin to function properly: + +## PHP + +- [Strauss](/Client/namespacing/strauss) +- [PHP-Scoper](/Client/namespacing/php-scoper) + +## CSS + +- [CSS Namespacing](/Client/namespacing/css-namespacing) diff --git a/docs/Client/namespacing/php-scoper.md b/docs/Client/namespacing/php-scoper.md new file mode 100644 index 0000000..84f436b --- /dev/null +++ b/docs/Client/namespacing/php-scoper.md @@ -0,0 +1,181 @@ +--- +title: Namespacing with PHP-Scoper +sidebar_label: PHP-Scoper +sidebar: auto +sidebar_position: 2 +--- + +## Using PHP-Scoper + +PHP-Scoper may be used for namespacing the TrustedLogin client to prevent conflicts with other plugins or themes that are using TrustedLogin. + +### 1. Install PHP-Scoper + +Follow the instructions in the [PHP-Scoper documentation](https://github.com/humbug/php-scoper/blob/main/docs/installation.md#installation) to install PHP-Scoper. + +### 2. Install the TrustedLogin Client SDK + +1. Run `composer require trustedlogin/client:dev-main` to install the TrustedLogin Client SDK +1. Run `composer require scssphp/scssphp --dev` to install `scssphp` as a dev dependency. This is used to generate and namespace the CSS used by TrustedLogin. If you already have `scssphp` installed, or are [using an alternative way to namespace the CSS](/Client/css-namespacing.md), skip this step. + +## Create or modify the PHP-Scoper Configuration + +When using PHP-Scoper to prefix the TrustedLogin client, you will need to update the configuration to include additional files or classes that should not be prefixed. + +To update the PHP-Scoper configuration, you create a `scoper.inc.php` file in the root of your project. This file should return an array with the configuration options for PHP-Scoper. + +Here is an example of a PHP-Scoper configuration file that includes additional files and classes that should not be prefixed in TrustedLogin: + +```php + [ + Finder::create()->files()->in( 'vendor/trustedlogin/client' )->name( [ + 'LICENSE', + 'composer.json' + ] ), + Finder::create()->files()->in( 'vendor/trustedlogin/client/src' )->name( [ + '*.php', + '*.css', + '*.js', + ] ), + ], + + /* + * When scoping PHP files, there will be scenarios where some of the code being scoped indirectly references the + * original namespace. These will include, for example, strings or string manipulations. PHP-Scoper has limited + * support for prefixing such strings. To circumvent that, you can define patchers to manipulate the file to your + * heart contents. + * + * For more see: https://github.com/humbug/php-scoper#patchers + */ + 'patchers' => [ + /** + * Replaces the Adapter prefixed versions with the original ones. + * + * @param string $filePath The path of the current file. + * @param string $prefix The prefix to be used. + * @param string $content The content of the specific file. + * + * @return string The modified content. + */ + function( $file_path, $prefix, $content ) { + + // This is a list of classes and functions that TrustedLogin uses that should not be prefixed. + $trustedlogin_allowlist = [ + 'DateTime', + 'Exception', + 'ImagickException', + 'RuntimeException', + 'WP_Admin_Bar', + 'WP_Debug_Data', + 'WP_Error', + 'WP_Filesystem_Base', + 'WP_Filesystem', + 'wp_get_environment_type', + 'WP_User', + ]; + + foreach ( $trustedlogin_allowlist as $class ) { + $content = str_replace( [ + $prefix . '\\' . $class, // Adapter-prefixed. + $prefix . '\\\\' . $class // Catch double-escaped classes. + ], $class, $content ); + } + + return $content; + }, + ], +]; +``` + +## 3. Run PHP-Scoper + +After you have created or updated the PHP-Scoper configuration, you can run PHP-Scoper to prefix the TrustedLogin client. Run the following command: + +:::info +### When you see `ProBlockBuilder`, make sure to replace with your own namespace! {#when-you-see-problockbuilder-make-sure-to-replace-with-your-own-namespace} +In the examples below, we're going to pretend your plugin or theme is named "Pro Block Builder" and your business is named Widgets, Co. These should not be the names you use—make sure to update the sample code below to match your business and plugin/theme name! +::: + +### Using the PHP-Scoper Phar + +```bash +php php-scoper.phar add-prefix --prefix=ProBlockBuilder +``` + +### Using the PHP-Scoper Composer Package + +```bash +composer php-scoper add-prefix --prefix=ProBlockBuilder +``` + +### Using phive-installed PHP-Scoper + +```bash +tools/php-scoper add-prefix --prefix="ProBlockBuilder" +``` + +PHP-Scoper will prefix the TrustedLogin client files and generate a `build/` directory. + +## 4. Update the Composer Autoloader + +After PHP-Scoper has prefixed the TrustedLogin client files, you will need to update the Composer autoloader to include the new `build/` directory. To do this, add the following to your `composer.json` file: + +```json +"autoload": { + "classmap": [ + "vendor", + "build" + ] +} +``` + +After updating the Composer autoloader, run `composer dump-autoload` to update the autoloader. + +### 5. Include the autoloader + +When using Composer, you likely already have added an autoloader to your code, using something like `require_once 'vendor/autoload.php';`. + +If your PHP-Scoper build isn't picked up by the autoloader, you may need to include the autoloader in your code. + +```php +// For a plugin or theme: +include_once trailingslashit( dirname( __FILE__ ) ) . 'build/autoload.php'; +``` + +## 6. Add a Composer Script + +You can also add a Composer script to run PHP-Scoper automatically when you run `composer install` or `composer update`. To do this, add the following to your `composer.json` file: + +```json +"scripts": { + "php-scoper": [ + "@php php-scoper.phar add-prefix --prefix=ProBlockBuilder", + "composer dump-autoload --working-dir build --classmap-authoritative" + ], + "post-install-cmd": [ + "@php-scoper" + ], + "post-update-cmd": [ + "@php-scoper" + ] +} +``` + +That will run PHP-Scoper and update the autoloader after you run `composer install` or `composer update`. Read more [on the PHP-Scoper documentation](https://github.com/humbug/php-scoper/tree/main?tab=readme-ov-file#step-2-run-php-scoper). + +### 6. Follow [these directions to configure and instantiate the client](../configuration) diff --git a/docs/Client/namespacing/strauss.md b/docs/Client/namespacing/strauss.md new file mode 100644 index 0000000..89832b9 --- /dev/null +++ b/docs/Client/namespacing/strauss.md @@ -0,0 +1,90 @@ +--- +title: Namespacing with Strauss +sidebar: auto +sidebar_label: Strauss +sidebar_position: 1 +--- + +## Using Strauss + +Strauss is used for namespacing the Client to prevent conflicts with other plugins or themes that are using TrustedLogin. We recommend installing via the `strauss.phar` method. + +### 1. Install Strauss + +[Install Strauss](https://github.com/BrianHenryIE/strauss#use). Strauss is used for namespacing the Client to prevent conflicts with other plugins or themes that are using TrustedLogin. We recommend installing via the `strauss.phar` method. + 1. `cd` into your plugin or theme directory + 1. Run `curl -o strauss.phar -L -C - https://github.com/BrianHenryIE/strauss/releases/latest/download/strauss.phar` + +## Using PHP-Scoper + +If you prefer to use PHP-Scoper, you can follow the instructions [on the PHP-Scoper page](/Client/php-scoper.md). + +### 2. Install the TrustedLogin Client SDK + +1. Run `composer require trustedlogin/client:dev-main` to install the TrustedLogin Client SDK +1. Run `composer require scssphp/scssphp --dev` to install `scssphp` as a dev dependency. This is used to generate and namespace the CSS used by TrustedLogin. If you already have `scssphp` installed, or are [using an alternative way to namespace the CSS](/Client/css-namespacing.md), skip this step. +1. Update your `composer.json` file to integrate with Strauss. Follow the instructions as detailed in the [Strauss documentation](https://github.com/BrianHenryIE/strauss#configuration) for namespacing your plugin and theme. See example below. + +```json +[...] + "require": { + "trustedlogin/client": "dev-main" + }, + "require-dev": { + "brianhenryie/strauss": "dev-master", + "scssphp/scssphp": "^v1.11.0" + }, + "autoload": { + "classmap": [ + "vendor" + ] + }, + "extra": { + "strauss": { + "target_directory": "vendor-namespaced", + "namespace_prefix": "ProBlockBuilder\\", + "classmap_prefix": "ProBlockBuilder_", + "classmap_output": true, + "packages": [ + "trustedlogin/client" + ] + } + }, + "scripts": { + "strauss": [ + "@php strauss.phar" + ], + "trustedlogin": [ + "@php vendor/bin/build-sass --namespace=ProBlockBuilder" + ], + "post-install-cmd": [ + "@strauss", + "@trustedlogin" + ], + "post-update-cmd": [ + "@strauss", + "@trustedlogin" + ] + } +[...] +``` + +## 3. Run `composer update` + +Run `composer update` to update your dependencies. Strauss should generate a `vendor-namespaced/` directory. If it doesn't, you may need to run `composer install` first. + +### 4. Include the autoloader + +When using Composer, you likely already have added an autoloader to your code using something like `require_once 'vendor/autoload.php';`. If not, do so: + +```php +require_once 'vendor/autoload.php'; +``` + +If you set `classmap_output` to `false` in the Strauss configuration, you will need to include the autoloader in your code. If using the sample configuration above, the autoloader would be located at `vendor-namepaced/autoload.php` and the code would be: + +```php +// For a plugin or theme: +include_once trailingslashit( dirname( __FILE__ ) ) . 'vendor-namespaced/autoload.php'; +``` +### 5. Follow [these directions to configure and instantiate the client](../configuration) diff --git a/docs/Client/troubleshooting.md b/docs/Client/troubleshooting.md index 6a6349b..744db17 100644 --- a/docs/Client/troubleshooting.md +++ b/docs/Client/troubleshooting.md @@ -67,3 +67,20 @@ $config = [ ``` If those are not the same, the CSS rules will not match the HTML generated and won't be applied. + +### If scripts aren't loading, check for a No-Conflict mode {#no-conflict-mode} + +Some plugins like Gravity Forms and GravityView have a "no-conflict mode" to limit script and style conflicts. If you see +scripts and styles not loading on your Grant Support Access page, that's what's going on. + +The WordPress script and style handles registered by TrustedLogin are formatted as `trustedlogin-{namespace}`. +Here's an example of how GravityView (with a namespace of `gravityview`) allows TrustedLogin scripts: + +```php +add_filter( 'gravityview_noconflict_scripts', function ( $allowed_scripts = array() ) { + + $allowed_scripts[] = 'trustedlogin-gravityview'; // ⚠️ GravityView's namespace is `gravityview` + + return $allowed_scripts; +} ); +``` diff --git a/docs/Client/usage.md b/docs/Client/usage.md new file mode 100644 index 0000000..5ae3181 --- /dev/null +++ b/docs/Client/usage.md @@ -0,0 +1,62 @@ +--- +title: Using TrustedLogin +sidebar_label: Using TrustedLogin +sidebar: auto +sidebar_position: 7 +--- + +## Requesting access from customers + +Now that you've installed the TrustedLogin SDK into your plugin or theme, you can start requesting access from your customers. There are a few ways to do this: + +### 1. Point customers to the Grant Support Access page on their own site + +There's an easy way to do this: point them to their own login screen, with extra parameters that turns the login screen into a TrustedLogin "Grant Support Access" screen: + +**`https://example.com/wp-login.php?action=trustedlogin&ns=YOUR-NAMESPACE`** + +Replace `example.com` with the customer's domain and `YOUR-NAMESPACE` with the namespace you set up in the [TrustedLogin configuration](/Client/configuration). + +If you are using a support system that allows for dynamic variables, you can also pass a reference ID to the URL, making it easier to connect the Grant Access request to this specific support ticket: Add `&ref=YOUR-REFERENCE-ID` to the URL. + +#### Automating requests with Help Scout + +We suggest setting up Saved Replies in Help Scout that include the dynamic URL to the Grant Support Access screen. The URL in the saved reply can be dynamically generated so that The variable `{%conversation.number%}` will be replaced with the conversation number. + +Here's a Saved Reply template you could use in Help Scout (update `YOUR-NAMESPACE` with the appropriate values for your setup): + +```html +Please visit this page on your website [UPDATE THE DOMAIN] and click "Grant Pro Block Builder Access". That will grant us temporary access to your site so that we can assist you with this issue.
+``` + +Note: There's currently no way for Help Scout to dynamically insert the customer's URL, so you'll need to manually update the domain in the saved reply. We added an `[UPDATE THE DOMAIN]` reminder: the customer support agent will need to change the URL to match the customer's domain. Once the domain is updated, the agent can remove the `[UPDATE THE DOMAIN]` reminder. + +![Help Scout Saved Reply](/img/client/saved-reply.png) + +### 2. Integrating with your support form + +If you have a support form on your website, you can add a TrustedLogin field to proactively request access support while customers are creating their support ticket. This is a great way to streamline the process and make it easier for customers to grant access. + +We are in the process of creating TrustedLogin integrations with the following WordPress form plugins: + +- Gravity Forms +- WS Form +- Ninja Forms +- WPForms +- Formidable Forms +- Contact Form 7 +- Forminator +- Fluent Forms +- Elementor Forms + +If you are using one of these form plugins, you can expect an update soon that will allow you to add a TrustedLogin field to your support form. + +## Adding reference IDs to Grant Access requests {#reference-ids} + +Reference IDs are useful when you want to attach a specific ticket ID or conversation ID to a login. + +Reference IDs can be passed via URL like so: `wp-login.php?action=trustedlogin&ns={namespace}&ref=[123]` + +When a Reference ID exists, users will see the reference while granting access: + +![Reference ID is shown below the footer links in the Grant Access screen](/img/client/reference-id.png) diff --git a/static/img/client/saved-reply.png b/static/img/client/saved-reply.png new file mode 100644 index 0000000000000000000000000000000000000000..19e61dde023d4e4769f0ac64d9f1ee3e52d92dcd GIT binary patch literal 66890 zcmce;by!>7w=NoJQz50$7J?P0#S+}LSb;)u*W&K(loE=&6o=yO!KK07-QC^&q~CAv zeV={LbM8L&+&{81*R=7@cZ@aWT4RkQKt@Uw9St81005wiiwVmC0MEbx!1He}o*-+U zJn_Rteo4qkDu`U)+@PSKFgbKYBxG!E?+Au(9v&V&K0XS|e(M?>&n_%iGqinpc$k@A za{e9&uWvE6^N`ap^b3t`>+GSYr;n~(hY#*MX3Z;y4iQ+O(gFY^0C8af1?QQ)5wp5zC6Q0etARwe?I`ifk>JE z$A@M*kgnl%uWJ?ilb-d<6U%;=oXB;1dOEKSje*Earf~smx|uU72d{TVfCnqpE@_CD zYRR=>i}}6hOcA%H=^UR0wt=`@{EFw0Zx9>o;Gpo%YUNdn7Zh|NqZ&@ud?G38oCFao zYldXT#FK#r-OSl9@5)emg5wO9V>q68n=jXxFKbC%tCm}Tf|FeKf>SQ0wC-wAxD7yW zr%}Bj?z-@!fbyf|D6w!@ayd|v45bTEp^%ZS-S+L?ExMT+G=CZtU-&`XKoGnT4{dn+ z56T*`uMTQ;E9b<`$SOH{$G6mZl3fVy3YccGHsC>8mBFR8dnfR*E{u~w-TC_@eH}U9rZ_UeOMc3inxq&Vb*>k3^!rL9|&@_4rwok39alAY`amcXbiYs zoP^eW>t#CPuH2vOL5%!l#VNCgO%7x>KH56|v~%5oC-%!#B@7bI0nPUVO)oIU&@;6j zQ*(L+^*n5LoinH>G1{`&gSM1@X3&}xPKxxcb){&li&2lpz$$L$>NrD>akWJfyH5%p zLX!nQ6Qt4BS*mSW;SU#!a1p-8J3qo-t$_Vl+560RCe~J4dA_$!==8_WVCiR#R>r+k zub^T{eWbz<JCqX4(oNGjU+;)>J&!u8=Kw4THg@9KkMZgN?>Q;$z}@N3@lPg`(OnR~8b z56NbtZMYTnOU0>J7$1-5p!J}J)0(Opa!F#MosO2fJPnI1(B(C>>qgEG>`= z!>Vu6#&4ZltRbAH%4*QOG+IyVyRNgL$>&i7C!A*%zWFg)yY)F`u_tjgqidGEN>|RV zt(UUI5Tp?Q8QjK&v!X%J(3wl)7y8Rev}!`&78cCVqQIiPTZ_wxK2RDL;_4hSJdOBn z!!|?|z`MMP&zIK-1JTiYL(up;p{<$od^1*U_g3w7EcpVEP z-E#L&&%qby|IKJes!z=9c8l4rrn}ug%|czy;7pmP;L%7hpq2>L&FK2WdihdSj8@*a zH&(qIGf#KP-@$ZyZbQCIzKiTx4R-QbhCHhDi7ZY;S=st_dA#@!HuRAqO{oNQUv`$F}kvqPgEIencA(SdtYIfmTO5Hh>! zHch0-_jPq7)`UkYzUqs-c-yW;8ic!~G)7>deyo>4q=nS(;ya@O@+3Q<-RnThT9SLT zr_E_-u0+QSnj9)%;V*FO_&JNLbKy%yyvC5@nUDI`{PI2f=6}R%EpvgIM9hI$^u2;= z@e77+bOPWjnrE9bhRyGhOj?Q%m_75~ z6>rJ@X#KjVSsL@1zFOxM^5UNtX?#7%$D;mgFv7#%7ioXlT?j4G40N$R@Kr9QA;>C- zc{?J`K*zlc7!K1O2QDA-s+|Cj*Q3PB(l<3s)M$cq$pR!Wg|<4{I?z90Xi z2IKLNf?GGTa9udA7jY&H?|WD@^Tk3bU=Y(!y6_fJUPg6iy`-06r32__^9>E}G>|*4 z)0>4*1(#8np2G5BIq*D(b7>~WNU@2H*7V)oUgKtG!=BLv(MK9>6jU#meUEWG`d zST9&tR=N+oKy1`YUTF6OX)W3HfN9jLa&sN~2l-#Kyqzb3wX?>hp>`#8ujSuV?!GfQ4*_4=4kaZQSzoyiO<{2 zm!UR>ya+D#(v%Y8IuHqHslFVjQxcVrGIZ~~kepw7A>;ZZb*_niBAyU;zWd_i_A(A4 zF`alKN`KiL75kXdOir)rwv~QkC)ZryP#L6@%o}#BSlOK{`l;(Yf}7hHqKi}oW`L_M z+*&`WkuUk^#pc`)@*?Y|`veCxLDYX0M&x^&JoTAU0(u8EopFHi5>cE!;QoS3t> z_aCJC&qF8WPaMu%6Y3G~r#SoFk`jtP5El~iS$lby{h7iJkx3TZm;6P+`!f~4pk4oa z>DscnKpb`G!-AK9YqaDGqiFIvgaGC9s4)xwFba1{;u(? zrh;6wyF*V1p{|x2hwFg6C|OBZ)x*ul-c`WJSIw7rkXn4tQHK512}K{pJswg69Wpmd z*NPbTCCnSgQ43k!8wjiK=N`cuyfA-vEd0{Mi%ofA%i+*mr->&9y0s}}bmwHQFr2cK zu}E7h+NJU@_>{%anzA|efenyLm}FU;V_@k^**K@)pm3`bJ-YZ( z^#S9rc7;D`RW1JD?LVCJ@3 zIOOz->Tw3VY#4@|di<{p=B4md^KS1mzh3pdD2}WnR`YDw={Sn=W%3BqOi;lN(Z;z9 zFue?qc-AGhZXhE;vvV@InzZ)@Q5y+*;^A_*j0#wQg7UsnP8^CCFGhJ17`~1^35b1r zA<(|Rk!gGOY(x8e$9|hjB-=%R=xsU66E@nm&-YPC7wzkCAcXBP4+OaXhPVf)&s|pN zKTg%Z+ZT>tc$L=oy;Y6M|M0Ppyug^juq^7=-0XJz>vC}uk2{E~`#xxRXn+LlS-(Bk zauxs^6;0&UFGv=E+^L>&A~rCI^T#Js(*B-zH+G$EgxDDyVS>EMnsc?!z*R-R|2F6- zUt$pM37P(Fa2G8%-<;Jx&3A;=I6f;&Ywe1xo5e8!+k70d1%NU6lXD>i?ZF|5-3nyt6gLH+L&=MOQ`+3)X;gl`$?DnYuSA)HCWm z0ta3tjw3KZ7IpaLI3R#mgIX6xJ`hk=ssM7)$^`@35OUBp#Y{Ei8YHU1JO86;F&F$h zvv@Q_gwo;d28Hkh>2Gy3NTuMk~WK{ zIR>o3<#j!*G*0*S%774w=EmNdfDH!m5>!qwPVX+T-nFCI4&Do{PD?Bd_K&aBe=4;5bW3s{6d<) z;YQ#Wg?4Q{KoVSQEmk3)@=8&NMOw+vraZYI0gzIrhHK_~%*+sLn$E*=>awM?WU90Gr{HXd zZd0H5Fd^S`mJ_Vh{>eYqWUvfVN)PTJE6raP1p*AJLiJ^t!Kj<2q|xI$C!=;%48+)V z{;)hcu@f9!bl{QixL|H)n4G4rjsv@TVo3q)CdM=!X_n0yYA;BMESZ1l>Esff5$#3B?elh^(-^UPY9r{ABZ7R`HPHs+>-=5mSuIHf|gSy5UKs9%2a=<6XQJM4sNP*S66*c zLrb&&^r&zgaU$z1AGhGRTp7JxA-8D1h&am=KR!}*)!emY^QJ5Y-yANQ=cv4B{h7aE zA>YqV*RVe)$TmP~^}1fCr^Cq!mB*%v!4tA`eGASmQFcD{0Nq2BwRd8x0}N4}%T=Z{ zU#ZebqMutnq$E=%=#sWo=fh5taMI1=thQun0X&M3hL8Hr z3+Af=nxt<=bxHA8XhO<|9*6vk74PuP#eMtUa`7R$7 zq+`%U`2<1ww=$%wY5Sk5_%FQTzt4A+d!E;O-;r7p7;CMj#Cu1(A9p*w+0?gh0grPr zqPuV1*7m5nEQwtMsXc2$uy+WaE@snzfo)ahu1+oUe9PN60sp+Tw@vJAV2;~4J4%Ii z-6%_31EEiJmnYi<)h5r~QV<4^_pOtih+cz*c!^t6NQ2W8_ntU9Nk|KE0Ibx_81h~! zssmX(@-`)Hs5qV0GQ3jw_fC7vWteTKy2}Ciu;0i>sH@dGiR(Z27Z{z0Qw30riVU=+ zBou}z$Z|*hlgRaEJ>&lLQVAp*NpU#k&7KeAwv&b4-NvGn9VM5A_rH;$<37-ylI4Y~ zsqiO*#EF%(R;8X@ z5p=n6@?g5$F;hYuMg*_2faStxc0`ghN>mS76o~FFV<~%_&w&(4@=4|Zc#enrnB3hY%6!e5UMD2 znv}CEfJiMn%L)#3o!JK|dZc=Ta zNYMDKXO_jQrut_jV7RUhhs;RG;Q-{!s?gPCGR1Q`jx@W}GX`v>T9ks-&vUZP;Hk8F^6)s%RT9_Rr zvm$p$LQpI6UUfDbzkbw}cVDczRnOnVW!Ug{YqF^~Fee6j;9cQ9^$X#D^q?lgCUvLCA%_|f5X zAr{Y6U#(9PD)KXqTJUE1njBEZP~mT%?8qJ$Hr8zrvVqroacCfWnNhP$VSMU5YDQS1 zSEf6!U86OjX{6@Jp86{pnshVmRjZa{sn`CS@QTfizP>7WTdsXEC4c`D*kRGc!x0|7 z@TJ-R%w{*kPXkx+)5g~G-Cg{##hlnUo#D0VnSnj?N&1uMNhbSqM@|yn9 zTi(hr^yQjt!e&Gp_J zF7f&L+Kd0fOki-_(b33)H1tn`;v$6uj#alIelxJc;dCSRrJburpZ$L#iCMh{-8Tw} zg2zbpBJKuOW*zu(>wZRp+eh6Yb@QTOyU%LVqy z%lmG(Vl=UTf=C*HI*p6;m^>{uZ#UZ|OH`h(cI=*0&sw6JygR34-URPBFJ~PL3U=`B zvDGTr1S@@%`{23uC39OTL6m+HxYO3%V*|_#ZCdm=yF6)V)Y^Fzw8(LUgPtw*&eq+s zMpV}t;^TPAv1^Yp1?Xm*QO`(azu5js>}KVyBG!g*WaU;@(JbNMOvYHoi9;BKI2vZ7-B9u@aT0pTf2DYaZq19YscQrXySf1H~`L8=loFY+^zg+Ws5nBmY`(Z(bPzX zG|;*`lh&{iCA*?reI*f!0iV+|d&$XbFJJx4kKQNqjTJI1Y6BICwSRXJ?FGSFe)zfc0BOKSc$(#E+c-%h# z?vQ@iicP7G4-uBYj*Bw_Z5P>3wkSB*#uz9dRW=xNus$PoV9rhqivLTN2D|n+)2ObY zDfJwZtoWbA?nttJ1;NftFBfa?483kKQ#%O9&zYjTI62~vy3BQ$T~BIf2S0jRp5Ir% z>S{bK(h~w;bHkT(+piC6X9f=T2FyuEB`*y@|9ReiFeb=KML4jdgxEuL+#|T4)y3oX zv+0m5cK6_^@o{ZJG88N0wC?`I`i<5a{wu1{tHpHI3i6~n0^t`^49Tfb7 z1{-oQXI&mFB-)qB6825i_up&dvjTJe((~$4cqVgzD~y)J;Y?@SQgds=ngi<}RbPT5 zY$sRx=*c`xdZT3-N2{FR_?Jg#GFD6Nwc`zG0Jf z*h~@YJlbj7ow6IIm$LT|sa1J&F$dN+!;hDz1s~=R8xyv(W1aPR;@juRejvb`-Pjw z5f7WRfyE{lE;7kQ0f+LzpGKfb6?JJ!5)a^7Xp@_z)ANvx!`@{}JLySBLn9|6q~+H! zt2M9=?hxV|qv$f*jf zS`+d>wc2%52OKDJ`sNc7y5eM9G(XiD4X4h}<1j}*uic-1v+&U!@K*Jo z%g}t|c9Sg|Oa3qijqIC{@jmnPriD$CtMgwqw&1wahbvi4Y303}vJD;AyVPIMvCHam z&>*F7?_>a47xDdhcTl>IPpXn993I6D0=;QRJg^OmvyRd+)(2>v4aB|_r5x4GHZ?(R zh)!xd%k`oFT^*I}lv^_!4q~U<)+;5)@e6kzLjKpi#GgCSocZ=`%NyNt%Ei; zE}atMk_)&+S%R-04&0lIdb-~{Z{5|q3LK0!uN!<0XR2?{McUhC|yr-LLLpuC$ z&%F3Jr=Ml^qxKZjw(dvM?R2s^YSnEV?l&N9y^YrKbIc4Q_k&T6+H!k`DMF`hkg-?l z_V6anHaf~f%K+c7B>xPP!F8=}^{(i@=K`qpU@dn?epk8jGNGR$E(Xvbh@T4edaGPr z>MqYL+P4m6Ev}9;k$@l0Rj5i9Q+cg0h&%a5gM^3w))lF!v?~*JENXuKJ7QCpv?+Gp zU*T`LQ%^@RHc{_(e!Q;9DV_H3lSuOjip#AD-v8o*(f{`o;s5x#s(~K-r3m#%zDFAu z1nNf?z|Bx_et-4|1i-&O-+0tpCi9C9aJQ$Qex+D8^fX2TaP`I@3hhv{+@(>-D%3keJrEH(mgMcTeo-HtGoH3564$~L+cZSc<0#v(i3GV7=o_GsgQ zCYgx=?y2zAd!KjUf$9IVDA)h3fZ6|MknO(y?m@5$9(=%e1DMh$^tI)f<=MDEp7;`_(ubDA`tu#S&X zX113p17rBIk;RKGHTM` z#NXAK4Qm!%=!yyf0Qx#{>ej#Coahp0<6qc`D{h0@CmBoe=iA6^-rkLc$F=k6EC?x1a=~m8B^{$ZgZ}!G4^vq_yPRDXY zQR|GOzA|94>4V+Z-gt2piU@aVQsUvb7trpW0Ov^$6$di)8o(d_wHEutBOWnmdB{=w;CBJ{dTL}>uCCC z492`5u}rdM!SGvS^@-NyCSMK5h{mBN=OpP*YF&u)dKc0Bi@bcLnes1p{Yy3mt0T zsc(Lj$g`>p2;bZl&&{?;hB4xdO2%v%Hi-MxVkw4$qLf4LD<{JpnD`1556oX6^O4N! zVec7V*Q_2bWJwI><5u-%<11%`96K@xD7e4wDf5ZLk2e)I=-^}N7Etu8+ES&7YQW~7 zHu;xkW}$^$KEy4Z&Sp`0nVu{q_bq&3yJYe|;vu*(A`jRV3=@RGgcuehu%X7%v7oI5 z{YevDekYcvfKT9yI+(5hZmatUU-snoS=#k{=pN=IyAfGlI~mNE#;t#|@T>tNPD0xY zw?9ZCL5dh*Jx+*@0tkm$&H2DxZ)gl#t>uGFe#Jw?C@sg&)h1=ZeV5{yA?io*TtWLy z7PXbAlcaT&KOUM)EUH4Zg?exQZ7||IvWSk2k!_YDTlw^jOAgAkN4Z^f=@HiXg(L;1 zp-VPxFg10eOQ4IrcI|z^)Ho&p`KGc1YF?;bx>yU-XH{eN^uqaN)dV4CN~7~Q>qwD z)oF3Vywq>5PR=YccOGKv|50sc4Q%U4utXs6^TJm$*y?G59Rclh)4?}e5gHuJKZWZ) z(TDMPxErGLR)1A@HwT@vnnOT~u(#@&BLuP2R5gC%`JFN;XF4wY4AGEDj{Bg*CH?j# zk~FVvuwR$gS8^*Cr;m{@rI*E(>8`l7&SYow-`dGe*TD?z*-u~QN6~MkqUv9;{?(7? z9$3i?v`zsM3cqA;u3>&hJtvfx5btA+#<j0=Drjl?C7i}KcMZ8tf^lzSUp(hK7)A*12o;xAFYB<2M0||63tGSNsGO&GHEI5PB&#tL;})+H z0kIWm)lf+0e`{$^nsp=o*PSgh_H}6GY3|xbH1K^s>xYEc|E_(R6URQSREK3i+ixK1 z*Qv6p#@paVK3kkOy5l+8@YiV_5%?TC*EenknI(*-_C5Iv9huhm37PH)P(^<9QT{E( z@81jmUCaM=#nlDR7d3PMpxG}bpQ8wZC58%U(H0Z3ky4epGX(%1o;iG04R10+qPe5- zl%yM^1bH-5G!p^57e$E4J#V6exh?APCIq6&1OVEO(1TR;nOug~XyTdDVHua5w-91fgAMbhGp zOvn2Kwgw^HGO8t#1JxEN@`enA+-8uJRR7JlTml0goN(>FFCxsXw>}_y9tBfj<}b>) zBa7ZtErdGA5iPG3t&1(xEsA1}!1m2w=HUaJKhy!<&ui?DTMJOjk1Xq~{~&uk$+s53 zUXa3SptCRk_IDKu5oX>&%vhCkKVYDCtunf$p0#pj}D%-6}BW$MPzx+70ZfmQGlrYsfA_%4;mC5gtr<9K@o zyfmqh&W_~4nP^?)&%5a5v_+L|>5fea3lwWm4Q%o)jO~qYsY5tj^n<=Tg3=L`K}FT1 zb!VnA&>=~|K{h)2%220^oV9Z;;?6{ZZ{@THq3f5gyUNOr09&Gjev17eVC)N*`-$?v zm`6;V3vKXGFXhY4#ntVAvT2!R+)nl&A(Q3U7d^0#st8i?(EK2hf*WmKmqsZXkE+o5 z^6sob-(2lklH%Dgop{1RmR|Lk56;%XNCSo?&!vYSKsx>b_AYbNO8U##`9=H2*k9s9 zj$s_%!b|SEj{{4V!G13)=I}3*tXIDi^}K6No+p^+KaWdprauHPSj;0-PWx!mI>XrX zmbht*+09^z$7th9?4ErA>dox8Jqfp%huY<>UnE`R^=iilg=oF>aOj=YZ7H zH}gAvhr0`Yk6NDY3h`bt@#@a0Ze#(qnjH3UeXhXsIF5X9-2pg7e5g7Am#eJ1g0_9n z`FGXRUmoyHM&%sv?XtTiDWSMi;=brle52YV79LN>o1=MkaN&m3RA&@|GBVP2k6G zb!pb-zv+etK!hiUiLPB*zn2dge%O?K(EwQ!2VvW><*D$L=6Df#^KSVzLRgsijk#*# zfN?B=R$2ICE8*3r>~6p7JlqZFVUee9b+GLvPd*RKz#or7@6~Oz*q;qj=*o$|Q8k3F zP78;H#@vSt=6J0A=;sUE&LOebLU7ItM*86j$`I&Dy|q2rO1SdhyPemw^e-Z>pD0wByeBYsE>1U{Q6z#I}JxC{;XgK7{H*lO)k9f0hB^_28=oPPq2wdWX)g z3}mf^r8+$bce(>ruS!kcxVkPO2JD4o^HCH>${V3hDG}E zDkso%%%uZTkl47e;?-3!cLqzx`w_Q#nBYrNB1yZ)Y<1(;DFKyKoSjv`?!}GkNIQ-Y z4Tm?n{UUoOXi*=A!~=c@AEGu}GpYXC6?_$E((Q6T=&q1>sMsre6A0n4L%6d}&h$2| z6;90iBy4sZXzxNgukaC_V(~ac4>*>j8}b8mpp~U~F*nBNXWU&rDHA^{NqrveziEFi zv#phSmE9`B+e)7_2lci30g+_v;W9FcXqa8UTwitI<)-8RWZ8pAsM;zX&Ysl7`$Fk8 zq9Mi(Q%CZ$Z<$B)qXf0=r1k?3A^SP8n{wKEE}GDGL~B8)Qo+MxbragtNPwg1 z_N&!MM@O|+zZ{*S=6s*lY+n=~SI5oX>bOm6k}8bM+&=4_7d0@{)vAbO1ZChgOQpG> zK&j|T(F9ooR0imeuZ)}oSg1vDp-Fi?@fkn^d+}+?+DuzemNMt7LYMYfF)_`nyy58%Qxte)y>JJ^PT((hFdMcs(_V(|#w~4;dyCjnyWa9A3V*dTwT1 znaW>STJUHfCwAt7=*?=*rB!MC9BVp4p%ES2cy65w;h(T@ACuw_96knngdlC%bV!G-Fy*pyw6!x4i z4RyjUH&pu>(qO(Vd@{rh{u;CCKX^{I+YUO6KX(I1v9{ffzbhQGMNGUpG;RM_O-`(N zSd{2qPC4?8?{P~GEs>45p)PiwqsbKecM->o7~0|?x*myLUtgp<|H=DT8K(KEgPj;YmQ5^w-fBe6wcJo z+?MpwVlt`vKy&|GPi(r|a@cb@uvP$Z&A!Png7 z;j71=mn7ajeh#U^Mf@48Y%j8Z3Vj7dBO@gg>O-LQ$j%H;>=gs)q9oiRJa^L84y5h2EC8(|jkfrI%^>iak+T*lhmC-`H*-3y zgP7Q4SJy7JO^^MX;hD0$aXNJwrJT`MfnCBIsT!@-&dlTtz&CSU5gSc;+lh5;5zu!Z zQo}zkb7-IGv+>@f$K;+Sj@R0I&Ou0$Eh;Z~KMt^B8Ic8gq$&$&B?_kqet%?1wxf*X z7I*Hj$!zdW@6|$!@Sq%d?nZ{r!Z}xWc5=MtNu!O)uAz4-I#6^g+J{PkL%})Rq0G6M zekEZQp}L=21gvo=qW?2)dMS|X=^if=njBUKuC-^-KQkVFrz|`ndGK>vGa{0DPKT}Od=U~k{aVt&L zSG*5(Ee!f094ynb5Q7r+t8dbo5$9>)MFM&|&P1N#d-Q>yWB1rf@r7w#K$numFk90c zK$zH*`N)jI1o}eucR42XC?3n#rB8nW?YZlDjbWHWru6e&@KIW@=m<%qX4w|x9%rgZzW1(>QHRL52c8f1Lnwxlp?vOccYXzE8b_Bo)Xu5yKP}rMgMxr%p2jn zvwj|30mXPPAFw5aQh)V8hF5{D7sXp4zim;uqz1a?7n}E?r!F;K)?u?2Xj#*}j6U#e z(w@yqvPl?cxmGog{WHdoprkX$6-YBBUjzo5^snXk84Etj3 z_9MpfYxS${T(RSjk{l6`U8bVeM0qLOBe;99Kz%C=x7`?cdL?B{sTRf{EZ19Qon8~o zY%Vk33k|050=yp$9M8jNwI^YDekxxJTjry(RUqMfZ#;kDdjkqz{q~(?HHkfhumBWma8Rwf(mB$-@pYFVPn1Dj_PKy4jS>|GG}Do+NV?x= zL!;(+B!y<`R+xoL!CnVE_()9=MP&g2D_uQYod8z1RW;7kv5_aeV zMze~zX?f_PE3Y!4V)kunGkux%Yd<;Gmz>`#2AY*5`65 zdK4ktu`XMZkR|%`s_nahi?qgDO=p_!vPpT7!GRZN7?mFl_4^jNS z6Sc0=r(#3FyD@pEc*gNdTXXJi1G-nbd{T9dsOBt)^#tbweTx{nn_rLRV8`iI7-%}FZ5`fE~0>LFl>z}WAP(Fl%gOByUOdq(Diuc)ZGddFSk!h%gG5v z7#G57?ioB3xf4r=;H%oxNpP41_%6V-QP9Tl&u<`sxBx~F_^I8XGB?-s!Ng^OZ0iq4 z#iCo&=OF|HX~1RF)wyFWi_E!(iUh0nsuyH|;0x#eE3{4Mk~rB%hIh~7fw)(SrArUS zLkr)|oG!!Gz|Yj{VtVV9iA@>-GQ}B1yqh=5TsOyvW+7rSF$7ST+_%ymc1 z>$(-U-8q#K7-d08pL_Ym7J_)0msF&bckWMG)WzFuSB7q6698fi5E(tL!0|}stD4!dRvrVVam8Dm&dOM>@uwu1h@}Ji9sSF)4C+V=mU2+}Go##_YIkzlMKT5UWNVpaR(FnH%AJ^ruyxzO3 zNs`v8;ge^c!4(5(*95t3AcUFM9zWl8xbcKjYt)<>83WEwv_Y%u0t~+*v4Lw}W0Z#d zX=G^f6$ZqWU zeT>DJ&9O@mlm6Q;Vp01K$Kh}9QUak=L#W4iQ)pEAr!lFS!aELv-`YLp<&Sp;%T$jQ zgK=F&q4i5WNzy;ThWU3VY&~WtN&-V1azDPd9+5v*gk}3BC)thWh53WWm@gII#07&( zZz#Rq!U}PpFuy|V8X8JoNjC9~JS533OX&Lrq7mLHxl0~jk5R~2ez>|1%fC8mPgndj zbZi@cHF+(a1|*d0$vaq;Ycp8OJsQ-4xi@@H=&PyGOY&gfG=1I z(DxXfL>vvb2rN7)#`*=U=VuL$8fuZr#a2w~RG`R@9yvM==WeW+VQ1vAh$y8f3zvg1 zv}SykhC~GxHJs|}W;kweY9x|bXFETm*zViJXtE8L7T^aqRJEx3k1`|h@Et@ zZ7aEgpk2$e-_qqoK-f?P*Pni61z!8e(v40b`s$zsZOC0P$gr;9g>V=M$8BcXZ~n$Lj>XnqVfyty=-%_%)RnFIV>q*2QTm z^2PM9f*QHIrgOhqyx#-u>a;%5SV`e+5RzWJWbk)6swXP>*p+H*x|nm=tM!(V>W9aw zRoJ1o*EuRw#LE>``=*PWYm4a4%=!L%6XJ;02NbTcMXN?d;vc=`rr9r;rJL7jyqu`@ zAS(90;bLcJ1uD*WiFXR!{~>no5VG|Gi^S&eDd8ImAF?eL zg85JHo&TiF0Yrq{WpXeCnfIFZ9IQd#$wdX$sNbB4!<>#fk0T2FDa1=#`0el&_cV_R zVA^klK(IuZ*Hh?G$7BbK!n%Ck5>@0N$7PJvC%#(DOfZdFu0r03(~^%g(l&xrOO4a% z=OANsurDz^z92e31=bz$Js%;^Z=`BtXb4Hdzz@tASLZj6Cvkq9@0yIlh#p*y9+pq` zh@6}5uOg~$j6e^A3-MI!p{P2)$`y_GNVKU@4j(gVZHPl&b0=~zKUS|NGp5A?@)C)| zjkK|~v&>1XI3qw-#Nae!g8ifk#SuH>Ht^PKWuGe-8QVl{B>Hn*v4$9xI zn13Y#0RQ=9nX_sL*>=UaAOp2;y~7Az`GLWAwRHL}^-=+}h3kIw=XomeO+&g`OY_Wg z0D!-fARlOt{8>H;gu)ah87cb(=&xMw(tjXX`8f+!d1D*>h4~NAT-YPOBy#@$5;f*u zXr}+*O#2tk|4S$TQw047lQIk0yBumLrpxZZNrRia;qN&>wW!6|HOZ-YrJi^f0Eh)3890nKX>eOJ6cX+f-rM(AwntV%WoHDT!Up@5O zrk{klS#aK#$bh`Q@C`I6hmKZvN^{59G<~gJ3zU*5f8c90Fu8uUG=6JkseLZ&RLxcC zlBC0>|BzwLYb(V}PW0zBc25Y*pC_5S%NUX(K!k7YM$H;oE=s@vRw!Va-LooC&M8OL zTS?@0lH4X*RfNxc6lY2Ic{j;^H8=FLRe8a)0*Bj@2LEo}<)+s_hoUj*o*N<9%nXrC z(qks{nkg_x2T6{H38jRV9)Ld$7%;%Za)?ENaT+PPn+@Bp4nd&qm35Q`lK$2&Bm^8P`}2~ zntOV`J3?{m3LByO$x3TDn;bt%8(%#W`dZVH@!ChNw3a-%)Bd3CR~22J?0$i1`s2qc znXw?kTHNx`?DJFM9=pA$vS zUwH0YaurHER~L7g|JAmZUx(%PAoWiD#i*$2M(ekECL`j#!ot8Dyr8O9_cqSVhuok+ zR$0aZ@QNZOk)!C(;;JcHQ&L|b4ZTBHfHb)6v*(4W%D2S|xXf7Z>x}|DMgn$c84y$T zA3=O=vqU+lSaPy;kQxbL|6U6JH8}+(y3X9GGSk#$EFx$`F`)y2juU0NO%#Z7{u^;` z8P#Uct_vfjv`v8mCA1VN-U0#I;_gzk#R*y*g1fhc;7)Nb?w;ThDDLhM+@-jmwC{fR zS!eBY_IdX{>sue>$MZ~P?zwK6nIzB5bvtT)NU1d(E>N$f77!aHBdeSFQd$IRH~m32K;a8%wM&ei&2j!}f*Qds)*`$q!1o^9#oUP?ec5 z-*@SA$Tk73Z3mD6{la@BBlW+%A+EGkt~t6pheGGg^{r9_wK)RYwP!tQT3kP>QsyY9 zc}VlF-Pu-lbCw%Yr^)6}2&T9Y@97Si4CX;^pk$Hm&woG7;?`~FFI_O%>MP4rh%a5* z%84UfQ$4dC))S+T>fIyW0NMAKv5t_t$U<_D(LR|(5EYhc8X>>P_?N(^WXy%RJH^5Z z+*1}*=TwBA1rMO+v357JFDW!CzOWKeC)=D+BXS^0lYFenQ;$l`bh7?hkNNFLNvL~r zavr1eV8d|e>B$a6xi+Gap5cawH*)`yASCcPMOqPY8?~F8((jd?kddHL-V;tG^}dk< z>W64E65PfsYZr8U2gn#t%9X0TUZc6EQ<4M0)gf&2^_1Pd?!(P4Y2WxTDFxOSA-2&Z zqNG7d8uqEXhho&Z+$ zy=eYoNjVWrM#2jht=n^rBzcD&$j8Jso1+enu+kT`)CQY!kq`r|=m!KXm&)Q0d*s)` zTneJTSo(Ac0_)j<$aR@#=HHk$DxJlli^afXdO>6TR)=0F?FTV6iZ*(F`el*ockLU7 zll}AauPmnCcp}wtSsO;>>B^#qrEIpmR)W&m0;HX(hu+mfk3$PjUYb|y<%G>CYGGGf z&bHEqQ@YBYf7`i;c+p8G=0=w7rPi0ItUt!#C;bB1uQb@qaO2XZ^?^y9o-gjeui|Z| zLy*ibmY*8sRpTQGSE%S+_`;HhMZBb9ubjd>MH2;U3iH#9XOq9vg{y(8bU!T^qhh#$ z2<)MqqPZEZL1Qmk|I28hv`VfRc;!H1rUDA^%PiMNGW|>sXdYOK9&}J=bz6Ra&_(n; zLBHsA8-~V!QGH(7xZu4&^&yvrz@TKkvi-(%&&@BoK(20ww33f=l@FUQt?ipVvp#%| zgW>$_3+yk9{EmU=~_?qba;NQSc=s1#Mys{An2m} zWqoLPHt&TTS;g^(-)8dtp(P?9`(X1{H>BTA|5&(SnM!%XIHFg6me)ZvcuyOAxMF?& zrJPf$ZczCfPC1%IL;q|sW?rs;jlFNy2m(`{Tp=}kPj-AeG7H=}(j6I0b}4lZDe zZDe~!q<1)ZR2usX87+5|#NtWWhM?uDy(Gio%odiVid=)hLZ1-BPP22HmpCI!rhE7X zJJ04|VR{>#APsJ>3w8I8!Opp1r*g0Q{lEKzne1o0l-|TmnDf`{zA|qO*QDLUnl;HA z`@VbJDO7fe{oKz^GQ4ZU-le2V(%hVmLOT@2X5xg?^H@J2bRWDE`?=3v)^(Q#+*P0*fkuXXRcIP%KR|TB%*lsHo{~rmk+9 zWNwKRJS!2eb$ssUMt~=;rN!C(;^LmAu^dMNU**Ddknv?UZ7~D1v)m;#p#9m1%_Q17FYLU?gkeC4nratDy)zAFtLoc{ zLytpCG14M=pg1huA8lR-madeN4-s4}&C=kSn(QyfN^j}ELT3fMoK}RO*F+XnCX0%X zidt7suBj#a%C3Q!X5QG{wae37)d?IHG%$c`Jc{C@9|^t6Biv}vK@mwCDl-vRN(33!wJ&bjB(3u}=B_;c421p+8#i+|IvmzpCA=-ljjw^Fow*_^ zBG3JS+*NzBdPj^n zAuKyfRWN%}AM}q^f{p785?^(?tc&OWPJqgO?TW8Z~g>{RXx$ZumWqhlW5* zVXw8vv)_ZI-jHY|nO-v=2M5GWx&86k zMt(o-IIlVhyOh(?w%^lTB8_&fJ2{&$7 zSwuBmO9vYBLFa6Pzm52uTu+8`Qr^0tuM|2!MzEL zO|Fw6V~@i}e-{?fAkuiQm3{$}pBxghj%)p-`<%0CR>`1SxG~ww_A!x;2gpXuC)fWq zmevn@xc&PP7TmCdDPr+*UTN!dap*N?9{X=)i13;P)wFsBdIc6-hwzPu$PYu&N-VJa znml3QZ{Q>GXjVY$f=JpFIM0?U)Qo=Q6En9)+?hfJw2)}PNPhEc8NOuPaQUExV(gh$ zU`=CvN`ly{lboEeC;P8w^(W&;+omxb{eSEqZFhDk7p1h>3iw?V+etsL;|2?Lymc8S zG;5icfwXGlj9}yxfJ}UnrK(Caj2#VHRE<_P*f!(&IfOs2QZGDUz%hlkD^diuKRkFe z(+~7`2pd$c@_Z^2E-=0zqAu*19$&vTwD6ti*!QDl;7^EYW!X6Tn>|q0b2$Xl0~rtV z-pdep)a(&ooLg8whNrgmDD9QDRaV>=fF$u1@7IT&vmUU;06V-`p)y*lnwK43?$y>7 ztJXhp+;rIVYinsel;zxP9-4p``JzBW&H-BZay1W<=2}%v$z`DHiMhMN(n9%kL_dyj zi9>NtMu?}spN?Otco^AZKM(vd#NH9pKgai?DO9ZUdrOYoyD>adjW1J7?XJYHr;J&^ zirD8D@10;vvd6h!08P5glb<^T%Qc?70+$`c9#ejkjZKCSK=kdYV}7Heh)y3E+k2~1 zM)Ps48)!ytc3xsYPvAN4lpD^EQpW(W>>JSX*>1H?bB_};5*NIn7(6i=XX>Lhkxnpc z)%42F?7B;eCR&{j8}J5tS0R6cnQD~-Sh>5Iky+xN%2{vhfTt8pBW8?P8}0hZ3_S+> zT*XWLiu?rbAHVVVY2Z6HR)Ss}@nQySnpq*O=y_lOC_cytfY#0>R523Sm5u}!)P7`Y|Q4jEfJp(G;pd z!^N!L*^WHrb$uewM_6`ldG)rZI2foXLpjC+TauYyOA?K-pn0Pc>qKRldsTotW<*8> zf3O?Re=YL>W-y2v7Z2qUcE4lPz_vftr-7z=`~}M2Uu3i^oUuXBPc7UHTJWhc`w}oA z`rt){DJDas=r4f7ADg782`KT0hI$n|6A;DhWeasR=j?qPkSMk4xM03(OWmkN6Xm!+ z-{Kcs_+l-p&r+(uxl21q=zi2v%(U$SS2+X7hr3kVTH*bO>(@Pd)BNT@AL zI3MTXWJ>WX)Dl3c|0W(V{HB3j%Mehf&6)?2f70F^l!YnK2p{r$7CsMt15ewVoPb|r zb4)oPEIzaVHJ^uOC|d4kL86RXlM?0@L_Q8@^&u>SgAWp^wHd6ZnPFJ$6Zdh3ax}kr zY!(o>oFl#ESZ^(*CM-?&=zjO--z%}~b1ahil~0{yn~rZ;lD3!W@LLbk%mk26Y?BcZ z<(GBmN0W?^)K}z_u2lbO_4P0KHYj8Ktw~g}p)DF@)u2<(K*|5;o#}Id{G)Fe!upmU z;9oYS)UU_fW^&3lx2HvN+eDqZ*OT85=_qWLI9yabB#YF4gFF3>p1pEj(j7~YJKZQy zSih^EQ@>#s{$rL3Eaj_#JJzEml%fhI43ww5XZx!)@#`PGjaA;-Nz8@-t3ISt)SGSz zm|3->vVtL95%=Vv zGUmrD?HV5gIS9xj-liU4s$3cced$p_Wd7`lloHK{$-YQxoOvys1s>Lox52Gb@oZ1h z{M`Wm2wQrpl3y!7jJ>*fvVdWw>7Q#8MV6Tjq!%)JSjF@Xnpzv`*Umy51fk5}m%f|Y z$|D#e?n7)$iHKjzwKB{RCCiToA|M$_KZ&KD8%58753PkctSK{0ql|?cu+%y`40lRiEWazYr*2$WK)@zCNywz{r?gN>paUN2)FDxf2H z%vt>XM!mwo!v5i-E=%;kGn(*kX+l$O@4I6i7;EcCo5-e^*XbLzQ;6quYi}SQJ#>=CZn{1rOkP3wA0M6hgu>X!yubDzBtdyw%N!2{?9h_##Xhx zmwvXN(QH>Shs(`uHFx$T1ayrCzXEB1Q(e4`{&dz|5^FT7;~ksbz2@o8&TEuUF9~#w z0Ja@adAp#&GORfkJ>IYSLIgWAtYt!AnDK{?A1jXVWcS`A1y!QH5RYcEQl7+-7Sq-S zz4DB$CG!!C$qsS+LZA@AGgmrM52&dlEark)E0>=`e+GE%&0M@B+Ehw{F= z|Jg4s0<-XKk_}f`cFg)|v9-QWowvU4wLeZJNXx?ku)pLQQFDLDM*r?RPj~fRLkOd8 z!##HG@iEJ(g=c6lL3Fqq!3-;5slmr#nlzaK!J0L1R^1P{`>#{v7$RK=CiyjS?&)BM zDW%8O@v7mz=Qhe(a|6G)j}lF z^*Lau&nivZ>*)C2YX-N?SUh^{>xZ0rufbfbsV=YYeKam8SK1&*@qQ6_FH?HI2vWZ8 z>TzYd9@V=ftd7bAtkWRAfN6|M=rmK&k*j^bWIb(heb1uT0#jEvndagRf2ED0Gh2~X zn#=1L6dN7{sc{Z0SQ>dP8$ouGqBBDGQu`X)Z(YIZhN$z9s2?Rq4LWB6#PE;2jO5pI z{&3mZ;n$Cmgk=oq19}O94>izbvOJEd!%e*c;%_+KZ~!1P2_RPR1)gcl%*$m#Ssokjzc0{U1Px06M>@KpxZ;xee#b>aRXMc9;`)=^+g{r z9>n_M>BCA?H%}k>v_ig3WB9b{{TJW%`A4IFi29drL{3vKwX{&3UKl_!_!r(eY+MRr zcrEA(F39JO&UPN%>~&-ax}A6m;_8~pkm?((;5eD@uUR?=x816(m{@C=e>jyo-q^sF zQn|^Mj&LgtD13C%Pn9w2ENH~{bR(?>UgSm=_I zOkf)HxzwZj47Y7VClY%Asyjx$68XiG0VX7;dqkeUbtWuU(45@yr1B8UlcQbE^N}9# zY-i@@_n!F*35rkQC*h42mQgC>8LDRb!2x;q_st8jCK!P~M@K!K7Rv|xKZFpzF5*)~ zJ0ENl*?IU=z(B?t5Ad|Agt=|-^sW%oE3=__N!$8u3#` zMsfBcvyK$_!t~a;4N;8V{ApqF_)GQOC?vyHzE-Z$s<$_2%+Ca%(^P?}W5vrBSBLlM z2V(%Jp9L6+TfaKtkVtn_D4yl{Y)2qs5W+JFg=UFfdpXm-m=xY=uL?49(Z%m>;Hu~J zh9CtSW$&MZMl2^8O6YdcRUG)nCz&#PHOu^k&l{B~rDrnwenz{V8 zXp1*r?Ij*Fj(y?j%)oHLyv+4HcJbOo_Jp=P7&rIiC-{+=p|?V9A!+-k#6<4A*u(1N zWMixIGmU4s1uxGe$DOD7brlwv?`RPBhWp+WQC4YWOJ~Mz1ut-7h5&9wIRJ9efrIq& z%?SipAg(?ocfIUg+qgFDP%DcbX6Qt~>`#hW+=^tqeMbMjR)s0<8(t?aXz=m=8UO9j z3m32+THD*yYS5Rx8!5Wr@_y-r-69Sw9sI#mrWfy%_B%s>{Jp1l%Yh?(3$R0J@yJs-WVOTJ)>3@mutTJvqa*5AR8@z7xg7#7GPhn=)*}x_I|X}E z^Qqr&Prv)GQpb=0;93LW7BqG9uU5FLCEcnaeKwBKAez2Swju(%r&T0UcJzNTVj(u@3j5$MoAy(!Z(tk$cy=1 zr;~Wp4f5|$3q3bGTJ*}Q?1~Qw{NbmJnrOx8H8b^i;X$5DOms&+`Bk3P!Rz{(cy7rpDNEs4#g zu<0d9@;bT?(D_u@+}><`o@?a@lm;f+!M-yGhoqN_O1dGvwU!qt*kRX4S4Ejr;~THQNjy) z$(NH&YI<^qd98od>Q#a*byUfJlw*7f*f*V;IBA*}CfSGE84SE#obVV=(zzU6s*VnhoQAOYx2Qvjz0{k{qVEU!QdM z1GI}(-@SpY5S#mXGww0-=j=@uJoss4*-~7d+!4=-39*M|QR%1E{hDUGhAH}7MAyYz z?n-!|Nnr&smk6aqXWkI&>`N2vR6i(iQ#PkeuV0L_MQtEk=fWuYlcwlEI3%l{D4pDl zm+zl@0TM@DB}6!NJYT?GpF50FK%?>HAFP_1CS2^GOUzJa6*=k)|H^g^Gs4tIN_MnN zVc^6+A)|LanW0q1@F>titYHl>HD_=UHle^zXNubk(W6X{Ck$Bw8=B z8~<@_EFzI@XzN#8;=4u%n_gG4xytSdz6xKOAjEkwyNWQSfMV5}L`To?S1w;m@By!u zvdd4oVF)s-ca$n>JX=`Qyfs3Zpp30n=Xb75NlRje-ZG>wM^0lp5Kq~9-V-?74kFmpsYrO7d03KHl_zRJ*jg{i|@gm9D^ z&?#6?>xQ6vrt}_<7X45V<}9f0xb$EIx4?sAIF_VM1pE{c3(ZaZr&zS@&R}#UHsYp0 zHj_YEys%;de;J$YFy~^!GdUWGFmuHxhlY8<(};w4qV?C4^?U|^Cu%=)u)9oJ6h*zD zry{knij_L(c=Q{R9Pj6G%W7ZMJxnDL4K39NVEL(cMGo1SLvBhzF@(tZj8Y?jxsWJ6 zU;$iX@icBq1R9pfXS`Pt+4Ab}Bei)YWm~+fdwznqF(Pl-{K>UZw#U=DPsKz78y3@u z@5Nufl`so4j*U5a;W3m=5s*+l(R~D{II;P)$0V2KL`W;k*|o~WonTF{^p$~vXuFON zL?z8eM>LZ4);>DZ}q#&?u+wRypm=vVUfKOQ6IuQ!L^~4H5N(yIKMH# zuXHi87!(o`ZQvRG#c6sv6I(?)6&R_?7dK?(Pcym_{Op9MrO*AV%ytSow_sEGE)1{p zRp@O5)#|A03gguG3|2AGux~&nMBm7cl?3@tLqL{oUPJ(Bj>FHVObBgVtMd~%+(|vV z%V`25E?>J6wW{4~$?UttKWg%w?dq$(c(*B0t;&^#@(GD|(N|-DDeCk!XrQ*7&a(_& zcJX=KtJZeM^dMq7SG+|edtbk4Fx#rd)-NK^){f>f|6u~f{=T(?YY*_z;^o04z)6@P_N?f*PTKZhtU>$?>z5)!b&H~ zv7+b2B;B9GLy>yc-_ZJMQSo54cPK@(i(L+d1$>n}v*SU5F7L{epc`GTy1++4p5RKe zHUdm@a?;;J0zjsUPatu>{X~pM93kJBM&Hiq8m9$uooQ)t`z6J-qT;~;<8^Q4F)D0v z0MqftY11WR&1;H9m~Ibl>9xL#>ab~Zzuc^dJn~A0c%Xxa-uxPqj4((yat`K|Nsxf2 zywwt~t9=HPc%V?PuOBevIQ)W{D3ZZ}boI!>Ut**}U)VT---5+)AYIR`kYZ4XPBY|B z6fi5HCO%D=qSteUy>WpC%NWJkue{L`+j0I_&ie*N2n=beV8%{n#&<(qT->09@AYM6 z=CBau(KR#tKwJPn*6(t4|51mxpNK~()CPpzgdFPWU$#Kv$`+;Ao1#Fgoc(|<+aXO$ z`wbm?L5Q@SHh!QHK=8evg?N@dnWXFPOh)8$NCv1)M5>e9JwMSKeY}pgu(MDRHyCx zWjf2D(ah0JFJKXSAgMBcy~N$_Np!qU?IY>I?@y|z*CLK3O2BDvWZ&Bytd$)ZK`4nL zxljo0yt!s|ujHT{jT+7bZ+&`0&VW|0L~+1UU%4mCzo}_o$)6OU>ky**U_nKPNnwzD^4t8=PN%56gexMf6^gRi+?m51CnopcG z;Dqe%h&uq;M69G6u`o@46yCUVsnU_wdIaFsqUi^gkcgswsCJrLlR}N5dZ$i^FhN42 z!o*)=N<-$;@Kz-kQ7fDe^GpS|y})7*5F!%eP4&Y7U@q~lJtv>V7=VKq3n`53v7wLj z``N??Y>JH-&7fXKW{JIMmTB7{fqktX%ljxt9Qm9)`uAN+N<&(U=D_S2DKK(kc}n-y ziOk>iOr@VK*ILVZf0J?g!W{N&@~aQ&wf2p6Lp zLuqEPGAihQNHpHMs;t{_B{qOMc{^bXL}0cZehs}erWv) z^Mf7f_tQ?wLUX)JBQcinEKV071-r|5w%UcW3mG3LJ$Zg#V&5bOrt)c zVEag>;>CdHr8ec6TFFGE&Hm811x2sY12e$-mcFq${HgWy{{FP!>sP1BRr&YP(&IAk zgN9zQLGv710%}52u1ptc7r}>%W5dU{w3e)|jaf4X2F}@EG{q7_OV}+COUJd4)+Uor z-c9)ei$e=h7PrP$8P0B4qX=ZVutx$Y??_efRVj=V??j}zc3jzPE9O99p=aEFPIaPl z{2nojCCWk#P5g1@ifu``|7)gjo+_8ZkHC&CreXCC1A zQDm3T`D;=R<@@@8c0W>LO@?`r=rLo1pe}W>_xWpw?!1DVRT1+qUwqs8DqU7y9R4_A zEJZ3OV`jh6;7TUyPAqSGa@x)?uxL#s!=gWt^}>T0%%$sl9iOZJa-frc{isPX&-j;i zW3yb{h7+Q;8F(6)kRdMz_(huoJbjr{Z9eWC<#x4#-B-A?`!q0L^5|Qw1>-FYIgzyV z*zV=qsVtJ1s}jpl=+xlh(>hCT`2ps+%b^hnt z5fIpra^t;3U984~72UF`2Rm?)}l|Iq#EIMl4h(<9AW;!o01~ChqNmNwC zmr^v=Nf^A-Zo-Q11@>J%xmKoPchp_=^lKl>#P-S@j&TRDH@+B6I$_Y7QPez4ZHK?= zx*Y^>b)kNi9*#~bojuO^kU`;GMqN24>j978lX7I?z!l%7A|OVgOi+`86N|29LpwB0 z$p^JREjROEQnM2N#rdvDW-gFznzd>%nd%x99m;t@si6-Cno&R}<;q((Dp53glXdoA zGJovu-rlUAHb`Ad#p-rl(w=bs>UGzA5j`bBz1umF8+mo{O;BR+cIc8tox$KVnSzV+ zLAN`_;JXs7CS784yYPl?)?m%Q@&ixCl-k9B9 z_`r?Nt=zrV8sNGL^mqgiVZUjSex8LRbh1CzF38IMt@{gg_GpFUv&#IK;FXcRW#?Yk z;Lg*A7Uh<9%iT%I%Y7%tbO(E1qmK1c!tGaP-|nKa1f?M|s8cP9f2==QH2g=Y?-g-c zoh7ekyD&59t?X3FV*?;@s^L@0B-yt00Uv>&GV5@1TH0>8 ztocMn{r-aau-@gj=xaN~JW}k8K?U<;8rg+hu7}OZH_(U`5k_Xbop6~?lqWY;9v@Bg zu$r)B6GLyW5R}wf!d55wB=x6f^22(~y+e!H^a<4sG!Fcg9ifNi5M=lK#g?N^s@6@a zo39H?cG^DnkxDj}iXz{v;eo+g-ATvhmIc`6_yMrn&$|G90PB58GhZhv&6Qs>jl(ac zhiQX)s2$;?X07!Hl$FgB7r{fGM@fYT(|zu8Z36zNt?5H2`zBkt*Zs6vP(IRY?}=uh zII6{=u=;>|oX9*bv!Kf8fdXK@Cia7O+e-*K1Rc!_^JM?bEAiyRz^`2Mt35MeU%{^c z7#a-4U4mJ7UtGFvKy>Q`8^Ug~fAo)1lN=L@rj*`g`_r4ds`RJa&%IgwT7YOvm9OjV z;&ZaK1YLy)$LmTK>wC>XoQx&Q2UyRhP@CDC?RMQp2!)4@@2FNDpa@7%+1>u^OGhjF zv%ek<1qAi?uNVKV{}=zCw*T@SQlT76BX;cq0aNqc1YfRti}jt*EAeSx>*~>?L6Dpk z(ETHqr&srGm-xf79}t$jJ3V-kW6Y&+Od^iJyAUFU@SxobbhI*PLkVr&&%z zH%Mr@m^8$ZrKX}x3PCsf`;U6ZbgbCh?jAIFUvH#dHxadN&I_LR-XkWG8@Ghg>W7w) z`q}+}&Pq7mY{7Ljc`%;aG2H?)W8Ou%k#P5K+UnQqO)=*&)50hGvq>4ZKMp2aBJa48 zVrKCo^LkVbnVj=Gd1!pg_l*~fUer~ayQt}u8iG2meEE8(C|Mk8rldI;Uvf}-=hQEb zrv{ggMV^#Kt}BSQz{L z#=^PBNh>=;A;ct@w)n%Rm(=+x3)btVv*fP^et$`Uvh<#{=U2{oI~ey(c`KV0 zusNCq_2n`LW;Z)gOpIx&I)#eNP81na) zuZH-@>CmPSfT{1Z_plt}QBLryg>cEmhnOA*j5&odVl&)@`Ew zsgF8Yolvtfe`9SKBu5ijY`?aUPir|M@+tkT!913fQg-C6Hu1+tmh-8Kb2#|FKX!aU zPm3^l$-4@bX9J1#fAquI800(W_2DNoP}Y=!feKwk;?eW~EP4P*lU?zZla|f}9gFWO z_hf+syX9Dzf;B|Y_-pC@AiCB{s3zz5&f_s{!;1G3BSQ|uKKmJ*Rcqh3(p&Sbz2r;XK_>%3{?Zm`g@x&GU*a-JLBUKac zXYhB6(|8`;6oxMn%)|uREWtG{p#cHU9(%^ZL{&H2M@9NjA;fyu=WwsVo+%Isd=Ke0 zO?~z!f-I&G_&N6al7)@fyPy@zJeP3KzY)=+k=y;-urg@fXC%n z1%VUAx#opGky9djaCJiVs2JO*hq=MOD-J1xtP+yJUcLEr+%l>wE*XP^l^PQXKl*G{ z#E|7A@A%ivEV(G9B5$|j8Kr}vo+4>R>PqsP?b9OdMd+|+@8v%qRhmn9Qh^MoVkh`0 zm(k0hYUR+($)`?^@R5vJfVUl3VjrZ)Tgq4+W#P0Q>?a2p+2333psaW=KQdIq8f-zo z823DRyg*9RG*Ji7-(8m+c$+zL-1tC6wK+hu^4!qIcXM}M&G<=gpn@jTF5wkw7>5i= ztBXBJictVKdmGm+-nHc^WI>pB8=BY5o3ngSU+p-?I!B4#5B9gK*g>f+cEV3rC$K_ zNkolXf^E={aJMdelKA`&b@bzW7&=aSuD`bFz%mRWJVKckpD z-x(m4@BOq6@}1#M>Yy(18I{qhK|6gv#o1%m*h*1}&8#wLx`xt1I!}cerPdsI&Uo&K zNS&owzY-NW8rTINtSD0yy&rR2o4n(osehJ*y$@o=-{Uu7S0M#I0}M;&_@bgtbo5ti z(jKn4>z&8?MJ(_U%x1SWKTIWDXa2Bwym5j`jwou>M&x3G*0MiPAyIId@Hc@Kl$zh+ z^N2_n%IQKEA4YEn^gnwtfU;&|$M`^hoK9Sh<(OGiw_pYe6c2Ba&w`diO;hkKtZMJ% z9HRs>P|nV>ZM|birq|823dn|v&K;?L)aeT!AB#!;6qVz`iZ%rqBt0G_lY`(zA7r~LBtQl04z5TZiZHv$x%u6Qj3=XW~2*nX-A)47n z7~f4B?%n4fQ(*k&U`t5pw%ShCt$)cr1nUxgmc}v|zLeexY0jNrbe%wS_N+{<4Nc@X zlR0(f;IX_XXR6L}orUTxPHd&F~R!xpwBWd2ZydMgTZLB|DWr_eb(2ptAH$(B z`0l+;YrS|Y?1QOCdC-H4SrKn1WR_#nr8rH&?5b?mk+|)25!8M@M2*F(!9PuA+dL!H z8@HGtv2zC++J-Fy+A7I>v=_GJGU9UmdZ&7*sV3OHnR+f&of~rZUNxJi-)bbSBU&?{ z9}XQ`R`b_uM^J=O0a>Bs~&l>=uct=z?z zyyTlb7r9pw*ZtpR&0 zvI^bJf^pOaDg~Evb&k@Y_On z)OT`hn}U^}=Jy6ie#wbh>HO|!{!`E}FNZ7WeG=2$O~R+}`jMwL+#zo%P;^oj_~ zq*n&Gy2%MZ@Xf{%S=W`cG*a^_Ax&x5Ibuizvdc#_p^4BTx16X|;Eg;LUWl&ok=3m|R-ClWz;s);W0T zJ7iCBc_zT^fEqHlMp^qtwgtWCTO721ht75?GN4$H-ol48RP=5vaN{31cmCk)B#c=Z z$6Ek8g;*}DM90&yc)t|^d7uuuy^8J5xpheJo>zOvy>KLOnHm%NA#&UOuvov>8spmI zq|MR`*E!+*FCaPRX1a3i8s zmgfC!W}ox1stQY1)oc5x8e1oQ;w})$0A;o5Y70-gp^7G(EQ?9pLvrRiaTRPgB$KvGj!OCm9_IzKtW(y<;PmjxYr;9fF^bLv_tQ-}|;FC)J8e32Li=eXm7Hh z)_hb{wCHg+l+O(#y=o|*S3h=1ywFS1ytvbR!TcHK(&$UkILB>L_>1vi(Yvf4FVO4O z@hn$2!~3eT7#UzGNRQO^a^JqO$ke!PO;Vd4>`5)J&Q=55S8Be|9*--1=eQ&}A>xkl ztL;OlRSxb=gXWv0&LeWq)h8Sxtz+NP)B)o*UdacMMjL#bj!PyJh+pSezu8e0yEHci zDcv3AbkE-ZEnjh|_v9lbGv-vn_A&-J1n*Y&6PwiMV+s}n|C}2~ogW|ju8F!bM;8L2 zZmLly#s9Se)KPO(-G38-@#jc-^`FDu|14hkSLOVNuKy|FFSh?E_`eMFPY3@iw*Mg6 z1^nN!z`r2)zhu#Ww*=~B|9=AcU-rWl1Bdzs{LOJF8mwohd(`k zoQd`kL%3B0eeqr!{&r0P-=<@K%W$yU$|)!Ja<`wxvG)0!udsAfZ2u>(z#pbg|J)1k zr%m2m&s^Ne7s=`9E6b7T}{8ul$bWxw!QTZGS z7=o6pv6gfni+{S!QGcZIY4uJM?JlO_O@%HIAh1vh?Y@fXc{e@w-EG-+n=n?3*R+2r zrRQs4UER`qf)>F@;(cFiW8 zh#Z{%dg{#omDN80>;EAO=RZZE(t7@1QrG&dvGJoU@4D@$)sC za3wY*WyfQUyz_lt86QOY09zrty}*Y z#13)>qvaq3YL#J?<5RK1k9*Y!jZhn3VWibiS(`09*g>|XGXR2VjqiTS93L~>S7M^K zBV<$>EKkfpEdH>FT-(BnA7L9e;;8h+Rx4+=H92O^vMD*1n){^WcnwwayE*cm=`|kx zUF$4$Y=UnG<>tDXqt9_4JOdOikKf%OW#qIMW z$@W%FaoEx1OV+25PDAS4u z1~-mHF&q}BNSC{BJuDS;OPZ3}{4MgjYx5 z^3m#D%v-erDT&4b&`ILRSbu+G7_3vgQOk9>`(}SAhoRtFaBKB#@aZ2vz>II@v$kC` zaMpHirE{v$NwAt313Ei~ZO# zuv?Ef60Q6YZize-<{tG2EZ2Y5!euF$NXyY>x>gZn(kawt_4oYaI?E&eux)?B^BOT0o#M3AwNB3F7w5ncXaBS)v!-Of+~iK;;#}~9tt{fF zyub{v3x|N1KUT#(3TfI>sET&D2=P4|7tgvw|L)Wvq1yO0&(Z=l~A6`2LK^`BaBE0mnB)oPT0$SBS>VLa{s4}^@m7gpXwZiK>4PE|)BVKuVUX(w3Y<7cU_y40ee}&tb&D7-E z8-&r_-OV-6WmXc(Fh{-PO~_lKZ2d8P2mlaH(YK)>IJq}vc#Ve&!FsKZ>g%!Qaz&Rq zCPHff&Uo#8OA<{&Q{3rp+(kN)C1p)!$Rpz%=wR!-6gwJ%uViVAgyr%+TQ-9aWU4Iv_de&!HWV3RHCp{2XV z3m>r13xO_BUnQU(#qW>N!fY?43Va5|vj;fxPeV)pkpw{S2bKeJr9x@~w5#3YM>ntiS|Tg=f131TgnQ)`bQzwyJf@GTVjsn4_qd+f5eo7 zAK@F<63IB#90}o#hcyp`bLLPqn)MtQ&13AKtY>5;EUTSLUx8n+fRx~Mw42*S-k2%X zy)Kpj7oFcU?psbx9wUd0?u1ROzFAPAx7b?=hh^pVAF*bvXfX5Qgy-f*PZskOqzUj7 zo5gNT%l+yUEPP}}-YUCj&`0R~Tb8CI{RvulHzHn+TavP@B7z=NH8?F*?vifUL?Lwi z^P!2x3uT?RDyc>pM7)=!BUsfg-IJ~gfogD{ZUH-`fj=tDfCAXW9tmfLb5pIZ4y&Mu z>QAjw3USs-&C1|b!iA@|$xK?_Zy)q+a=5RKw%kEn8Y zv}LW<+ew3e&7Vy}$$h-j3Y7&!r^BfTe3?LWC47T9oIim-$V z`1_(9;tNm5oACPgKY(}|YIV@M zV$Qkm_r`$E42~js*D2?*Pj`i`A!Cs)A511tIuKe3%hfFr;8VWGg0q@1UNx0EdfHOv zS$iNv3M&V#l1lK=i$9bPv2UKI^@dJ#HgUpI0t<1mQx?fak>fW_35zKTlq#RESC|ub zzE;)6T!;;63iQNjw8n&&m4HD<}nJB(U&yf5m;|o00J=b z(Wx=|9Z718(Ps!13n0t9?(a6^t!fS*SHoafa~r%A;DMi0)A9IZExK$n$v@>v@p z-)eU|Jab3krWSfiEmT~m^}Kaf<0~z;X z$H#zwwNHjrigu@#lf91Ed#+5}4<}tqy?{`{Jr}2b)x_A{MiPmkMw)jvVOypi-vE)) zWF?NA#JNQ$d*%lghx;B9*%$Im$jasM@;y)u{3_*>Ai|^oYuS$9XH%MolRUuW)(RA_ zXsngc7J8AzHGe#qlQH4J15f!{WyCXz-CYJgQADXIjyzxbxYQ+5%2bf<9J`2mIP5zoj1BRe0vHcOm}$e1y6G_&oya zbwF8G^dq7mM3)z7|I|=AFk(*HNcM-UrTDo}e$FlSLQ3D7 zy^F(U>#Y7PPRGXxcS4oevd$w zsL9b4;8)ER+avy(tB1InWn7bk>muSly4Eob{MN)A?^*sSn|>>2)kkCUZRC*QlI1}i zvF@ee+fGTUp^IZHyx>Y99fP~w2W!2WE;9{It#3?#V>2^BmG1{TZ1-MjUy53q{nIs0 zCLe;z-ZJYC;O5AJ^%$sn;Yl!m0uN8t$)e^^h4!5^#R1-P`Y;Mb2CzAwC z1Hnf?_M<-wzI-Vg+rb=M&EBNFwMiDn2fwuIza90!k+ag!{1~h)W-t)I|rQr z&J7-d%?ID6%5p82{=DvR{k%~0v-H>z*?Fi;g-?R&CrJPuBub>C>AoGD5Bp9aL&}b z^HVfoYV+STn%}!;%z#@l=PB8RBc_J8Nl~9+M-xK2#0QKsV4=RNwWrx$ne|G#Ca(3d z{0xT9&kX!thGn5o*jqd8OLx)@9(&~Jkrp2cmFsMaO6fQ@ya4uj<|SPsF8=iXzI92E zyDjQbG@v*4TiT%m;D5^=Y=D>W`ws>`N*ch6Du`yv5F5c=#n!hT=O!0{_8#@fdJh#D_dBs?z-`sQI6w-z^ z7kPf$?Q&l*VGbe`R)rTR2MrE0J0w}lTLYBdrS^HI zI#15b-iih|T_j2M*u3)A&biZ-;@^fWZucQ!_Q-=LE`#Fyt@!$ieatH!)oUf2N~&Tk~AC(ULqF6(xSYE}Fe<#fZ9>!97d$7*Xo zmRmmn8+64x4IOZGRiKyFErSZtRzUKS7ORw`!624vXreqi!Q5J_6&H?Dlcb4DxTq54 zj+E%5xAF9tk=ClR`hF&yx|7E8#^ODorVQw~3^=@YRz>3D<;0W8>n=W650Di}xU=S; zU+Melbv-JYkNkA?@-wWTm~b4BJScIdan3a<(^~SXN&#JaZ!QL=Nnf;cR4i)>Kp%Ef z=A>&4b?1FN^Ex%z-q|3V_WFdec)Vv4wfYD1SC^xWi%? zES=abvMVFQoc>t^d+?2{ITKi{#)Q$=&`K5a%)Xj2pSa!#B49bX8EhMD5bzrMOucs& zN7Y|TeMXiCZ^oiv_o<}qS(~o%rbTak+$B?gbNHbHvWN@il!5^;z7I(GQuhrp;6C0h zz^d&yZr)Yr==bVRn`1$@P*0O=ww)){rvl~!`xc#4^Lm_No7qhxl*<5x&X~uqVV=y9 zW&0gFLubFQbTR>543%GwM-copV18X4AQb@7PcL7Q4+k7fN{ZsmFZUMj_@*qd1~gHj z_LU7lAmq1?>s0m;=Wb{AONG zGMrg3;JnNqq7F*z_5j*~$oj4lxkATeX%X>gyd8pq=o7fA2^L)d(5&b!i_H z-weu-01fpl5LHTp{9Wk-Bkk`y&aAgHpl^uFP>KGFtqkq(w&(R4@`0^7-ZXr2Nmp%w*ctr zo(VeK|C5Bs(60Z9Q|Pu5RMcM@(6ELI{>JhD%inK0{=cwF=BX$?*Si{dV>%=C+M2tr zzKqAbrYbL`%%7K*t|!kT_~+eE+$^DKgdvNgdb~1bHiLUt1*v$9W1)FU?jxps&i+3d zj7qj62PsjHS$89zvrZ=ewKi&%%@q!q&mqWotBaMynP=GuL;8lKfnjB}COf#9K)xbi zDW9^L7^O$^5&uf^P8QZkMpa{Y-4v0W`Xa--Rc7C3maf##jnfSFl9zP~{IsY1;zp<6n=j+i4FZ54JYT{`7vTD>+I*F;s zfX;9cS+V1EtqfjQz(M-#|cxVr+agGsoQhOSZ=OQceB#k$xrZ zQ~5f2z(FSzcQ6zOXk4?-Zi)f`nQs(L3n`8o{``Wto7X9XqlJFSskf0gEo3e*rI(TH z&HopO#iE@yRN0#JoQ0m6Vj5jrJ810aHUwr-&Y}C+%voi$E}%AF=~7em;2p0Q8av#cWUs{0!FM9K6zd$5-%A z7GobgEu`Ozv}e5b1t)^2MUCRRU+cm_Z{t$6Q)r$+`JMw`S}RDV4GnPWs-&kTel3#^ zG|W)|K=DG2-MOKl&*ybBolTvc%r)y{cl`~+Z4iwxO0)nv?1FA7y^LqDUWZvcUhoNl z7z@9#Qn6l!L;P4i6D=b>#RHWR;Ok^2&`S^`?Kh7oL7`lyJ{1r7lInE9xqPjj+>|QM z7iRndH;IBjwd^rnb-TLf_k1DNS*XqMIX-+%Y445z=%~PVNOxJbMCrOqq|6~QixJ9% z^swJC3`9Df+c4sW<>`T6RcghPXAy(h<~==kqFD{e~E z_r?`U{HqCuUC>XPd$$soEKCp`oBFgB07oI=DT=9IaH#mT`m9f0!Zd6bjSAHyi#2yT zaex<^`cYhTNf9LH{+R!byDZ5lHesO)qg8q)NvLTpr=_`Iq5EK zhWP8sT$dF_=;HbNL6KOHOmL#Z%z7mXZd1PL&x$fbU`E`OXs{C@yQMpp1e=tcW^Jy7 zy?~4RF=dUsr9Z@sPKzsfJAi{wtKgO7^*LbL*HqOm^q_&ciWSt)Odn#Fquh!{XiJw; z9&rrSL%N9UJLoA!!<1Yidj@A9w#0oes16KjQ9LKmT>f1|d3L%a#C4J|b8ksTujyMp z&X(EOKnxr#*~8kqy8O<+BgUCo+^L#VhPYobMkKu`V}{l`otVM0q{i_3jcdo>yhU7^>% z>k69&#%d`n>1V1h1*SV?E2zwFiZyKc$G0F5*A@eXUiXGe0e(#zDU!t0Az3+kx-}}B z)F$#%6XoYNiWcL;)PMUd(i| zMq0fE48UBEASbygc{n#a$bC50ORIA$cIJ-8EfwXR}ZQLSJYYdUv{MG@_+ zh^Wn<1)25Sc2OGFMh5{CoT~O1ohXk=jM$meNRk2of;Ni0ljp-W?rX&U6s1-;{Ca*-{BCjaopF%{}^&l?xoWy8KMq0X#y zdBBq1M&NUa^G-#yR9$d6NtO7sYxi4xp-gu+t0wGHm~TkU2nif5M@?HFr*mY8#{T?r z`mzuLaV<4Spc5%&kid^@iPD~mDY?d0DB7D5B2;q8^S_g+H{z-*@M3}}E+_OIpx<_{ zv>3V_f0=>hC$)ER`A6emSHrXhM&28au~ezrxe)cK?fH1{yJ2_uN5>YNyWwey5+DeV z*eU(B!UZ%~TF5kwM?f5S_WC-fxPylrSkhFIH?Z7bayCmysSBj@ALpVnN;B~%vh@4} zoOS8+wN@qegS7Z`q7XZ`pSiI4L+Y(yYvr5tDD(k3gFviLO7VZ!h5=1BF?EbZ7e8`n z%Q8g+1ro?kdjOAo;l`r*&+vsetn~A-Yzf{U+x##9qkM$1N!S%|a47V*bEr~xk3NVu zh#k{*G2_$Da|#E!=(>kdg4wiKmfEofM8F%Vf+pHorqfB-1B|-@^btJnFAGA2zO>=UH8Ipb1c`=PjRFfe!Iy#jtyX2~7U$U%Cvh`LO_IPcAQV+*dDz31= zOyqn-mIa>v<3vrisxyu#-oeKJj1t z&3FccV-Cb#qIqs#Dgr(Jbl}!N^xXQM@y{%5sBR@J7wMP%E>8 zCGvQW3Q6YsP47|O=T4zcc3g1z|3m=iORPPWP4czyhKkKz4@mzj0dLZe9fjq-|92CRQ1_ZbEO0>aeVo zCI7JVoz={B_D_>H3K_F|dhY;a87_fczIL|tg!-1GU0AE>gA&>O{s^gy7OL3>hd&a< zU9FmoIE-o9;@gUMY4p*)7qkDz?OUClAE9+Tr7gxfg#yle#mMemXk+)PEjs3+G_J&c zgZ8N>{}N64Kw_-qYvqrauqq%Pm5^r<1|H_BdN;>rM2-sIRK~Z^= zrdh-7QNizrr4J3d;5B60n~WX*V>&(L1^B6=ygj{+(zL;HF%zTP%uA?%CQFnm%Vg1R zxJ{7?&XO5umU^US_%Wb_H~AhbAR>L4A}4)}QtBI`!k!CTQRak>A=Bm8u-mMl_xE9hgg&0qrS zSr}o;BdTTmLHU*xvX&dpmOckc4tboi+@;{0{SS^6G-eckysC|gRKI-*+Hc2U6WObG zB^>Rp*8VK~XSu^=j(w^sV(K!1aGj3f8aPfM6>?5N&-^X8uCJT~TQL<`L7H&b_T=k) z=c)G6LXbpRuS@r5D&3cu)ySx|40VG(AB3{+r~s`r9|Sjtg#)Q|UcBZP(VWX==Yf{E zRrx5fs}M}!wz~kEX@CvXe#yvSTXMN>pmiUx8MXGON!%ZhOF!%-Oq92j7#9^{4li~r|GQvGQOiWVGugdlLx~Fk(6qE>p%UMB$Ym>s_(1rf zbZ{qm6HoT5X|bLycG^9t?Yl#7*bs0~H=dn3!R|fKFp|$22JPGEJe`ayM(ujF)C`f2 zO}PJir$q;pqtpe}zILHScIMi@u*%)Q)B4)K_G21MXr{a_)QG%W^GHfKG0k00@EG_X z9cLZfG>b0C9-lv`+4AxCLrqBf3qjs9Q&G^Z8@)2LUsgR)f<5E|! z63*n7K;etPPEy7IGFjplzAARKv$k2YUZvE{f=;h@%E5R@#a5^9GTv}VoeG9VS^xqw zm&s>xkqCIsEU{%{t9R8>95N~+Kc0EmyavLFhR?*10cK0W3%=AQ&>U_Es4YKj=4zc# zQdT8~zO8nIeB$jM<_hEDdQg_aZYghBQ)e{#g=HJ*?>5e`vcX`eZ@uW5-cvT!2RRt=J96W zDVpFyRw$=aYQ1Qs-kT3hbgzjWt}7CMD9f{N3*8#8cMHw#RusbS6r zIyaYx62efk)0r&w=Yo`qwnUuUX3_l8O-=au-;-^)AnWNhWygb7S5$`43k7a?P*aop zQjJj5euVQ(%;j;h z_UXd_uMrQe)qqY(e%AJg^mk+|CL%#rh^4rWG1z`V;NJX@YJv%_Us>$T;`mbRKa7c9^Nes{vRz&oi0;|B?P>M|U&zLzj+VZ0 zRK*{aD85g~q_rBP&&-Yd4}d>2P$9gaXJbnRmKUfYC@4}LPoS?IZ<-QE4ARQh^O=dk z;ho6n1NxQA%XaVuw0dCycY$Cv*k41@mK*T&AvXR9^&qkGa@m;t4{GZS^mU_rL;hBq zmV#v#P?0tkeO>h9)eRg|(H!2dl(5(fQ{bR`Q&xtbz8Ygv`pFh(VOnafX zq&^Q_oHzK8&&D!r+gX}%PgABh=7L=hR-VVPGOgKOq{H!13_quzuX>FrX|C)BP!ZxR zxwSKcVUl5e;WXiA%Vk#bF$}zx`}yV)(Rs_~_igl!QqiWR&Stx0LR{DRn#}ZyDwM;C zRmk-wS4P11vd{GNO6ukEX_Le@@z@@gNZ_nOj84H*LE*ph=60sZz)A>_dTAkaM)C<9 zVZ-uJ@M^bUe`*wh^E~K=Z=Hf8vJmE}>7ny2ll-S@BnP)=aS= zvDQwqA_eaJ*P)h^$VUJ9PStWq8$qp5vuaWO`X|X1!7ib=)<5rD zxG9Bj?7F$AOXA*l$2J`D9g?LVjiajB%Ii#1c=PR+VnHVWT|n_m3Zjud-FN=dk1pu{ z6vytp#XkbYPbs^BFBY}uSLHC7osZT&_cGDtygeqAY9ypkJRkwfjV4_^=A$hA)Fg)` zt#t2hyOlYOCgR|fW6FiPtO06$$EAD6iW}kz1bx6O8-0HBlPqDY#UcOG!TMEL@hgp* z>B~~$?pd=o+W%0rujtR4*?5y^ZSzd0`yhNif(LX1p%!MOpJxBioTz>gCq|&V0ILt6 zm=1Wm@I<;Ef7FTQ zHKlElOhWqBY6XPenx&8b zTbqYPd21C2Sa0qBuH%3ESo-{z`c1$8^8YVuDChqR0i>=Hl3BR=^H-tA5XSP$<92)~ z$$Kv46UDC5yX*4Tpwc#SFs9;EdE+Ub!BNw3HS37~^Aj_xx5-vG>SbcCG>i39irzXqMEM$xU5DU>qbr2@-rI4;@^kQ(%ea7Cp6KSo8wC!W9sW7ZR&F$~ znE+UdcVbf03;_ii{mZpnXrXU&W(^O$+2rzv=i7`UPx>bK$OE>07ck#R$;5X0lLX7a z%-*~Z$El$f>j5u%)|OXm^m-p_S=43GqB?;z?}QYdpb$c|WAIqjyeHD!{~Y;3 zP81p?U z{Co;X7R%%2-E3eOZ{RiK&CI8pD1=xoodo-`>mtsaJ`qiI| zPGUy@VmD;B0QZ8};f>u~Jwgz<s|y@h&YCmAqg0WS;-yZH2Z@WJuzX;fce}UU zJg0_Fqa+zJflWWhcF9>+rA~g>ivbhelS?Zf#NaxbR|Nk42oXn!8aiO{9cFf0)jz#%dO^u^yiBYkXm{cfo@a>zLy z7@Rou_&xf3akX@hZTiD6HnvpBHGh8%VwjxiZl^qhSRd0tlFsC$8l{>tl;N*=j0^bK zB!uaMka~zv=w>AWBC}C<;StEW!lL&s#pk*8*GI_sb)x3@!_b6{_BH|dFG;HC=cNRr z5P*KZ4YL$>&eCM{F9D$>OqV9}-Jb;9e?Sq7l-ps&*wLR<@PzyPF{xfTT=K0RW&Cbc zA|V&Lx1(14-}}L;N&~cJwdeZEgAqFu3o(QILLn9!_9UUxxgVqaSv)&@EXhnQ()0i? zW$DekPezt{i1*7=M6;CY6;cQ)E3nH^U&-2theidq@_A(9<_3VzsGrlW?oD~sJTO&1)>I5kMnja=3+_5EIO~|*gB4qa10M;!A z95Zd5B)F4^jVH68WH71_CcHaW^Spn9=2_Py3wR5w z4}qGlRb&pfzZ+$a5M2hL={`R1_cPlR;?YbT?l5&b%kz9vXA5A#4@IM-qs}mYsy|mx zx2!w^teND9taJD}=Rzt%s%GU+iOA95?rlmSkIoY>oJk5PFbuw8Wsd(FpV4O<|Ro);pjY5ApKFyt&MO%? zi;nRd_MSNs0xXkoM7v~rjV;RW-Ez!mfOo$4cb<$~Zj@7mJqNFPYd`c(+6UT#`Ob1biZ;b8M~dVUO~)!YhJ?8d)t<~Y9c){nf=Mii z>wd7=JLDU(H-KG}X_4C1l`UMjmdB{G<@`{5 z_v~rbivyc(+P6A^B|hPPwRo6%(Lqr2_gJ5L!y}Vna>q5b0m|N^+T+)!HZ8A~dR*!i z?3Z->G!LEo-0=ZTMciMghab-?n3#Gl7u4DS7Pdn@G!z=X8LPkG{eM+; zUC6-n`Q$~5qh=$DT3G96>_(}9ITf-J1UnPQDbMw!t|;@gew=PI>@|KZB$R^tR^{o_ zDDWi`cL}LveAdXLnXGL8o13A>Nu>t;cAhf{rdFcRn3YZq5GJpHvA&%J z6sDG(W@gyZW7-JQc(ht+Dz@jE{jdVf1M9nuy+aFBAqL}IO6^mYKEGpP3x+}yrKrD? z%ps9toeluj&3|kAOfZ04qCm?(5LYU`{+bb{A?yO;F3CaV-kEO2mbk4en5+O*X8v;X zC!DK^r$VPsYLHm&7Fy^V6HeM4yL}IhDN)><5K|gtC8u+1y&wH^$(X3uQsTHYNtrP_ z1rBj`qlp~!34zVz%IG3>FmB@SZBQKn@Q0i*bWB_k|6uE~Q>5q6bH-c^3Nlk%8d<^#i(0s6dUu^}{-w4*V z^ltfTPft_>wBFb$j2We?ceost0Kez;qfoi;zp3AyWvGIeiv?Yel|!s1Wd3b@vGB$Q zx9@F{6Wfh}=;!Ac+p!*;Qa&98FK#X(0u9_{*6ULubDL7l119o-G81sDhiJnr3i)0A zyL#)G;vd*sj2*7*F|a-&ON;GKv{WES=E8a*GL9p{(IiJF7WM{x^$&X-mv0$ahNX1U z{oSH~vq-rk+XzYe%D~lIePU@#hm+Vu2B*I0CDgB`N)>L;y;P)(2RwVmiaSUDS!(ub zuc=s8%LAiuiz+20cB@qd8AxHoFq7jW#ed&sxk1AL@g?GsW_1Q!FZz;L{-APi#51Qm zg&k(l3WsOYA;%U z7>&dxx|6RG#J+Da9hkas_!#>LLbB$@H+u|nV48(~9t8orR?u1nXsJgARBxs7X5R+2 zD*poslhwx-|4OJ@g3rj_e{YBxIfZ-fewEh#-P-4beqkg?*hP3sxX={hPci#I_MF6yBX-R)I)g2}uwGCExPfoB5< zk8z+Kcpm`{6tDl{21bb_`AD4w%^WVvuqCMHVI{3&i|ncr6pOctbRka4E1mdCDB+l} z7GoYiKmUDT*P4M3viCKn-EV&fv`93bH0y!ONqAy>Ifh0A#9DGY8kj7cx#Fu!C6%+w zoB-BdqiO%6(pan4vuMb;mefDE>={@E(&xWQ*%ho6$UwKufQ6GZF62_P&deqi^l`1Q zaOn>KD`BdVrI#ZC);a|S`DW#s5MT#JD6rDjm2XvLo08%R8M79#^+#OGzxp6A00iz3Rtw6!Lh7pP}+x|-W zn#EBC2YB(6R*BF~`jKkR!&2}(e@ni&J&?F&ABgj=@m+dCMNjpz@3cN0|H~4fuY`D?tVe$t{snfk-Dini;SA!_o^hF8=l|Er{bv^xOgG zdMu+y(K%daNR9Z1jfs(eV83vTZ&cjCyC#8{BF-1CJzlG!xng=A7K6vYFvVG-A^JbD zK`TG90;@q7^f-pQG*(*`I}4Gz4?3}AR51$P+rd+?6BSq8YK+Pqt$Jdx%8^oKmiX)7 z*!zJ8YWrD6zNhoxv&Fjc-99ZvBMNr+2`w)z>!@^JFY+u!BLOMsWO9Mnirgs=>3~S- zVBt)~bW>hR4jtCZDnl6U)L8eUg)xXAq^b-)p87Tty0cj#RqD$$k4K<^+1&ctltxSY z4y#$oWr=qnJhe0jGpfBWK-0NEDPZa^WdbA1&@~=UDuDtK1mSxD#d-l`2ERPQJPI6C zUBa1A(AONi$QwA?;950=$F1A3N7w?k6S)U+XIno;FVm0rFssGN*l0E0^2(OHmLyRmm+0MMEcdH;G{`eW7MXsnT4)3 z+&H{IR;m@fwTtO>98DUSvZ1JWKT77N{Xchj=1EPODUa?M6wOGc;!5tIlNN0=#436E z1pe}%TqIei*`Z0_q#dDjbkdp#xHbSdC+(+PD@7kuU=_IHS0W8IeQRpkpC+y7=QhBg zziZBl6(41eRWVmk7_Y#vC(RtXi7rc8$Q8kuZC#8ljnTkp48{5IfuHoy`48w0|2;V4 zQN*t?&~D49y45CLihUc-1aP!ibLpV4F?0%+|0@zz4l|Z^o*oS_9t@18!pY;^!w!lJ zULe{y&>A~0KK3F4&B^g!UTfdudxB6B8nT2X3Hzcb5qfxzDnPRwB8MknA;8JIX z0;iQEja&z8=_HR#1<&#r@P}F;+rlpdp$lXn^%<5k(!@dV+C~U(Ipz+Ut{!q>6(>FR zW7R?6e$<7eoLw26)u&Wej^ZovZ8@&Z!DejBj>w=XbN4V98$ zRO)7`4xLawTI%XxF*F_+U}Gl9lg6kvhv^7ztx_JNXJYpr=dx^G@GmC)T$MP?&@%3& z^8K)s&F*bTjmwMXerLr+|7r%@YaN$bh^tI zG{f7>kFEz`u_)vN0--Oe#W>zpfz^YO*q+*|O>FLgqe`qI1)oAv+DCh3U&q>Eh1azERTHU7(!l#AbPR39ACtDE^#DuX4L zAy%=r?*?m{N=JW%&KfW4orY($&TE5v_kVh}c;bN*_Jv+$ksf7P9^JgtXC6i)yT@o5 z{Y3C@mu3I@C3*gxdG*!Ylmr?B;I$&Wv;3Zq2&dTwy9|Q!I8sv^z}UYb9^3C#E1AFo zhMaDHk-IwMY1hhZxI;axXsze`^)`qaI%DaFf%)^5b^lON0qL1f%`h$Id!a&Bc1={M zfPej;N)7dDe+|^*WVg1M=&Ie}?gZHOxVp7LFLDeZyj>LNjcaUryF{?_{O7{t%OB!# zDC1g%{iXkO4K`isviK+3S8d#-RwE1UszO22r7H>IgdcAGiHD6t@l8B?ft{5_;p=j zYP!5v%K?w6UwdPlZm*G?ihiqku{T?kd%DFsfk|guC9PgkjLhfo@-%3o#TQ9s`GgmR zrgo&2vD&$@!(&4!P;&v74;Og(z^Ru1hld{7P+W_T6b613`jq&z{hkX`>K3Gsg*lDs z9VlgaS^hV!vhnhe^BXc?lS(bZX;Mx{Q8}y0qzVqWx<6)_q)aC_@6v{HC35P6aG^qB z2)hlGd`v7C@SlCBhKYmsA{5#d0rKya((Q26^CoH+GDVv@H3o3q>z^d2-;W~9nBc`X zq%s5GA!Vp z%o_mAcYUQ+i?GN_TC7xiWed>rK`z1g4I%vOO%6tO{{s&c<^MPJhY%jfg%?o(56nlL z2sp!5Lh8NM^*76zlK0w_&rOp)PyeF^AJ}`gK0E@GFE;6U~8bJF9u zfeLmlldCF~vhYOu`XTpyu4(JxM8d2e6%F_W4eOGoY_oHZD*!uQoaq3co6Z|F9IoUvk^-8)^5*vXzie{s8O)DajIx zDY-{?S4qVLAmAC@#+J)-w#o3p@Y*xAvRDt#Eze?ImU0gPNr)%V@?VemJKB$n@%{Vd zC=McVJ}$Gb%~L|Lf#TH1L){smgurtMWp)Z;1xM6js92*VffTn;7Rux2PXZ3%<SGz5 z_5yi%c_RbuS%xodA))0v;dho-!lEY933Qjp^q7$(9+v5{mI-2CQ3ATTHTXA4wJqy~ zJtcy9Ltu|Sf=!PcDY=05N~SaI57ACwc}*un${%p?vW$2q=1?!aN~+Cw0X0YBe2icK zxe44#91&O_=;zyUvxukp)Dl#qZ}-hm&DO|X>|Bh7CNr7lX+f4B>^xpwQpr8m0hv<{ z%vK{kPt{1`!?IXUY4gvPH_;>bHM%dFLUGMZEN5oy)(UolMuNqdFaU;AF^;T(AS5ir z7ND1r@S^go_s_$r8=QlqL~^b7y`3HJeSU6(?&R_+Z#**}Q31O0f7b$eh;_o*Iawy~ zKdQuMzYu2uA3jqCCRz^U@azN*aK>b~AQKb$4?W17Ue$hC*sx_HFUI%rn}Ky>9nvN+ zE3hzVlGN`CTafwj%Ts<-#WUH8KIrP*)@y0qdf~YHHb^*LK3bEv2&nW~q><;BI$I&6 zgVd9MR%E3Bp(>}PF};E4zF84)t~5-fp6vV~GhFj%UpLvGGh7_Kb61~15`>foq|e-w z!ee;1ms1C$bJb?A;gdqoox7y`Onv1pG8SLc)BeZj#GlDs33=k>VBZ}GzM|+I^{od4 zzOaZ}N*rRtO(q1bW|Y?&Hr2H&_>Q1*H%)}v&{jn7=+8%>=0LS0*p6En&ToXjC#Xgs z7)Cx)#ysepoGu{E0EycZn4w9m-lUmwU^}ZVwjexOU9Z*IfrC~%K`gqxdx;ybr=a@7 zQIvcL=+1(!;$YcCGE1E5H>!)`H-0&m6`NN)57-*Qq@X;bGCm)*k=D6E135vr@{65Bf(YS zFvSGrp^4%Hd5Vs_ekEBfnW7zCc49G2Zhw3aez6*7s!|s-ER+IqC7D8UqA}CHlZc=` zexhmlez#6iRV<$Q&95$LeZ4E-3b?(4*Pz6ScMKG;PpHo1=g%p0&P>0R1?8Vxz1-UG zu6Cla*fyUhCyGal1*4IFs9_S;V3pJ`F((ZrBQ!Q_H1qmE?M<3`S(}}cgvPkA7xNr9 zJ!1Fx0nPlKbx#3;WBuP-GU-q7g8BWY#*DYON~jji#DpXII~dqL{yt?3Iwj(dTbJOj zlV0ykUEA`n?J7kniE?5lnF}_b5#-|}lY4%#T4%aY7lRfEgg2=>tZ0IK)wgt1xQHsA zkT#0Yc8Ai;S_|q<-*mYE3VFfk;R-|b&{qkRE`IuT-AjTcm^t&||ETRNpyFu0J%NOf zWUxROf=h@2gKKaL5ZqzV2|l>HXCMTZ;2PZBEkJp?wVg|vi_ApWkAVV;7S;B96yEAxSd=dAHK_5U4TAbB+A@p=DMoIYvv%( zF5`KT3}s?8xJj-rpgIx8CiYdJXti$t+DW1JDSGSI2F1YHE`1aFZ}!ANo6Kt6lk~NY zk2#(r%MhQ-r*Do@B%Hs;-d~O_h;=mOhOC$#pGMw} z-UeAa21cD>j=g)Fzvb$qmKDfz%=So98c0yrz>TFl_mXZ(r>a$}e=Q-N!c3>C(W3K` zaTB_36|W(@HHnPWbSh_XOnCL{sI6lKw05pmESroUr=u6FfgEf(0T0Dj0Kl?u-a6RV z$-I(mikKPlWC?vH?Mv&~e?3!7fcXo<4|PytDLmNk8|rBUG(77wU4Di9@`Uf}(fDwq z*RFwWGm-s5H2!#pu4&#v-KnbO$Jk4Leskq9OI3_k@(~3`ttHMNX5sB;ospy>&Vt2NQg(m@W$K94CKlX zdC2lHvLErI{hrExP;bpYa3Qrw(}3;(5j2NBec3e(hdLPX=cN}2dSPnVf!X2FQl#S) zO2Xkf$FhPwVEY*k2tXb-d0k+Cp0k31FYkBrr?R2KTc-|nQ&A~6j5AA70w;TZ%8P&990>c3)c zNzIm~DJ3WYV;6$!PvVZ0m8I9b7hP#$j3o9ySN<_m$ljIV8)ZvIcLmLo71B$o4S)}F zGFT0#SlZ0Qv#*|aXG*bV@&Xd*dU+U(wKCT!&TB?5+U^Wq#HgWv{p?n&(Kc zJ=-;hR-Lq8a{E`l#?anpU0G)~l^fcC7|32n1H^ec@75|1%tkL?!G+RJkCY*ADR7;b zGZi7h>{+-X0d|?7)1%o;PmP5p6oJY zkg$n;-yc1KQ~=F7lZdvJXe{E)6MvuuCM9dXRkT{F^*b?xx6&^7DS()66;AsV?IL{I zq>u3sRj(5LBrso5Uhsx>1ej#p$9{v@Ch1Pm%UvbIgTw`4RVDRE(l-V;to&1FI|8zb z@CjVed>2sHKZ>OZem?G75E>{q!YdFHtDa;}-U@-YzJ6$MV`31FnPi@~Ym8QC$urX@ z14m7QaEX{r-ngJc!`?d>JTvT0hRk6^jP-~Mx)$(jG7yoKD$xJKsvF$LR;L&tbe&;t zyyZ(vD@M#Z%md`&9gsWo0$TP%zx|@#6y`hJ5WpKn{C3I*fUwNgk^_iZjTyn7OU0+tu} z#ePloMiYL;e8-cKm}M9RMTwVq^ph{Me?cDOm(7NPGh10;fJ6O^GFXV_I>BCYw46OS z(U=02~u85FJHyVBuirCxj_YO=iYAnrPe4G6FPHIiR5O?DgidXS3K9FqR1 zN)JMB7xv9W6*Qmo`~fqOcNC=RCOlsRXP&gOvj`g3TaWlg*%fEW>oAoKDdWsE+IA#_ z|MGEu=n0`YwXoQMp9utkfw^EOZVSTVTw$Mj8FH;;&KMpM2bMzKxCXRsMY7onRNMzU z^JS076uzSM5fwiP0>Ir`g^V=DA!a)^9y9j%T;~>6RE94kYzuciV74>!>r5B<3STSH zBc6|Iz(p3?SUc}LtXkQVj^Z*5zYTjbb5B2cV!8L;fRCd9QHHtS8HB<$tvDZM)*O|> z@WS7o;z|}0_p&f=wI}`(n_w#q-2t>0DJ|8fl~!>8xE*YIZ4~^W9LhX6q?=yzqxDi3 zJ%UB#T=Y{t=5a}C8=LVzF`8z8pv7tv!UW`%n4c-0j+tQizXJ8~!8p}p>|5~#G%4G{ z@NavzaYLK$>dK3UHPfĆwTDa^nOAP4{}bEh#Gsa6!vu24lO$>2Qe0je(PCT`M5 zL@k>zka7?hi2OM4%iOf#>W?ghel4(ydJN_eTrA%e^CIx$k#^*R-XzQZ@;7+y5RMTu ztd|hO!7VYbG=SqCR5KlyeaPFZrH2Z7%LDeQ<+f)TEW>oqCt{R8U)zfT$xzVGl`qeh zzcb)3&(0d{WKtaez|A22bq3elth(eG<3<}=^)*J>w1xZNN+x2N@9rT0Ra z@!USKqWa`XX{im4Z*G<%?wT8sK4|z&$Pq1o-K;K3(X_CM7?H2ez4R=;e!|&5A?0FT znfj=KpeFsn!mbeqbuo6YU5xxM$(})moQ^YBw2-PSH)C}J?-yF_emX(f#c-^b7b*Rz z9-{%+&)Pg7!OGaG;Hh>U<_xg{=myKC(-g_i0a&?HLI3&TgJK75HuU(wg|yP<%qp!_ zHW$pY$pgWU2ZVH_>nycLbF7#YD@v~72kC&5tgH8LQ-gWjlRMgl+)dbTW+{P-hiQs# zyP%l&vdehEH&K7mb-+wKv?f@0`j3?}Xo>u@&sJY>;wu$UCd4BH`k2%I`TPOkAjmM- zN&I%2T>;ogbffZfVdpR(*A2h>GZlnI^(bfCh_gzK^z z++8#d5zjm}^^eXe@f!qB3#3wLPFk|TOs{gyr8aJd9RWsLg)FCoQFqHoNk98~xo$%W zO;hzkR}Y>_^{DchmQ56bmFssxx54Bro`zj5%MdPH3=$3c(U>>uh-|n}Cec6<+(+k? ziDeD2c2#jR1s&DK+1%v8WeD`e;@szks{sn@vatw9>~M7mm(A+Baxhe|;}+ zm9)26T){GvrL_EqtHw*DD~P|jZDN#q^hUi?7{Y|#Bm{GiWLaV!A43y)a!k$fX@mT) zW^I6M4`(^Yf6MjdIrxo=vKemRDRXa#qNl25sTZ10#fym>!Z5x4>ld|z`zop z1nzX=d z`4=6UF=0X#5PPZ%K9j#KW|eG_vbu*F(HL!#0D&+^>&M*FX;~>tbUWgmPwipq*MaaQ z6IGYVz0ONjnQ=_vFX?$!tb(fZjbl^eIPpqd9Q40p5^tZI8OkJ+3Dw1<;;&5#i#XZq z<-|8PNtY4Im$a}8i(R1WhEzCA+E-mab26x^ol?GNbhj@1PFGLdX5e$8cQ+K_?_59{gbHfKpV6SNC zIr0xl`(PHfJqbAB99eVSr0~bmYJtSmMI4v9CDmC?O!3yH^Y&5HVN#5;q>EGEt!(u6 z2+{bsl(@BS+4<2}o0>ieIQ!i384AkXL%8uuMo_W;{QEv3i2Gcr{2j$704SxV{Swr7 z)$09+ulzB5X~iGGawDaNf^z*JZotEdyI|7u_z8Ro*=2HviVNV9nr;xXLbHx}20GkQ zKvf5(?QL;a#!LWUign*!uj05{%G0U?jTfEIqyWrJc9TAy5`B%v-8^{^#lv@5^7*2a zD2tjyf#qs&+VvW&r}CgwE*8qi|3Y~A3-5x0GKS_4psE1)DEGiB|6huGjQ@WD$^3&N z1N4I8Y;UN6eTU32HdvHfTNQt;BmGwC`a$CzZI!&-3(IDP!sQG1)BUPr=inO?rs(c& zijW6lB=NCB%73;iy`krPRg@j)q~t$h5#wxaoEmU)yQ&*6ED?O43y=+^X;jpZ{U2a$ z-DXk9u@nary}P!$%uDwuVA_k??A;_2+q1Y9T#QH#?k6&Y0nl?PxDaIe$H)E2|0OM( zTtrJI`1x4d3aA}wudUWHs(4ZkJty{0NV=Zp3a{)Y121>rFNi=IwIRTZoaNF_>L^*B zM*V#4Z8?DSKT5q}sL^eu2YK*xXmimox$B95`mp!6&0hb0JhOy6zHby6FOC{yZOX8rA(<{`!R55p?gpAh!z+t-vv>)O7` zcYgZhfrF;W)2sH2G0O`|J8hUc?x94D58UFxr{bwClSf8)xuKQN*Vt#)Zv={IEWSU% z3NijV8SeoeYeT^DwLbB2r}o^mv?s7<)c*drxd7p0SxDaMmp_TGoZ6ki{JYwq{*KI& z8qoHZj@Jf{lEKE9!q1r(bU!s#lr`ln9^J&9v=s)EiGP#L+r1h%nMkz`uQGS1!@>W6 zk9tVG$xqfQ1$*VICsaBRaW))}?F;u~atED)XygR)AKP}>P_k9)#6VnmCt``859(AlZ%%A5P)V^!o&ZgFIn!3>C2f55cR^0TLvNC2gZ z#z=>rx;!|wlQvQ~n`ftp(p*1%gyQ$fMHnx@>=5tF_t_7MhzT|jZa#h3kE4~F|tyEm6KH_1AVozDKh%uysK$ zk>AQjJh$GD#)raB^f@h^vsA%VIe+NHQ+0T|p%d8x?`89RnGWI3TkR9~Ek@q+h&E9GA z8gObn88%I-|ITmdGEI=oL__ca2YhvRcCu%aS}+#&Nf$=EJED&)#t)Y%s1_+RbuCb% z+f}U4zkXgVRSeE^#GmMY=1>e(AS62LeysC^4*wyj(r(VTo1Oy1azev1whhbvp&;v8)%jUNXRvxN!uDLJKfq0CIFg2r7E z?*B#SvGUo8u&-VBf;d>ESJP;-;}r~?KJy8g^ngizZY2hPbc0UCUAXHLL|i@H=6*00 z$zR0IaFl$wDQiA?vLG9T5VMwQw}lBfGOA2qyqQPf65*H{yqHxw zB4iyW^uBAJa9Wc|=wyOOSbzR3(qB9p(EbR+<(r7=V~KZXIMfNkhYv&Fw^*i-3)FPm z%@8D@2S1xJGBxlyNPJ_rj*dpg4cidwT*BVd`a&m3!jK*jB_aCf^O-!TBp)G9p72f8 zD0RZ~rW9#RFcM83#2WH3sC&ZlcsIgqsjurbU*Zf$=}g;1!{7iTWWJBiNo}=oG_Im% zeL}Nl3BK8{EZHN=nK&gj=)vNv*4BgGDwncP>PAt4OUczLLn75&+`~+%pb;9hpgCZ? zu3Q=L!2D@}6ymjWiqKTG7C#RBHe}Eq1*|-i{aU)xkuWQS#08mlGkwF5& zix3ce$rzqqmLsX6^o%2^-Fa6w53csqUMIFiV~i&%Z#rVsFNFoGxCh+zQ}v1(zy&lD zIS6kZd6#9CazoTlL{c2n7GMAIgmnCxl96RE>RBV6>g&f#mwxM{Zo1MC`G@HtS=k=+ z5AeRN)ov6Z7^Df3g+BgGSE)F1S z58+hcq{8JV`|04lSKoi&6sm5=cG(4M>eOQiq&hU}gl} z`1*;bSM8xWuWW3vkDJQNj}9q^;W~LY!9QI-YuX6enoTE1j(ulwiLeGN6j90|WL@<7 zp3NjtVo4>5e`6E4+@)#c=8VfZ;hWgI4kJQ46xCd^@x|fvi@~_3=5H@kEcHD3eFosB zuERF9KKHQ!8?IuB|41HN*#0{x9B)S#NaKF1-=uAtf zMF&&Kd85i+D!CV}+|cu(cYcS(K#a?(SPx){gn%VdO?98#vzCkQT1pd=1rF4BL_^za z8*zm`-g+yF=cA)!WsldpD?@yfE*Ht&>iZ&0*;bvhfAGza21JJOH=(lC;y_jHYfm8u z33Hh3-_$)ZuCfsNJ{$Z9LQ1tOBXUUrmoLIA0N}Z z@c1fO1d;DHBQ^IEKZs@19b3NE|4gFIGLdv~@sMRavc|e4@L2yo@T-B8gm6Ra3ECT^R@c zm~Z@&v3zgzAHF`()f{p{yRWFSf^;-nDguYj7FXymu!J7(gluUMZ4bE8Y z6*pMVqIK`J5zO?~zt{19<;T<`NWh*0fYW9NAR5Io`OCjVTWZOJ81vA%xdZ48-e7Bk zlSWwKu+eTr00`gAh*IM;Q*j4|^3g5;)BMI1*YC6}}u|Z@$ zG8V00*9R_RI8O++C2aY?4p0`mv3hMb_={Mk{faNt*}|%o2SmM=k>Yk4OE@4VaI?^0 zAFc}WjmzK4i==dHj@EVMac06k<-w_h4%KijNr57u#7@glEE%;SLXESF$3}>6AhbL^ z`t_-+IO(nc#BN%!1$~tSDGsWxModt56MD?!2=)^jO{?6~#MvURLc70VE`l7aesuI? zRb?C5cI!}0VF%na?N4b+a5Cf~`d~ep&o0hLKZsLS3N5Xw#PXAqt6I`gQxoca?LOGKh4J?n<~to=bp+k|tw zmU&q%<;-=5ZIgf_Y>5fSg!h=%9-r+!Hrg({C@{HGX=p*IzA5an7lOpa_oa~}o#~94 z4}ML04~<>IPxk^A`joACzBbO}T^~aa!A+{YbK`sZE6wU*LH#AqjN9Fo?2|~`Cparb zPMm{t{cR7v4{P<9X3c;fgYd_3G!MQR$*{M1ST&Sr+15MDRtq@a5 z;`xH%i>l>4q(Jc^JDi+#>uWK%QD7 zZ6lS|FYdr+^G~hF14fV!b@#rD*X>+wo<`jypRC|Frle}d@sljNVyAn6r;U=RitiG$ z5#57%8VSSGMMv!lgG$brulZt+&a<;zulpvh+G;OhpyrXnzz>gcHbZG+;f+5NJR`x& z2(mqDlJ|n;7=3-_k_6(q__~3ST8I^N_c_TuNAZ~;iw|ZF&9pE^3CK@(sD!je^N^3_ zRqr3&sNI8=<|E+-|9PX+s4z8wi^FDxU=jhCl9r|gP^0WZmWz<(kol8_W+u2 zw`FS`Vt9pTmJyB|w%fo#I?6pXDfzG<(5FwzR{u&43pCG4mVx|W%h2CmT`y*Gr=9(@ zeJcQRu2}J!cq!d&PK|+GyD@vzluBm`mW3^qu!CyHs;StqWR^lI`dDqr1eM}U@QP4u zu9$N_UfmxCCKX0%W1UZEgwP%9_%oO6n)F`Kf8Ar(!yJD1+gLReub?JD^O z@wPNU4CeRW?qH8+!{v~?{8B}mWDPebl9BVBO~vJVT5{H34eYtxIboLuVvne)Q@(+<)50{R2;+Ib9|2vwGN9hS>K`k# zdC8m7;gPEauebikOgh-)s>mqEAN)3|&ivXwNrO#Iqqda$jv_; zqoAgsMR9pv5-_<=Ui5CZZYqW`)@hhpoE2U}i^~?)+s(Q;wR{P1jLk_q*ga2U<%2}9 zc}7oGcF?5#<;P5G7zGmX%_@pd&(cULpUYhaPIp-N@-t7!xO2PXS=ycLU(2BX=}Wde zw#>LMcw@fuLAJU*>}uf95v!p;5(c|nVXcY* zS{hL5;rMFA<~)MzYCdNCeJ#wU9(^|0?ZDN6rv+GQAZByYmgcwZB-1<{l_COm&tn$A zqqCMD&bOePpvmKkEAV#&*}NDBbVL-tuOG1BfD%cIPf7*W4$}1fnH`6lKHqJHRKDwk ztA9an7cR$O*b{6wZzzoUW5&f=|InaGdZ}mp6?9>15SrLF1cJlFurG; zwL_inD)6|wt)j<#97QrY5v67_XL)OdlppW+NJM@JTFI&n9w0tud?}DzaLerWXK(*~ zqv_JLR>H@5Fznjsw3aE?bI!Mf&1~v%pk4cl!0Vi#iF>|%5oCOJpGHuZU&qByN77>J zvTBbE4;X$TSb!|vL7+Kd-`bH>HC-_~N6>p${mIx4M=XWwbY5O%bmY-Q|mB=onB+Ej=r2=Jbk z_H8YP8_UHuFno1qMLt?LjxFGemvXrnO|PHTLLe0GHC?8$PC`|z^$D<4flZz>klPu` zrX)t(CTe%Wpz5DJGaYrrk<#nF`&icNs(;b8%(yKW<$%X&3piTYzVy*J&P2~q7-Mcz z<-t5GU)r*#S1rd?%u7!3Q%LM!iLpHz{X=g~X;6EqynDz_xkWh>H@*453XWPm+7FT(gh&Omz;5U+ z_Fb7YSoW}W!z+hQ?>%mXPLUm_>M^(zYTM<~-oeQFa6Wgh@r zD=+*y3(L6O8VP6vGK69qJ4DOaUTc1s2xZ}F*W9pferz}Jw@ALVE3T=)`!#o3##FLV z5|jm2NOZxL{BdmTL_e$iO53o9MabUQjPg3cDq@fA^x{l(ZzmZLFfn>KmVDO2Lw!nm zB$Yk4xwEDMi|UhI!Zo2F)VZY6Is~QR)?S#C{4-(==KjU>j@|RT!&>)fMtcBdKM9<$ zu9c)VYT>Fr_2{#b-MXFA4V;yptwuC;3($DO>6~zL%P)IOfKo8cs%5|z4(-R--jxTcrZCOq*EOU``35kz z!@3sEr5JF}xQ**%+iu}!7-~3pff1s`ak@gKHz|Wh5Yr#{Wq^C%%Ccb%(V&pdmu8@j zl8LC100k_;M`dhC9yo5_O0~CH%%l6wr*n@EA&<0ntx|Q2qe{*Xjf?>vgDRPtR|>TZ zFVeZj#%sCg8|hUX-UU~mXy`m|B?Il5Kln>6jATE+Evj9Z#ML`Y`oH+x2;eA`5Wofh zFDob`X#ei!3quuzhTprQ>3^UCH2inB|0WjvkI~_Oz2{$%;GcN#Kl#3o8~+h?{A~p^ z{2#Z2uuMcxDarvd8?kjq3o&qME(cZ;r7O7h+DYDyOl-tM$tzcVuHN=MdhrH%{DQ{k zXUBF$Dui@2S>TD8U|=^JYdyhoMma)_6L^Xr>dt*PNJx?|kqO|NcfA5#RuNtgs>z?( z3;pRwK_T^Vb$NA%t`_Btin7Q>_lq!xg0Z%d2z}k zxiMj2q82fV_wmMLEL_K-L;C3$3QD-*6XE6z&%0$aS`-wC)~idpjdI{wekIVx1Sp5@ zVc~(d27*BU-uGDP0NOeV0M-8gc*1|2WX_Q9-X+CUn|(q6CdxoIdLTaeuoO8f3fDI< zTf`mV!$BgHBnePt=^foF2*sKjA}{3nJ@lvFBb1zBVeug^w991FMK&nY&uimHG=DNt ze`r(+{_=X7!UjlqFCXMyxXOFchtQya(B5F61oqsQfFghrI0q>2wF8uYkKAkN9=#p} zwBr338+%zV;_(hgeNUYL7+ZKaynB96C>(EC%PU>7DfxS`Z-W{|=~IFGy>C7e6w8Hk zun-0{5CQ~I1ZfR!g27wSvpZXUMW2B_f5e*>%MH_*D^}IJIoRL*<;gg`mS57wBr25Q zWjer#HJE{8N5{UH!)tBEi`pS-#_g@DhUS}Qp8F2gJ3q|NW`xa|?+Y&zEAnu?Q_HVX zp}7}>^2urcH7uaKGF5VphVY9@%=z9u2Wbed4I>Mcs_B(M8k5NP8~=G{OuNsaHH6gR z3};L@41DVyDSUWGviJ&`tH$@lWQhs#0@9_~JJ87gDABv6AcsQsjt#P5yOW-uD0Q`0 z*59$~i2o4p+!DfTw>qA?qbR^FU)^kgam`Bh9nlODfu6#dmr_wDdsQQ93FhA7`Jb0cx=M@Q_>3Cr0c9jtXMu9Z)Yv$hJ zK*sKArlZF*Zd1&=RfW?XVNJL7^S$oR%EOoT7X=*TJU0?nr5!fU&~Y_D(DYo4=KN_}*@x#5{3;*~<;k+hp^`CSfuJxj z^$LV}A1*Bs-%c#2K)ng-tqX7}#dpMdLsE(HrmapU#$`!WZosr}!l9q%HC?_JpQgP2 zlf3w5#&0UEs}hwc2c@4X&OIiI2^pGZph}S=A%_)Hj$UNkitJ6`zU4~(2~i};C?98G zC6dVN{elpK<&=Pp4lm_NMLGJc6ahHIeyoAgVYu4$#^Ga=1J|epRr!f{yPTq^@BX-O z-HoMA_DI{l6L$^R^Yc!2H^}I#Tk_R(vP)WI{N2=5ZZ)~lb7Rl|&%%T4qxWtyY8E~9 zZ$s)*U$1Z+|DjMaO;;ZeR%R!Q;Jn*Xa*>Oc8Qsw0B$>tiSYu_*_EV*{vby;o~f7SfQ<`nsC;{s+k%^9>3&vRj28bL=RA z*qeUP-Q{rc8{t$SO21S(q?AU+?I)fnAcZLm7-1wMz*{#9qAZq8Jkql-lda~D*dLyh zx>Gn``N)FaPRYm&7 z&DOarWIm-ZnqSLqMt_#yb-inK6PaVeyeCojJ2ZJXOWs9QSqbAa&aq+o?gY7^d~kgX zV(3)BKMq^eJ-Tq2&zKuHSbQ2A52uH{&M!%-|+}g4kYHZqDYYxbDT!(hU z33N8uOJ(w?;4T{d7o}e*-cU=QE!ge??vS#p`Q@V)bqcUH_P*^r2dw2p|wkL_(zT_s9nuuWTWhe!?rNg_G(h zjB7^N-6M1~{DzO64$Hv4oHr*f)GVWnH+isxj z`dR4s*df}ztS&{FN^QIX$> zU5j>G9lzT+yaf!H%A$ar^8^!GdK6NnB!cUyLOQUrU|gn6(=*BX^0cz_y;a$-j3IjMEhLm9s7HiBx1gmsXf|}8R%tF-!?v!j-THRYy7Ow zfP_PSJgKxE%T6{~3e*@()*ZD}PsrJp#`UVYaoMkUBydG3y4SDy7$bHssYXQ@gcg9@>KG5z*0b2ZN(8=J8T zemgTDV8ABX#>-`;PZOzClm^G?HEg0y26tk6!@mi#Icfx(SY%*$fN06rp>vj;rdN;& z9JFaP_dGE9p3bY``><8W%NceX46IkcTz7|6}nqLbE>fVx6vfU&;T@f;cXiai%JyT9K_|M z%#a1%?JZgKaN7r6;p(B!fqstXp%lTCEF@0?bO;=m*(1=fEK+Njd#4M}G&jH&62*uK z%V}LO3(3Po>vPar$*o2eB{Rt95+qbfznY^qD}XvG+zi3*G!fuERL6xw z!3&M2^E+t6GGf~6Gbktzp^~CP%Cr9Qz&~LaJRK-v`0#?}^z~a1dYfPSkFKv5q|ckW z`zH3x=f7j+RiKj$@7pvIDAqV$jM}`T;fWT`mqvOf*DUJ9<_rJ+IB58;!Fz-$fF`l# z%LmYb1Jqhd;`U=yrHTnvk^s|%(9e4HakFyXFx~l;FxsOlfaspfr)grM{Q+I*2veggaX0Lp!t2EUBl3#(6c|K6&sH!CHTG%oE`ex#jDyi^s+VE zBFjyQR!LbMbp+me(!*Cs8Thm46KvOon}#(McQ;l%#HCzz^z4j|_h$3vD7&A#KcBmR z9CTur3-%AVRMkm1RQ**)o*j)Rrdj#Ecl<%tLjim-mkV7tr`agV=a2N_un>lV43BQ_ zyb@l|m>;reCOyznL&7bLL4#ypa02Sx&sPYM$m`n1ZM`?JCJnB;m#z|SjIYQ>MYyl> zdHvt;w-`}lc`kg%NmsStX7m2zAc@JwcdarIm;+Am-FU&6LL+q~Uq^ei9^;1K}Q3t!_4FQ}&1qhANC z2kTs?M94Sc@LQKP>^4Rs)GLNOQm8LP2n6y!)P;ok=^Sy;4pIDus{!rtCim zMqn6{if|bSf%W`)UQ{qGu_%^Kv)&&+Jwgm_Fi>m5+1<(Vo}Q7{(f>j#y!#B(!&VHh zNh*1RX{t++N-NO34scANusG8lvW`n6| z4u5N&<(pyexre-W4X7%%!#