From ebde65acf4528bb268cb10102b68f166d6392aa8 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Sat, 10 Sep 2022 05:04:48 +0800 Subject: [PATCH] [HLD] SONiC GNMI Server Interface Design (#996) --- doc/mgmt/gnmi/README.md | 0 .../SONiC_GNMI_Server_Interface_Design.md | 568 ++++++ doc/mgmt/gnmi/images/cli.svg | 506 +++++ doc/mgmt/gnmi/images/data_flow.svg | 1442 ++++++++++++++ doc/mgmt/gnmi/images/data_flow_get.svg | 659 +++++++ doc/mgmt/gnmi/images/full_rpc.svg | 438 +++++ doc/mgmt/gnmi/images/full_rpc_gnoi.svg | 472 +++++ doc/mgmt/gnmi/images/get_lock.svg | 808 ++++++++ doc/mgmt/gnmi/images/gnmi.svg | 1089 +++++++++++ doc/mgmt/gnmi/images/heartbeat.svg | 608 ++++++ doc/mgmt/gnmi/images/incremental_rpc.svg | 397 ++++ doc/mgmt/gnmi/images/message_example.svg | 1686 +++++++++++++++++ doc/mgmt/gnmi/images/mixed requests.svg | 153 ++ doc/mgmt/gnmi/images/restapi.svg | 373 ++++ doc/mgmt/gnmi/images/set_lock.svg | 744 ++++++++ doc/mgmt/gnmi/images/telemetry.png | Bin 0 -> 101081 bytes 16 files changed, 9943 insertions(+) create mode 100644 doc/mgmt/gnmi/README.md create mode 100644 doc/mgmt/gnmi/SONiC_GNMI_Server_Interface_Design.md create mode 100644 doc/mgmt/gnmi/images/cli.svg create mode 100644 doc/mgmt/gnmi/images/data_flow.svg create mode 100644 doc/mgmt/gnmi/images/data_flow_get.svg create mode 100644 doc/mgmt/gnmi/images/full_rpc.svg create mode 100644 doc/mgmt/gnmi/images/full_rpc_gnoi.svg create mode 100644 doc/mgmt/gnmi/images/get_lock.svg create mode 100644 doc/mgmt/gnmi/images/gnmi.svg create mode 100644 doc/mgmt/gnmi/images/heartbeat.svg create mode 100644 doc/mgmt/gnmi/images/incremental_rpc.svg create mode 100644 doc/mgmt/gnmi/images/message_example.svg create mode 100644 doc/mgmt/gnmi/images/mixed requests.svg create mode 100644 doc/mgmt/gnmi/images/restapi.svg create mode 100644 doc/mgmt/gnmi/images/set_lock.svg create mode 100644 doc/mgmt/gnmi/images/telemetry.png diff --git a/doc/mgmt/gnmi/README.md b/doc/mgmt/gnmi/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/doc/mgmt/gnmi/SONiC_GNMI_Server_Interface_Design.md b/doc/mgmt/gnmi/SONiC_GNMI_Server_Interface_Design.md new file mode 100644 index 0000000000..d97234ba3a --- /dev/null +++ b/doc/mgmt/gnmi/SONiC_GNMI_Server_Interface_Design.md @@ -0,0 +1,568 @@ +# SONiC GNMI Server Interface Design + +# High Level Design Document + +#### Rev 0.1 + +# Table of Contents +- [Table of Contents](#table-of-contents) +- [List of Tables](#list-of-tables) +- [Revision](#revision) +- [About this Document](#about-this-document) +- [Scope](#scope) +- [Definition/Abbreviation](#definitionabbreviation) +- [1 Feature Overview](#1-feature-overview) + * [1.1 Requirements](#11-requirements) + * [1.2 Design Overview](#12-design-overview) +- [2 Error Handling](#2-error-handling) +- [3 Serviceability and Debug](#3-serviceability-and-debug) +- [4 Unit Tests](#4-unit-tests) + * [4.1 Unit Tests for Capabilities RPC](#41-unit-tests-for-capabilities-rpc) + * [4.2 Unit Tests for Get RPC](#42-unit-tests-for-get-rpc) + * [4.3 Unit Tests for Set RPC](#43-unit-tests-for-set-rpc) + +# List of Tables +[Table 1: Abbreviations](#table-1-abbreviations) + +[Table 2: Mapping Operations](#table-2-mapping-operations) + +[Table 3: Translate Example](#table-3-translate-example) + +# Revision + +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:------------------:|---------------------| +| 0.1 | 05/05/2022 | Gang Lv | Initial version | + +# About this Document +This document provides a detailed description on the strategy to implement the SONiC GNMI Server Interface. + +# Scope +This document describes the high level design of SONiC GNMI Server Interface. + +This document provides minor implementation details about the proposed solutions. + +# Definition/Abbreviation + +### Table 1: Abbreviations +| **Term** | **Meaning** | +| -------- | -------------------------- | +| gRPC | A modern open-source high performance Remote Procedure Call (RPC) framework that can run in any environment | +| gNMI | gRPC Network Management Interface, used to retrieve or manipulate the state of a device via telemetry or configuration data | +| gNOI | gRPC Network Operations Interface | +| JSON | JavaScript Object Notation | +| Yang | Yet Another Next Generation, it is a modular language representing data structures in an XML tree format | +| Generic Config Updater | SONiC configuration generic update and rollback feature | +| ConfigDB | Configuration Database | +| ApplDB | Application Database | + +# 1 Feature Overview + +SONiC should provide a gNMI/gNOI server interface where the client can communicate with SONiC (server) through the interface using their respective gRPC libraries based on ConfigDB/ApplDB/StateDB/CountersDB schema or SONiC Yang schema. + +To understand the requirements, we need to go over current SONiC management components: + +* SONIC CLI commands + +cli + +1. Users could use SONiC CLI command "show runningconfig all" to read current configuration. + - The blue arrow indicates this process. +2. User could use SONiC CLI command "config apply-patch" to incrementally update configurations systematically and validate target configuration using SONiC Yang models. With generic_config_updater, all operations in a 'config apply-patch' command are processed in a single transaction that will either succeed or fail as a whole. + - "config apply-patch" supports ConfigDB, and Yang models. + - The green arrow indicates this process, and dotted arrow indicates Yang validation. +3. SONiC CLI commands can use "config reload" to erase original and fully reload configurations from a file and validate target configuration using SONiC Yang models. + - "config reload" already support input in ConfigDB schema or in yang models schema. + - The yellow arrow indicates this process, and dotted arrow indicates Yang validation. + +And we have the possibility to improve generic_config_updater performance. + +* SONIC Restapi + +restapi + +sonic-restapi is a docker container running in SONiC, which exposes HTTPS endpoints to perform dynamic configuration including config VNET routes. +One challenge of sonic-restapi is to provide a general config schema. Currently its API is designed case by case. + +sonic-restapi will be replaced by gNMI interface in the future. + +* SONiC system telemetry services + +telemetry + +sonic-telemetry provides gNMI/gNOI server interface. And sonic-telemetry provides only telemetry via gRPC, and the gap is configuration. + +We will update sonic-telemetry to support configuration. + +## 1.1 Requirements + +### 1.1.1 Phase 1 Requirements +* Set and get RPCs must be supported. Customer will use get RPC to retrieve configurations including FRR and VNET route, and use set RPC to apply new configurations. +* SetRequest message must support to incrementally update configuration and fully update configurations. +* Data models can be SONiC Yang models or CONFIG_DB schema. +* Ability to read different DBs - ApplDB, ConfigDB, StateDB, CountersDB etc. +* Ability to write different DBs - ApplDB, ConfigDB. +* Configurations must be verified using YANG models even it is in CONFIG_DB schema. +* Need to configure huge VNET route entries to ApplDB, with high speed. +* Configurations for ConfigDB must be persisted after a device restart. +* Need to support multi-ASIC platform. +* Ability to support bulk set-get operations. +* Must follow gnmi-specification. + * All changes to the state of the target that are included in an individual SetRequest message are considered part of a transaction. + * Within an individual transaction (SetRequest) the order of operations is 'delete', 'replace', 'update'. + * If a single path is in multiple operations in one SetRequest (i.e., within 'update' or 'replace'), then the state of the target MUST reflect the application of all the operations in order, even if they overwrite each other. + * The session between the client and server MUST be encrypted using TLS. + * New connections are mutually authenticated. + +### 1.1.2 Phase 2 Requirements +* Support authentication and authorization with TACACS+ server. +* Upgrade operation will be provided with GNOI. + +## 1.2 Design Overview + +gnmi-server + +We will update sonic-telemetry to support configuration in the same container. + +And there will be a config files for disable/enable telemetry/new-gnmi feature. + +### 1.2.1 Basic Approach + +#### 1.2.1.1 Transaction + +* Rollback + +Generic_config_updater provides rollback mechanism, and we can use it to implement transaction for CONIFG_DB. + +Currently we do not support rollback for ApplDB, therefore VNET route will be an exception for rollback. Client could make decision based on SetResponse and use more SetRequest(s) to achieve rollback behavior. + +* Set + +Since a single SetRequest will be treated as a transaction, gNMI server does not support parallel write operations. We will put the SetRequests in a queue and serve them with a single worker. + +set + +* Get + +Every set RPC will create a checkpoint of running configuration before any modification and remove this checkpoint after all the modifications. + +Get RPC during write period should use checkpoint, and normally Get RPC will directly fetch ConfigDB. + +get + +#### 1.2.1.2 Yang Validation + +For ConfigDB, and input is SONiC Yang models schema, sonic-config-engine and generic_config_updater will run Yang validation. + +For ConfigDB, and input is ConfigDB schema, generic_config_updater will run Yang validation. And sonic-config-engine does not run Yang validation today if input is in config_db schema, and it will run Yang validation in future release. + +For ApplDB, we will create Yang models based on requirement. Today we only need to config VNET routes in ApplDB. We will leverage Yang validation or implement specialized validation logic for optimal performance. + +#### 1.2.1.3 Data Schema + +The ultimate goal is to use SONiC Yang models for configuration, and we also need to support ConfigDB schema and ApplDB schema: + +* We will follow OpenConfig specification to use origin field to support mixed schema. + +* And we use the first element to specify the target database. + +A single request cannot have both SONiC YANG paths and ConfigDB/ApplDB schema paths. + +message-example + +1. Stage 1: SONiC DB Schema + +At stage 1, we will only support SONiC DB schema. + +- If origin is ‘sonic_db’ or NULL, and target is ‘CONFIG_DB’, SetRequest and GetRequest will use CONFIG_DB schema, and sonic_config_engine or generic_config_engine will be invoked. +- If origin is ‘sonic_db’ or NULL, and target is ‘APPL_DB’, and table name is "VNET_ROUTE_TABLE", SetRequest and GetRequest will be used to access VNET route entry, and special_config_updater will be invoked. + +2. Stage 2: SONiC Yang Schema + +At stage 2, we will support SONiC Yang schema. + +* If origin is ‘sonic_yang’ and target is ‘APPL_DB’, request will use SONiC Yang models schema, and special_config_updater will be invoked. +* If origin is ‘sonic_yang’ and target is 'CONFIG_DB' or NULL, request will use SONiC Yang models schema, and sonic_config_engine or generic_config_engine will be invoked. + +set-flow + +get-flow + +Assume running-config to be: + + { + "DEVICE_NEIGHBOR": { + "Ethernet8": { + "name": "Servers1", + "port": "eth0" + }, + "Ethernet96": { + "name": "Servers23", + "port": "eth0" + }, + }, + } + +And then perform the actions below: +* replace port under Ethernet8 with eth1 +* remove Ethernet96 + +The steps would be: +1. Get the running configuration + +With CONFIG_DB schema: + + ++++++++ Sending get request: ++++++++ + path { + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} + } + encoding: JSON_IETF + ++++++++ Recevied get response: ++++++++ + notification { + update { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet8"} + } + val { + json_ietf_val: "{\"name\": \"Servers1\",\"port\": \"eth0\"}" + } + } + update { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet96"} + } + val { + json_ietf_val: "{\"name\": \"Servers23\",\"port\": \"eth0\"}" + } + } + } + +With CONFIG_YANG schema: + + ++++++++ Sending get request: ++++++++ + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} + } + encoding: JSON_IETF + ++++++++ Recevied get response: ++++++++ + notification { + update { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet8"}} + } + val { + json_ietf_val: "{\"name\": \"Servers1\",\"port\": \"eth0\"}" + } + } + update { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet96"}} + } + val { + json_ietf_val: "{\"name\": \"Servers23\",\"port\": \"eth0\"}" + } + } + } + +2. Apply the new configuration + +With CONFIG_DB schema: + + ++++++++ Sending set request: ++++++++ + replace { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet96"} + } + } + replace { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet8"} elem {name: "port"} + } + val { + json_ietf_val: "eth1" + } + } + ++++++++ Recevied set response: ++++++++ + response { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet96"} + } + op: REPLACE + } + response { + path { + origin: "sonic_db" + elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet8"} elem {name: "port"} + } + op: REPLACE + } + +With CONFIG_YANG schema: + + ++++++++ Sending set request: ++++++++ + replace { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet96"}} + } + } + replace { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet8"}} elem {name: "port"} + } + val { + json_ietf_val: "eth1" + } + } + ++++++++ Recevied set response: ++++++++ + response { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet96"}} + } + op: REPLACE + } + response { + path { + origin: "sonic_yang" + elem {name: "CONFIG_DB"} elem {name: "sonic-device_neighbor:sonic-device_neighbor"} elem {name: "sonic-device_neighbor:DEVICE_NEIGHBOR"} elem {name: "DEVICE_NEIGHBOR_LIST" key {key: "name" value: "Ethernet8"}} elem {name: "port"} + } + op: REPLACE + } + +#### 1.2.1.4 Incremental Configurations + +For incremental configurations, SetRequest can use all kinds of operations, for example, 'replace' operations, 'update' operations and 'delete' operations. And generic_config_updater can guarantee the outcome is correct. + +Generic_config_updater is used for incrementally update configurations, and it has two related API: +1. replace, input format is ConfigDB schema. +2. apply-patch, input format is JsonPatch. + +SetRequest syntax is not the same as JsonPatch. For example, 'replace' operation can be used to delete a node and update a node, please refer to gnmi specification. + +We can translate most of the SetRequest operations directly: + +### Table 2: Mapping Operations +| SetRequest Operation | Description | JsonPatch Operation | +| ---- | ---- | ---- | +| Delete | Where a path is contained within the delete field of the SetRequest message, it should be removed from the target's data tree. | Remove | +| Update | If a particular path-value is specified in the client-supplied data, it is replaced with the client-specified value.
If the path specified does not exist, the target MUST create the data tree element and populate it with the data in the Update message. | Add | +| Replace (delete) | If a particular path-value is NOT specified in the client-supplied data and the path does not have a specified default value in the corresponding schema, it should be deleted. | Remove | +| Replace (update) | If a particular path-value is specified in the client-supplied data, it is replaced with the client-specified value.
If the path specified does not exist, the target MUST create the data tree element and populate it with the data in the Update message. | Add | + +Below table provides an example to translate from SetRequest to JsonPatch. + +### Table 3: Translate Example +| SetRequest Format | JsonPatch Format | +| ---- | ---- | +| replace {
 path {
  elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet96"}
 }
}
replace {
 path {
  elem {name: "CONFIG_DB"} elem {name: "DEVICE_NEIGHBOR"} elem {name: "Ethernet8"} elem {name: "port"}
 }
 val { json_ietf_val: "eth1" }
} | [
 {
  "op": "remove", "path": "/DEVICE_NEIGHBOR/Ethernet96"},
  { "op": "add", "path": "/DEVICE_NEIGHBOR/Ethernet8/port", "value": "eth1"}
] | + +#### 1.2.1.5 Full Configurations + +For full configurations, SetRequest will use one 'delete' operation and one 'update' operation with the root node, and sonic-config-engine is used for fully update configurations. + +SetRequest message will be: + + ++++++++ Sending set request: ++++++++ + delete { + path { origin: "sonic_db" } + } + update { + path { origin: "sonic_db" } + val { + json_ietf_val: "{\"DEVICE_NEIGHBOR/Ethernet8/name\":\"Servers1\", \"DEVICE_NEIGHBOR/Ethernet8/port\":\"eth0\", \"DEVICE_NEIGHBOR/Ethernet96/name\":\"Servers23\", \"DEVICE_NEIGHBOR/Ethernet96/port\":\"eth0\", ...}" + } + } + ++++++++ Recevied set response: ++++++++ + response { + path { origin: "sonic_db" } + op: DELETE + } + response { + path { origin: "sonic_db" } + op: UPDATE + } + +#### 1.2.1.6 Configuration Persistence + +All successful changes for ConfigDB made through the gNMI SET RPC will be saved to /etc/sonic/config_db.json. + +If the target database is not ConfigDB, we can't guarantee persisitence. + +#### 1.2.1.7 Heartbeat and Reprogram + +For full system reboot, client has to reprogram ApplDB. If the gnmi container restarts, client doesn't need to reprogram. + +We propose to use Capabilities RPC as heartbeat to detect reboot, and we will expose reset status. + +After reboot, client should check reset status to decide if needs to reprogram. + +heartbeat + +#### 1.2.1.8 Authentication +sonic-telemetry provides three authentication mechanisms, and we will keep the same mechanism: +* Password: Like HTTP Basic auth, you pass the username and password in the gRPC metadata +* JWT: JSON Web Tokens standard. First you authenticate with username/password and then receive a JWT token. After you send the token in the gRPC metadata. +* User Certificate: Use a valid client certificate with the username embedded in the CN field. The certificate is for authentication, the username is for authorization. + +sonic-restapi uses one authentication mechanism: +* In the authentication of client certificate, after the certificate chain is validated by TLS, it will further check if the common name of the end-entity certificate is in the trusted common name list of the server config. + +#### 1.2.1.9 ACL +The new GNMI server interface will use CONFIG_DB schema and SONiC Yang Models for ACL configuration. + +#### 1.2.1.10 Data Protection + +For ApplDB, gNMI clients can write table directly. We need to specify which table can be changed, which one can not. + +We will create new Yang models for ApplDB, if gNMI set request modifies a table without Yang models, this set request should be rejected. And we can also use "config false" tag, please refer to [link](https://datatracker.ietf.org/doc/html/rfc7950#section-4.2.3). + +#### 1.2.1.11 Docker to Host communication +'config apply-patch' and 'config reload' are designed to run on host, and it's difficult to support them in container: +1. These commands will update redis database and restart container, when they restart gnmi, bgp, syncd and swss, the ongoing gnmi operation will be broken. +2. 'config reload' will stop service at first, run some other operations, and then restart service. If we run this command in container, it will be broken at the stop service step. +3. These commands will execute some host scripts and use systemctl to restart service, it will be dangerous to support these operations in container. +The solution is to add host services for 'config apply-patch' and 'config reload' on host, and gNMI server uses dbus method to invoke these services to update configuration + +##### 1.2.1.11.1 Incremental Configurations + +For incremental configuration, 'config apply-patch' should not restart gNMI, bgp, synd and swss. + +incremental + +##### 1.2.1.11.2 Full Configurations + +For full configuration, there’re 2 possible solutions: +* gNMI server needs to send response at first, and then invoke 'config reload'. + +full-gnmi + +* Use gNMI request and gNOI request together to implement full configuration update. + +full-gnmi-gnoi + +The full configuration request will be overwritten by subsequent full configuration request or incremental configuration request. + +overwritten-config + +#### 1.2.1.12 Backward Compatibility + +SONiC telemetry is using prefix target to identify target database, and we will add a new target to support mixed schema. + + enum Target { + option allow_alias = true; + APPL_DB = 0; + ASIC_DB = 1; + COUNTERS_DB = 2; + LOGLEVEL_DB = 3; + CONFIG_DB = 4; + // PFC_WD_DB shares the the same db number with FLEX_COUNTER_DB + PFC_WD_DB = 5; + FLEX_COUNTER_DB = 5; + STATE_DB = 6; + // For none-DB data + OTHERS = 100; + // For mixed schema + MIXED_SCHEMA = 101; + } + + +### 1.2.2 Container + +All the introduced features will be part of the sonic-telemetry package installed in sonic-telemetry container. + +# 2 Error Handling +supervisord will autorestart gnmi service if it exits after it has successfully started up. + +# 3 Serviceability and Debug +All requests logs are stored in syslog. + +# 4 Unit Tests + +## 4.1 Unit Tests for Capabilities RPC + +| Test Case | Description | +| ---- | ---- | +| 1 | Get capability. | + +## 4.2 Unit Tests for Get RPC + +| Test Case | Description | +| ---- | ---- | +| 1 | Get from CONFIG_DB with SONiC DB schema. | +| 2 | Get from APPL_DB with SONiC DB schema. | +| 3 | Get from CONFIG_DB with SONiC Yang schema. | +| 4 | Get from APPL_DB with SONiC Yang schema. | + +## 4.3 Unit Tests for Set RPC + +| Test Case | Description | +| ---- | ---- | +| 1 | Delete operation with SONiC DB schema to remove table in CONFIG_DB. | +| 2 | Delete operation with SONiC DB schema to remove table in APPL_DB. | +| 3 | Update operation with SONiC DB schema to create table in CONFIG_DB. | +| 4 | Update operation with SONiC DB schema to create table in APPL_DB. | +| 5 | Update operation with SONiC DB schema to update table in CONFIG_DB. | +| 6 | Update operation with SONiC DB schema to update table in APPL_DB. | +| 7 | Replace operation with SONiC DB schema to remove table in CONFIG_DB. | +| 8 | Replace operation with SONiC DB schema to remove table in APPL_DB. | +| 9 | Replace operation with SONiC DB schema to create table in CONFIG_DB. | +| 10 | Replace operation with SONiC DB schema to create table in APPL_DB. | +| 11 | Replace operation with SONiC DB schema to update table in CONFIG_DB. | +| 12 | Replace operation with SONiC DB schema to update table in APPL_DB. | +| 13 | Verify invalid path with SONiC DB schema in CONFIG_DB. | +| 14 | Verify invalid path with SONiC DB schema in APPL_DB. | +| 15 | Verify full configuration update with SONIC DB schema. | +| 16 | Delete operation with SONiC Yang schema to remove table in CONFIG_DB. | +| 17 | Delete operation with SONiC Yang schema to remove table in APPL_DB. | +| 18 | Update operation with SONiC Yang schema to create table in CONFIG_DB. | +| 19 | Update operation with SONiC Yang schema to create table in APPL_DB. | +| 20 | Update operation with SONiC Yang schema to update table in CONFIG_DB. | +| 21 | Update operation with SONiC Yang schema to update table in APPL_DB. | +| 22 | Replace operation with SONiC Yang schema to remove table in CONFIG_DB. | +| 23 | Replace operation with SONiC Yang schema to remove table in APPL_DB. | +| 24 | Replace operation with SONiC Yang schema to create table in CONFIG_DB. | +| 25 | Replace operation with SONiC Yang schema to create table in APPL_DB. | +| 26 | Replace operation with SONiC Yang schema to update table in CONFIG_DB. | +| 27 | Replace operation with SONiC Yang schema to update table in APPL_DB. | +| 28 | Verify invalid path with SONiC Yang schema in CONFIG_DB. | +| 29 | Verify invalid path with SONiC Yang schema in APPL_DB. | +| 30 | Verify full configuration update with SONIC Yang schema. | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/mgmt/gnmi/images/cli.svg b/doc/mgmt/gnmi/images/cli.svg new file mode 100644 index 0000000000..e017036ef4 --- /dev/null +++ b/doc/mgmt/gnmi/images/cli.svg @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + Process + + + + + + + + + + + + + + + + + + + Sheet.31 + SONiC utilities + + + + SONiC utilities + + Process.35 + User + + + + + + + + + + + + + + + + + + + User + + Process.32 + show + + + + + + + + + + + + + + + + + + + show + + Process.34 + generic_config_updater + + + + + + + + + + + + + + + + + + + generic_config_updater + + 1-D single + + + + + + + Dynamic connector + + + + Sheet.73 + show runningconfig all + + + + show runningconfig all + + Sheet.74 + config apply-patch + + + + config apply-patch + + Document + Sonic Yang models + + + + + + + + + + + + + + + + + + + Sonic Yang models + + Sheet.86 + + Side brace + + + + + + + + + + + + + + + + Sheet.85 + + Sheet.78 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector.77 + + + + + Sheet.79 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector.77 + + + + + Sheet.82 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector.77 + + + + + + + Dynamic connector.87 + + + + Dynamic connector.89 + + + + Process.90 + config + + + + + + + + + + + + + + + + + + + config + + 1-D single.91 + + + + + + + Sheet.92 + config reload + + + + config reload + + Dynamic connector.93 + + + + Dynamic connector.94 + + + + 1-D single.95 + + + + + + + diff --git a/doc/mgmt/gnmi/images/data_flow.svg b/doc/mgmt/gnmi/images/data_flow.svg new file mode 100644 index 0000000000..bb2d59b9cc --- /dev/null +++ b/doc/mgmt/gnmi/images/data_flow.svg @@ -0,0 +1,1442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CFF Container + + Sheet.21 + + + + + + + + + + + + + + Sheet.22 + SetRequest Flow chart + + + + + + + + + + + + + + + + + + + + + + SetRequest Flow chart + + + Swimlane List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Swimlane (vertical) + + Sheet.18 + + + + + + + + + + + + + + Sheet.19 + gNMI server + + + + + + + + + + + + + + + + + + + + + + gNMI server + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Swimlane (vertical).28 + + Sheet.29 + + + + + + + + + + + + + + Sheet.30 + Sonic_config_engine + + + + + + + + + + + + + + + + + + + + + + Sonic_config_engine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Swimlane (vertical).31 + + Sheet.32 + + + + + + + + + + + + + + Sheet.33 + Generic_config_updater + + + + + + + + + + + + + + + + + + + + + + Generic_config_updater + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Swimlane (vertical).34 + + Sheet.35 + + + + + + + + + + + + + + Sheet.36 + Special_config_updater + + + + + + + + + + + + + + + + + + + + + + Special_config_updater + + + Phase List + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Separator (vertical) + + Sheet.26 + + + + + + + + Sheet.27 + + + + + + + + + + + + + + + + + + + + Start/End + Start + + + + + + + + + + + + + + + + + + + + + + + + Start + + Dynamic connector + + + + + + + Process.234 + Iterate request paths + + + + + + + + + + + + + + + + + + + + + + + + Iterate request paths + + Dynamic connector.235 + + + + + + + Decision.236 + Different origin? + + + + + + + + + + + + + + + + + + + + + + + + Different origin? + + Dynamic connector.237 + No + + + + + + + + No + + Start/End.254 + Invalid request + + + + + + + + + + + + + + + + + + + + + + + + Invalid request + + Dynamic connector.255 + Yes + + + + + + + + Yes + + Decision.256 + Origin is sonic_db + + + + + + + + + + + + + + + + + + + + + + + + Origin is sonic_db + + Dynamic connector.257 + No + + + + + + + + No + + Process.258 + Run Yang validation and write to ConfigDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to ConfigDB + + Dynamic connector.259 + Yes + + + + + + + + Yes + + Decision.260 + Incremental configurations? + + + + + + + + + + + + + + + + + + + + + + + + Incremental configurations? + + Dynamic connector.261 + Yes + + + + + + + + Yes + + Process.262 + Run Yang validation and write to ConfigDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to ConfigDB + + Dynamic connector.263 + No + + + + + + + + No + + Process.266 + Run Yang validation and write to APPlDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to APPlDB + + Dynamic connector.267 + No + + + + + + + + No + + Decision.268 + Origin is sonic_yang + + + + + + + + + + + + + + + + + + + + + + + + Origin is sonic_yang + + Dynamic connector.269 + No + + + + + + + + No + + Decision.270 + target is CONFIG_DB? + + + + + + + + + + + + + + + + + + + + + + + + target is CONFIG_DB? + + Dynamic connector.271 + Yes + + + + + + + + Yes + + Decision.272 + Incremental configurations? + + + + + + + + + + + + + + + + + + + + + + + + Incremental configurations? + + Dynamic connector.273 + Yes + + + + + + + + Yes + + Process.274 + Run Yang validation and write to ConfigDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to ConfigDB + + Dynamic connector.275 + Yes + + + + + + + + Yes + + Process.276 + Run Yang validation and write to ConfigDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to ConfigDB + + Dynamic connector.277 + No + + + + + + + + No + + Dynamic connector.279 + No + + + + + + + + No + + Process.280 + Run Yang validation and write to APPlDB + + + + + + + + + + + + + + + + + + + + + + + + Run Yang validation and write to APPlDB + + Decision.1000 + target is CONFIG_DB + + + + + + + + + + + + + + + + + + + + + + + + target is CONFIG_DB + + Dynamic connector.1001 + Yes + + + + + + + + Yes + + Start/End.1002 + Invalid request + + + + + + + + + + + + + + + + + + + + + + + + Invalid request + + diff --git a/doc/mgmt/gnmi/images/data_flow_get.svg b/doc/mgmt/gnmi/images/data_flow_get.svg new file mode 100644 index 0000000000..26fcf7a86b --- /dev/null +++ b/doc/mgmt/gnmi/images/data_flow_get.svg @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + Start/End + Start + + + + + + + + + + + + + + + + + + + + + + + Start + + Dynamic connector + + + + + + + Process.234 + Iterate request paths + + + + + + + + + + + + + + + + + + + + + + + Iterate request paths + + Dynamic connector.235 + + + + + + + Decision.236 + Different origin? + + + + + + + + + + + + + + + + + + + + + + + Different origin? + + Dynamic connector.237 + No + + + + + + + + No + + Start/End.254 + Invalid request + + + + + + + + + + + + + + + + + + + + + + + Invalid request + + Dynamic connector.255 + Yes + + + + + + + + Yes + + Decision.256 + Origin is sonic_db + + + + + + + + + + + + + + + + + + + + + + + Origin is sonic_db + + Dynamic connector.257 + No + + + + + + + + No + + Decision.268 + Origin is sonic_yang + + + + + + + + + + + + + + + + + + + + + + + Origin is sonic_yang + + Dynamic connector.269 + No + + + + + + + + No + + Decision.270 + target is CONFIG_DB? + + + + + + + + + + + + + + + + + + + + + + + target is CONFIG_DB? + + Dynamic connector.271 + Yes + + + + + + + + Yes + + Dynamic connector.273 + Yes + + + + + + + + Yes + + Dynamic connector.279 + No + + + + + + + + No + + Start/End.288 + Invalid request + + + + + + + + + + + + + + + + + + + + + + + Invalid request + + Process.44 + Read from ConfigDB + + + + + + + + + + + + + + + + + + + + + + + Read from ConfigDB + + Dynamic connector.45 + Yes + + + + + + + + Yes + + Process.46 + Read from ApplDB + + + + + + + + + + + + + + + + + + + + + + + Read from ApplDB + + Dynamic connector.47 + No + + + + + + + + No + + Process.48 + Read from ConfigDB and translate to Yang models + + + + + + + + + + + + + + + + + + + + + + + Read from ConfigDB and translate to Yang models + + Process.49 + Read from ApplDB and translate to Yang models + + + + + + + + + + + + + + + + + + + + + + + Read from ApplDB and translate to Yang models + + Decision.1000 + target is CONFIG_DB? + + + + + + + + + + + + + + + + + + + + + + + target is CONFIG_DB? + + Dynamic connector.1001 + Yes + + + + + + + + Yes + + diff --git a/doc/mgmt/gnmi/images/full_rpc.svg b/doc/mgmt/gnmi/images/full_rpc.svg new file mode 100644 index 0000000000..db99731921 --- /dev/null +++ b/doc/mgmt/gnmi/images/full_rpc.svg @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Activation + + + + + + + Message + SetRequest + + + + + + + + + + + SetRequest + + Return Message + SetResponse + + + + + + + + + + + SetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + Host service + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + Host service + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + Activation.45 + + + + + + + Message.46 + + + + + + + + + + Sheet.49 + Config reload + + + + Config reload + + Self Message.50 + + + + + + + + + + Sheet.51 + Config load or run yang validation + + + + Config load or run yang validation + + Self Message.52 + + + + + + + + + + Activation.55 + + + + + + + Self Message.56 + + + + + + + + + + Sheet.57 + Config reload + + + + Config reload + + Sheet.53 + + Sheet.54 + + + + + diff --git a/doc/mgmt/gnmi/images/full_rpc_gnoi.svg b/doc/mgmt/gnmi/images/full_rpc_gnoi.svg new file mode 100644 index 0000000000..568efa538a --- /dev/null +++ b/doc/mgmt/gnmi/images/full_rpc_gnoi.svg @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI/GNOI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI/GNOI client + + + + + + + + Object lifeline.6 + GNMI/GNOI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI/GNOI server + + + Activation + + + + + + + Message + GNMI SetRequest + + + + + + + + + + + GNMI SetRequest + + Return Message + GNMI SetResponse + + + + + + + + + + + GNMI SetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + Host service + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + Host service + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + Activation.45 + + + + + + + Message.46 + + + + + + + + + + Sheet.49 + Config reload with previous configuration + + + + Config reload with previous configuration + + Self Message.50 + + + + + + + + + + Sheet.51 + Run yang validation and store the configuration + + + + Run yang validation and store the configuration + + Self Message.52 + + + + + + + + + + Message.53 + GNOI RebootRequest + + + + + + + + + + + GNOI RebootRequest + + Return Message.54 + GNOI RebootResponse + + + + + + + + + + + GNOI RebootResponse + + Message.55 + GNOI RebootStatusRequest + + + + + + + + + + + GNOI RebootStatusRequest + + Return Message.56 + GNOI RebootStatusResponse + + + + + + + + + + + GNOI RebootStatusResponse + + Activation.57 + + + + + + + diff --git a/doc/mgmt/gnmi/images/get_lock.svg b/doc/mgmt/gnmi/images/get_lock.svg new file mode 100644 index 0000000000..1bf062a598 --- /dev/null +++ b/doc/mgmt/gnmi/images/get_lock.svg @@ -0,0 +1,808 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI write thread + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI write thread + + + Activation + + + + + + + Message + SetRequest + + + + + + + + + + + SetRequest + + Return Message + SetResponse + + + + + + + + + + + SetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + GNMI read thread + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + GNMI read thread + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + + + + + + Object lifeline.51 + checkpoint + + Sheet.52 + + + + Sheet.53 + + + + Sheet.54 + + + Sheet.55 + + + + + + + checkpoint + + + + + + + + Object lifeline.76 + Database + + Sheet.77 + + + + Sheet.78 + + + + Sheet.79 + + + Sheet.80 + + + + + + + Database + + + + + + + + + Database + + Sheet.98 + + Sheet.99 + + + + Sheet.100 + + + + Sheet.101 + + + + Sheet.102 + + + + + + Message.162 + Write Database + + + + + + + + + + + Write Database + + Activation.165 + + + + + + + Return Message.166 + + + + + + + + + + + + + + + + Document + + Sheet.174 + + + + Sheet.175 + + + + Sheet.176 + + + + Sheet.177 + + + + Sheet.178 + + + + Sheet.179 + + + + + Message.180 + Remove checkpoint + + + + + + + + + + + Remove checkpoint + + Activation.183 + + + + + + + Activation.185 + + + + + + + Message.186 + GetRequest + + + + + + + + + + + GetRequest + + Activation.187 + + + + + + + Message.188 + Read from database + + + + + + + + + + + Read from database + + Return Message.189 + + + + + + + + + + Return Message.190 + + + + + + + + + + Activation.191 + + + + + + + Message.192 + SetRequest + + + + + + + + + + + SetRequest + + Activation.193 + + + + + + + Message.194 + Write Database + + + + + + + + + + + Write Database + + Return Message.195 + + + + + + + + + + Activation.201 + + + + + + + Message.202 + + + + + + + + + + Sheet.203 + GetRequest + + + + GetRequest + + Sheet.204 + GetResponse + + + + GetResponse + + Activation.206 + + + + + + + Message.207 + Read from checkpoint + + + + + + + + + + + Read from checkpoint + + Return Message.208 + + + + + + + + + + Return Message.209 + GetResponse + + + + + + + + + + + GetResponse + + Return Message.210 + SetResponse + + + + + + + + + + + SetResponse + + Message.211 + Create checkpoint + + + + + + + + + + + Create checkpoint + + Activation.212 + + + + + + + Message.213 + Create checkpoint + + + + + + + + + + + Create checkpoint + + Activation.214 + + + + + + + Message.215 + Remove checkpoint + + + + + + + + + + + Remove checkpoint + + Activation.216 + + + + + + + diff --git a/doc/mgmt/gnmi/images/gnmi.svg b/doc/mgmt/gnmi/images/gnmi.svg new file mode 100644 index 0000000000..9a2f5aab90 --- /dev/null +++ b/doc/mgmt/gnmi/images/gnmi.svg @@ -0,0 +1,1089 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + Process + + + + + + + + + + + + + + + + + + + Sheet.31 + SONiC Gnmi Server + + + + SONiC Gnmi Server + + Process.35 + GNMI client + + + + + + + + + + + + + + + + + + + GNMI client + + Process.34 + generic_config_updater + + + + + + + + + + + + + + + + + + + generic_config_updater + + Side brace + + + + + + + + + + + + + + + + Sheet.73 + Get + + + + Get + + Process.75 + GNMI server + + + + + + + + + + + + + + + + + + + GNMI server + + Document + SONiC Yang Models + + + + + + + + + + + + + + + + + + + SONiC Yang Models + + 1-D single.81 + + + + + + + Sheet.82 + Set + + + + Set + + Sheet.84 + + + + Process.91 + Sonic-config-engine + + + + + + + + + + + + + + + + + + + Sonic-config-engine + + Dynamic connector.92 + + + + Dynamic connector.97 + + + + Sheet.100 + + Datastore + ApplDB + + + + + + + + + + + + + + + + + + + + + + ApplDB + + Dynamic connector.41 + + + + + Sheet.101 + + Datastore + StateDB + + + + + + + + + + + + + + + + + + + + + + StateDB + + Dynamic connector.41 + + + + + Sheet.104 + + Datastore + CountersDB + + + + + + + + + + + + + + + + + + + + + + CountersDB + + Dynamic connector.41 + + + + + Sheet.110 + + Datastore + ConfigDB + + + + + + + + + + + + + + + + + + + + + + ConfigDB + + Dynamic connector.41 + + + + + Sheet.114 + + Datastore + ... + + + + + + + + + + + + + + + + + + + + + + ... + + Dynamic connector.41 + + + + + Cloud.34 + + + + + + + Process.139 + special_config_updater + + + + + + + + + + + + + + + + + + + special_config_updater + + 1-D single.140 + + + + + + + Dynamic connector + + + + Decision.1000 + Target Database? + + + + + + + + + + + + + + + + + + + Target Database? + + Dynamic connector.1001 + ApplDB + + + + + ApplDB + + Decision.1002 + Incremental or full config? + + + + + + + + + + + + + + + + + + + Incremental or full config? + + Dynamic connector.1003 + + + + Sheet.1004 + ConfigDB + + + + ConfigDB + + Dynamic connector.1005 + + + + Dynamic connector.1006 + + + + Sheet.1007 + Incremental + + + + Incremental + + Sheet.1008 + Full + + + + Full + + Process.1009 + System Telemetry Data collectors + + + + + + + + + + + + + + + + + + + System Telemetry Data collectors + + 1-D single.1010 + + + + + + + Sheet.1011 + Get + + + + Get + + 1-D single.1012 + + + + + + + Sheet.1013 + Subscribe + + + + Subscribe + + Process.1014 + GNMI diaout client + + + + + + + + + + + + + + + + + + + GNMI diaout client + + 1-D single.1015 + + + + + + + Sheet.1016 + Publish + + + + Publish + + Dynamic connector.1017 + + + + Cloud.1018 + + + + + + + Decision.1019 + Target is DB? + + + + + + + + + + + + + + + + + + + Target is DB? + + Process.1020 + DB client + + + + + + + + + + + + + + + + + + + DB client + + Process.1021 + Non-DB client + + + + + + + + + + + + + + + + + + + Non-DB client + + Dynamic connector.1022 + Yes + + + + + Yes + + Dynamic connector.1023 + No + + + + + No + + Dynamic connector.1024 + + + + Dynamic connector.1025 + + + + Dynamic connector.1026 + + + + Document.1027 + Platform data + + + + + + + + + + + + + + + + + + + Platform data + + Document.1028 + Proc data + + + + + + + + + + + + + + + + + + + Proc data + + Document.1029 + ASIC data + + + + + + + + + + + + + + + + + + + ASIC data + + Dynamic connector.1030 + + + + Dynamic connector.1031 + + + + Dynamic connector.1032 + + + + diff --git a/doc/mgmt/gnmi/images/heartbeat.svg b/doc/mgmt/gnmi/images/heartbeat.svg new file mode 100644 index 0000000000..aee2106107 --- /dev/null +++ b/doc/mgmt/gnmi/images/heartbeat.svg @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Activation + + + + + + + Message + SetRequest + + + + + + + + + + + SetRequest + + Return Message + SetResponse + + + + + + + + + + + SetResponse + + Self Message + + + + + + + + + + Sheet.15 + Full system reload or gnmi container reload + + + + Full system reload or gnmi container reload + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + Sheet.36 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Activation.31 + + + + + + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + + Sheet.41 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Activation.31 + + + + + + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + + Sheet.45 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Activation.31 + + + + + + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + + Activation.31 + + + + + + + Sheet.62 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + Sheet.60 + + Sheet.61 + + + + + + Sheet.63 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + Sheet.66 + + Sheet.67 + + + + + + Sheet.68 + + Message.30 + CapabilitiesRequest + + + + + + + + + + + CapabilitiesRequest + + Return Message.32 + CapabilitiesResponse + + + + + + + + + + + CapabilitiesResponse + + Sheet.71 + + Sheet.72 + + + + + + Activation.73 + + + + + + + Activation.74 + + + + + + + Message.75 + GetRequest + + + + + + + + + + + GetRequest + + Return Message.76 + GetResponse + + + + + + + + + + + GetResponse + + Self Message.77 + + + + + + + + + + Sheet.78 + Compare ApplDB Configuration + + + + Compare ApplDB Configuration + + diff --git a/doc/mgmt/gnmi/images/incremental_rpc.svg b/doc/mgmt/gnmi/images/incremental_rpc.svg new file mode 100644 index 0000000000..0de42da0fd --- /dev/null +++ b/doc/mgmt/gnmi/images/incremental_rpc.svg @@ -0,0 +1,397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI server + + + Activation + + + + + + + Message + SetRequest + + + + + + + + + + + SetRequest + + Return Message + SetResponse + + + + + + + + + + + SetResponse + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.30 + Host service + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + Sheet.34 + + + + + + + Host service + + + + + + + + + Script.35 + + Sheet.36 + + + + Sheet.37 + + + + Sheet.38 + + + + Sheet.39 + + + + Sheet.40 + + + + Sheet.41 + + + + Sheet.42 + + + + Sheet.43 + + + + Sheet.44 + + + + + Activation.45 + + + + + + + Message.46 + + + + + + + + + + Return Message.47 + + + + + + + + + + Sheet.49 + Config apply-patch + + + + Config apply-patch + + Self Message.50 + + + + + + + + + + diff --git a/doc/mgmt/gnmi/images/message_example.svg b/doc/mgmt/gnmi/images/message_example.svg new file mode 100644 index 0000000000..36ad96e9c8 --- /dev/null +++ b/doc/mgmt/gnmi/images/message_example.svg @@ -0,0 +1,1686 @@ + + + + + + + + + + + + + + Page-1 + + + + Sheet.1 + + + + + + + + + + + + + + + + + + + + + + + + + SetRequest Message + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete { + + + + + + + + + + + + + + + + + + path { + + + + + + + + + + + + + + + + + + origin: " + + + + + + sonic_db + + + + + + " + + + + + + + + + + + + + + + + + + elem {name: “ + + + + + + CONFIG_DB + + + + + + ”} + + + + + + elem {name: + + + + + + + + + + + + DEVICE_NEIGHBOR + + + + + + + + + + + + } elem {name: + + + + + + + + + + + + Ethernet95 + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + replace { + + + + + + + + + + + + + + + + + + path { + + + + + + + + + + + + + + + + + + origin: " + + + + + + sonic + + + + + + _db" + + + + + + + + + + + + + + + + + + elem {name: “ + + + + + + CONFIG_DB + + + + + + ”} + + + + + + elem {name: + + + + + + + + + + + + DEVICE_NEIGHBOR + + + + + + + + + + + + } + + + + + + elem {name: + + + + + + + + + + + + Ethernet96 + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + } + + + + + + + + + + + + replace { + + + + + + + + + + + + + + + + + + path { + + + + + + + + + + + + + + + + + + origin: + + + + + + “sonic + + + + + + _db" + + + + + + + + + + + + + + + + + + elem {name: “ + + + + + + CONFIG_DB + + + + + + ”} + + + + + + elem {name: + + + + + + + + + + + + DEVICE_NEIGHBOR + + + + + + + + + + + + } + + + + + + elem {name: + + + + + + + + + + + + Ethernet8 + + + + + + + + + + + + } elem {name: + + + + + + + + + + + + port + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + val { + + + + + + + + + + + + + + + + + + json_ietf_val: + + + + + + “e + + + + + + th1 + + + + + + + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update + + + + + + + + + + + + { + + + + + + + + + + + + + + + + + + path { + + + + + + + + + + + + + + + + + + origin: " + + + + + + sonic_db + + + + + + " + + + + + + + + + + + + + + + + + + elem {name: “ + + + + + + CONFIG_DB + + + + + + ”} + + + + + + elem {name: + + + + + + + + + + + + DEVICE_NEIGHBOR + + + + + + + + + + + + } + + + + + + + + + + + + elem {name: + + + + + + + + + + + + Ethernet + + + + + + 9 + + + + + + + + + + + + } elem {name: + + + + + + + + + + + + port + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + val { + + + + + + + + + + + + + + + + + + json_ietf_val: + + + + + + + + + + + + eth + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + } + + + + + + + + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/mgmt/gnmi/images/mixed requests.svg b/doc/mgmt/gnmi/images/mixed requests.svg new file mode 100644 index 0000000000..75336ca8f0 --- /dev/null +++ b/doc/mgmt/gnmi/images/mixed requests.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + Process.1000 + GNMI Set Request Full Configuration + + + + + + + + + + + + + + + + + + + GNMI Set RequestFull Configuration + + Process.1001 + GNMI Set Request Full Configuration/ Incremental Configuration + + + + + + + + + + + + + + + + + + + GNMI Set RequestFull Configuration/Incremental Configuration + + Process.1002 + GNOI Reboot Request + + + + + + + + + + + + + + + + + + + GNOI Reboot Request + + Dynamic connector.1003 + + + + Dynamic connector.1004 + + + + Sheet.1005 + + Sheet.1006 + + + + + diff --git a/doc/mgmt/gnmi/images/restapi.svg b/doc/mgmt/gnmi/images/restapi.svg new file mode 100644 index 0000000000..ed8cecd1a0 --- /dev/null +++ b/doc/mgmt/gnmi/images/restapi.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + Process + + + + + + + + + + + + + + + + + + + Sheet.31 + SONiC restapi + + + + SONiC restapi + + Process.35 + Http client + + + + + + + + + + + + + + + + + + + Http client + + Process.34 + Http server + + + + + + + + + + + + + + + + + + + Http server + + Side brace + + + + + + + + + + + + + + + + Sheet.48 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector + + + + + Sheet.49 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector + + + + + Sheet.59 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector + + + + + Sheet.62 + + Datastore + SONiC Redis DB + + + + + + + + + + + + + + + + + + + + + + SONiC Redis DB + + Dynamic connector + + + + + 1-D double.22 + + + + + + + Dynamic connector.72 + + + + Sheet.74 + post patch get delete + + + + postpatchgetdelete + + diff --git a/doc/mgmt/gnmi/images/set_lock.svg b/doc/mgmt/gnmi/images/set_lock.svg new file mode 100644 index 0000000000..862d507d4a --- /dev/null +++ b/doc/mgmt/gnmi/images/set_lock.svg @@ -0,0 +1,744 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + + + + + + Object lifeline + GNMI client + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + Sheet.5 + + + + + + + GNMI client + + + + + + + + Object lifeline.6 + GNMI Server + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + Sheet.10 + + + + + + + GNMI Server + + + Activation + + + + + + + Message + SetRequest 1 + + + + + + + + + + + SetRequest 1 + + + + + + + + User + + Sheet.17 + + Sheet.18 + + + + Sheet.19 + + + + + + + + + + + + Script + + Sheet.21 + + + + Sheet.22 + + + + Sheet.23 + + + + Sheet.24 + + + + Sheet.25 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + + + + + + + Object lifeline.76 + Database + + Sheet.77 + + + + Sheet.78 + + + + Sheet.79 + + + Sheet.80 + + + + + + + Database + + + + + + + + + Database + + Sheet.98 + + Sheet.99 + + + + Sheet.100 + + + + Sheet.101 + + + + Sheet.102 + + + + + + + + + + + Object lifeline.169 + GNMI Write Thread + + Sheet.170 + + + + Sheet.171 + + + + Sheet.172 + + + Sheet.173 + + + + + + + GNMI Write Thread + + + + + + + + + Script.174 + + Sheet.175 + + + + Sheet.176 + + + + Sheet.177 + + + + Sheet.178 + + + + Sheet.179 + + + + Sheet.180 + + + + Sheet.181 + + + + Sheet.182 + + + + Sheet.183 + + + + + Message.184 + Enqueue + + + + + + + + + + + Enqueue + + Activation.195 + + + + + + + Message.196 + SetRequest 2 + + + + + + + + + + + SetRequest 2 + + Message.197 + Enqueue + + + + + + + + + + + Enqueue + + Activation.198 + + + + + + + Message.199 + SetRequest 3 + + + + + + + + + + + SetRequest 3 + + Message.200 + Enqueue + + + + + + + + + + + Enqueue + + Activation.147 + + + + + + + Message.192 + Write database + + + + + + + + + + + Write database + + Return Message.202 + SetResponse 1 + + + + + + + + + + + SetResponse 1 + + + + + + + Object lifeline.225 + GNMI Write Qeue + + Sheet.226 + + + + Sheet.227 + + + + Sheet.228 + + + Sheet.229 + + + + + + + GNMI Write Qeue + + + + + + + + + Script.230 + + Sheet.231 + + + + Sheet.232 + + + + Sheet.233 + + + + Sheet.234 + + + + Sheet.235 + + + + Sheet.236 + + + + Sheet.237 + + + + Sheet.238 + + + + Sheet.239 + + + + + Message.240 + Deque + + + + + + + + + + + Deque + + Return Message.241 + + + + + + + + + + Activation.242 + + + + + + + Message.243 + Deque + + + + + + + + + + + Deque + + Return Message.244 + + + + + + + + + + Message.245 + Write database + + + + + + + + + + + Write database + + Return Message.246 + SetResponse 2 + + + + + + + + + + + SetResponse 2 + + Activation.247 + + + + + + + Message.248 + Deque + + + + + + + + + + + Deque + + Return Message.249 + + + + + + + + + + Message.250 + Write database + + + + + + + + + + + Write database + + Return Message.251 + SetResponse 3 + + + + + + + + + + + SetResponse 3 + + diff --git a/doc/mgmt/gnmi/images/telemetry.png b/doc/mgmt/gnmi/images/telemetry.png new file mode 100644 index 0000000000000000000000000000000000000000..8148cf72e9ffaad2b96e7a7f45ad7e4caa64df9e GIT binary patch literal 101081 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≤a?r$ zikwYMm~>d>wth26akt|zpX60<3H!i@?mN@({@J2c? zc;z37NeZFg{YPGI`#lJfmjaWi9$`PY;I-LuT0-1!GMff>gCo`CCAZwR@rww;5wP)* zSl?J&f1mJ8O4!&xlmL8#+W8b%Zkd%Z{_2mZ)W-3PyKtyAI_6dhMr?}8jO4#O;`SAU z>I$P>sTsT4 zW9DECL?&Do>XjuTEzXr0ykc#fu|+tkVK5Kt2{~N(9-#9yhUh?8kjbwu6}|eSz!FyJ zBZF@z3>w^eR82$Vz8pv7k(>PnfS&C_RI++TTzZ z+mOfsa|=6pbFV!x(4TcQ?zI!%%b!#EKK+GLzbEMtH6O>_J8l9WLBNL8;J{9o&2m<| z4(vEAqi2^7RWb*QZqq4;yT{V20j|uRZ=$gFE>5{M5`|nHcx`7V__))@=w5o}+`;@V z0fyQfGR<1>>};F8V8{~^wTKQfxZ7T08Tob%_Cu`MIKRhk{=C?J#cDS@*n$2C$eq

Muv0V5b;V9d0n&XfLt&| z8V+*;rhmSxOop4R-tWq+?||(0rbkBDZ^zl7oG$mSvBWvgRV-LtSP& zmDU7qG7`>?Wpx)|)d3d80*&p5^P~T9mT@x#%*@~)>dfBsP<*Fd6{yb=-6YuWIU$5Ux&X8%^lKBsitNyKNL9`&eL8dwNwTUN)b@df3LNeiWYr^ z-{o_>`}l~#kLzQtE%|{lMYy`oWc_GrV|`Po3pQ-Lp<;?=eXi1i&B!p{?ulWVVI3^W zF=)8YXIEH&HYOX2Is}v)p6}O_TK5*$wxtB%Sf_4X#mf4|d41U-VWPw(Jo|*0|Ev_1 z`wQUnKVqw~An1XCklpaeKI z(V0wMUfxR$RhtJPE0O5iGMRms@*K;h1pAo|!ul`b=AtZox3}qW@u|h0zMgFtZ_n0% zt#?DbVBiS0Z0VNjp+;o;`ZMT^3A$n{AA5;0qp@Cr<0e^>LiR$(P6Q8@&<2 z|FF}YXmExFNBJ9ZlNW=5`=B)~>>Z^?zO?c;K6v5yoYSUoYtTv){f!?k4s9|gd$6!^ zMU!7Gk(2k1Z}IJ$;@EtMCdWpRpgCnN+Ge_3nj@OXC<&$Osonp=NUEi2=n;}IR}+=R zg`0kNsHLo|D7@U>CTPVU?Rnj5i_~^KRl<7RW3!vBm7%{M2YCVFxgI|-+0vr0G(FVz zJ~eb-D^I+f*G#B*2-Z!$%R8eppq}eVjNlY*yDXMyjo*T8HactjLVIdP`Y3HU zANi9Ct%Dq;YK25%9zAbq1r`h>Ok%*DoflA*c!9MncP}r~nn*>imidF(KdiK4PfGYwsW#zOY zN$$iHfdHu9+{s6|4wyov`EpQ78S7e%fyxq#^A}oGVh)*Bsbf!-0if&o>-=R^Z%&ULULn$W8GeAsI=*RCS9N|5!3mFK<3qMN=SO)$cL!=cJ0i=t@)h!e|dX z+p;GA7Ld0A62@i@nT6crxtP7??k%v_`HWN*Mom9N<+2RXq+IBjad*0&iD>o~k;{yC z#Isy3X1ZOqxG=CPSJ|fn0^9oxbO;(UMDL)o(!@#44t=2}0Y^~G1QtB285BD3?uJoy z!si%QD*NTCQ7S7Y-Afd|E(Gzd>LHzKfAop!-J0Hl=P0s?zVYQR4*>z?EY~^JlMVw% zlyY~NdaHVK#;3R9X06#E)zew#-YM5{q`v0=?Co4YdJuZgY2jn?ML_;_SA zLWM=@l@e$p+wBS!coLQxl^4eFV+Po9!H@|gDw9}eyw|Y&1V^jQQ7(o+BNL0gM33lUK4`Aw7PW{F2^_q_ZS;i80#_9aC47Jxf_-lb4= zcwSkp`=D(s%Qm8PO$s*RkiFR_=E0Wu836Vb?UY~m8I~SJ$gT766xMh31>XK!=z@hBH$JIWrTpI!MIODht6vxcL2fsXsj z^aOuWx||OBhiwn;SlbYoXh|Q!TWLzFwQf*&nLM~oXqkxCoAnmx3L;k^sIDLLYo-To7E&3J0S{c`-6+@mq6OBAV3Xv zYmQ+3K)65$ar4c9$Aw$YymNL{tN&&%e}_WFc0q?M2H9hNhs{xUBtR&m@th*%VN)8{ zXOwueTe*Hejn5^e){1Iw`psd{)cV$5`6$^8;rl0Yn%!;FEipM7J<auH|;;fRTBIJ73WMaAyw7+xXkukZ=4-WrjJd9b|PJf6E^ak8FsSiDpN)wn2 zT;{BiwqcCttO;&*<+7`mqg(ZaJ{W_hIRfHhfo$tVj0FZC*->|wxt6X-uT%Y5IV`+V zd$7sS+g0o9)l>5pL1CEYBUZy!`mmpQgVOXhy9B@LTsx@SYbRL~xX8mzyFs}Hf$y$bMH?tnAM^We9FDYqIhq_UPfsR~P~iw+ zNrN>$k5^E_<9XZgK1Xk5d#~amF<3#;xCLk(ZJgeuuVnBtK3hPHFlZqN$U9QvasFiw zThh8<(`Jh~N=DnbgoN>r%Pxv&y{O=K9)3y0@0JprREb(Nl;tscyJlkFUyvMfRp(C2 z3sE0G?5M zZu(K$Bl0M3RQD#s-Epsk+l}Rj8VeKahe@D}`_$V4qOzMU;-(h1q0A^BD@{>IZ$B_B z&_l`hRZ9tq|FJ2GTexTJhFL1La8MP#7PaxX|7{P0c^%MRm&K&Y9$mx22_7&b9b3 z_E#B&CV+B1810?PYBd4$w0T3Iw%UVCbxH9Z=|p5gxg}lTKtpdPUgE@$P|9K}ra;+) zeC94nh4V`6i{1b|GuMtmYF5sLqB8WO8aQ-tssYOXAcsv6fam2$K23+`Qnva?n7g$K zFk^~jWThS|LZ0N7(NI)#BwP=u)^I^KdgUtbss_Bn*c$U_pCP*=bEoXq|H2jr~Yh z1~}yK)0bK0drES;ES_^&L0BoPv3|O5Y(}zVNyFniGYuNd#ez`tmY{9L3`h%=ny3q(rhkdUbJZV5D8DO?jy(Llm5*1uV~%O^I_>fxcY3v>?A8`05gz)dyTVL8no~vRJ1KTEzxAn>@3;@7j$>THe;2Hu9ph&KD)wPUI>y|{4v*AF zuSq52j;2TJSJ${OH9LBhjSG z@uNiluEdwN+(P7uiV|$P)9&8+L7FzXiS zSv%f=qmb-{d;EbuX(cfmIh(1a&uB`!{&&lYZj&rZJ75T_HN@NJtbEFJ0ez%rJZJN~SZ80>k$V+-`_31; zwO*LfK24TW0%fE%eq?)FQTe?7;xxylNN?udl(R_pC!UPdFQu%SY&JrJ8hxnxIW{wX z7n?DWH0k~^_*+k4$VGuEREN~o^np2D42=`}>5-!C>2e=barb^;^XBeko?~Y~syyH1 z$V=sN{pW5MZ{br;0-6FSKqMT)((GbsreZwJWZNN`gf?RBA!&@ z<-X~8^I_FDN`UQqtq?w7%nrui*dQmPUsYGRvMTKI>6#inOTp?X1i~WJoJ_eQ`eUw0k_*FIm5q^fbq42^dS39F*L(oG{D1o5QpF;WiJt+g-AF%AJc5 zIr4PQa-T{{jmskWCZ!;O=5=?4aCUyW?SJFe90(JA-R>U0)&8?gHGEt_7y|7RIByRx zA50x?nVBeyEu^awe9XAJzvGg$Y&1U@2Jtm>cr~8LNJ?`_Ew|Q51IF@)s6vV<3RetyDFPmOaMjnIp@_Mw*FP?vH`wQVPlmWjE1K_n&rR6R~N&8)Pf0C&_uYLtZTM z_!O~s^K zcmO%^ywH;8{Rg92`JvFSi9pY^BXFgM@%#EdC_K>GTQnF?k&~DFBg4AL=GS$tskK=! zWL8~Mv(q=;^~HL2diC(IY((UM({%^J=?Ij(z;_Q~o4vJP{A{+TeMj<$CcF@(oDMhX z2f!-OyDnN{xtgO0*#~d#xj)}xoFU7-{JzscfLy)!nq;c%x(K$A9g2+&o?rWQEcExN3 z;PMNoCKKBBm9bAhk*)=>^*a(iEw!e#y6%UmTbl01yj%Z~)Az}laPA9($cZz#%t936 zgzmQUV!vbQgo_nJD{q@?%dqWI!nzb=^%$vEsIYHy(K0o93GQU&cT(M+^Q+g-EfTk6 zE4xRckva~{ZBLVw*omQg6(l^xP5m0SLH3s?Q?H|66a53d%gToD`zTj$6SfV&;;;J9 z$EEj>sO$N}f3Z6lYO#o=a;yW0`{<*pkc3Mj87sG<7GaAw{1J9V< z`N9yX5U$qHhQl&Nuv4f$OZsathEta=dl? z`b5T|=Z2!gZP=`|ZWHjlHhZXHcOFcBHH{WB>%jokE*)W@?2n4cJ zPZn7rravJAVqtCASfojHgOiMRf>g^T(D~_EP&8wju=t6dJI^kqvRoVy_lPD#upjFJ zk1{wbz40tI=2ACkJG>0V$v%jk|Bjett_n0`etj1}y05x$(59cT!i~R>=fIkV7uhIO zkmsOYA~`Y@MN_j|G(GQe>jNP-hD*wH=|f<LW~px(D>9BwjQp}<@xvx;UG z0|~ShJnapGW=DvEUT4p<7ILKg*6|0gM zt#6)mFQq$DoSX6N*vKNjsL%Oeo-CfwYhAYF%jDXnSprkFQ6am8XL#$whKXYoLA&?e z{A+ykpYPmv62PxR(H#}Zuz_DSVInzLar#=)p-h8^o995-lH4HAcXg|?_a?qf^l|7g z_o*$vRQwC(mvtDlJn8g<=_*=GaPvozU#C}Wcskrn)S|x4zIO|k<+a7kDbk(XInk?X zMEHLsG`JbQ>VPE5Q-zftMA=yuVu^ZEaS&z~IWo~O1)A8a$qcf2u4V~xG0EaE?g`2- zfJOUB){xah>O0Pyki3-@)JuTJL9+U#?wx+Q&s^JHgxMRK0l%Vz?Xh65dn+%rI(?Ib zwGZDC%ectrf-OCmJcBp=^Dzl0v==2MN@#71u4wBk#S32aI+v8uOy~-`BK9bSo@7rE z;rVrIjZ99i(A08oqMF7@r|;|R-iWYUh(s=2@m?OW z2w3Hg(=(TvO>x5WsMcdOqxOvgiDzO)n| zQ}gTarZ#vDsop&HF7MfFROXVw%Bi?LsW*L$AmslRAreYW!IrE?gNc@nfn>$-wE zSMP^|i8~hshJx!`;s-mKz>b`wr%|GFIdh*^ho@;h#t2T9gsM%J*Q8JUO3A^!HWUO`V zNhJT)4aBB2#ETNniY|NSB(a97)Lk^C^`tycOa7%V427`FNu?UbXyK&)g69rCI;wol zMavEGIZ>ts5;v0I%x)-`0VzBDX^INJpUe?I>{1)sBBjL!Iq zQy(;C$+a%WX#XU_i!q3OibmSXDpqZV!Eu;yV?E_YWLwDr0 zD>IKAl8oRNSptU_JZ7GP{K^{l*2^6VRE`}yNLP4!(i2U*Z62mXdd>&aZ;iow+TPmCtC9nwqlG#i z2@_AlnmPDB1J1B$nzdzga|(2MZ8H(}I?yn|$YkD>hKPZ}K(xUC4Y^SzDF2Nnt35AE zeFf=fknY>iK%KynEU7m+J%w4Wi8TLQZ>aMmxxO8Ra6%k8Sxn{Fz6?knsOlgB$Tm!tW0 zo27jE4|x%Od<;2vuLPHtcz3Pc4?3}%uY2~zJ+1H0R=I0F#8rb)DEy;KDGK4mZ_zH~ z!6&5ce4@zsxl2-B9>_L@fsY;~%`*-A@0|rbcn-N6MHUl@wp{z!+^$~5YR8gelWETR zD05V_wQx4@Ls+$fyB^z6ITJGmN$L@c!F>@|6BMaeUH&Qtg&by4Wi*K1%MzJDc992I zE2WSBYy&r!5FnKVTZLfM9KfS=NtFB-1FvkWbyOmZxi#&xkVyE`eBy#fiQ-e*kdW48 zFW%@a1|6Bnas=fyQDftmH#av9ed>#A%eCol{CVR}T`iME-h3)?Xov0U2tmuRlZNg( zpP@DI2RW-9YLq+3b3&WQeVju?0)h~RT@gbl0#h_+GiSeUre<~s@V9jYXr4I3OE3<( zsRtvR&-#3>rD_Kn;)OMlTgJ==icxEkC2>E--4}d7Gs)i67M(B9FPAlAjBnTo3L;(~ z+j=)>p;@TSsBhQnf1WZ@XGs$c3~>q~pKJz+d?K>f`{@rIKvVeTWdo>q$RCbM|Lf}Q zY07@2K9}1_ccM6TB69-_1s|PEur4~g>Xuw711k{BZr5&&Vj7#t?Q6G;UNWld$!mv4 z_JatW%wxGZVLJ^mnm(=V!ftJo8U#feTIv9IVPrNJy#Ks2k}QxPra6klW_-z9*0o!V zCkpy0Rm*%ARR6mKmx2tb5jFU6(ebN=xBzx)N+Zb(QV)__1%TKndXa@x@=5o|4E&`6 z>EF6iH845IGk@-zV$V&8FGTHw8)F@2de(&S0_i^jz|pBHG}0_3>FPTRbPn<-BOyv^ zAFL-!<_CV}-6> z-`wH!8oPj#iQL}-4DnbuJg?*6ThRzPqV`L!I;XLybR$UDvkM(c1q_Tw*_=6>Puv;zD8%Hi=ni2lxjjW{<9zR{W5ed+}jDMS*S_U zoH{QToVJo^-zESL8@Av}@CH-S8cTh|xSiSKN61a)N@YEY`ify9#su_k4^C;WI^X=W z&H1-+Z6SV+fH4^N1oy8p>O&uYe8G_I5b04Y0%$=B^ZnV;@Ak+QQ)p{~`NW10uEgO_ zlL+`?vkR1CGohqH!yd`jrGawaEYcaNx75%!v9OhZnS%C5L*5lb0_8~gblH?I2;-b)!9z1!2Snl`0eA}z%4ZJ;;ac5Dli zTJhnF-F?8IA&Fm4-^MC=qBF8UY`J@?erxfW7FqKcF-dj`<IkSUvGCrzI7W)m?3>N!y z>U~eh%?+$CJtDf5vl zEO~E&DZh8&=@Qpqa_wvHXJOWw znS0$cYo25^Xa@R6p5pWX67`fz>I2KyYuW?;Qkwpt<%SKUC)OMxZq*HwU~I#L;Z@c= zxOyLwZ5SM&oVEmmgXxvCb%n9O=@a5MM;2C}QgJdS9ScrZnJ`2~)K4$>ZEZdm3q{%; z_QCXwQ>C?WL9rK z9M^+u9kr>L(_)v_6Ozs+Hgr9IXY4@Egz28)6zG|ufgMM7y>2wl{FZ?sEVBiYJO|`O{)FMm-;*9R$$!#7Guztcs2#?c?FnjgvKzUGQz~% z0K;OjUHM3NJ78*7_B#|uL08S)lm?Ka%054{x{2;R9PG&Mev2q}95iegDDE5<7{3$C z&W<}Af<|1for!<AiI@Zt=3n8j)_S0vQ>VPKh5|LAxld9+f%Ia}t9 z<8hn1HIE_0hg8iCnmY93SC;HTG~!nj&g0)2$m|#uLpl0c@?kj6AYn|hf9^>s$uU42 zkb?UcoL&+0~h#x3_ztHqb%j_7Ywc&x4M@ z6_rbDs7G;nu+v7fR~;LhuFc-CZFj)?c#4?c78M|f`UDm41eu}hv;qfGvkELU)llN! z29B^Df+dW>@buC`Wuy1*6%s^3%SoHt1J6xC7}MTAVmJ_x2r%P}#6>-(cc8R4;_QRx z&T?=<{Ig|_gZ-?w@YpFsKJ#$g=gw1s$2_N8T{hrQwb8ufo;yX_r39*9!MUWQwb6G0kXaQ1awRndog3@Ux|I;(D)WmF= z5bWb_F^L$Or5C8=ZVFq7?)M)?R}oGv4G2lN#5S}hqtS#ltD7zPvVZeDKKU04>ECp7 zpl2JYBkJCA**S3e?}W0x%*`iMTBps80)_-NbiWxuYkwHzu}Mnu6z30x>gnQ+%tc;D zwimOc%|$W!I#Av0fpc^+TowvCq7ZX)l5HaY=^YCgXd{(?V$RRGP4&>oZjqUGy@Nq@dUmg-)bWMOgL+CAG0}CHe(tY((mIPlq%|1WZCRRi22UwW2sLP#CJNI=|Ju zy$N(ee*siN!fD06oWt+;%|uC1;?5L=uR(d2ug6E0j~@m_FZJrK9F#}E5*=}FB{9UI z4f zPY%dnlDz7l>`WQEWFAU681^3eU#XK%Xv2#0+89jla#y28U=SUslKF?8RP3YCKRH)k zheZ*A1`jK+(`MKi*o6HNmt?3ER`R|h0(Ti+vm%C^`gk1X@DCMOXWgFht4MXLP0OEy zbBVF9C<+6?beg;EZEa6`C#t!gdiG9^H2ZDnXQ?M&DuL8&@t^u+1*o_Y%e&@CG2A^c zM+?!Rhk7KQ%lWd(prFy;vgwH-`=SR@r~rQ<*u7Y`p0t#Q^%nNai8`ID9WS7)p0vDnw9gDU6l)%DBP{V2e{|aF*2`u3M;E+ znU2m7JZQ8;HrwAW(y0J{%b4AZ5Vjb9`M{f9>)=ueUB6U&``3-l7(xBXaMJ57Gg&$k zHv-I`<4{m?Thv}Z1iGf7&4@#-IFUQCiNB`+Q|bzZFaHJ=Q`tb&?k&ICn_-5AZYqNg z%2^^#Ew|So@KgOM8|laBA9Nb;MC;7{;${#^C&OdS=@eqP%$;$Sp)*!$hu$GhxCsYF zEfNz)O)OT>gbbR6Gx2rl%jdtr3BOD~C1~6g&Qd>)**~nc9X)6;*%N?fi$K%G4IdV- zH5D*b!_OAJ3<$at_2${?x%+e@0t#YEl#R+cpqTAiFl0b$6D0ybGyP>1^*5o`N?=pk zf!w>pDh=MkqK!ITa+Bj%oGhMZ2pj&msKwHFfqlpLoy$Xk6t_xY3yKTN3KSTO z4|ebiOdqSbXD&6CK@%$p1UL7neztlX!9P~T_b2V zozYR#9ZVHf;ob`o#F^yH%$4RIrHcC+AzOqK3TSuV zRGK9x4auuXP?9x(u;y+5sposVQoT>=_aTrv<&9mzb?=?%GppR;J6qu7zL2KeklrIL zIT5~dMVr%is&t&%srHq(%gEJvkCLfCBw@tro#T~`?0ZIeiAC8(miUSk#qS4ufs|6u z_)#*8D23nc?D2_?Dyz)#dab1CW#o=~)D9}URkSMZg>y;;u@KfNqjY;wl{mW#Ys@WL z(^2QC?=kQBwGAUuiKghmb2kMUCozfc)RO?*L^bNx!d4S5Rb(y~it@t6s6dv|x4GS; z^9q&i+riZ~!|OYHYU^d2ed#6`JyN8vWJp=5GOaOW)xndT5j(bxKYu$?RaK|JL~sP8 z2o>^Rzw~*9o;Fu-pPe0vcIe`xVI9jUAa~EU>o^{-l>Es-1~@Af|Mgy{nST7-r12l0 z@i;l7ySC1bzFqKhOrN)H=*_;vMA*!yt!vzUO1u_p1MhF;9N$!#u{Ia-b{Ud zG^$Le$I2vRoH@c=!8P-|+hR{&=Usl7ZZBJ*MDCo5B|gVRWBEHvg_rU0*L$G_;5db5 z&>(##KlVAT1r?d8Axo#kn79W2__r0IGt^0cR?f)B07CkTFyy4Q!UtlLUDJ1SJz@T* z^zdxTK^G#O5+yf16*Wy=;)3*8wY#ULm-s4EzvtCvtl1LVSy|Z#snMZc9mFA7k3HNq zq{<#lXs{qZFZ)`r8--`17lo0r@gkeEz!IgjPsa=GWFkRs@l}o7?(T>0Ss;vqq=b5W zXc)-~y5FG5Owr^GE%2>59n$wdIx+&@ybrHI7+DO&;f4ub|7{?@Wjh#eetD~3lw#}# z44zRTgD5!BAHW%7=9hI;abJ~jxx^fbSqrt6f_r|ua(A}Y>w&1BN?kp{*X*6g`q@{q z{T$y}i$1h=yPhgG$J$F^C_)4(Y3M@h40j=+vxNP9|6+!+j8MjS1^ z%@L5HC$t=!N7-97$1~+1mLG;PPUP#a3?b17=Mljrc3VV3s}C?j-tUOiQ(7pH`@mw=f+i$0?stN< zb)5cb01OH5R^~8F4+B1rIOIFa1ClD1camm&i|wU!G=JKzwlC!xi@#i1ST&%q1D@@j z;6QcH`DR=Dp;~fB@n)MfeCxJD>Pe={vq(ER7+909BORA&cWCkCR(iDtCywjF`a`wr zlx4G!DS#jdK|+5#Q_1P%WJ5_%l&RfG&bGx<63*Ei6VASu$h7V}17k~QUuR!0GtkWk zf44dA;Pc-YPI`s_Fljv8R!U4p)~K7&wjbdb7hSg315jVq%+bTgzHjRj+(&IBe5A=G9Cab03nEY!#RY+_?%TlJ|23i1xr%g5tIK0&duyyx+>A!Ua6nw->w zZ)IxOD2J%)4I9o3si3%qI~AVPl1x1^sqiTkHI@DbkwL<*BAmgG=$D8$yQVTanz9(5 zs=h>r0O)2aM^j&hmGE*2;B7v|#{IyjmBv~asTihvSEZ38`Tk>fdV@&HrT6>-DBlbw zIzHZO_1U-s)=mzw#JTG*UtGHWLW1v|be>BegV+`X%NZV`2qZ#Vilcw(#`zf`1Htt#w;u?C}CU?wn)m4pQ>*KlZj-fJ(ExRTn^ zDvw@}xViAkaib$PU~5v{Zht=9u@13eY4ioZG_p8c|H@3xpEPnKP9h}kczJoY`dJ)bwdUP`_jqDN z1-z_zZk7mkFAfBm&yVsNXgHR?Ol>?&honefT(^7 z3alsaRsB-VDk#Z%=KCIX7uy}HCLI$pNJnCTK%R4-V6UMwVG<4svPeTw`c5&?S#L|t zXW<>H!{2TEduZRQyM9QhqhGZW@gbEh~<;vJ@@j@*o_<50k=7@-eBG4g$IC=wwT@tMr39<|VR!hSO zO_`!e(3Swqe)-ujG5PKx)u(T=ur*}57>)u+25eTE~ly55TlQrNVqxA z3T%}c8vkUdaNvV1B@rj#=q$g~kxbuXH2QL_4^8bnlM=pj?z;at5X~fTkNHOkzo5XL z-4&e5ju&k2d30Y^XA~d}bMrgB2F+lu%ba#KLM^Oxg}uyqnC~4i@L>}7`a|M7rz`8q zRJaMsJ%3hSJP@RE+Sf!#5_hn@8`>Ma4Hq1Dcp1@lfWgg7dh+jAVB4N#;7S6ZYR=9}-|#Uw#J#ms&wYVggN)fqF1kvO|coEmwVj4c;xw8{mKhz4T6Vy@B|L5@}zd zF#E5&$zA}n4Xd*$O(f=^cZKw$nj@vw_*IDkKk4t0XxdtFFf`wH^4GyN0#)$HngpQCUEM|5xq*Mo zFRdiaZyQS58m8C71*ZM$!RjqD{rh1c1>c}%i9phtdwzy9H;N;J3U)m}*^R-wNHyDi z$Jx+oD{oqdzI@qFWN0i|q-)gMe2Xmd(95S4fPw-cnu3B(IqaTg;LDV2yZG#7_W-Wn zUs5=FskI?^F~e7NUrmb=v_w4oMjVO1yao=7KWkM>c@@aa?uPL`zj%Y)@Vcp-qPca& z`a{T)dpTuwaHYvBIRhc|pB9zT?jXJf^9$@fzTLBEgpi^+9S)g}AH%CH^R z`lwUoqAYl7ov3sq&^f}cBy+^JIw(19<`!(Vg%2{Hom@i(XX2^fUu{GCArWYgsg%ta z_#U=6-lhkfbR6@i4AIz|5C?lNf&VgA0Mg_GcUU4AXPNar zUKwaagg}6bgampglbu}*#t?TmFo()5ITrow!|3JZ6Eoa>LDB%R{gC+25BZU*Q^uPP z$6#Eo^jeETN}!Yj4JAqf%L&KkniT1Q3n>7FOW@BTIlM|$nYG+RF9KY#4Wi4f-1@_5 zK9qEHp$H@n1<+T%?FZD(s(j#T5`w+@3kdi@w^L0OS7CG_bF8;{GmQZgMe+2!`G;GA z1@Z`|NZa6_S#S#3Dy9DH6m}@P`AC8!>+ZfBI&Y)yTFETJt_unuJqcCxEVt(GKY&Ac z;^L*b+>cLhI+0^HzofiaCzm~^{D?3i=GE}D}`wE#f)$zq7GNTWvRUH}k zMCZsp^X8QU&)+TqA{Q_V5xOSnxqQl&kObDd3m00)B0UES`=vgC!DPXd@~7 zP+DuUL1v02sSkllFdG7jbno1LG?y4u3|=6SC`f<~l_McDFltrM$sA8(lzI3v`p2iv zDkg_U{|(b|L$VGjBQL}uURa=Ne}#IC?oz z1U;1)rDySxHs#a8?+ZUkj+UOuR2sz(OT3xqIg+DNfdHD9wLP83sEmhM1LH?qCT4We zt>wn|Dsj#w0(GK|jR8f`qWQcZdOq41pZL^7J)JX8WNm0RiqC18%h-x$>KXEQ7jy!@qnF|7Iv+UJ~y13&{#rK;4e8N3dKR3SQL7iE^8S z7zqzQAmviOPc(>-j~a~;xw~)Hwyo;+AyxUWN(yE_gQ?oe2|ln`E@saq(jM1QQ1?U>Y~SwYa6$C!3(n zbxy}qmxjQxMx*hE-A^G_)bW`gmCoKb+1?Plyx=n`#9?JNiq3UQ!V4fK7EW_A)$-YD z);oZ9{{$1txZ0J)attsHS^#1Y-Bg7BGUSRC;DC**s6ilTQCrI{&XNH8y9njn-scjJ zlHE|?mImsZa(ov=ZP)3PBJERYxEy^MD2R`*^=f>SeIS=wPNUOb`@*6PDyPR@xJ7^d zh2{pwKTjpVHYNQ!&_lgi#d^@q`uOyA4AG`9gqLQ{OHR7;=PIXcWnHr|@xSey^EZ88 z3yf!HTUAV@Vch5hfx1Ve*Salvl6KE#>p$iwT%c2S-22|;bs*+rt##sN2{Y#%Q+KPh zM-^A`pJf3W7##oIC>~N_se3eEPaT}!ZavI8W@myj0P8bBf5S26?%sqT3PWd z-xkG0Dm>h%)$tKAg7f5!4=YVS7fL;Xh+9kQDZYCb*83$b^@E0<}V zw=asdQ`C$j6na6=y0=H|gL4lk-+lf)qk75g;=XT;*{=h3^{N`fn{y;x7YsgG5`U%j z$mK6Jak^L6xXJE&bm4n|ndOcAee17j`}4fO8ETy0T>WGd<0Rol)xhiVXge&(2l3`8 zBggANzz%PCx5AmPN~Ef<6qSt>FqCpBURKg-Xv{GFznC%i&KS%UslA{s22+U zHLZVE68J&>1MF3Fv)DJGqcxzvth2Wv@MI4D*2=XO3b*4$ab)BqOkn1cZBr)Vf1Usi z$Pej~9kfviE~dzv1tN5#srWSS)>g4ptV?5mmI3bT)3}ykCq>DBclBo`b5P~W=dDy# zZ@_VnP;~TdFU^$RM@TTRgPPuFgz=q0=0w#N_XSZjWyF65PCbS+PB$*-HsHH6FjSi1kXlz%_19PIZfV$YUh_cq1oaVkzuMCcOcg#lK?tzk>=A;6>snalG+JsW&OS#qr;HYn`mZB9698 z0RQmu_b%a{%|JY4Q3i_+ntaYf9ckH=7Q|gC95XfsSrs#bE5ymMWf&L-cze+fbc542iW7JlU9Y}; zV!8?lpp@?rtz|*rQlhDOsPT3664_mup?JemHB`==Eq#arttt3lAz8}xRBDK1ridCE zd%B$e@%sPMe3u^7n42?SX3GS-Qa@XHQ3$G=7%oS8G{zN5U>+BgulhT(A`@b%l-v=U zB3R6^K!T-3lwXNgz90&hD#0^)nvz=Fls(FF|9wD#KNOw}$#MYufA_Ef_1ZdqXLT6) zu*VKMxEJf|-(Oesv~4MWVM$LzGqa%2WFDLBp_Es=o4o7Co(-2X54Egqs9|GIejQO) zTo1R^U{=o9!lP2dRDR}+$>q& zbJBIhN0us%UpLoib2CZ_hSvRsIJv3(tgtkNT?8DLn@&fUBR(&!sCbqYPncoNNz`8q zuSy>@6yLK=>rAJz(YG?O>C5etYsz8)FIb4Iq@0&#=t#I2mlxfAIy3Uf@h+z!oW2Ll zEq*(2d&4t)$u`m^nDaf^O5AiDt8mozb&9wsTGr^>bX+~RODbhM6H_qfn3_R z(AN!sSG;S#?YgM&=7$CwaFN;M5Dy5b(Lv=<_bWCd$cM!pZuVSTjs^{#&k~`);B3m@ zBj}k2B$ncvH5`LNMpAGytIK~102Olb5A4Svla}{Pp;N@CQz+&i&2P-rfX&YVOB6Zt7DgZd}15qpUtC zHEOL>w>@yfA&Vh?ThuB@8PG^>6NaWX1@IGe`x~sc%t_$DsvZIC8DUhNnVO~l%YFs< zseuyPx%K~U!X89yX|i9dPHtt@tW-9cR&+c=hqcRk5MHLKWc{++WfrI8-Z~vH$PrW1 z-cwt&&*4VUX$XE^-}Nc2_VEyH0n^_k?PZvYk4t!-DNXT1wa!JV7^(c&4T~w`f2(k@ zJ*b>6bIZVBc^L>$>CG?}IOq_MkE6FQZi2u>DIbtfrAI_WS~tF0qG?C~a#Z8bGkXq* zt!j3!rxoh!A|q6D1GcBhThh3q$T86?gdr(@zKAl+ZG1^!V$1*KFsDyO9HXraKp|KL zecc=bg<7cp`DGs4L@C=M7QUpq+6;RggUu1j476`bThkn48sE#72cb%ahK`uK#B=i= zN-JtUN>xGU&;uq_;>_zp)4&y77jhJrXtyU19pTe5AYD#gzj(gPMw zDnYx87|=``o%3SO(o^x{zlH7*SYZ zV0Dm!uDJ?h#68$FwXOYSg_Ar41G9H=f{_Klfj!`2vODt9!bh)ol{@uMh&2%dTTT>g} z+Lld&(nUA&OV zCb6+h)&&ZwW#uICWmAQ;WNpdV>3@vpKgabZ=+&oZFCO>tFIhpGKnvFmz-5Uo`z$=kW5s^*CD>DxEuDtbI%iHU2re%l^RfhVeo7 zj~_`hT-yqWe{b^R$KQj}e>8O|y184464;BA%w>&g zpZDBEk>z20$B;zx-#`583RymZg23y;*Mj};`TX1QWP>0zo!o)L>!Z(U1psl1I9$we zJIG_{MbfxPNnQeTpy6v*B(hnF_=d)t!k#42W+#}TAmy2@G=p=XcJhDe>1%LT1RbQ; zy($neHJ#Q>*0|lXWO)-EJ8tQ{USYsUUC*J2W;ta-;odzN4z2Qi%dQ1<^3}L$hf@yV&f_K9Vl$bhwIdQnzH;ITj_2wu@PMwT)tE zP>+A4*T(D~2wfsDgoCBCy4CQJ6Z4~ZR1G_NK4}98iw09z(Z+*?iEeo-0C+uX$B>WPN?2J0V(?-K-zKN*m#i z?IEC1z@P0ee0Z;JBV%(M8)Zu?qB`{5j3;nXZe~ZTlNY-MA!C_OjvyIret&u6s_5B4 z$3QC;!cfv|ug)Nv-D9&!ct;r!7nH%D4m?C%j|WO>jBP~J12UoR>CcyN*U z{AB<}EBeySleuv-Rt46+_oHy9V5w>=Rq7+pHSMaaLcRJ{>+MmPhX3sf{@m-b!2+K7 zVg>whzwY94=BI77;S7O#`wjyffwM>bz|Y8kV>jGrzYTRe+%xjM)oEz2n*&eEybq4| zfhC}t654abAV^QZ{Dr>)dBk1xlzKkb@QO+ZBt(q5&}e5|fNm_3&}Mrm1n2=e*Nq^x zEMM3Y)vCcRC0PgVNyyV}`5fgS_K*A<3ctoY zbkqWVOOc(c0aaW~xfU4M1G=8#x{1DfI__%k6NGffEn!w+RaG{hR}(%Lo0VX*S_CY) zBqHmTM$Y9+n}ej+XNu+DybtFq@vGL?S6kd!hRg73`s=Q+)%Is5w|G-Hc@l?LsxD`% zfz_8^oz9mPGGZcPdcc#@cjoU7vM`M9_$`spQG;txMN3|`5SF!*wVjF9J?^~s-g_Sg zPkwo-Yq3Fir6B48y1S%EYIA zOS~90t2g@2kkwZ^ihB8=GG23WBX+kkru_oj(CP8{-unrxmhC;KQR-jZS&+c;mQxfi z4?fO|OQR4?{EDvg)Rq*GXS_X;nf@U6=Ek7J|E1 z^V_)f5-G^n4zrTuhrueT#Hm~z7W2MfC!6qyj~a`9izqJR0FTFo2?EQH=SbTVBLZ^r zx^rKYnIV|H3^jfMNe7t9_EYj|t*Aza>+JU-@yWi=%=ptfmQimu%{C#m9?$@Y?c}FU z!?C#VMSxG_aqhS?8MI*MM=co55L1Xz!dTl2V|o6|)JQGa=+)xq4@msLU`l+WtAGtk z=5+8$zAI4rFRmpXI!*kMB$GUBkV@p*m0!wr>UD8M|AjCGz{oR~$4xo^967A3#(Kpb zbPoTXi&l@4MEaGpq)O(Rmm~|u6iV5^l)-F9H`*~mlf82HWqBN_b6Z9mIqIJUhc^GZ zCIaHGAE8+)JW-rgA6c5LT6S$u*R4%f$0E-r^@ zpw_Lx>2`$pUE}&-S!9H39|QYL5Cvb?_LHawpIRTgyXIY>+yC?&Li5QVV9z_%D8?)gmK zFY3&PP*{BN?N&xAZmxVepnTQ@Hs57|FYK5I5DcL)mw8Z9V%QLTD3th}?Bs5WjrZ2$ zJjVCO^~uZOSDk?DBl-NlF5m1sSo(Lmt{(7K0XtPxnr2Qg2#6Mi>LsgN{S1Na9$heS z@U6B;^45%lK<;FT8QZ#f75*FIo6FXWPTv?gkhVhlT zx5Y!-uN%ogP)AG)MBEvtsy*~X>m&VY%6OA1{`)O(6dyUfW;L|ci+i_+BCGcLBcr_tLvagBJJFAV*Q2l0yiOPoY!f`|8NJc*A^ zh>6+|G0my^!Cgy@PtXXv_#j`yNSPTC1%ks+@XkU`^|nE?EgwE*@)0IZXDZhHHetIN zAjnKFty~`RACi6>YhVhB@AeOF@cVQ=X!zM0z&^uhnzv(wkdd=&Zp);=-RN#rt~>Qn zddXQ~mjRAcVdgy7Cm1#;+5%nw>re#sgA3G2#fr~1zD2W^`LfrTLO!$15G>B|3snTy$<^|*g?VfQe`y($j4 zm_=w*JcXxEmd%Xd{_rH|cxv9>N?o~Vy1kgU9Z70 zbsui&x#4%XKz-cav9&v%`W6-jBW7chNpE=RUcqq`>-@X>`yND(wUx1AVoxOzEht`v zomG@rmV2CGGF<;G)q(-A#7@FVL?9n&HCd!8m-Cr`J%^}8sKumS<`>vO3isEXqHYXA zmuKSQ;$kSHf!4}lQr8r-h&=<`o7G5igT-G$w?sTjPsbGh?0O_nv_K=G{>{sA<(hLj zKfYH(a?{;h3A+3UW7sfj$lulGa?}l{a^33*aHPh&dD+EiTSO*7GniyV-LlUE1K&1| z6Mlc@2uHRz4zpDi?JgIrho>YfBngZg;6vB!Q)M;fBU1 z^+LnEfk5GtzU4}Z%d`<3CW7^DV$93_`lkq?Jp|6dDE;{Dv;4D2Csy;llAr$bIsGa zBB4*lb=B`?vIWdiwNfbSz5Uh)T4r0tPoX`h&4CG=*myK9cKrp8eSO=eU~}ogZ1AS@ z1MB4;ze@vEj9}XOWj1q3JT^4lz7(52Ru}_= zckC8^q8)MavL$n5-}*N#a-b}?Msr(rS2u_(>j^r3omiDk%Zs$Jk$CGrxY&)N+Uv&W zg2F3%&K4{t($qTy$SloKURNcR51MvXh^QB%D*WgV3#-o4VyA!zNhD$ks*9ODbYfam zfck1#TUZbcmM?D$3R6N5(i0%=;}6~J-aIrR)33MUYPjCXwz~(p*)#K^e;o&-hSqEB zq0$GB7p&Zd6b3CJ+?tYk47X5#o6*(zK}y8Jf~3>hKh54IdxxYHPj4!g)owCbyW|5T zaRNT~TDa(AodrQzNxX&9Vt+o`Fh*QnI2FSIh6rFJhcQ5YC?IdnR#?eQ6?mFfS?-Tf zopCqxLfZPClH0kRNk>}`1?>DRE8P4gmQ_@r#^~`1Wvo$iIVhsu?m(yO`2k*)>|m1Y z?RifUUhDtb?!>9-J3`~8h!v?@Cpx-`1XQ84diX&=+YVt`cjyATIWX?Au-Q9 z6>TG=n1ae>K412Hw1ZA?Fh2tPM~-)>95mdWC(=^hv&x1_=W=No9BLh>TJ?ejcC8H# z*);q!}Gsu0bsn{yQm{UlMn?p7KWo$1-+-rO_Yp2vqpG91MuevnTK ziBzL-=%(BtZf^_P9qrNk4>?Aa;$r>)*RipI-rk`xJW}3kK|Sj28F)XnUQD@W*A#R9 z*4XDy!IZA8)e8o5=DwKO0Rdz~v!!}IkqKy8h#%_HM6pxah(htkVWOcKe%9dQaazc8 z+gs!O;(1SL?7elwXFrX8uyZ7Kuz6)_S}Krgm4m#wWoRILd8zc^PY1lV(Qky<67cJ~ z&1!D5qI$7MLm0o~z@Ei&I^lPF!@wvY^M_IB$r|TgYXg15@@96inx0o6in#|cXamqrK$m_h;9CK@`n>3L#SjSW{LTake8>j7I z>Eu|E1jm|o>0d0qFVffPP&Qk=(3jOU_|Cfu?8ePaMlFCIyr-@hOdq-=!KF-C%vU0w zF$n^v(~*ckI!?i15i*V@xNo~ZiB<8OKjybwzxE3Y8RS4e?dJ9*;k2Qnf&By*`^4nP z5h8{q5<4lTzvzOyxYRhXLF4SZz+_}Z*43G8vbLHpYV!fSm)c+>GYBYqA!M$DI+-un z4!vmD8Ay}u@rzHJ{wzp;-eire>*mgKN+$c-W`~(X#~p@wv^WFcjqHoVnthm^(KMVr zbUDU3-0)e6l+7>{-xOB`9dti%6|u13Sc_V<9xt@Gp@zj8}DdxWKY3Ea2|P-vn&cC(VQT^ zX-AVrq?!Z7%OxGB)DFbK8?6PqEe3F5BlJYL1s#M!* zrYABE-y?oWt@?zfAG$es_YzkVx&K0GB?;W7)=_s+z}6IX5sW1dq&Xv@2oeyYsJ7bS zgF9a@&0&~1d5(Ft+^pB?wUv&l#B&5zR>$r4gnYEm&8GzG58fK0h7r>A;E*nvrlf-| zK%{4j_&~}IFoal z0h+(n2{orqG)S`ZDIZrmfp4Y>H0rv8XNdCRh?y7~&1+p6Q3J%uN--b=g*8Hak#b+Z zqK_vGv{_S1zeaJB#gUx0L3`2gdMekQzWf{b^RfD795I+|5ReaoVS-hfMVjsozcgk? zrvcxImdoyH12`Y!N-+k5UafPVOf~8ShoRu%<>M2oH$9rK%kJ(i9pNZFgx1@3EJw_L zf3ojaK_}nC)Z2CdH}V&vdAT=<7r-rs#icEOZE!=Zb&Qy7j13Sa`NU{ShWK-cibdoWm|s`O5^ioVVQgIVPRzn^cziTBGki1 z+;#GNRHlsf6>O8Y^=|?X&ny%A?$8xAJWc88ES;j~Mh+#Frnjumuy@a0sz$fZ8!!9K z$4=8!6@w>dzUObUomE8E6h~*ir|*(_A4g{sGb@-EuTjU9;ghFdMQlIZ2gPPjEePh0 z6x+Su8y@c7jkxtn8b6x$=u{2}c3O2S8hsm&Slhh~A5L!XGmb3pTq@BLF(}ziTY9`! zlIvVgl=}n2hM-_*pFeXcO3spxr|S1EN2@|+83^I1qOw0Wm2N{k%qccI zya~hb-{SPc<3|$Q)^9i4?0D4k4YVJquRjx<@WrB61DGC=Z5_=mZ?u!=CpCaX#A5!kq0ztmsv>Y+Q=g){uCCrN=bt^}2!6W5hMsf}I0_cU*ZMD3+!ER-d5V>w za~Am9VJLpL2Ua+lZe%p>PEhR=)exnYM;{U8U_G%557Tr=? zRLoU>#b|4TrTmzp%_N0w+%~tpmUhcUlVw4NfLUkILleD&h--^W zti<3+p1UxLs*t)3pk zS$iA7IIPAF18ag@N%BD)6AW!80CtOIZ-$e*ewtnUJ1;7lLco*&3Nvm0*BL%SKZuI% z+SlXxXS40f+`KqRPXGK>oe>p(#3vj>Jq!*Wy;%cOc?%H-W(nDeybX$1E#Mo3U2Yuo z8KIGBS==IUR!vdEk!byJ%gp9+*IEXZ_QMQUeJ5?d@HXHrH$?XwWZ6KpHb>!XAeX6< z8=WLM0jx2DCrI0>4|{^wi~=bAzNWo|25St*cJ6;fk?jGGaUtY}?(3+nrI&@!xU{(C zi=6@&CTJY0_}cl6mY|UQ+7%MdI<^a72sZ36SgBpzXQEp|s2ok+TFcblxH6lYE*PqS zTxi_Y3Bf2;7XQGNCm$ZzMuL&0y`}QL%7iv=-IWOs({-`u48Ollt~W zg~R%_Vc)nmwDV4ScPbZSD|wJ^Aa*jDiL@ObkgC&DV#MQ65*wYT>$XlmR{6i7kEv>? z*;k6*5NBWK7Hpp(glcr6xCT@zNfyGbyz(*W0FYs{i3o2EEP@$PPYUapYp#S(-Nay2 z*raR;Kg@b|?Cj5;a0zA#!!eG_%Yfyx_=`WIJBz;Q69udQeGsX35n{rgC#pu)q4TzW zp(Dn!wDN&Z;ipg(qTBZH7>Oaf=(0jfd4AkrF`p(IdDw*hSsH(Rss6_7SHfQkaZzm3 zYf}l^4nZ0^S2V}Y{uE!`&59E{tl5-CMu__ceiBOU?WbYA*vsI2Z3s=HRV= zxj<+DgoWGRRUO}UzP4%g@1@weP&kM8qxdm&F6IIyZ?-|C**t2O5gZGDf=EMy(6Fcv zVluXP?^P-a3z@jDj*u9RvrcYAl+B2V;T9A6&G^l-bnQ_S3}SJLs)K;5|E_-~*fF}O zRNEBRPt25GdGGzV!oLIdRj7Z0=5D9Q3ViN3Kx%tdHFfdXP30+P!;0tx{E{3<#`%Yc zW~(@1KJR<6Iz;F&Vlf@9n6Cq4&+tV4TVb%)G2bc%N{w%Xa6SgVoq6S;VJr`yP2?Dw zRDT)S+fy4XhFt7L!^(CZq1G z>2yoosuBs5>-Xozc^lkLsn<{5xJI79kgM*?gALd0qD<9;C7X81Y^Ece+17LQHkCM> zg>zENeBDP$#bn{#C6z0(so9F7Hl5RN4qzQ;hRc=-WIX!$7p#}qBd2EUw3Vo{ofc{5 z`WrI{kfYPeg(*e1#PhSUnJy;sOty_lOOR79Uu_6cxPVbbFfUx7J!0HD0=2s{$5|Uh;*jd=B}5+7hbJ zji3nLI$Vl@+eH+;m)XX+ch1aHS{xP5oLd1}EsfG~q&q$1`Ei_t`_TR?Ky-Xfh>N2;pximM#%F7T7tIo)zi!v)eo#6u3ArDxtt)ckp9Ha8mn00w-I}K)vmy$t3fLAma0+b(%Fa!#B{#z}>ELNzne1dYcdw{;qxak*H|KV2Y|jzXs%_joe- zIgE5PazwK6-2QQQN9K4LN>XVQ1Hs%pcu@KS8`tXF@)l^sUN58PYUgm3RpoI*-KCR7 zTHOzoln|K`-yMPb`(p&Mg*jpn3^w&s1K2MZi2sq_6dnJE-HN{1+u6*;wd^$p)mwnm z9CT8+f?y+Os9JEIz4IRRau&*-$_%XtRV%eM45WFQZ?I8yxYgjmGahW>v!Ee6iS+)J zMm6)>z|L+sJs0ko{CUyv*P239)O9)SR>NVQoO+>%PB#*dX6K@9FEKQE;Eg)G?XeLH zIn7vhrwA2%W_FIJtG~imY@fgx(Jn}0g_CAN8zG9~S?_m-AF# zVXQpf!F6KQRuu#pB z$0a6K{GL_y{M0P}j|H>H=xRp`+))6gk)5Q+a($CD!MC7MIaQ$G8yIeyD&%OK^qmUn z^8@wJ*J?X+d~H5~bWZ%$VUIm?r|4wKB=D<%Un4*QU#`s-^DACMz$l=t6%Bp_2k$~*^X!8+?{oNL53I3O7kX<7;Co>Jps=`^CmhSpUgy6-Tys^N zD45P%iAnguA!{3qkZY(4XMMDv8*yW%br=-xdVcbp%5DT@v31HF#71RTam`)E?x{6S zi{U=*5jUBxRqP%zqbFlbH$JZ~@q^#TCxv|^Vn+7uhBl8k=WAa5bd;_3^+%L<^G_vRYTxbt4_EIPo!Qnz3x^%2 zW7}589ox2T+w9o3JGO1xw$pLaG4GRe-gEExzCZc(jEue4uBug-bC$=M3b8c~VEtBd zu>HijMmGf&XN$CO@$8Pa+ruc$G0@tS}r6#wGO{y+;%o@{BCyUv_nS zGc=-+?@w#B9ZR>l`I#mUX~!Z2uWU_-T;)V?OoYB}0 zcM3x86ZK5>J85W*i3*{(GU9^sN74&GgNYE_#I&F{VfJ@hj~`izJ~}*rJ_x0-bw1tg z#d50){#lNko1#o}kjEChx=0>KF$L^v=Cglrw zk6GdzgPU{n#-HLWA~|!PDmWt>{>>?qLP}yFYeO#cqOC`XA-yJzITao<+y~7OXZ|p+ z?=g6L0yk$5^vX4TYDi+=nz>;t;pqmqA}3EZK7v!E*IH|?^<7&)UhQ8mOuHhJUeWfG z3SCPHtU%WzMP6I7S7IBa?vL?tKndc0g{l9oRw5e4#GUTHFXoO8Io1tEdLe7&9Bhd$ z)7oavhf6+xgU?7%C7`R|2yWoTc8zv}o2KcK=Y|{#X63iI1omq3fF}wtu;bs(uvclO zzP@i$EoXXzdbCIJa3y8m^*8q0C)>$=Lc`&TtxvL(SPCX`x`uF;xgR}a8rr$;=-t?p zlDM#vzuHGbY3~(qp2onzL12t!jaV)F*o2tNj-b9L1uy#ThLe6DaQp;!lL`)L$Y`R) zxYWqAfp!rGfQ{vh2MD(J8PD1?Kc<9dDy8b5{O#@7I$>_ZAO`02Y6`jsAnbhXl?c20%ST1xa%d zmO!k`d-*}XALGhlS2sEe@HRyM2@mmU0~2;pCFs5n`S=ZygCKS84Chm9*>c_7D(UJS z62@J;|GZ7jLsFV>SD$W&+yN2Z_=*T|2lb+%ZfoW{7ggrHKYs3!wMUFl zVyzw{DWz$Q2Lkqj3GB+8q3IfD1*yF-HFrizLO0 z;f|;*);KP54%ERMTvKvvsu7y)dAu=>18x>}F=rbP40m=>xmd8g(H&Rez*H7%;D?Ux z6%oQ~v|aJ; zg=LS#@4x)2k)9s@;xp*keG=0!QMKpv1qhJD2Mt=%cSKR9T=_4mjAV|?$RBialiUi$BYgQ&WEIL|*9&#vL>?E5%Ocjp|7_ToN0fe_<% z;T)psDE`G7Tx$dHWec~K!noQl_HLDQHfH3k#T7k+OY0}Q z6f!LK--3iSdHZu&4QI<&OVvb)LTm5LI8y_*aa9C_LY{O0^q@m(+jGYX&X^3%#KK?S zqS5WfF{cejqivJcAvLA1LDy`5cIC4~%B!HjG<$(HvHlTvv?YRpr5ke2T(jYNX~Gb( zp~v^9Wyv3P2-?((R!+Xs4$Z@*n%I5bjox%48euAQt)H*C?WrEd%9l8PylkdO0e*p3 zyLWy6O~qYfF^K3It`bDL@)uO?*%@_n{8fe7t=t?GD~M24^Vv-UV!z8v8g>6he46;t z(7AQ_tihlA=*Nbu@b_s(>gfA)QDI&uT0ZPC=L2K-3!aVYdAc8Q*eZBF8@EkMeD*pM zX6W;v+Q>3C3{_N}6vCzsmpaDsgMGsFp-o99zB9H$RDdzV6OMn5uSTR~v5dXuV|vnA zjajd)9Vbp`ScLrX6krs%)&R)S`bA)S*Obq04*KhF=GK!meHt!izV+tyK3!+YUOzd0 zKXa@Jz4^$%*MIS?>JxOGnp=-i9-SHkh9M4tC&`n1oMJ!jt9O1xZ-RV&7{~9Sqr>HF z93J>Pq{xMxGPtsw;~lc~?qM(=Osn>OrJ-eiPn!C80aDk3aX~i207I?)!>WaP|2uy5 zhbdgXK|X^^A4P-JrT}f6wk40(v7(m4VvyU};^U|RGoN}xrj&rZogD)j{oCX*ja>Ag z&eT86PypnKSW)!pyb{3pK*T@fcGmLlX40+jK{RaB4jzZt5dQxBdPCV-U{?`w66D-*jK2O#n|Rw5OC?%fK5{Lm??;4*>rw{@&tSuV4()xDlr) z^3igG`_}YM4bAEi818&C5-sKcPer!3;IcnL z(>381rgO|#9$(AfzEi4ORj7tj$>==uJ~kInNrTj{nXf3IJHh@}c`?cmB$X0_GNq-) z#KvEYgPj5b^PYw#Sd06KaD!#fnKaUjUy=LO9k0G5K^$1Iv5wH3V@vanuz5uc%vJbhyK+Rno}$ZU=o;Iz)D?F>2zof54v8mz@?f zWQYFz&wjMXY7H%iRT&Gdpd=1X=X*#TQj?x!~~n$?G#y1Csl(U`*RRhO`v#jLZ1rxoGz z=v22rRNpEgJNsTOv}PQabgw|S#w#@YK1_R)Qen;b_*NvXPP+pvd=rB?+UnBTbGnTd zPbXYMWzlf*O_>NmXuyTTLtHSK&GqS{iA`@j_jXCt+1IG;S{KBsw|6iVF^Cp(Zl38r z!z3lDN1`rw<8dSl0B%!OyY8R%@ST>BvqMm~km?D!@+p$3^&F)?c(G3l(TqHH&K{oB zWEDJXsxYt~yc%S-{|b zn5`KGsEtRJL*II=qi|}KFJ{0ljcV>xxMuk$mT&#|_s2}iAeeS7JBiW$L|mi858Xen z=E!7^Z91)C*Y5C~oO#2GPwr>rI-uMR2nz5@Ywgbnmp(%34Ht^x-u9f|6g%Lv6ZTbM z%~+7Mks)wqmsffMz73C_AS}bID=wF);pZ)hbw;3(#0|zKXk?YHt>T&>7@OUwFe4hQ z>yLTGHSLyAqNV}I@cM7qt|`LCJ!eD#b88nk;&;(c;W&1bT6I=dQ&~p`;FxJDzewW$ zFIkWUNw@0-=5J&=pP0YC@yywMp|%~mle8Tea?Y?P3=#=pC4SZdCGy{fAK4zXT?7YYk;$?9N;3cQ&r~rv50f_zPXn~sY=u!i%n1ljHW{c$MsJc z8*XU)O0V=^$x|(+3mH_|qLARY+FhppNO+;5BQJ(Q0*=y4f9(G{^arRtva#-oaTT4kcfal_A1)VrQbpSr`gZ*Yld zuL!n2UiCE++KtB%K_vtKt<@m?u}FGUpta)R$qKArS<60FH>$5!&O?+;5^{41xHygx z>rCvxv6OMSd^YU2X))G(QP^WmjSEe4F7+4>Hrb905C`jb+;A2tt^9lGNI$deL8tJ1 zc(&Z{K{xJatP`UOF+J{1zco>CWcLLO{fL?B#Y8du-LMcHXBb>Q?#@*|80m?hEpKjB zGj=4-nJB<7uB}CVMtt!Pe2!4g7mVba=zHz5sSUvI=p%)rQc^ZbX_!GMlfjFHS(23; z6n7V@O%jA#vryKw`Gp&K%%4N-uD&0ehgkR$SVCOB004BmH>+jGrJVv501R};D#d0+ zpq9i+hT^E-Zn5zFhTV?`~ z%)Hr^Pn6ej=(htc62Gc-JUuC3)FL*Xs@51W?w4W$lm z8Aea9$W`|~BFhw@Qr{dZ8S71s(u_+=i{fvf!&Y}xtMrGAumd;E7P=&>$M*%!EJ~^r zT$v1>pLe-j8l9vabj-d<7~1K@tiQhIjxju6E$F>u)?zmtQ%od0TI8@TlcJvptrS?1 z_!XFrS6QRR96gluA7nkZ2&yGp#?nIxb2q^yjyc^v#s=W_)!-U!prQhr76-8$ zn`lLc%D~y*j?wLsQT`}iex6dEdmOu1`Cf=59<>K(+>X*tYx_HYj~qz%49+K^7QX7f z{6Ks`&R z9Zsuti_f&Z3X<$HY_u={GKCn2_`;sane=L5Joju$4ZIs5In9p{Mxn9m-r%>rF|-Wk zX8&HZE}3L05wk>|r`qmMWiygAPcPrE#d<*mn1FL>FN)k~`n;$q{L4`E4;J3}X!bQ%gW-%`e2R*I9^Nr4DK&`MzmKi*5g>3qmO#PZ68-)P zG3&J81P0c|Q&N?~p#lY3=#F{v`R1Wkpq1v-6vrSJZ!fm#{p4tgh_bD)sOb9{`wJ*V zZr0%zSHfu*`Pp+hkA3l;a86xocU&ty2g)-V5Q!o;vhVr?Fk4~l8DD%I+juH5&Zgo8 zPWG{0P!i1Yp-4m?OV6Wx<=Q0)%$>J3*J8!eAEBX0))(!CQWOy|@Cr^fb2gZX zo8dYgs*>Yi5wB7ak`4?6(Z#9>5Np+T0AX=XfT^zcZ78Y3%kuU|mTXl<75%rCe#dI= z!zFqqDiG|)_i`GMNb;pCb^av`l}_{VyhWSgH7FOyXV)_YKwa_o#!W*X2F8WF^)+uj zPKu65e^;NRsfDT8KBwCE;~><%(NY%xQF0ijv`5x{+5jNWl{7iSxNr&r>r2giCDnjd zv+M9!p?fT7V0@pzdkOj3jZX*+>lgmztK3o0*XgV*;jQ#^Cl{*7t z$2k6+^hmDDs{kwJHiijL$??pZYsrr4>EZKw*i8wIhyjOz)rwTX%#Qe>!R&T6yzh=y z(9(O%6%+NYu4lHCUs^j_IrZ1`=ase2g#g~XnS6eurKjN$Du5-Gz4xuz`}1Cw{d3PT z+T;6%?0*wY|5Jn#H;2-x#i$*u;=oD17^h=1u;$B@=8ZVIk5%jxy>-cX z=U$?Z2ADs+?HQ*w#QcCUtOQfMlRq&77rgKx9ll6PLMUCJeuO2Iq!^ewl~O3yB>9Gv z4Gsq+!5O%v(;&oB^m2Cq6ZC@#(Rgg`)6xr4`}Q%koF$W{Sw*-MyLa~6H~=o>Ew(6x z(N*$UU+xqEf1$}{bM<<_L>iko%N8Y~pFa%xcc%e;c7wEL5M#-4b9`)bK%bt3I*J`n zAc?G?2r-Ab?%U{crR>u$mZCJyX;>P4RGzc+`>=A^!6z#gz^safL|uUTQWB1c_n+FW zQOXa0$CS&C8bG?(Kj^nmL;U`|;eL;@)ylb+`#1Bw?-* znr}cJ5Qtj?p45Y+29!V=W2Nx7L`O&ys!*oDWzB6`)2~$tEDqUixlV7_No|Lsv8+;Q zeZ7*RF+uVdabyK_UkP5o9uYM(%p_zTH~}LWMppVjzGk_}$r2fGmd1cQLL;N#)*<3TYma~W z#fahrsf)c*^OVo5wmI9V-4f>5q1Z>>soN=}3rCmgWLad89G3q*sjsw~7YSpoJZgF? z88BpPOd?Ch4{mP=SH+$Y^v#Qqkcdl93b{K6F*-maN@$AQ0Qr4EZ{Hk+38G%@P1C#XZOw#}32m08fm4(ig?N04{@wJ>&NiY#mCKlJOvLEiqIC zTKtpxxKVZ0YD1-HE$6A4wXOuM?vc%AUxdn2{IF(y?QX%!byXj`Lvzy_))w?(Wpf(FXwM>kDe^p7%RI&K}+YqpzK9BVW zIPH&u0h|0zDE~VfxTZ8jBqM&e8r0f6{?KqJVJkOwgFZokB8b$h-hgm$nO{Bs(rI@m zXn(#oM)b|RP}f8)d6b}1^{$x4b^7UKFGuC9^c}V9bf@a~6^`pl?>iAYD4fiT0i#-~ z`i1llcXqXxsaMoJZdFRmr^gx~PcRbX(FptJ;@k|h%{-xS5;bX(kuWWfz zgIg4WZo>(S4DjK|eP>SbYQ0wJk*Q^C9D!q(kC#d|Wal>X&)v4=E-u`=6*O7_NbC9A z=SgK#HVoo0I;zf^0+xe*mHJ4s-AYh6r@!6+8bo}0x=Sh*(l3I>T^0Z)ui%o!q4e3>-Sul7so9g81@>dQ;(+<f^z0vGy(UvcuA5KMOB%h>YfW zik5o-4Z@j!G>jh#HFoGRycMwj1ovoPO=^;B zR6I)d#>^1wv43w1$Kb`~;O)rME!HkzlPfefBH!1KT6T=6k5!E?9D=JC;onfQz_Aa+ zW+=aAP{Dmc1xOOyHyWe0fqXlI`(H{5{7=^aAHi)WOZWO(xylqsw;gvGIk38NZQNtN z?(ZVoqmB$qD47rYcj9u;t>4UEAk_5}o~s8P&@lL1}ZW0q@a5K2OK zDiv8_)>qg`s8`0O=A$?5QPA70YDB7Q!CE?^sfMChHRhqBc{dpBO;C|cfPsbdOZAFy zEPd0=su>htcy8{&L4?Ay;O2`OW-o8kLpiI@UQ`<1i)!%2Pu_K$o2`E;%gXqwx<*KhCs z4WYYTMHfKZs)4kFR;2?DUMN!5)(2`$HVdl6&Y%9tG*iUE1V5RhE`)~HNaZ z$ZZ_#aHAJPUxZ=bj1gLBrLqVmx3fK-KXb$+efrWvCh!dN-^}7v~Z**UoF; z(!ie_-nUdCU&C1Ad4s(IR%!fOhYr#x-Xs300+90P4^HeJF_v|1KrI)$61xh7d}6H z#Gjpl%L5hhv`!HroSA|AeRMHg7T8Tx%)V)Dp2<-xTR)G8h_bl4+2T5y41L|10m z%sOaa!XAIY{-57P)Yi9l_)?!=S@&kXPnWO%fDk1hNS~{Xe-)P-_MuQ?#D}oqghM>% zOy};xD&IUV2enYl$LS9G&79Ge}Iv*WZjK0&Xt=poFY7#}FZ-_CtE!OvDeO2nn zosk({1y!}vb{3y(Fuv>iyEB+$WuiBA<(;#6Spfb&bAt3=BflmX+)1TmWVgV-n>7)e zrsT5{3d;GMeHr5*v;z=>s@#D?j=F=B*dB|N3SSXd`%!BWsvS{|N~9O-Nk#xIwJ~?X z9T>3lXr$jqSAwssmo{1e4HAqkAL!NsH2_o|=5cS_lBN))W3Ujs%L}H?<-ae>Bda(1 z(#hlbJ@_OL@YiDZnD?&McH6I_iyx7Kq&!OSuZ|L+pEF@aoD$<`Lf|ukk_4!ZDu`1I zob4o(;fKs2f0bsXbOQXMi{B4CQpkaSwQ+c}hOwOjm)ABY0+5S&?TdJMB^6E~olk9? z?7I?<|I6a}3M;1(eqjcXO21u7s+AXdI{IzBVIoYIZ2?PATHrAAfe|U#Yrr!;uRs!y zj&q-XWy~7v(ONhQCpO*bjbZ)f@(JqFuuqtgUl1RBvWy5!@<`qnM{d8krb?7U7?rv4 z)@Olmhd;b`6TGeS7|-wPJ~P>rN;Cew0PX*JM6#a{A}S6Wt&!(>&c7OOVi-=17fVVI z%Y>5Ua2`>%68L%1@u=snaY3a+y!or=2C2p12c-2$)F2@%Svg0ZKXT@9zi-;0E50?p<=CD&+BGv(l1d4vNL zz|z8y`FoW;Q>#v&@H^fa=`z+Bn4pYJjP|N|lMOe1Gb(F;*x&ypv%pyf3Z9~|u^U^y zFfXV0Dbl@<#0lFkwip8m0A>x8$fV%K36pZz(xX|u^3|0r>{(7GGvizd{Z~2x0Aaph zcx?u5@6tX2KVAVzFRo5p-z`|$$e{oqxn3S~brPzhlYwz@jnAaWM8`3s7vq&+=QPZ8 zM|e$*TshR~30rq4>#B8#PeVsjkV8 zJ1E8+VRr1xM(;}Uf1@(91qeXO@qYF75m1AVr=h=|M-af+x`8ciIHz}&@W|3Eo()OV zi*~c%wJmx+{E0pg9A$6$L;y$}6ivNf-*a`m{yCHAn9-t{gD)ng7zyq#H3yWl{pHi$ zrO}@E7hyZG1V*NZ6#4-WV&XEw1_@v+Dge06!{t`>P;_LO*00gAi6PPLj=*07ZeQF? zI$mE+G@5rb`C0iL#~iOmyh-ecuNe=j?|VeA;J31yXHj!=%3FuOVs|wJETpIaCcUx% zRF0%HM`UCJY(pVy#$@S$q!MZ&_56kHEvMqRWo2}^W!ez^?M*t#c+r_Q1?ntj3zI@f> zJOCgFw0N{c0pTOwV*(}eiDsJbZAD+fc}ES7#a(il0IL7txr3g$d4bj4arM$h3D49< z?VXjrg`+3Gab`*TU*i;@hp^)b_C_{Ra+Q~Y%4P%t{>sL`Ue-QUKaClJ-}ND`-36GO z{Sy6EVE&iPX!RQPsOvqP6Fr2dKQ1B-jaUH-J9-<9c`rr;975ab@RMG z{g_g|ugqxL4KDu(spkEJPY~4(oy2ZB@s3vEaK9GEa2P68W4Eo7>M_fjkE{?}X zihzneyRKBrkH2zCz)ml{>(f5as*Q>LOC61Ak^xTz&;W+01lbGV$M0Pvb6n5q{ zhnrOEtd_MjyG_R-3!EDm5=&o67osx64dgQysoUyDax|J54m+0Zv0mN|vi$rB$LsS0 zKjCDh-Y9{kzdffrn$=pfR554r9s0**H+a^FvC+lpefH)eV|!}H<1=;{UJgPC@8=V? zwx`q0+H!rZ@)_C~l8|NhEO1 z+TBX4H9DCT56n=b?P`lM6sN84ZTKl$$?G4tx7Lu_pni;ruh zgoQIPf8ZqvLx%%YQ^INzO>K0OC=@o-YOweEIBk`5(FO>JxCkWweqLRpR_gyQov2K} zJ~;1X@MQoW@{g=<6g_^|@3?N%!w1W7K0v_4aV+`$s`dSOV^$L_X-fNNpN_?F_U3C1 zfKK?dQ_dEHF)wk6o8DqSFe-tyQhB(wjz^@LOn`&~(Bm1HO}gW%d*1OE#Bdt}dLJmi z>dw_t;_-O=!NvF&v*Y^c#|uYQjb#K{N`Y}XnizRAii@?o`Ge(w1+u@i5w}6}`exNE z{FBBc_@I^j;6tj@huasG*Dyq8=;CoJQrvcvBZbzkb+oU}=@h;ZM2*8z2< zf0bANNduf^^->3RN<2@pe}uQ}iVH={{^Bz$za)2P^|=55LiV4Fbp*T&aPkfF?;pmf z(2zh@jDJajwKn`#*np#>i3hOJOJ7uTd?Elqg1v444HjM8ti)oq!3QS!qY2h^x??|7 zG9bX3YNzBl4D=Pg?7jw}-g+Fq!D3#aHABnw@1kBxiX^%0B0Xc3w(VU>jT+Owzoz|7 z61u@lA)AWkj-Gr$k)-mksPt^bAwW;5Ckx0_{?Gck)1wFn63G8evG`D-zJx7MuTrx$XgO~lQV~OIif8g( zDhwzBDZmSi8GnJ_x-Cug&W1IsV@lC=AkZiTCcG_lq}eqK>!Jjiwt@82*5G($ub23aT2haprOk1h#c%3j^17grr|qK5H3uxx$qm?XqcAmK~J1}7}*$-uU7HCE=3XVg;svk;*Y`>tHY|>mJDt~jy#J$Q$hy>7(agUYf zI*TA%Oy!||(@=3+T9{pTXFcLoJZ zTzs&LAp644)-}7I5nBu7<{|HNr**x!kJ!?%PkCMw1LQ5SUa&hDtE%<3hp^hM0WILb zI*MFW+O8m%iPsuC)!=WHQG;-F=`FqYfYx!Ny*Bprx|&y4+aN&9$jq!{U29EkExp0e z+E%OGo_naRHpXSs{%SmP*gH%M@GWjHs|5$WqLL&GRs{dBZhtI^TxcfO1`(N!+fmX+pT>BRm^Xf@CXGbSwA(<95 zK&f-OlHHJTst*Yn^^0<*>@fv;hlWmQ^zz=$sJP##iQwRO9JJ(3Gz$I}EjUph=#?7vkg zr#}Q8{^ggZD2S+%+Wq^p_rqdB&@z_)4D0a2YjoEWosrKIJGarXA1yRUMw9Xxr6Z?Y zi~pX$3@Cd_$tYVH_otZ8n}Zx5jPr)U6n@)C+{^hrKsYg1Za~IcDC_vUL@V#KbE9S; z0;gL?d6t3wwIDAH30VZ{QgYVaNA!8W1dg6R0Rf3X;!E?Dd4;A_TA(M|B0u( z?g^bprt}aWzvbUUxrU-9bx3G@ah@Q^nyqU9*^sp^Xp}IeNyLru!~Kshv2#8g=Z9hZ z_MSOQ0hnKRTb>5tj3Na?16!Uyxn;RMd9U6)AGYqfxINFqXp7RfJg=g_kO=PJ+uycd zY3pffevz&kyM|oNuckduR{NL`OsuO4J`7aWIGTT?6p2^^BTd5@`3|wYs$q3p^A`bzp+u5 zlgo`8qoyVCgoJDfu)n+-=tvo@p`dH0pceo z*rD-{_1~v#nWmsxuhnRkH7k{zJa5XUWP{B^tO#W&rK2?-WIYT{G)KchYm%ba?$lYF zJsk_9z`QN)Hl%K*WG|zlIJ@uG7+1fEdwT(K)|x~^z>JZuP0kQl8Po6LY)V9%jeDJL zNUpyZyQOxlJgo3zzx7*`=%XjejMvRB7@HJ+PW+fzJyko}zARj2xrd?HAC0Iu)R$kl z9OSJyEDTDVL_;IWuQ5|C*eNjy679Xh*BmD{u!4r?g=f%6>rzcpbp%q8{#{9S#AWHB z#qk&;tq_h3I?YJHlSE@oTH#bXL^^xge8)3^B5towX`#ju><0wt#_Nxu2$YnlybHeY zYMV4YRnxE`MaU1#^V3%f=WAQb9UmVXG(7hPY(=jpq?Mahg*6jswzkpFDqjNVu$``g zGZbuM1Io+Z7%>{8fl7e{3m?WuQ|j+9)Cg}*q0Z5q!i>qT_h$@cOK z!qmFWh{jM99|^~(`g>rFtrd5wn*ny6Tp?^m7zF~}s3qBNECIic=07cf z{P=ox=hLfW*(|M8VNyb}NG8W|3bMX3Czp$fS!~Eyk1nKq%g-oKX>Hl5h1%yuQ%MhK}%BSBFA$`3nBZL3M~i$gs%)iWPZ;l8-t026l?HlAt0+?BP_Y z8T#WNW8w$dhj6;>Ro5)8zy=TbnS`BBF+xjKaNc3SsUs)A5mX3RhRzX0+CiW9wx>Wv zLs^`!Aa9~XDIA;z_|SZywmug7kM6gR)kS`O7Ahc0e9UJYz z*BP-f)XLu7_L-cmSU79c-qcp}amTZ#C#|G_1`-YvA8y%%{u%-uJZ{ z#|tE0*f=($u7qSzq(*@&)dgpwI2(6IWah0s5RIIOU^8m1#d_5fy zNM%@$x?tPv-aSMfAbnx$3|eY)^Clbp3l0nnFk)^5wHke1YIZM2(({Gf@2%JPy4kk^ zMU&eSyLl!S>qU`B`{fjrTT->NayFSvD`=N|iSiEH2Op!}R_jGdo2sqdQ)5HJLvc+U z>)-CbUJ(dPCd$u9el@F;-}==-hG)gmu%6vjh;6NbJVjf^@&^x#3i=`7HU@UjK4^_U zh5_8{fXCcX2WhL_u|pl2`30VsyqW!gE0O;efPgwqNYxjk8@n1nup-6Zp}wg!pgee* zOjJc#b8WYXYu1KeJAW7SCrtWr+Nl%EMA0Iz7)N0@&; zpK;kyByz)VnJ!R_olEp(Uw%E5$gwn3XY-#*?|=-C5gvpgr;kFvmn?l^$?FGN;q0Vh zTeg6#88k>E*nxZeu|zigKVj6*&lHNUS3bs9O$lvOq#-%}slKjH2-P@GNgi(uSSWB* z0Y${;NUTl?+)-|VFB+nkk$|1-R}iRqx|B~Q>aRx}wM66~J1+RJ(O!PxcMdr++dY#! zkSHeSRYwCvcp43CtpzNv1uU@z3SiOIt|2U=1uTY!Ev3!}C6IWDruj93f+e8e4s^Xj z91*2!js_U;R8$!(H6_lra6B5y<~ym_NUnkgHfn*<$)jDFpjAvikcT;-V43R;N&{d& z3YDxU_PrUw!D<^tj2H)9_V#<)s;G5fV39$;%mKlS5kyt?M0T0`llwxPI+u2YJUR8jLAe zDfA9)Y!Yq<+pA;EI1p9JKD2LL;)~-_93PXCqtcv3HZ{Jgs$=Wm$i4gi1KKE6->N80 zK3L7T0MQr-)He(1X^nzAx#J~RDuAW|wIE4G_(HvnM*4EPBa0^#m<8>z_)6ultg(1) z@(rUdBB}62QDN4hxnt`@vCKDAy7@%R_$rk(b4*1_^y)PZ-_(NwcHQwBs=> zcu-5ax3SSZ)uA*!HGTaGgFzWo%mC_9-i~-FFC6myJs7vg6pl&Echhk3PpaEl?)VrF_{dJ@6nA`3P(ANy<; zCwXfT>ypEW4q1<(!L z9(ZtL=CrzdUZZN((}}2>=o$VB52v>j_Lon3#RHyu4AUm(wdDiX{C=wc?q=HaBs!w~ zrd#vjldR3#4K^1PWbYgG^mI?vD06ZS`TtDa6=5bSp#P^`n=M*C^R;0)L{pO8Ho?i) z4mC=UJb%OmR%Z3ZBtyWj{jLyWZ8xucuUubDrhwb_XgYFVws7yxBM)0Csj7;6wb|zC zk$X@6@%C>ZpO4QucL$C8n=|#V?F&%>#NDa$1HpB#5MW?he0uxHjl47OyH$H2`7fvW zhElfiUlqWP##f~Em3}}e=*{75WgjVdw*uvWcy?^gmVWHGr%%RI!0Zztw@UuIQ z^;5G6bub+MAoAF+8pW}cX7iQ!sYMUX4+N$`?mzF*{J0uaFB`~n@N(R>JSd@ z;Y)0up(+KL0PqALe-%DHz|NL5C00`!``2*Nv!IUOcw-dBk3K8HNQ%IK-N1;k$Aa0& z?m7pp{7Z>LVtIgs8W7>10DyeJ#Z|=X7*)+HDl@&^BQMOMR5E|BtF_cx8U1JgxtBfOT6Z=*&t(%qr47y`_rYXY+OL- zM|R&4>_G}!c(TJjM#U*G{(a&%D#VA}a=%oZ({U=g`EV@@v*BM~E6~iveJZMQsyt!O zqWSxNyn@VlsjiQ_Haygg$mjo*PmFaT+zdwNgpip9EWo(g7`%bvzzS55kU^& zF|)fJo6Iq*iGSOKz7=Qkn?81E;HIdc%zo^zn;kt&KY5f=S&qi|Oi$R3?lL6DAg<*6 zn_kran_l!ltPk4|7M&G>37KzkH07jg`vI3h-p>0?rqgwf@Sx|TC_~iKH4{uc=v}0?fjw5`NNyYC1 zaEL6Mc#K(pw5#{DCVXvS>%O(w)G5W2-5YC2VN5{`%FE38Y zTe1I?erHqoteRyu0dxptqlCQRm-ipm@JOeIrUIWE+yu$2H?kxXMDKD#@X|t+YIHn@ z85jXZt%{u5?SqekQx&|n@j>Ty3zPnNIyq^5l>B0^KRPy-Kc~=(h840%2I?GxEmX?L z{U_%~by3}z0n5YDT_K4LzT)eq2+S&{;J^g`Qu6t0T2YdK_Vq4I7Fg=zEFrbNiv>iJ=?5^ zN|hNBdbU8n0=Ys`YrKnb)pEFa1xH)Mh3uS;mPv3?cIi@zYW$$(a~LYQaZ}qGzq~t- zF}i7qbcNC-<|CD6gO(((m6xb8;-ECYdh{AAj=B){UWl2rc3U;oRB_p!*48ZrNg+Ds z8z@Ji4anQvzLjg+i}Yc3Jfwr? zYm2xIcag7-mS1S}W+!cg%4?eCf2%u_Edp}E6b@If?#dxg&wOjw)iKYDucI0pqb;~Q zM_ThPiEX-=E-0zdYcf%r zTro}s>^Cr%T@uM~5XAO)tyOkX-g!qs-4H>2wvUW*|JhxLh&z?%BVIg9rV_9snKKZV zsG44gf~dXrP(bSGTiboUPi~DX)HDGVXuzKb6Axm8Ee+6mB@xcdUPzX-rOn$#%htI z3$TD!*p2%=5?O}wD@J|hZybTir~>42-Qk$Bon%? zpuHiT>tW3a%-5yIw*v-75;5kVSy>irB!6Snlz)wYtj*e0y%ueRKJ&8qr{TVbQKOL~ zEBXjUUfi8DAU=CX=Vh!gmyb9o6@&uNN>JF#H*u~_~_+2ehPXOR8nBzm$y z(D0sEbetbP@9WH^%Z*N(GonwVyir~Ht|(#7h`4hq>e>tVMJ*dxGg34}BoDtr2i8+N z_a)Oej!j%x)MroFg!ZP0#^6m4@e_E+6MPv^?ezv+(Rc@{=nk2?&IT*oR)6nVi18Yf z68=R8AFf%bSBt9)GW78J9V|A!DcxL`A? zrdB*V{SFiS7N>kAow)ou^dg=5JFI`B&m!uxx%X8GN)VtBTtp6gyK*URrBpH zEEKG&@ok+gz2xKjQ1PM_u6?#cPEB_au4ImZ|87MG`y>6`ZXNk5Et#6ShFH6s3;!QP z-cY>s>#jAj`?lyxii);sR(PNh&`3|+E*)=vc zrG36@3)f;Afs6*XKTv@`Re6~vH-szD*WPLnkjku{UPICb`p#b}S0e>|@nuWVpl1;O zqza-t6TMm9E|Y*N=IMER*<({W_AXAh+B-=nlQWPcI!MhCRsvIYFPJb*h#BxYshh$M zl-cVwn+4QwnuQGaa1jnhi1o>HPzY0_jM#MDA&UK`xd*W2-Q{s>`a3gE{2ayUuMK z8B9a^shFC_AvOiY<8Z|dLRu8sw%`8`TWpMAh^4Gf(CbY zcXtc!?(Po30|fYo$n$=;>Qeby<-Df?@U?3neNQDduOU1RdkDhAc z08pqw!L(wM@(x~0h#zRu9<=`oelyO|P(9<=piW(a(!`r-H1cY~X&IL1lct1Ea}sZ9 zdJ$m)y`=y6etvJ-i@Bgo$jyiZxO)8rnDT;xhDBVJ-?wPs`J>fHB3Jw-|_s&gB{xHMrpR zdpYs3xon#_un6mg&Hha`mi-=t>BO0Uk1v+9`Z)oDDR544K<9&H!xqnD082tuTSg>myjP0c3B(I-Oc zS%0LSa?`tvbGH>Da5u#q)1h2N*ORSJN6j98QUeZ+HXLroeGIQ2kt@+=elon0af9&9 zthlU(-M!|>8`@Z_$)z*R>>gQe8(X%{jDF6`9F2nMET9`k`CC}UT>D5!{Mq$_I)0H0 z9^uJl^<^hbo{L&Sy^kAt_(mgUMu}263`blUCVF~*hhglml{4jw$5js@AI+b!xS1Y}R|^i&aS7sAxFqj? zej*!er^oU4X@MLV4^h*Vh|m62ZE?dKr5!En+eg6Fk}|7M>ii3mE3qYP$2iYZY4~C1 z?l6)+a0=mL!fpDC=YF~SMv)gno~pt*e4UCzdNM>G*jqUy3QG3rA6Jz*MaJnxwCzIG;G zZk6Q@ZX#S4me5cVBQk3AeHKVPtNTPS{6I%Dr9*?o0)xPZ+>Omy;(pu{*E5nNOR^kH z%=q)YB{bA&^OM??waZ6Ti3!DEVtx84XE4p|AiLi7FwYEy{tN?WR8=+q{H2DwfbB3T zx|?LB?`xex=k}2f!YGMIi&Ag8q3e4P&0!avgU(Dt*=uapBT8om7Jf)h?YwCA=k^^shc=Bj|8Y+y(ELRS@c%FB4SSK}}@SzJX zGh1D&Rl9Fm&CrYy`TCM}{TUt2dTUC-KBJ4Sj)vwV2Aw<;2XYlAXOzht`mN(hf3z3OklhLWa`@?Ey|ux5!AuqVRs(C_ zTSyKGe*LB|_91$-17$IzI4UVMkJMBY71)gpUcEmnQIQ*%qOwDHsEQnZ1-5BnU{r!U z=ZGlU^aR!=Y@sK3r6Cu_dQVI-Q&UpHUl3_IzWY*ObGpvirL3Ku5kv5iQe7#0M3uIU zGIU6SrguO2^IklA@k(Sb&9Yr;Gg)ACE>LIdw{_*?(}2tm3vb=VoQMHgD+uyv$2NV= z&71#W5gX`CTtt8f8IYs*@-YNPCX24>$yB_B*;GHFANzP6VepGGYf??w3+TAr^Zx>90cj=Mw?7?7zTzI^5&p=@&^rcGZ}IBaxHOL>Q0 zeKf%JPI#kleey;ZUH-A`_neAVKXJg2JMJph9SL6JiQ#7>uRO^%-?jwF1z`TD;0 zgE`tw2zI&jOfOn-6On-JJ6PY(dJUAs4GFwGmeL^e;F!`lirvlg54bC5u*&3L`~#Z5 z`w1V<<33X6xJ})K)=!-I@6NE^%y^$S8HBgb6xfV>Ho)J6zM%1KR#(!?no)2z=+6=y z;?T(tV6L>{pkxbzH&!2C?uVGpGEn(?Bnr<@WkpqmG+;BWa0kBq8@eEe9MNn@!0Xs^ zkc0IcGC0~RvmV;kO||p*I^5@6pc}6%{%Q06GpsDRqBvfX9}Fc!A*N)6qSuT@`8xpc zj{U0OYRVCpARN`i5*z|eeAo>0{a{(9q9|Bg8l~h%6jyEf{C%xwOv&tC$=pj*k;-&) zf^04Fp(^ft?R>c!anV38IO}OU>zvvAOqCOfwq3>?Q=q{h>y5VzZdrX!mD$nUt%+q0 zujS3@LzPZplD{L_QH_AMda^e6BYOSil00^KcSLnaM4`$hA)S_a#7NF*Qb}Qf%;aRP za=={I7rF%VK-p8d9l2vA2wF8thRzJURu7t|$6;58N3`eErP_PwO!U-pRRm=v{rvY= zAqN*FX%&Fvv9; z2~+5>QgW61@&2BZts!rolWSUV8#4Hk%lXVXELYrP>+v`wxu>QMe{_Kija3kM8vwwz zsyx5m`}a=((5J=^{-SV+KtXQsM)$5_!)}pE{k?(&cn)hzkoFx1j|2#MP1MNV8z$93 zbaCa@Bx+Y(Qz9v4hWjMqMxIzIY7P_gB0l4SiyXEnpwbtcpPPeR_F56tPzCP-Y9>?1 zOds1rx{9wzXBBQN|Ye~b}TIZR@Swd8{!X;*|TsG3&KyN+TJr#h%q2SL-n0QGnkoP{!Q%!Xn3b zRkcLjtSt&2LV^h_sM574vEID74s}7lZ!E3GEVN5%?Cy()@AMCcIRj_;KIxBE(YGaX zk*dF=YY;V3WBv{G`rIM=_~op%MI~$?wJFTxYex$+H;EX=rm0Hz!$@-Qc~I`6#a*@s zjfYZnG{!<-4i#qBMw9evynif8=7cxV<7Wl?si_8~|0yppDGpD0$GEW8a!0j`-W5$) z%ZTBJ0|IA!qS!fONPx7h?SzJk)C&~WgX1CazFuy95wiwq%9 z2(QlI+OX^IfXzWAfsXE}hDB(!vQ5({vLGEtxzRdkKdm^w-#4RqHQQP!OR?ziS;a0M zO`Aoa1w~j)z(=|l-iPY~A%~lLBvdRA(!d&qP$`=0U3##Y3IliKaKv*00(B*L8)zdW zTeM@u)nRV3{B8AeOGWmjtNmGkfc}9{$(*$T?G(^l$3(eBvoTSY#7oSg+_&;h6}n&ef+|TioST&lo%BvC>o1C zx2*vtT1J#}p={#zc5%4x0(MphbD-+yo@AuZy9{i@@qN+fAMBT$=0v~D>))(F{KSqM zY@m!(+^Rlopd|3gset%sqepQ5?tWz;g%AHxu~OpJqs)l@j=2X_ygI>)uq=>&dE#^4 zLeMrWd1OA+it{1n!%hV2^;)f^L)RCEBfmr(8NualM)v#~%@DOt{-#Nia`ZA_?Rr>c zgsThryEeUky=xYo+6wD05)y>Gk%qH&=!|MJ5N9ewjaQOChYy=KuYITW$FKxCm7xSW zTqHHkWfbCfz?RS-9_w~;zRGzmi!YNbE6xu7)KvG8ersJz_=MCtO?IPNc9oESl;B*K zcAQdWG_43oh$JjZV;+ak&L+`4?vJZ_gc%y)F2=gMQ@nKfV;o-EnlIt|s>QtpJyl;x zT08}T-3t0^IUESvwp?=Nc}RX{KZ;>M9svHt15gOiaq#p434s$&OZv@FSPTRe{c*+z zJIYbD`n2|YPZTf+B*)_oxgv?TGh|B{f_}ZlA)}QV!AdI1iV{U%tL;k;^xQ~Kxju^I zrJ`;z$%1jm)#MRm7CQ4nMvLSrO6#(64*G#!!1~5EB1#5djVxfI{Z^!%SD@*Sc7z|? z>i&fD<+W70&R~BU3|#TSC%y$R=>o_BsmHwShpAqJ2b;GFXI{}sZt8Uh5A~Mk?fYG%k^{RGK$3Cj@oon6w_Oix zf(@r{S88FG>MN8#{K6XM<$1=X+lG+H{<;Z`-+X!o-!HIASkfJ%;sPK~Efxs(bO;4; zicGp%a~(oXt{NNEE0f`M!>~Y%;SP^#%xA;=-VMQJc!D$9{&vLQB7Ovo6zS#0`%(*d zoQB?6$=`a`eE=l>494i~?~vI9%iG)nlVl{bKX-b)*_*etp&_3Y78BbG!9;ry|Dbum z_YD-!%k1|D5nlUpY%npX{tci1uKB+|r1JPKn%|~+7$7tNh`hn2L54dfX~3(0`}@Oz z1_Jnjo*Xff_>y5~u2kAtw69Zm{qR$hWTs%^l>J!yH2C+anbfcUjpA5GMg#u$(BseC zg*@o<%h`?mMDq8ZfA0L}dxG3Iumb0}24)%{E>==@8e4;q!T+8rVCM6G9?h=S&SJp& zRrGE}>4)0C2Zy3?xKm8^)N@=vynDV~al8q&`R|$yA<$BFrM=?!Dc`z2+Weeo>sI<> zlJR$9Lw1VvVxNKR{qZ1vf9nWlYD!{;o#L0&_o&4rj6hHS8J7tqNP8+70NGLH?Z$z! z$HlwtFv9d>pUEIuOtit>syZh<^z{Vrl$wwAoy=U8POyS6x>1LdhzQq(1LlZ zp#5?&#V6SR&zik~tW@a66c>siFSg{L;vo2Q1@OopZ+s=Xn_cyk=3$Ef&v8AYV~tgK z0_NXZ1N*EG(lQl7vF(yXL~uqGTqRJJ2p<1u)*Diw4nPw_sR>5ae=F=8@Ct&pr_!2n zCz_AuPgSBzuE=amR3U40aO+ww-lLu2!9V>OlgoQwjCP$JLuNZKu4Z`~aaj02Q6ONz zKIgBXusQs={Bpqc*Y*~~k>Bj0SNk@xvvjt_)9DttBK7XTnAaVJ;hzlu-|cWypgLsu4dsK+%JMhI--;3bC$Iz)I3OQwSOU?H{QfOgW0=oScC=mm@`G6a zfBz?g;_~B?QAYK03ai;xo)HYQ4V5t;?4Qj1pS^7t*ht+JM>)RWX1)4~&BF^J{o6Kw zJ%u)QULh}kS8gSUt@3EB)$JW_A*ufsPetrix0RiZed_ur*vue~HH9<)ldBTv@4x+k z1EH7EJi$hBWRP0z*`O#X%+BOrrRnb~6GZyowl!w(&&M)^gja&Q%6wyO^5*~cXMh{Z zpl;6Ju8QwjjG3AzA+>(&U|d72C?(sU%VYd~b6P`u8uJ{2&hqw9^?E|<3an(!{y#!C zhP$?Ei~+pd5V6?2kFfe%|HcXlOzjh;u|N3#hLMW;wr7Kb(!vDvf9v!>Qu%0uM7xw& zR{w3=@Ii}2<d4&oeU*=RJss_=#ri zd$ZxOiXW?A_4fV@fm}pyuUMOWb_^TqP_)Z-j5x#Xo!rRVe;Q$fJp>Yh?)BK;f{P#!Thad-(GG=kL!2oefYkgW39(`II-OXrFHX zE&z}bf!AnJdoI&#)Cb5X=ud3VTQa?W%ku_Acp%%a;NKH@NPs8T~~4- zM*l~K{@xP!%?1((a5I-Lc;J7c!ho3Dynp*hLlt=G)Lg3T@ZZXA@c1TlsGoQk(w7ur zW5k6}F@t@V=^e(SmxlN|?$lTIY!o_~0YhEHr8bKCzG_(Vzp-nBy5;w|&VNZ}#C~vDq@Y|p~TI`>Y!a-uED=&_}5FoiVI?eL^5t#Ad ze>eMqTrWeUcO5bF1a#=KqAww?{B)(t7-!E zRc+T6yn8e$R$FZ>R01NM|E_*j$el$<3!aTZ=+<22^*Nk|1#|B;{wNlpg5$c%PpeF8 z-~nS^2j0AQ8+zaWThF@RDE*41nGkxM1|6-Z!w(avvel%5`qI{rcs#uAKa=w5ltA$T z-2EIOp?`1ZTh&*kR5E2$L>DE}8~1q< zh&pG#$!>nHS(?|5SXS4knT~zLkno_gn%iwx^;(Z^LCvl)Z%?()1V&*RhwyMfO_1#npBg&|b#-b>UD zKNkcZb`}qhJo;Kq9eC(dteSsXht*Hg%~+Sj86W_b0YHM3_x{B3-zooZnXE~EEPuy8 z@VC~<>!}}9(zeV>{bf;HT%6sZ<%O^9+;v({`O>`M9-ZJ`WL%XPC)n8;e|)EP2dd3- zL8aN&X4-OaF@K)zFLtXSm_ov&Npn4>N_31N+@nb#Q)|Nk5iIJk{ z+@}Im96CI#RaSuwWmy#WjEMYTz$D5UvLN&}=*C|mJHw^>@7#2O0@P1*e23Ji=!&vJ zcC+i?2m{=!OxV!+9vzv@ZZ=em5_-S9p`sWn@NW0SZ(~0-#A5y7a1?Fkh*VjbEht=~ zs;0&N;&OF)K(IEi?wHSgYrw;$+BrM+jeBtnn2r#$r#&#*${Wlzj@GX55%hMx#i>0Rc5UJ2uL9v#4 zyKViYc4rjo&weH&k<65wgvu?sx5(!PgUPNA3a=#`B#~Y z5>0%4ISqq_`Dlr(f7IT}QbMc*?yDl1nVs!t<+Y_hL_dq z-EZpB!8n8~ihY#;wjM=6L9%d=F2sGfTA`EOkp4?6&D``+YyO1XL&c4r3?w6aCsLkTkMD2YD>A#i%e*OGGPGf&gl z1oUss-$@RsR#T|f!Fnl%jux?60}n+=f(`m=jX;)aHAwe<|9NpLf{OB9Dv49<(2u)+ zB5z+yZaW}dxnMf)_(f^|ams00wZkh{=M3TwPrg9*DF%PvLj;`fou)tRW+QH#1IsZa z-0^X8ZThX}JbpuweHG9B$-OQGY1KPwbEd=QK=Kj};tHN$@`^G=rP<$%Mjiw3o`!2! z?yseko_=Mwa-EX!7pXb6-p$NY(zDYL~R^>UHTg;qpJ!bLv2IQX}x(VCQ6 z8!wyRoVD-C=dDCuu}#{Vec-EN64m$QfVL~Hi}B3#&aAdlZ*+rC<2|u}hJmtzjK6A&c_U@m@AV+2(+ZYQG19&-NjpsX4nbFK8D$ z7Q39x{8X;-j9aB}#e0Pr#O*)pU;^@lQ$bjY4PSM6GL@+e(;d)OI;l4^>(8DZVnM^@i7AgD}aWLV~#=dXxf#lMJ3&CNA`UO-4lOOVLh%}WiqfqnS7 zm|AU1j#W%0%stc-+c*OIczN+wqwV2>W2v`c--6C)$UrqMUl^6(rSZyesnLK{ z#?U+=f$zCM-(;PxQYUlfM*+>0%t2_D#6*Nih~xfJh|k_ zIg00`7ifajf69(Ol;f)D(Y+=7(WkYHK4sG7qU>WXWaMB*p=$z9x!@Xh5X{JmTQ8iM^(6Mp9|OXpIr?+OWZ7EvJEwh z*2{~oLPG46Nm&+}I@bGbPQo%4%8d82GsHm(=rouUYQB%;eyrc)h~lVr;gt8(nr8nq zQ#J{H`QWBaGfrcEqNiUQYIQO##;B{Fvg~Z@)oaxkZQG`5`-xHVd7^I(%q&XTUB=ZP4*f8+^?{rz`x6N|J@Ro7kiYV#}9oWc1eR%3d4~c-y zCZ|6WV$AZr9zRce6u4vmIe87yH`Qajr)cD>?7#GZGBw;LLzjkkVnDyOM(yHe=fkZm zO(NQVb`9VgCLkRoE(Nz|FouO!YD!9f#;)IkB($B6+(?qJr3@Q$+A18p?kjjPnvbtA z;UCWmn=A3&47sw(UPpfxe{p;CT5{CGhCBSA(7UTv=Sum+@+kFim?naX`zZ`Up~F&f ze@o@+*zf%CDuXYV@dWSc)h>Bl)Gaj9XVj<1_j=@lfT7I`CMGX&Xc(TO&*ZLfTWFWe z>1R48HQ#5>3FS-|hb>!cm2O&_kwaNFfoR-N08tdZaWM6!T}-k<#j)3IDk5#FTTt7z zz_nwkkhaXATaj~?GfRA?WTT19hn2{`Ek)#v*A-o-;S(m^RdyJDpEk==fj=L`)EF`A z9zG2w6hp~G5_y)mAktKD!mA;^4=0`7ewstkksIx$nIQ{N6QbP0ydWw3fISpX#Q2HK z?WO_OVfoA0HSL}EV9>1=y7)Q`w>W1nn!{>hcq+s)|2iGFu$Y~c<~IazkUz2H-wb-* zp=1%#PQ=2Dub*D^W?2ZogA%MJEhyzzpD1l{JI>w1RKt$wT#=`vT|T8Zvca5LTGS`) zohS|QHKKB#Fv9SaPvBAdQ*D$gct;2n8J^CY4oSKMz0+T4J-db=k)Vd|A&p5*rJDdd zC#Fw2k5w~%(p|SBSIY{p0VKv(@8DM-S7dO0t(&RSz1J2_Z+~Qs!@AwZU)w7sdpm@@ z4Q#2>{7$zC!==jOgQ+(j5_%ry(|*gm@>9@+c$_?G7MWqWr*@f8&Sdf@`MI}m--h|% zo39-euhmj7aLa6LlfJ+18^=y9KerH(C%d-5kht@zmt}2ol7`6p*0?olcwHg&SUr^! zyOvS|P|TJ>tD%QE5RH-2hKEAfO20MU@Rb}~MipI8#HL@5m1@V1Nd}IZ-a8OebBj7! zOTB1TM#P_u=!=M{%JyRk^OZ~I$XJIC)edIkx{&u{#{0BoU54)rkoa6Zt5GmMUJpR9Q|y2bK_ z zYW?CJSJOp}A5&5ZQ`%E@H2h~rn~`scGD1Moiy=p~BFMZ55W!_}g_Ol_}C6CoVXY_ABD|e)s_R zOt$C+!D)9xqi0z=T{{QqP|6&5FHbq$za}b00;s-;l9A3Q!5Mbp?7Vb@#XN{c0F$9jK()CnkMV}mEF z8)?I<&K|6{mBR;7UWOfw;r=+k9UzIXeWT}F*N#FYn)>_ zq?l$_X$&15cPU^=OUVM`UXQtd4iW*L0E&#u`YK_4ZNr(Tvx*b=w5$bc7-w zg;L|FAJSH>A;0pB^*E_)#OY(`pg`2A{`U4#T`^}Zb&+KS?re+N`HaT!oLqMaoa71g z3A{3&^-gr~va&S$Fan?PvO?ku7>WOaSV z`wMSmYspxWXVEp6bynUlZsh7R)De5CA4R=5!EE(b^wxd{=2#SftesB!up0PV_i1~R z&48y`FKckzF{(@e)x0&RJJ2&kE*;_jL`WuSg)Q)on|!MAEpCy0^m($<(N?}5QZvCs zlQxCO7Y)yyZ38pU6UQnJ8W2#8AfHCFo?eo|vabO>3a!9B8YaBW$+MElP!VP(N$HmyFkhs3R)?k-Jo?MwW zp0SLp#}b*_*47#oW>M>oXWKQw=%RyCm_DEAXeAD2kP?1aniTdT59R57L>1eoIld7r zd#A{RjfbsF@wM2v8J!xu+4QSjE^;{8V~39w#og_vk0rY6PFCENPV^b@Ar@aRzgyEg zjvb{gBrm8|SZY_4D;2LhTkZyUE+)_8oN%g0O5N@(_aPe!>DF%?5TfIhCfca%M8y=y zesDXw*hcVDp*}%nh>jAEF#toWO-CcT5%K!^<#JqrL=(t)L&=RLx;g$ibl>;k{dHGG z$)TDRE>*WPxF?C2lGOr#@J1koAS2=Q$09*a^I*1JpXW>7eT5qt zcwkF);Xp)8t4**%cDs1f>DO?2$xb=fD%1uPs5z5*a}q1^OFPxB3r681-GpkB@YN{Q z?-l+|2DA7=M}zE}`tP$P6!$egsGb0L78+_>NyMr}QI(5xdv)$X0?trK*n|-!TkUKq z_W(MMDI6O5lH(%6DPnmnxgCuPk>+&SVdU;g6s$N@jzH1o(Ny{f^3v!~VlD+rUSBc= zRZlU${mj_3;pNoJp4_nM;GPhRm5KGy=n&imgcTf-?`r+o2Wc2p>%2+N<>^(7@R=~C z0@fA2(%;;^)-<0QbtMI&7Ws@XQETluBM6{aq#J|I$D-uBJ7A5498g1wvnLKvj`<%u zwER5H^ea{(nH~wU?Q~w6V|VR}=N}ZjVVkTfR&4fKy)po}$sL5OegUypNbWhmk`o>K z)^nhWf(X18K@pnEaI_0QRb1Qmp}9O%r31Kc5hy0~-YhK?pZ&V9JaUX=09X7J+qJ{G9~yq~NQzXGPkd>~ zLpCK95y_+_b&!tsHdf(}Gg#H3;pK-F;0n@e+w7s~ zFyb2njSWTG&3%;~R&x`M-6P0Tw zpX~V5n{v)sbJj7*ovuHaeyv_fTo{VO#`3P(LqyjfC9)uB7xINZfE}eCgWL(2tPU;o-!P|a}*C3E?^z`v=$qb1u!AM`V5~Z?4D-!_{?j3YKmx&UfJjNaBA8 zHjC)SG9PaqUfRP)J3%u8Wi1^qmPg2^SCG^CUYqvpWO>%!(#o58PbR0=+*1f@jkFFT zul`uNgYH**)3ESU3`r(7SieL${_hw@raGwLLNzg6t4h}1|JcIHG@d zzm=MOzWe6HXN@-YK=}PwmV)=MF*OzeevtUSFB;ySOAz#y*-4so=Q872IZYxCNXAmW z9ApGZpV7+~CBGNjM~C{gbKpVe6^Ijbnq)^6?WgI}oBR$ojuKY_HEW6sOEas4$d<4q zr9(M~z4B_rarr^j%L0MYd>|_=fht!`hNQy<^<`6tT64-s@0m|XV z!7Zzn#LPIQ9RN)zwKpmVfp_y+E9n!(F|X0_EEx3`z<5(A+w zwXO>1RMkpLdil<3EAvo*#b_W26?--wy);<_OvE)dJxP>V-4t;|OBUY=eefx{?F56% zeCD3yOmxa>%XD9n>Iwx31BsG;)2*%fI!B-_VE%n|QQgv=Hw|~%;)?`f*Cz+`2&5tR zqzE4Rs85q-yz)qO-qr(dFON?tB(OMDMa)R_oDyLXm(fWq-dI3f;inx{%HBHLzJ?Yn zmvWxhhbTXxEm-lP;cq;d(m_46| zFF%V8o+_Zm`uTZ0jQ8Vzl#pP|%dIU)YjK`v<@BCPi6B>u2=`PXDLKW|M;I`U} z!4rS=X2elROGB9QqUidWy<#FWz58f|M9kCsdKLTnBEtGg!!4>yFY_+HP5Pzzm^Bcc z#2x-DQ!~Bw%YKyLDGK+*TCMi=-v0O`c7&&(zgt9Q8FdFk!jQVU-Od6bG)&k>TUM)% zEwAQhKW>XF*T>=g!(mI_Lcy`_YrCgqc(obgZue^G55%JKasW8M z*KfL5$6q6I-|c3rx1*q>E!R~}6Z;}Eg&pB73BnVqA1??)5F=D!HF}x|yyxN}6Wjof_sv$`7Rx5Uc9~`booiEN^nW-hy^Q?`%mM8+N zLzt2o&$07-5}7h zDs=cb+vf5kzQFY8eL_jQm+m$3(|QX+mE#y{9lG&6RhTjDeG;$n?$^&t_m-Oxr3)@W zuduaSS{(g%v+1$A>x2S2WApHJizG$iN#wDi3}TDjx3+vhMBavP8y%aFqLY6<;#3?# z=1}6D!f`U%jU~RwUHWobdSfBGc4s+tG*q^63uN*Fy)QD6|3P@Lw#nytwqK#E5o6ei z!V$U)DR?{`5I5USKsKpwGbqq#fTT;rFvdVmQbUEeE-d`V4yuQ~#V3+df;AbSL}e+* zb<5Hm(BE}6ruPJ}YaN6LIv66h^pSDO_s`7nYt&_hMTO-n*4j+w&(emVg=iSrEVRVB z1H+Yu;0_5UP{p4fVHN0`Zy7PR7FoBSv0t)c--M%5PC4yuWpI==MFGJ^I!AwwnNG+Y4=;aPdy)fALuiM$WP49S;ML|o7q=-PbTYFby27UL9IaHb-~ zlRmKwSg~fT0v0;-`3bI)OWb+RB+d5yOD*XUe&LWd(-|`U}p$hB1Pi*^6YP#oR z_dHZ=%@zR_&(bCn$h)Iw*dAdqYEmIvTO?%_mFV2JPfroLCUZFE6H>OHirB9D;!$^T z47xk|WC*#K;z54)J_!?@A!JWPTK_r~(ZUxFH^P;te>SSmpBSojdwza<^l^m=H&`vO zb~oXqr~VX2+exiH9qrAQpKW9r0m<3d#)Mol4Fe4mIFNV8mrw{*UWY_gbi$vgChDtQBJiHS4ek(^QXL`4596Ul!phPRFKy>9`Fsp2Pg{kB)e~j-8mzH)&M^jp z3*U*8^J%$-hnim#20t`l8-{je(s5iMb<#hfp*iY)%S!@M*nIFFl)exZ*-|>0FXmcHMHJfbBQnmL1IBk!w9CO-{pki%MwIE0%n`+-{ zC}d417bIA+6s}6+{$V$1)QAciN}lfNeDM%29}&eA?!>Lw+;XDI-_OFUy{8O(%j=cc z(ug1D91#hid{g#PadtvR8sFpJ-;<)%>-q^TQf+5{qKrjE6AqT|syz)dP_(qwZqiqx z3e$6rJE-JW@%j?2=EMKTN9ONbedRE&ewpM0>y@l3)EH z5ab;kU^NMTDhj)Rw(uoVkdp^yXP45Udi@eHkp2uS!lsY3WfPe!IG9LuD9p@+Fc0O@ zY;_E6*hY|~(!)fufGVizY@G?9ep7R4JxH8U;+eyXIDCSBhD$BmLD*r988Zn@I6_3e zWgni$=-wyKjPGQ}Wtgmo_m2*a?@6B{$V+-VEP)DIjP%<0%TOw1I#qd4?CG zrp?dk>2n@_?mKJJL7dB9-szbUoIeVQkxC#WB3j(8n5gzRFp*Imo=i* zY&zQ8ISGcZ2c=ntxv7AZO2Fw|?Mv3|k7P99(q-DH*obFN?6%Y#roIiH;pEk7Dy%ie zK($p|wBfH!@R}K?dsC$5Mj`@Hvo{yvIa#d!9=SLcOKbs4cqnEetruJPXZ6q$cD^6y ztHlg3dxHTwR3nrHbIa;DbU5u}nXZjE4Sdh02^qiA9Vf_>yV|N0+qs4qF~qkL<`+%+ zrxxgE%Jtg98rgz`62O{5~#TZcb@3^G-$4TP% zTIiF9L|MnI zX_<$XVYR3aZ(SoeUc%*BvR~AeVP3kfJso;IjVFf@p2R3Wgd5>!jfA|5m2Zt8@-MBz zKDvtn>cEP`xz13#GTg}E7`D(9$(Jn32*7}vwRA!t>k?Bi477{mhRzC8YGMaHN*fSa zVQoDVP>PF?ROWdij`TgC?*_Gg2^GwvL~=%!KM|)=-Xw{KT;jsgR5jQRahF~`aJd;H zD`&hsBa@8o+u<X?Vs2%jRpxE(lwg6ZiZ6D?My^qEy;Ujk?x=*|cI%b!w*{foLE zm1mjjFYR3*0$*QYaU#1rL9F}Y+bi`6$-q%+b@w7>C7WmX?hl4#^?-g~bwKP8t zIla)RK`d|fg@gr<|6bTUju+=fH=}8$W;~u)GAi$QZ#oQPjWWSQbnU^GbJcNDJR_;% zNf^n$JH1Z=?@n^dWZQO=r8H%`la+k&RDu=dYXAkiFw1VhToeTji=oJqIq-OMaz~Nc zhoc@L{O@%rEz6L`e*h~VFDRha@hc*$@Y(o@4wV{6-~7P^l91+^R*kOKUnEaRut5b< z!cHq6k_mIF^-XKGf&0;PzR#KV?v)}w$Wo;b$LN@;+`Zt7hC5u3pJ(7oiWfGxIR?>A z`VgOpeIZXc#3ULkrU+hJr=C{Z^AqzOsH`vn#{~c6Ndg_w?}9Zzdnt6Zc^hGRAQCr9 zPGALN&$p;IOc5PD;mhm3iD8zpP;{S`1qL~Th{?PooqV%ir(%wQpKUj(wjTCMEADSq zwYoeYMloZW+U?#l)pWyzID##hl7#0NGSZ5SA?f7x>Us;l8&4FEoh&sfaT{Pn00i$p zpa@C)$6EFA@q%1vkqOe2oL5>Obj!+U$?S+rr5Fo(Ryn>$131TQbR&O?$EOhPZ%C1j;K!UCj{mmc`nT6%2Ev>XH~%I^7C?%p zrZ81a=|kyDf%oJ_?YycxVl;19nH6SHfSX|DPm{Hz2ff8wI_~nHwgq zCyrvNHZR_$Yt-!Xv_0>CA1J<^x8IN}Bv6h6cC!G|xvz?BCQ3^{0GMXSyU+->Iy)>i z-rqzEA9|#TFffQfi~nVA{A74#LE+0|6evQfHl64<7%=Z z9Q*Ip(TMF#!+^D(ywKvr1d6oe2DktBC;rZUs1qsr{E-#AI_RpMApew*h;?~s{8s{7 zve?E}m1pvNXQ&xa|BG>d7rPCTI{!~GHy|oIp#^fQu0&F%qaeJ$=j8i9M?mm;V8STN zW#NRrgNDc87s2=wy`>fGoFK}n?IaK#Q-=Fr4um#{20GecZZ(%>_&FUY^FMkjKG~14 zYcyVNcM~v=+qq9${|f^DFB+@?axwX-{In9xeHtKTjy&>N30PqMVcqdpfI8)&O_nMr z#inZ)&y%{HHUm`OmLNJasgQ%6x~ra^zmw-52c>%-h>3&O(ecUz-?s03owNpo?*{)n zkt*HhARM7<0RrlZRP@sEeBwnzGXc{iQitIk_y@Jrh*H7o!qmA<5BwzBe5n6|)Rv$C zVSUD=M=GG%WdeT6)bLzsH%)&|^u6>UGRstxr#=oH* z-gPk#Bl>ek!7*p!hr~l7%O9!ehg2&rF`Zrm(HI*FyOa#I!~^HceydGvDqMl7`5s;) z0NC(Bij@j*=E@f66(x-TZc*UIHtGDIT;X4HR6d~m^qN!wFmzA4I@8@xrY98AE16(&EFL-UJ|TeA52zJyV_O z@(x`;T|&YcqM+#F$VbuOQpi4zLD#PM*>NSxk1&?QPmp_;8k$#rZaz#UoGF(Pp2p1t zx&t<%n(BY>rZ?(v$k`|NegDVI1u7DS_LFjcYa@)24TssYPA^ST+{!LJqf|)8L=k@C z%J_-EJOhF6s=_ikeU(`T<-Sh9U@*w`kf=*Fjuj67k$g$<}a5^c_WJ~9T3uQUF;j(b z1l^&SU>~+rDFS79IgY#JT3;l(Uc)}XLt6v*D+k3ZcfVFi+qzBb=N?&7xyoP8I| z_Va0aNsa#!Qo^BXcU`a(!mY*jzXcUk>gAM0$IJJs_`GXCL2QV1LQ0zjze8=k3&EeJ^*?4Y{q(94+sQz4TOEQF?B$ z65bTX)1KE=Ao(pIJ{ZK=`VJ}sK5iY;#tA{uVpQD1(&p_-m&IK}h>O69bWH*Q4od0M zQl%M&nkEkX;QulDl(2y7wGxRQv_4blftf*Qy2GW$lzMOw5I*5O112)A?+1sfw zo6&b$a$_0%ix*gSdHh8Pjt=bACDj?#M3eVU2r)tNvTgfkfZL0lrs;cfNKj$azFo!$ zQWF}6kkXp}B#a#91T32tkw1N%OIE2ddWZi7C$fbB!?0A71NHDd#CC+1MOQm~gg%S19R*%+~eQYsVK;#W7iK z5y^MYZEx!2lWaOulMl|!U@Y#;Mz?=MjvK-t)H-UPf$k5!T?DJHp8lTGdGjHv%=7Ir zBr_{K5!82w1mbT`iY5^fI#RT+OqGN4E$~gXBsw9W76_UOTkR73 z74B~##h5j^pV^%MUTu%M)a1sT%wQNSBIcd%uzn02^kq4+6}Z|HhJXT|jGlAWyNwbt z=r-uO?E;QsKsv~*IGM&sP&o;Ap}n;=S2hXd_GlHis*34>uc4tC9NZ^jB#FmB-It#q z8X_Vi0&|Ts%~S+s$<={W)q#3jea;V%kBPN}M>K&Z+(5DxugNjMvgW39WKcd2Aku6yNnv-<)9 z*SB}o&@Q?kFz-(VfBpgh1K0{#-jd=xPiy^nymlD&C-w4j5tz zMe-0S(`T~%N}O_?LuCBG}9icfdc`3ZFxquyZuMtuG; z@B;gy1-Vl&m5CB+D0rKp;Llu(fo^cN1;~%opY+m`+1_@maT$~>+{5813G>sb_-%|G zPirI}(B7Uw7u$s!$yv^Awsh%t+~$#^xOJa-f6n`@-jXTTp%d?zui4STp~{J@Jo@lZ zo6`HThc$}$0W3a2ZR_yxJKJ6zS*a(AlWK9vt)!$R)Wi_MVCx}y!zJ3SMSBr=ZqkXB zbgR?UC+enw-buy}XXOZeq3kzKjNADR*0-;cJLVO9PyBRG3li%ASWfOv^NTW)e-=u4 z3gS)Q1BLu67t^5wv9v!|!PX&ggjrkg=?WTL0SeT{J=YVx1alARZAR4wNXWyx6q;|g zm3#g<@QQH7!zzyvIfcnU#MGyPx`&?d?rR7KWKwiGq^SY+g32?pw&x z^=?Ql`R#QmZZbfdxXW*YM=T<4sz^Uy^0^Fhq(Bd|Q}ajQVG)sxZ{K z@sNbUX%bq^sH&56Yuia5wc56M!Q{suCO_9|=uN`-aXscbg}&U7F#XCDJ`1p*Q6cLO z^@smG^Y;XLNcDhrze~*Z`lk;?l|U}Ku&iQ7vK@Tw34GH+*ru543x1dg;i;M zgoVCg`(?5xqtZ+_rkh>lb1C?;DfgqA>m|-Keos%1;`&h-kWyTHsvyxO>`bzCycPJZ zK@V8y!eS_>xG=7PLEudj51L?Mn9pc6xR7C$YtvzU;H+h88jYC)bFOy0&L1}``5^to zUPxxh8G}(1Qqv29`sas6ON;*xeyg_nB7c0D2SiOR!YVsC=?*r zJ~{tD%nhA*6`5De$VNOk?tI>5t&GwQ;C)U+inCnpA3hZCos36m&X(|pd@S?eM{;-(bn zRO5!^=MeZ^HcEYzL*2oX?>W~`Sr4;dzjA;WelJCoO=ntS8dfutfPnC~X*I^_X;dYe zS-#m1;o79fgXx5dTY*l2v6ykzbj2KjNCe=kL7}&Kb~L3km1Do)}Jxy%Au1Q^Fugn4hx%>o$n#{Yf%1NgYwUcok?mc z-;RzbbbXuQp9HZ~Rr%JWw|lSnA4i9~zPUJWD@nPyUAepEqAR#spd3|v${YBF@nSx- z3CD9qTtSKOmI^>uY;$uAgS^oyTf)iCKKDF6>V0(E7dlP^y)XcMGc_g#oak?2OHPKF z+^3UHZA?rPOYILV*?!j==8dR0hq1*uxIuhw<@BsomJ%bsi;dL$A6;Ier_Dm?A29p< zC>&QImMFSqLaLUrXaRf_eZB6ym$fxgRSuI_%5%LFu#KY}67#Aix6cdOxS40rlsS-& z9k*QjZ>&a}Ba4&J@A%IM*L#q%jkNM@M@X%EH{E+HU1u&h|Cm5+7DgAN=V?knqXA)9y)lFVsbDY z4Q$mJp_uKKL&ataeD`h3vF>jhhpEyA>m>y+A|>EQj;4?~v(xD|3b|a;Wc#^t>{n+7 zLq(tHow8SBj=A1NxE-!ll4lMBRpU`w^uQN<(4+SsAq>RQ;kVP%$@p^yV=enK85JpY8NRIo7p_Y9uv zmhn=Dy&O2Azk2-oEb()ls|jLzd_LErmuB}YDCybF5srgo&2os(eCvECKn&Zg)=CSa z4B9JCt@8uKk85-FV!9;{CMbSIsXSXNl0H$N-!pq$ny1}CAF)jv9QM>;K9f6LS+MQI zI~I5c;Gdqs`SoYp_dKije7Qi?jqtmlan4?FrR9TM+)*{THj@OCaqG5uI$#d^oG&9- zJV!r=Tquy$bIuHZf2@c#z1KhTl|*1kt)1b={BRQ;;XL951FaK+~}_D-r&W309HS^K@9SMBIux?CKI> zQg*0@@AmNsQ7EgyMFd=OqKw*Nb6L5<%79PsrbK#AHnkhtp=GNHIDEX>)=kNWeJCAHf=#FwQV|xNWNS zql71ms|`^{vBo7h3EHyy=SYM2251hKs5wd0PvuUVj(=v-m!vF1c?T>3`=<))3}3;!~j% zD9HkHl(j^{yNf(oPJr{pJoCMbCThwa%4&#CRjJ_@Z0H}Um)BND_j(w;egF6s`52QR zRMf7M#bS*{fYpj(B9jlgIzBt~ZG6)6sPSOh!Q2*OU|_)XCjGi#SlVRkI>d+UC zi%c_g!Q?zfWJlz_^3v0XZ>gT+Y!s0#8A!;1NJ@9Hug7)q-OwuuArfISwy0867nw_y zA?s3aE8bv?wuzF@9*ZP&f|&0=zy~-&65XW=Wc{q9*qn!twCfJgu%c`gps$mZS%tE* zv)$gDd5yTgK|UK#B*QPcyzm9dwQk3bAKV#K@w#f{Tu5S3HjX4?K!#<1|IC0YEjzC2 zTH_MH$XB5<9hU$ZhEEGcc;?nMMl``E5k^U*KOu`)EbnF8M9`4e1L#)EjdJ7Z#DPjik^7;!6^prA|Ya+MMhf2F>BnJPl` z8X7%!ljBA>MjbdV$LaRkz?TZg<)+q^l4_%R8Co8$idFH9_d;(-shpT#9BZ&yL>D|*M(0ZCmZIpg3@%*i8{<+ z<#9g!nLb-fK6JFl{-BR3zl=o!DN2$MP+Wf3#KIZpDZ6O$)$friH=^GNs5{l05wXX zIu@V}$C57c?rdrs=NCOn9YB{rZb}1DYFIa<;5+Yj<0G1o=Ufm+fXL zNt_^7{&!~Q5rf;}9+^#|JQI6Jlpq_xE#BM9m#UnfT>>aOx{KE^GKQD4 zQvbqi?Ot+xk(uK@fBVi_9(2I2Y76gbZ){L(8}G9D;8t!UAMfYEEn_*_W_gM4#gU&v zIT;JydH~(dPopdgA!*w`rT=&nAPw^4Lwjy!%t~yXVME}9qkP0w(5gN|arCF5{#3qK zbcs+#9*ZCR!!@X4w?BEX2Fl;LRdi_VfR2$ay;iHWja?foU(Qb<3kj^|8bIA4Mz>Cn zzR(?(#8$`VEg1mlH7ccFvp84Xd&_t~Cv8<8^Grx2tk~B$%zGpFdza{V_4m!qsmpsl z83;VTsCmXQsPlY!n5nlyT><;zmlZjbGu(=d6a-vuCN|kT|9JT7gdE94_b?JN#stXgc<;E8&g*9=fh7oU2?_Tn9BXW+fO9z9w)27i zM9X6$FG{C6c68UmRZrg)1zUp>3X?LvqMB-Q)w7fV6|R1&+nZtHPP$jnO-ShG&uqQR%g>*15+Ov3J(0i}3=c#;D%Us? zGV(ij>k!ySH2>72iE`n8-&7_iH>-ns0(n8&FBRXe#}ky9gnz2*vU4cYNMxzXciAS7 zK7?Tci9|2LQ_Cq1>Ehpt=M}AQRi|$uJ3YOppvM8;UbI)V#X{IWbJtmC{D6&Q3Vdev zKMpgt&DfPvI>aP6O)kh{=zplkYhBTAcQIgQ#wAr=gH7FB*CoZ&vfMSA(`@k_Kfk)`jnOYAXLp3Uw_C=QPvDq~cISI6 zO8}`YuL=;^n^46GS1R0MmXXK_D6%qz6zOz1|GDJUOg9)RnTm<)HtN0gVGxb>;sji? z4$_Oi+{}~{7o?Z|Kqep$J{3ZD7WF5(p*OTIAEIa{&~11S)adT(fq4O~MwOHmIZUGWPHw@z z&3f!yiIbws>w9s1{SL$M-aFkkv53sya$0jLjrzYdsZ`F}y8Sz4y{%1;XZ!mN|}z_1I}D6%yP3wlub0Ll+w4)5Uu5fl5Fhf0tI6CZln(s0F7SNneF=Bf|rS z7#UHmirOa=@VNPa%Xp@#ibuuFC!36ShpM1S3_UTVj53WslIiz6Oas`ddvW8#iUJR> zV;kh0)&0DfmSKDn*NDDao=V`a+7Zi4qfHBqr;w{nbU@QXJE;+mQX}32N>7Lu6;NTH z;={xbJt>oeOHU7UaALF=X{3x?%(ZVXa-A#Ze>F*}%0I++iR<`hXJH_Mf1%x?fIha{ zY>np2zOAP0&U5cf$D-!m2fUjIH%le)Lk(q5#rq3e*AEqN6(wjc#c#!?`O|X4DhPJx zjAB>!LGq~->N&2{GK8Kf5eY>T)BHG!P=HsdS47lsd+brEXO&%BTmRj*$JoDb+>E4H ztdy;CCDkyJK&_Z?om<%ETI^m?!YU7Yr6aZL!mFoQG~Ml$Jkwc6qbDdm_>y|LL7yD@ zyH-DPx$m6`gvLII8sD#c%-?Fk4uG6q&@^=#)Bc)1wlt3J6&nxHY^{z zYl#EHu;D8MiF8-Uhs0sSV)@p#&t={Q~|S1#<*nyPAlN; z*8#S6p`aS&bj)L&RR?8K2tO%Q53fPJ`7MAp5bpEY2cucllh!VR1n{?=0WAC%^T_Z` z7)HYeyytr&NscryEf}WAuGh9)7l1K?K^>OKoo(=Vx>Rg>z*TjOXcAqoNAxzELn7$u;-9G-`VQV%Ne_Fh%0c}0!o1P`NPR)43!gkG!in~u=9W-sUX zFivvF56GbcC4^s=7ydH-^eY8&u`wfcrl96JOYL8Uy58^T#hiV!mE5-zM9GdG-kTIw zukI{2w@cqY#VFUYu__!{^LZ!>LM34mR3PxW??Ldn+gsAv+^2sG3JqNx-18{fS~coY zX0UkW!7r9}X7f#U@Z+@6QlpNuBhkD&UhJj5@D=G5N5;*f*p+f%=;CinvP>Df)}H8gLe^83dW&1#KtY1V?_3_oDfwTcA(f&-bCP)iFR zzRqgu$Y>)Ao5)Xmkk$JQ}QQd(N4;QB?shRl2iKZlfyi%Do){4W4a0&y)IP|2dIHoGM$ z)k8(4icoQunYUxt(Buz z%e=yI7}SK=Zn~V0iNku$D#q%Yoy2(2aSx_DfAQ@d|B0>1aakrJtTgrUt=t>89nBr+ zRjV2toG*Cy`(2s)C#uE7qd{v~V$JOMs^ASfHRTg1Z=wq5pk9Dk1|7ORWX(>Sdcg5& zO+%ob6x(W!ofSH-OS9}3?2TLb6@r$l$zd%N&-`R}(&&9*a-JmtAKoy9OKH{%`Kt>I zl+Xh4$980i%Ij^8N#%~G5ef=w%5qYKG%GW_4Iv{TBLo5<3suxt>^nNHU*<0JaTE{{ z_WUsG524GldaVj^?d?BRQw?cgNRW9L=~tTfp| zDJgk4v9v4Td+fYC$kz zfs{&=Z^LTTwDe$12hnvVvNAH1^q zYFore;OY4B@bDb2+m4NAyfb!+CNmOc6KxfEHhzwQWjBSwgH8rGpZ!k%Ra3bjr2-^) zn~;3+Xr)<432uFuSns0=PjIa2Qq&5N{ipdh0FC(=`!Y@(>#X5?cyHej? z?Fjf>!5eKf2CXB0y)RP>(Wsd_^tb5mo|qJ5w!^gJiNk$?ipplL{wPYLu*8rI3h2E0? zy!3nQ?>Hq=dhSkCyi^@NBr9wu<4c$1X50mwX~pbE5!>?>}?cLl#)=pBdy>?ZXFTxY%>GjjW7^(i_$ ztaRds`8gVJ)MimrvJ}%zaPPBvCh$^13jA zUrDDLbaC-jwjg&FVg<*7?4s0+7x-U__q@Lds%9l|RGmckxo z_uPCtV%AoqJO6FHzdq8po>$UKtD&jq*{hF-^Pq_6ei!E>*cO}6KmlX$)!Pd>ut0NM zPUdJG&B?6}nmw5U;#*HJdCyRH*UO0X*vk_LpWUIrL>W(sxjPZc%}D0uTH>C#81ra5--g=t_#&0ah#$bc=_hhW z|DPqzHHHz7t9ybP)GRZsx9N4&miOMCm1i>Okaw0F!L3|UZH+@Q*wdJ3Ffh?4=Jz20 z6ERm0nCZhY`h@`wDe))N;=ts^-&U5}gL@CcRCUHSe87gt9jB)?xSWrxwy)thFN}@A z?K*p-Ko(%WD9P{DaIRy%(aM1MkcajIznja42Q^tF!JwF3s~T`IIkj%@j0z@Kl?TL| zJd?&Aqvqeo!ATULSgkHP&WQ6ieRcEa%PY5#q^VCn-*SOXG~MC!1L^B9Lv;rW7`dci=y7A&(NOy$f*v7W zwtD`Z$Nequ*yBF7+mV!18nWk4M=n4J)o9LQmEjP1C-KlP-*Uvr=n-rX;xttEYv;-` z6mNKMPB6n53`^XwEy!c@5oOjdExp?C;dD(YIZ^9s$JXq6Uh$iK0%*s#(?CgymFs7Y zx0HZ(Jbydd<9VrM3DF^B6W0%Q7Kl_zcJrn&?RXR#ItXxCKJtp7V&G0kCAB*-tGdIb zHzy#}+R$uUqLv3FD)#ptA3yaEm|b3Z{jd1?Sy*TSg5(ZoI?b~A47#i^yPjR3u*UVu zQgWV$1TJA2GK>8068Mq;pqLBLd!pmvmy~wdkt;_^2@e```8a1HZ=?S|2U`r#0kkeguCOW+ybhG z28vbx!mw+^d`gZ_#nRjXHDj?!ZnK%LV;P zm@s65kdHcN8da()Mi%MTva%mQjSJJb(l7`cSuY^EFO{ zbijJPc-@B-D>wP*oUXflz?V6ya|d{LB2<5(WtH*o^tqyo@;at`VS8=1tIgM*{sJmU zzS?}+w`4g)e}X9n2|t-L>i-T<^34fN%jtT?EXctr#}LuwjeXiF(VFAqphTdL09iLx z=gVE|(21%t37{+zV!seqRjXRg&}41vt3Gz--2@pU5>i1C%#4%Op+)F7bJ^XgKyqC* zkk6?p(_^8pj;1yP!gFhqL?)pCb6R;yl2jxh8Rbikf}0RDTH7WB4EilWIkkFU$#ae` zf292nBsd2(7Oc6J+~DxNJK|{6A$~so;_3bfk0XKa#~8v5*I$ZWJRka&b|7gr2%HS; z2bwue4khBl51FL%?s^~)vf}uU1ErV~)b{fX4K8;Z(qzA3qL1rxseIXPk>B0)LA8}8 zy#y{bU#`C7^xSRAKM@i8Tp^K>ld(2z!o0LQgQ>==C4%pUToq^t@i(7IN&}1=&X({t z{h!F&?hg|S9i_zcsjT2U1E9&nXax7Hu*mQKf(`#=nCEw%bKw`EI5 zkO=Bj7!(n}*97eY=kd$Vz9_{E8p&B~Yo0RxjJLIfUBP#HMzrNd%^`j4j@wl!w4vm% zj&pn2PseXM2e%W^SU?!$ZxP9#0ussC2tC@FZ~as043NMCC=4R`rz*Aw?- z(N6tb@D4wet`&dLfh0Q-=jL6%L|@@8t^PxWKpM}HhPlp{mqVEv(O>$T9m#co;6(jT zbqyeUvmz-V6<7NtE5QpC)={>CAd_jWeK+j@2?mOPZW0PeW*a}nlz(r@Hvi;Q{kqYD z6%x?Hw%o?+aoPTX_QMC^4>IB+>i0n|xTW&==iZ-Hwn0^4DQ;F)cQ4oHaE;|)XE6v= ziFz^Vjn~T%zel%*fPy!4Awi{?g|;z(UO2e^0cU<9T)`ivZWJUeG#?JE{W6z6S&WSq zSjD(ag(PAzu5c7Yzf$!VNj}+N?DnU{Fd`#X+j4b5=`|pn@dvGa2GY>S$nt7uISo}v z8$*iF46=Bc?y*$pb@o~boCU2j864iSTBtU9W4g4%Dr>C0t;bU5i|hgqZxHZWY=fAg1t?qh4{4c zDR15(jqs`574Y6}mCb9}9&5pj2Q?IZZ!(#)V_8l`uLl!*zK7vypN&ZLnlv^mQZfBg zIsbqdV_OKaD$4DPcP6v*Hn|oj&a3PcOC_+p#z)-HtXi_IPFUjYtH8-EaC@6ocRO=! zg=EBDI!#DDrBwJO-fvuEcCbBgpiJlXqu@|HH`DDPrPC7q`K2t%ojyue$JN*hw&Wd} z`OQ4xyiD!DowMD_i{a7HgcyoN+JN)5>ET2An;)eH)mVZV_oxdOI^o4qLV3DVX@*#4 zN<26Nk=K{E!n$Q%<<1tjlM%~*Ky<>4yPjU(FpbU7v#iX_AIZrM9CA${)1ZC$F^z!{ zD0KT>_48Upw3v^62OQ9AR}w?;<%Q5Uip~Ss!}nS6^{eSoA3*k;O(%lG4y~$s7Xezx zTq4nAq}0(}uMNK_^i^(y3kKl~!=e$s78g57;sUvTC4&SV`;S)v6WB+If}RulZO=84 z(fkFf-pP`(;LlDafVCR=CdVDm>L^A5{+c=cGnrWwyiT!h1R2|pzT18_#!i8&YBj1^ z$onJUw{Ia?t9#2#?MBhjyCH70;<$IZ#t+xCWn9NjHdrYn!v35{e@=Uwt90%+A)gy| zi?_SrI0QY(OBv?suGe@~q?)gg#dwY7W*=KkIjlE+?8gOFW;B_>=y*GgeLq>OD%ZyK zv5DBv@3ZGI1|=k9C*Cs;rbrGC&f}VczeJBLMTkazayH&19axK+UNkD+b<-j3zcH3e z(si>rJV9V57@J=$rr7ZG5D<`tt^I>gkBQYN#YFZ-gy-!0gei`HrGt-1=SW5-92bmQ z)8)CUJz4o;!b8=bs7_*=?qT$d(n)lltx%*pPUm{jOz&Q?^t~N3EE8w}kk6W02^Etz zgwZAh1DU~|Ei30L(V7qH!{0*w80VUzBwVD3tFhv{hfh2lw$g?81E7krsZnY3?~A zyHQSC;tzYDd5?V@0nw}oLmQIhO@CmrgP;wOz;_2i;FF5VZn~iNQ)QUr@j+R_a3()D zAdsf9+(_5=`tI0Zu~n{sb_IBpxXg3VK| zs`3K954i|Dw#oM0<*HJB{d{P`C|TZK3d`?*fX>oK&e zck+3fNhFFQL1g}9KsJbTMOeAA#bq3sTYhA~QWL$W0My#~X5mjy3_PTpo1+V=FBl1`+4iu@dXy*^gj_VjtAmgNhlhB`xb zGlKuv3p`Qw`N&ETqow3*TnBkrv`Vj%j!yrB)$y$o26c2b*XvvGv+>IfdX4)K+pAAQ zYcvr*n$lF}LdByJq)V3U8spt~v{Ibh*eLoh8-r0xR;tV0Is?zT3^yWly&%7<>kECE ze`4;36!=#w_KsLnCnq@ii@;0cNr5H?P;D>fx9_l%xAc!O_BBH?vj-+;iPZBWJ7}}D zuT~r}nVk|AQ*DD><-3toX&F?u27>Pi6Ypg=@liJoxXxqOvI-Qom{|y;wH;N2*f#dQ z0`-Oj`o%qM`c=nX2=m>}t1g9Zj{aV2H(CjEk7ckA!$vPg7TKfa(~~h(f?~9(u54*_ zuDxcL+?DpPWqjyv=l+XVsbgJH2l3eFQzaT!Na`2rp!ea7Z=kP z#*%(aHg860f|=gW8+H~mBu=q))3x+5g>SF&OyYR^8g$TKm#!DF-OIJDhHc!P4)Z0|V0; zc5g~&L|*7=Y1G0i_y%ug?%VtHHesc2HHCc1++*xYXVFY4?;?(_yhnR2rBz053SNq! z>ymS7_d4k2hwC{ggIOP4TsLK3@_vn9gxUj5z0ES^X1IC;ayGS&_H)$G6|&7A?Y}t4 zs5#ZFjbtr;K@Th1GVUFRcHF0{rsdIg+8jO=K~vzL!XVK1V#chx<*zmcH8mmA~d#w>6u*EXS&ZIlAcrAcB+p(PXD)RUTfQVgFwY{oj}w{q**3F zeJXm5CID)a3#3-YvUyrkg+l9m{uzul;v`w}_qNblza~eSwwf&JOvrpbQDMF$rMNP& zu`-)_r*+(yb4p8hRhoZ!<#;U+Y=$DsVJEc(^heOx7XXZ_+0#H3U38Jn8w5_Md8#R^ zn2!|wk;<;e+^M`2G@lV}zvTHf3YI2vx3W9Z=R^?UsE_mw92wP!h zwMXb8YaFiN#hTDeE@&0);>Qem_0QFsSby{~=(f?ND7iDE*=#reFiu*oxJYbpqxvY< zIAU`pJ>;TaaxvOcS;}##9=kQ>*V2uaT2BRD3#$`I)A>odR-}q{p5C(rSP^%fy=$EQ z5`|MV+4ZE{IT#x&Cw#JraP1o0~h-)(VH>xzV;ya5Xw#FhPlL$GlDdsyJF z=0(o_@cfCou&8Hw7%BWonFwcM&grAIwgc^Z?w-QXqJ4{JfjH+anhX{z^iX9Ya1t%TfV>j*c7tF6llR08qOnmSDH$j&}lT=ddV|+H>>l26O*R) z7Vgl?t6^D=KWB*TNTwGO5=1oacE!M;Zb`qeWB$3kM)`-)A{*mISjc%DrtOt@orX5e z)J~Fi$%LjI4sr;6<0H1=PtToH{Fj?JBe_(&VCBG8%aF~TjILqsMa>broPgGY{(CJ( z`Udf>VtlQy5o<?^BrvseBj{c zmm}Ia76!Y2YntTcnp^lF{`mxPU9V0fowg(!mv}%vX_<`i?fbGUdr0V&!Wd|J*rIac zD^=m_Vm{Dw^_6=SXnvw5JBQ(dl>`Q~qVPE9Ecojd^;v%!>5)bU|iu z5H*VS4DJi%Fc1br(I>62k(sMJ4e7@)c0H)Yaq3Y~v@2BR7q`UASsl54mP}C+`mMy~ zTaclr=XH~ePg;r%z95#XG}_}s%TQ@)&ZhR~==Qu)8-tP)V28bKGP>TS%_07sXPRS( z$4aZt5lWSen4&#$Q;(T&x?dYd626dZLZB<`k^*QL?C&N<+Wvs5D1V6hS0u*6IDbt5 zDij$h3&~%{iDiMe3qn);{*DJBrqiT75lHt#)e?f|>6B8_X<1|9|J?q+@C$Nw&#pl~ z@k=fwM?MV?9L!Hw5LzdEMcOkG?Tfw3j(tiBstVI`M^I2ek)=-Z-@wgaR*zZMi5??3 ze|c8x@Bp?Vo{cJ5%0E*C^mu>a=)ZAr&>LZA(m&6d?I6)F{&Js%K+u{QAclG+E!$oI zA7`YWT@++Uoway=Y!$`_5KyN7Z9o=|&0%z;^j`!0cVlDGtph;&mG~kQRpElOH9K5P zegHoyfD7xqGp2rVrv`9{sUIyPzGAQHBHcz09^<+qg6qi5QH>iAjGBFD(9N-yb#_t4 zYz;zg|DOT=dDDts!)($SL$tvECE_X`$vsu9P+Tzezy^x*UyPI;Ug zxA;?tFc;aib`zgtxBlyE|2rgO**^(69c%F1P|!nb#?2UdGQRjpV!TGpWQ_#-qyL{j zI(q%-p?DX1svOj)i{v+fa-x|7hHE;|lgDR0i{&)KUeds$3_Cz2tBho72(!3)z-*?Y zpU3?P3yP~efDVl4(fAFO@@jk-pGIU0RW*)$~v-G}_9yK1I zC?eY_0&uqSE%&dEqsFlg7mZ(xa^7eJ>RrfP%#{8&r2e00dTDcECc40LNFo94*j`p1 zEJZv`PwqVNaPZhxRQ(Y|x6!ZVvtoVpK;y|}t42Y8RdpYh79z>_2K?sy2vPcKy3X6$_4!Z;ME%MCoP64f@W!UVGk3ho+JjgM}9;yh#Jf{KrJEKgKQ#$B{7HBi$CSZ4kj!vkoH3RUV}pX zvuN{I#H*H5?gtE7$%Hs~Qe_Aj2yg!2Zi@feT{H~fiZS=nGVO?#z(f#`6#d`1Tc%Ez zk+1w*?tPNTsx~j}4{XWPT2iW1m$jvtOXGW*rg%%fh2T0~+OpBoy|pO}0-z!cl)Oyu zKAt?fb2QOk7SS(Vs?%vM4yp#S2u?437H!IWsA*ZUZH#1Ednsm_DFv~(vr>m<^mo)| zda(!*heba>597DsWklhUY-c8F61V4dWXHNKREz+ zzeC5Po=1QLPQ~n}5NunJM7Vc%cl~xqxU{?+O2xvVeUM&v(ZQrCiAIaEGRF`-A67+1 zd&fnT(}Y<4P#O)ntD7M4i_)jz5(Z6X+c-$QMMQ6eo-Z&@6vW0 z`^+fvURbo*J3H%fnBlxNU1LlE5u`f=rIo=X(?$zNJu?V1JjkFz9X1Jw}eIonpTqF$OUOb#=16y^tvmR4NED z1|@1;6oTFq80f%-UngIXXmrl>>_q9bz2fxXm;f=O(=xKHy>%5d;gl&k2*6nMp|iuq zmX5k#Ft_f5adNd~Yq$7=?1NkTy;i!77(N1-(ofq+O&>t$qFr z2RAsn^@z8xO6iX*@5Mj>VrTc1;PSJs_UQJj`-!)Y9BOlaNElB4JkW5)<3>55E?)K5 zGW#EO0T&>=S`)G4%K&Ew0EGv%(ZT#I9;WI?Cu@G@OOcTBVt!d9rt?N0-Hif?kGP>b z-4GmTD0BLV1HX-E=lc7yYSzSVw2W^|uHdpaHigPL;9f2}X2uyBcLgm3%awG=sw^t! z2kRnk+hS7VE~b&O)U+|7CVXhl@c-e5WfH-`iv!rQMhPk{OgYhtTB5-pS;OHtdp+Ape+L z(-(A7RLK{D9Quu}@EeGeh$JaQBMTG2e}(sbB@|r~Op2 z#GFj1b+^*2Cu5!3aY&&r5}^l`9DwChWi6;@a3~OKb$r2t#sG=q-H*!Cy7Ux@tp$X13 z+oeOgEIz5SF~ogl?Cj7MOaTr7h_C^<;Niz_^S%?CdMV%i!bP8aolrE{ze1~oHQG3u z588}12H^1AguOx;NTz+?+olXfm(Oj?%@^bY4AiJzT~UymDFwPJ+h$S-}m_hGJ>D>q{5;R7g0l@nnu*+DkUOVo8e zU8xoNlFy-lqNF(Hnan;5KggN16L3Nze(MqpD+DFo{y&yT%_s2tdv_fE+(Ncje~({a z3@e@@6})yATzcyfOE$qd5`I+6j3GHHewvh+_TX_U&M>$10uLu&3(eR?Bu5`Tx8(Q6 zzXC|l{vPvIG#HwrZ&L`!ltW(sL90k0BEZ48ULCay2>gH^*oHt;Y`nQku`Id`7$m1K zB| z!qq}&0BtXtxuHPypFkB&4Sd_g%=KI19(#xo1vlJ$s?)XEYd>*y&7vj{!+s=YEH4yx z#Af)~7@eM?`71}i>o$q&SX#UP8sfUOT&IcRIP4JzOU@7m2b9q;Ps_J|-WJ-Qf*z#^ z%ZA2aiVaelN2%I^bX-W8%wv1o`%&Na68kcPG@{0%Qj`8~RO_#(T&4Wu1^7f}64>=u z*T`9YxX+4}^_e;NiF(SCq0_D@7qQ|wl7N~A{RWk%*ESw^O4K28bYlVd-D&wED?_gO zkGp=ZT0k}sE#LqDA1$B6feLbstp2xrw5GXAC??_RaQ^Pxytr%S3AANce&yFrf&|f# zXwN~~3IXL*XP%J+*zLPRy-ODljhi^feOMN93(EiYlSF$20^Pn&=Kc(W?<$QZ z%}{k>x%jrH-jdKB!C9=y`C9w-oAVWIWsxa(lvRf2;3QNs$v0_rq^>jN?#_+gv%tXK zzvV}e<#Q=bg;1Goh918!bRsP6S>UYJu5%XnN9XiTKnHNH>kffA5_zBamsD(Mo-?M9 z9e>*Mv`9y&(c2<~=@L{23LJL%hs)7>dJC3~5XV{zs} z$!dAyF*FL>s|tXZq)?&`a&yRYu5Dw7AM9d+r(gz&tQp4<`$33uBDidV1e ziQWMfo2JiyhND`^^wD<{QLMuR%U56zLfQaxrh$!CxHQYb_C&8* zD~o#vHT;#WFgPS7&TrE@y>#u8tiQ@7ax7=_z516{&a4Uro2sgOCz15&-UKw(vyC!t z?D<@B0!y5*%7n~Lpe0tk8nT_Ny7&qCkx^Fy$tw3OOzh5L^zab=v{hIInyDgoW?Ep) zR`&%VI-ZFCuy8c_np8-*2vJ56j#?c$?tbGZ8ya?ei+uU9eqqKi8L^(HHrA1gEyXWG zj|W>La9lp!L;US9Sq3%8nGspJ5QDlR3M`N#fjEr+CFusq&H{8ikJK_yuv+5C0uT(hi{G1h3}084kxO=h1IIHhEI`Yv~VBLWQ=Y!6&!Jq1^MwRiDpFw6aQQ()fj-4V-&rk=)X)hQ)#Ny?u(ZQnM z`o}wzjfmxWK;mnrrd22c&h2?xU43G13!FT<;cv6aoC1EGy1;n_lmaJqE~O#^U2f-J zWy%T)fM z2dT~pXdQGrcTn2&fzI}((h_T;#K?4pq7nNf)PQ&f{zhJx);Sqan+n%5u$Az{l^&hc zTmbxxQV5uVWTB`{vJ%Wofe7P>pn>%-c8t=zuIsf-Kg6lDf*u?066&Ygd@PK z+$_1WE@vvoQ>jbaM=Gb$aa>wEEHAFE#l#a?dJoxDbjoGfT;H%KKlMAMV1MNfnI*5| zYrz!NEW~gbH?_leWt?`(ZM|c~+>yDS)xgdIj5S#a44Ef&?g4mFhGhX~uzEKgqV|mf zN?+V!{Q_A^Rj5^m5qN8WU&wdi_nI_&6LrVI7ww(-3BzgG>weNR?V#eixcrzH9pQ2-_;(PJ9LEaskH#a{N+p^O|pclP}fP?(!2{hIH zt3-41b0Mki3%5~^Glr9--Z1#)`bRV)lK-CdmMQ3S zoq~C_%Aej~=xDYfTmY$}>L4v^{P|((nKuM6@R9F46Y14vbVJ z9X?zR^?avoJC)M9!Bfi(?=iM4%6_1UdLv}U>5^0&?tK8|#a}kcS4|R?k`R${!sd^jzkj8GpA z6;oXV_$)}vh<+!q7-2Y>X46gvPw1Q@y<0yC;Wf?s1ar7|^q(kt;G&%BL4ywlL3*_< zW1r?F47q;C7{4S#XwrlouR-NhlSjA;uF0p47{RCD$g^7j#ZGn#f%f`;J@XgMD{%b5IULfls{|?%o+Dw3Z z<>pa6n+3aD0PquPbe||YP`E^S44%<}iwydzuJ32T3nI;<-gNb$Gq-0%bC(s>sQKHh zoDK@Nd4_Tz%*hWyQ_43XM84CB*7~6K+68wGRFrvZA|6Izb@xR`ICoA?mnQaH@FIPt zkTAz`fKEQbuReg2#{54!4+8X85gqFydIT0^-~DoZPDwRcegliQYGQ;$O#5gXwCX@tK4HsEVif@`%MEZKV3H6~~p)n7Phw{$Ety3QXDKzo2D z>Zev998N6)!{4pyGlG`oV4-1IkQ|K%ZkAHj!p`obq{n7%vpG{8a>xI)dPD#5{kbi|Br zsly@p;G>5BAd-KA=RU5GrB3PHe&M1csv5S%qcm*vTA^Kg#i4`}NHks&h6jJC=$|73 zU)Ujh<6`}^`{OnCRJM-qm1-PEwJVe;l(%)S`=+nG@b{Jx;eR95`I@3?`wXgygEPl# zHVc~P21GEigMo)|Ry}sjXgnR;)uq!3cA>`3|5T&8 zX02+uUrB}h-;|1w)7Rg)Vr`)p7ki>W=0*aShDrr&c(+#LgTrFdlB~2be?+VOmja{` zMa85}cT^<5^wnq=$!9Zb%)mAP zK5rRs^s01q`HHaOu?2Bc&~FDN4#55O@4vBt^5RX5!jw&vj110nqk43vIlpw3TL0RD z^icTtUQ!zPB*Ul8vwHR#eWsQa^j|~$eI%63ki8mRT{D#;{kdV0qS?z3IDcF-{mTq~ zBh1H-GB7aEiT_Y@jixwqPJLqpp9B1Ot0tEGFP5W5;``ZsZ0)g^v)uOJmTOnvx+@zc zt<8wHB%UGQ?d*`5@CDVsalNwy2G|_y3*KtE{9xCdZH3pb$ypo7b2(5zmvC>%&1;e5 zw~6QZ=fM6nB422+tc8{$ld{sdYqagaw}L#sK^cEz7T9Zbn!#vAigy-`V-eFc_L}W@ z@RC!*A)%Fc#Epr1moeNR2f|`D{}~Yar^ft(8;Hex;@?+#bl@F#Q)5UrqW5SL!yyU2 zk8^f(5)wzoYGv|-Qd|5piua!b-t8$nv_=od>S4;t(bWAzpxX0&5xwY>qWh;0?QATOags{G-O~PXRXSHgze%8cnv*S zC``x3`Q5JvlAHcdBsFWFR zPQcmAq+90Kw(bq88fyhX0BIDBHhvcDK`L=Jq13I|-ALlkbWrg_s)F1xH2dq8q%Dpg zdf_CR0$9R1Vo~SrV5-1RcNgY;FjIw9wyaof4Z*Q5)bAARk85*-0L14=yXS2dtsM z!%w3fO6%}=>#uthCfonwgSmc8JA}~)=k?t1VWB8t6mMCZ`<+HDkw@!On4HCO3xRy~ zymGR?KZ)OKnrtJ(%Yp`~VyZkTK&XK+vahb#OgVwo&F-Lyk3iGFzH#Nd0usSLObZdk z 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�=8*$o_}E&>I*VA)6wBf4&IV z0WpIc@)%{VQ2&QMF_`=RCzk(V%hdmg<^QbZ->l^YIs`{)(|5q`BLw&(E-WKdA@IfT F{{a_Z0<-`C literal 0 HcmV?d00001