From e238da54d887611ed136b64f0f64cea7d427f86c Mon Sep 17 00:00:00 2001
From: yuanyuan zhang
Date: Fri, 27 Sep 2024 14:12:51 +0800
Subject: [PATCH 1/5] docs: merge apecloud mysql and es docs
---
.../handle-an-exception/_category_.yml | 4 -
.../handle-an-exception/full-disk-lock.md | 52 -
.../handle-a-cluster-exception.md | 38 -
.../_category_.yml | 4 -
.../apecloud-mysql-intro/_category_.yml | 4 -
.../apecloud-mysql-intro.md | 54 --
.../cluster-management/_category_.yml | 4 -
...e-and-connect-an-apecloud-mysql-cluster.md | 270 ------
.../delete-mysql-cluster.md | 49 -
.../cluster-management/expand-volume.md | 118 ---
.../restart-apecloud-mysql-cluster.md | 59 --
.../scale-for-apecloud-mysql.md | 309 ------
.../stop-start-a-cluster.md | 126 ---
.../cluster-management/switchover.md | 85 --
.../configuration/_category_.yml | 4 -
.../configuration/configuration.md | 217 -----
.../database-security/.gitkeep | 1 -
.../database-security/_category_.yml | 4 -
.../high-availability/_category_.yml | 4 -
.../high-availability/high-availability.md | 226 -----
.../kubeblocks-for-apecloud-mysql.md | 16 -
.../proxy/_category_.yml | 4 -
.../proxy/apecloud-mysql-proxy.md | 481 ----------
.../proxy/introduction.md | 49 -
.../_category_.yml | 4 -
.../manage-elasticsearch.md | 663 -------------
...ilure_simulation_connect_cluster_after.png | Bin 204444 -> 239905 bytes
...re_simulation_connect_cluster_follower.png | Bin 45227 -> 108141 bytes
.../failure_simulation_connect_three_pods.png | Bin 73183 -> 164569 bytes
.../failure_simulation_connect_two_pods.png | Bin 74358 -> 164088 bytes
...failure_simulation_delete_follower_pod.png | Bin 9143 -> 12252 bytes
docs/img/failure_simulation_delete_pod.png | Bin 8737 -> 11628 bytes
.../failure_simulation_delete_three_pods.png | Bin 16637 -> 25576 bytes
.../failure_simulation_delete_two_pods.png | Bin 12811 -> 18272 bytes
.../failure_simulation_describe_cluster.png | Bin 79241 -> 178615 bytes
.../failure_simulation_describe_cluster_2.png | Bin 83201 -> 178872 bytes
...lure_simulation_describe_cluster_after.png | Bin 79422 -> 179583 bytes
...e_simulation_describe_cluster_follower.png | Bin 88460 -> 182239 bytes
...failure_simulation_describe_three_pods.png | Bin 79345 -> 178052 bytes
.../failure_simulation_describe_two_pods.png | Bin 91365 -> 178242 bytes
...nect-database-in-production-environment.md | 2 -
.../handle-a-cluster-exception.md | 21 +-
...e-and-connect-an-apecloud-mysql-cluster.md | 276 +++++-
.../delete-mysql-cluster.md | 52 +-
.../cluster-management/expand-volume.md | 155 ++-
.../restart-mysql-cluster.md | 68 +-
.../scale-for-apecloud-mysql.md | 350 ++++++-
.../stop-start-a-cluster.md | 166 +++-
.../cluster-management/switchover.md | 100 +-
.../configuration/configuration.md | 311 +++++-
.../high-availability/high-availability.md | 283 +++++-
.../proxy/apecloud-mysql-proxy.md | 511 +++++++++-
.../manage-elasticsearch.md | 902 +++++++++++++++---
53 files changed, 2841 insertions(+), 3205 deletions(-)
delete mode 100644 docs/api_docs/handle-an-exception/_category_.yml
delete mode 100644 docs/api_docs/handle-an-exception/full-disk-lock.md
delete mode 100644 docs/api_docs/handle-an-exception/handle-a-cluster-exception.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/apecloud-mysql-intro.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/expand-volume.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/restart-apecloud-mysql-cluster.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/scale-for-apecloud-mysql.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/stop-start-a-cluster.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/switchover.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/configuration/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/configuration/configuration.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/.gitkeep
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/high-availability.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/kubeblocks-for-apecloud-mysql.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/apecloud-mysql-proxy.md
delete mode 100644 docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/introduction.md
delete mode 100644 docs/api_docs/kubeblocks-for-elasticsearch/_category_.yml
delete mode 100644 docs/api_docs/kubeblocks-for-elasticsearch/manage-elasticsearch.md
diff --git a/docs/api_docs/handle-an-exception/_category_.yml b/docs/api_docs/handle-an-exception/_category_.yml
deleted file mode 100644
index 0048c1e73e5..00000000000
--- a/docs/api_docs/handle-an-exception/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 7
-label: Handle an Exception
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/handle-an-exception/full-disk-lock.md b/docs/api_docs/handle-an-exception/full-disk-lock.md
deleted file mode 100644
index 016a2c3412d..00000000000
--- a/docs/api_docs/handle-an-exception/full-disk-lock.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: Full disk lock
-description: How to configure disk lock when it is about to be full
-sidebar_position: 2
-sidebar_label: Full disk lock
----
-
-# Full disk lock
-
-The full disk lock function of KubeBlocks ensures the stability and availability of a database. This function triggers a disk lock when the disk usage reaches a set threshold, thereby pausing write operations and only allowing read operations. Such a mechanism prevents a database from being affected by disk space exhaustion.
-
-## Mechanism of lock/unlock
-
-When the space water level of any configured volume exceeds the defined threshold, the instance is locked (read-only). Meanwhile, the system sends a related warning event, including the specific threshold and space usage information of each volume.
-
-When the space water level of all configured volumes falls below the defined threshold, the instance is unlocked (read and write). Meanwhile, the system sends a related warning event, including the specific threshold and space usage information of each volume.
-
-:::note
-
-1. The full disk lock function currently supports global (ClusterDefinition) enabling or disabling and does not support Cluster dimension control. Dynamically enabling or disabling this function may affect the existing Cluster instances that use this ClusterDefinition and cause them to restart. Please operate with caution.
-
-2. The full disk lock function relies on the read permission (get & list) of the two system resource nodes and nodes/stats. If you create an instance via kbcli, make sure to grant the controller administrative rights to the ClusterRoleBinding.
-
-3. Currently, full disk lock is available for ApeCloud MySQL, PostgreSQL and MongoDB.
-
-:::
-
-## Enable full disk lock
-
-- For MySQL database, the read/write user cannot write to the disk when the disk usage reaches the `highwatermark` value, while the superuser can still write.
-- For PostgreSQL and MongoDB, both the read/write user and the superuser cannot write when the disk usage reaches `highwatermark`.
-- `90` is the default value setting for the high watermark at the component level which means the disk is locked when the disk usage reaches 90%, while `85` is used for the volumes which overwrites the component's threshold value.
-
-In the cluster definition, add the following content to enable the full disk lock function. You can set the value according to your need.
-
-```bash
-volumeProtectionSpec:
- highWatermark: 90
- volumes:
- - highWatermark: 85
- name: data
-```
-
-:::note
-
-The recommended value of `highWatermark` is 90.
-
-:::
-
-## Disable full disk lock
-
-Delete `volumeProtectionSpec` from the cluster definition file.
diff --git a/docs/api_docs/handle-an-exception/handle-a-cluster-exception.md b/docs/api_docs/handle-an-exception/handle-a-cluster-exception.md
deleted file mode 100644
index 5114b0d1bd1..00000000000
--- a/docs/api_docs/handle-an-exception/handle-a-cluster-exception.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: Handle a cluster exception
-description: How to handle an exception in a cluster
-keywords: [cluster exception]
-sidebar_position: 1
-sidebar_label: Handle an exception
----
-
-# Handle an exception
-
-When an exception occurs during your operation, you can perform the following steps to solve it.
-
-## Steps
-
-1. Check the cluster status.
-
- Take the cluster named mycluster as an example.
-
- ```bash
- kubectl describe cluster mycluster
- ```
-
-2. Handle the exception according to the status information.
-
- | **Status** | **Information** |
- | :--- | :--- |
- | Abnormal | The cluster can be accessed but exceptions occur in some pods. This might be a mediate status of the operation process and the system recovers automatically without executing any extra operation. Wait until the cluster status changes to `Running`. |
- | ConditionsError | The cluster is normal but an exception occurs to the condition. It might be caused by configuration loss or exception, which further leads to operation failure. Manual recovery is required. |
- | Failed | The cluster cannot be accessed. Check the `status.message` string and get the exception reason. Then manually recover it according to the hints. |
-
- You can check the cluster's status for more information.
-
-## Fallback strategies
-
-If the above operations can not solve the problem, try the following steps:
-
-- Restart this cluster. If the restart fails, you can delete the pod manually.
-- Roll the cluster status back to the status before changes.
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/_category_.yml
deleted file mode 100644
index aab404f2a69..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 8
-label: KubeBlocks for ApeCloud MySQL
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/_category_.yml
deleted file mode 100644
index f694f38720b..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 1
-label: Introduction
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/apecloud-mysql-intro.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/apecloud-mysql-intro.md
deleted file mode 100644
index a142ef9ab5e..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/apecloud-mysql-intro/apecloud-mysql-intro.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: MySQL introduction
-description: MySQL introduction
-keywords: [apecloud mysql, mysql, introduction]
-sidebar_position: 1
----
-
-# MySQL introduction
-
-MySQL is the world’s most popular open-source database and the second-most-popular database overall. It is used by many of the most accessed applications, such as Facebook, Twitter, Netflix, Uber, Airbnb, Shopify, and Booking.com.
-
-KubeBlocks adopts the MySQL distribution provided by ApeCloud, which includes data compression and high availability improvements.
-
-- When there are 3 or more replicas, a strong consistent high-availability cluster is created with the consensus algorithm protocol to ensure that RPO=0 in the case of a single availability zone failure. Among them, the primary instance provides read/write capacity, and the remaining instances provide read-only services.
-- When there are 2 replicas, a Primary-Secondary replication cluster is created, in which the primary instance provides read/write capacity, and the secondary instance keeps in sync with the primary instance with asynchronous replication, providing read-only and fault tolerance capabilities.
-- When there is only 1 replica, a standalone cluster is created to provide read/write capacity. Automatic fault recovery capability is still provided, and RPO=0 remains ensured if the cloud disk is not damaged.
-
-## Instance Roles
-
-ApeCloud MySQL supports four roles, **Leader**, **Follower**, **Candidate**, and **Learner**. The Leader and a Follower form a high-availability cluster and ensure RPO=0.
-
-- Leader: This role is the primary instance of the cluster, and supports R/W with forced consistency. It is voted by all the Candidates participating in the election. The Candidates with the majority of votes become the Leader, and the other Candidates become the Follower.
-- Follower: Follower supports data consistency with read-only capacity, and forms a high-availability cluster with Leader and other Followers.
-- Learner: This role is usually used for cross-regional consistent read-only data. Data synchronization is performed through the Paxos protocol, and the data source can be a Leader or a Follower. The learner is a special role in the consensus algorithm protocol, and does not participate in voting or being elected as a Candidate role.
-- Candidate: The Candidate is an intermediate role that exists only during the election process or when a majority number is not enough to select the Leader role. Normally, all Candidates in a high availability cluster will eventually become a Leader or a Follower after the election is completed.
-
-| Role | Leader |Follower | Learner | Candidate |
-| ---- |----| ----|----|----|
-| **Capability**|RW/HA|RO/HA|RO|-|
-
-![Role_changing](../../../img/apecloud-mysql-intro-role-changing.jpg)
-
-### Failover
-
-A failover is the redirection of traffic and switches the running tasks from a primary instance to a secondary instance.
-
-### Read-only
-
-Replicas provide read-only capabilities. In addition to the Follower that can provide read-only capabilities, you can also expand the read-only capabilities of the cluster by adding Learner roles. It should be noted that when performing read-only operations through Follower or Learner, there may be a data delay with the Leader. This delay may be caused by a log synchronization delay or a log playback delay.
-
-### Fault tolerance
-
-The cluster supports node fault tolerance. Suppose the number of replicas is n, then the number of faulty replicas that can be tolerated is `floor (n/2) + 1, n=[1,99]`, which meets the requirements of the Paxos algorithm protocol. Based on this, it can be obtained that under the specified tolerable number f of ApeCloud MySQL cluster nodes, the number of replicas that need to be created is n=2*f+1, f>=0. For example, if the tolerable number of faulty replicas is 1, then according to the formula, the minimum number of replicas in the cluster is 3, that is, in a Paxos group, the continuous service capability of the cluster with 1 faulty replica is guaranteed. According to the table below, it can be seen that it is more cost-effective to create an odd number of replicas.
-
- Replicas in Cluster | Node Majority | Nodes Tolerable |
- ---- |----| ----|
- 3 | 2 | 1 |
- 4 | 3 | 1 |
- 5 | 3 | 2 |
- 6 | 4 | 2 |
- 7 | 4 | 3 |
- 8 | 5 | 3 |
- 9 | 5 | 4 |
- 10 | 6 | 4 |
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/_category_.yml
deleted file mode 100644
index 200a2feb546..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 2
-label: Cluster Management
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md
deleted file mode 100644
index 47a77279cc3..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/create-and-connect-an-apecloud-mysql-cluster.md
+++ /dev/null
@@ -1,270 +0,0 @@
----
-title: Create and connect to an ApeCloud MySQL Cluster
-description: How to create and connect to an ApeCloud MySQL Cluster
-keywords: [apecloud mysql, create an apecloud mysql cluster, connect to an apecloud mysql cluster]
-sidebar_position: 1
-sidebar_label: Create and connect
----
-
-# Create and connect to an ApeCloud MySQL cluster
-
-This tutorial shows how to create and connect to an ApeCloud MySQL cluster.
-
-## Create an ApeCloud MySQL cluster
-
-### Before you start
-
-* [Install KubeBlocks](../../../user_docs/installation/install-with-helm/install-kubeblocks.md).
-* Make sure the `apecloud-mysql` cluster definition is installed. If the cluster definition is not available, refer to [this doc](../../../user_docs/installation/install-with-helm/install-addons.md) to enable it first.
-
- ```bash
- kubectl get clusterdefinition apecloud-mysql
- >
- NAME TOPOLOGIES SERVICEREFS STATUS AGE
- apecloud-mysql Available 27m
- ```
-
- View all available versions for creating a cluster.
-
- ```bash
- kubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=apecloud-mysql
- ```
-
-* To keep things isolated, create a separate namespace called `demo` throughout this tutorial.
-
- ```bash
- kubectl create namespace demo
- ```
-
-### Create a cluster
-
-KubeBlocks supports creating two types of ApeCloud MySQL clusters: Standalone and RaftGroup. Standalone only supports one replica and can be used in scenarios with lower requirements for availability. For scenarios with high availability requirements, it is recommended to create a RaftGroup Cluster, which creates a cluster with three replicas.
-
-To ensure high availability, all replicas are distributed on different nodes by default. If you only have one node for deploying a RaftGroup Cluster, set `spec.affinity.topologyKeys` as `null`.
-
-KubeBlocks implements a `Cluster` CRD to define a cluster. Here is an example of creating a RaftGroup Cluster.
-
-```yaml
-cat < - `DoNotTerminate` blocks deletion operation.
- `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location.
|
-| `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. |
-| `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. |
-| `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. |
-| `spec.tolerations` | It is an array that specifies tolerations attached to the cluster's Pods, allowing them to be scheduled onto nodes with matching taints. |
-| `spec.componentSpecs` | It is the list of components that define the cluster components. This field allows customized configuration of each component within a cluster. |
-| `spec.componentSpecs.componentDefRef` | It is the name of the component definition that is defined in the cluster definition and you can get the component definition names with `kubectl get clusterdefinition apecloud-mysql -o json \| jq '.spec.componentDefs[].name'`. |
-| `spec.componentSpecs.name` | It specifies the name of the component. |
-| `spec.componentSpecs.disableExporter` | It defines whether the monitoring function is enabled. |
-| `spec.componentSpecs.replicas` | It specifies the number of replicas of the component. |
-| `spec.componentSpecs.resources` | It specifies the resource requirements of the component. |
-
-KubeBlocks operator watches for the `Cluster` CRD and creates the cluster and all dependent resources. You can get all the resources created by the cluster by running the command below.
-
-```bash
-kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo
-```
-
-Run the following command to see the created ApeCloud MySQL cluster:
-
-```bash
-kubectl get cluster mycluster -n demo -o yaml
-```
-
-
-Output
-
-```yaml
-apiVersion: apps.kubeblocks.io/v1alpha1
-kind: Cluster
-metadata:
- annotations:
- kubectl.kubernetes.io/last-applied-configuration: |
- {"apiVersion":"apps.kubeblocks.io/v1alpha1","kind":"Cluster","metadata":{"annotations":{},"labels":{"app.kubernetes.io/instance":"mycluster","app.kubernetes.io/version":"8.0.30","helm.sh/chart":"apecloud-mysql-cluster-0.8.0"},"name":"mycluster","namespace":"demo"},"spec":{"affinity":{"podAntiAffinity":"Required","topologyKeys":null},"clusterDefinitionRef":"apecloud-mysql","clusterVersionRef":"ac-mysql-8.0.30","componentSpecs":[{"componentDefRef":"mysql","enabledLogs":["slow","error"],"disableExporter":true,"name":"mysql","replicas":3,"resources":{"limits":{"cpu":"0.5","memory":"0.5Gi"},"requests":{"cpu":"0.5","memory":"0.5Gi"}},"serviceAccountName":null,"services":null,"volumeClaimTemplates":[{"name":"data","spec":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"20Gi"}}}}]}],"terminationPolicy":"Delete"}}
- creationTimestamp: "2024-05-11T02:12:03Z"
- finalizers:
- - cluster.kubeblocks.io/finalizer
- generation: 1
- labels:
- app.kubernetes.io/instance: mycluster
- app.kubernetes.io/version: 8.0.30
- clusterdefinition.kubeblocks.io/name: apecloud-mysql
- clusterversion.kubeblocks.io/name: ac-mysql-8.0.30
- helm.sh/chart: apecloud-mysql-cluster-0.8.0
- name: mycluster
- namespace: demo
- resourceVersion: "752393"
- uid: d3e64bca-b856-4a85-8edd-a5d14f489e5e
-spec:
- affinity:
- podAntiAffinity: Required
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- componentSpecs:
- - componentDefRef: mysql
- enabledLogs:
- - slow
- - error
- disableExporter: true
- name: mysql
- replicas: 3
- resources:
- limits:
- cpu: "0.5"
- memory: 0.5Gi
- requests:
- cpu: "0.5"
- memory: 0.5Gi
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
- terminationPolicy: Delete
-status:
- clusterDefGeneration: 2
- components:
- mysql:
- phase: Running
- podsReady: true
- podsReadyTime: "2024-05-11T02:12:40Z"
- conditions:
- - lastTransitionTime: "2024-05-11T02:12:03Z"
- message: 'The operator has started the provisioning of Cluster: mycluster'
- observedGeneration: 1
- reason: PreCheckSucceed
- status: "True"
- type: ProvisioningStarted
- - lastTransitionTime: "2024-05-11T02:12:03Z"
- message: Successfully applied for resources
- observedGeneration: 1
- reason: ApplyResourcesSucceed
- status: "True"
- type: ApplyResources
- - lastTransitionTime: "2024-05-11T02:12:40Z"
- message: all pods of components are ready, waiting for the probe detection successful
- reason: AllReplicasReady
- status: "True"
- type: ReplicasReady
- - lastTransitionTime: "2024-05-11T02:12:40Z"
- message: 'Cluster: mycluster is ready, current phase is Running'
- reason: ClusterReady
- status: "True"
- type: Ready
- observedGeneration: 1
- phase: Running
-```
-
-
-
-## Connect to a cluster
-
-
-
-
-
-You can use `kubectl exec` to exec into a Pod and connect to a database.
-
-KubeBlocks operator creates a new Secret called `mycluster-conn-credential` to store the connection credential of the AeCloud MySQL cluster. This secret contains the following keys:
-
-* `username`: the root username of the cluster.
-* `password`: the password of the root user.
-* `port`: the port of the cluster.
-* `host`: the host of the cluster.
-* `endpoint`: the endpoint of the cluster and it is the same as `host:port`.
-
-1. Get the `username` and `password` for the `kubectl exec` command.
-
- ```bash
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d
- >
- root
-
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d
- >
- 2gvztbvz
- ```
-
-2. Exec into the Pod `mysql-cluster-mysql-0` and connect to the database using username and password.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -p2gvztbvz
- ```
-
-
-
-
-
-You can also port forward the service to connect to a database from your local machine.
-
-1. Port forward the service.
-
- ```bash
- kubectl port-forward svc/mycluster-mysql 3306:3306 -n demo
- ```
-
-2. Open a new terminal and run the following command to connect to the database.
-
- ```bash
- mysql -uroot -p2gvztbvz
- ```
-
-
-
-
-
-For the detailed database connection guide, refer to [Connect database](./../../../user_docs/connect_database/overview-of-database-connection.md).
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md
deleted file mode 100644
index ecc458c0a94..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/delete-mysql-cluster.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: Delete an ApeCloud MySQL Cluster
-description: How to delete a MySQL Cluster
-keywords: [apecloud mysql, delete a cluster]
-sidebar_position: 7
-sidebar_label: Delete protection
----
-
-# Delete an ApeCloud MySQL Cluster
-
-## Termination policy
-
-:::note
-
-The termination policy determines how you delete a cluster.
-
-:::
-
-| **terminationPolicy** | **Deleting Operation** |
-|:----------------------|:-------------------------------------------------|
-| `DoNotTerminate` | `DoNotTerminate` blocks delete operation. |
-| `Halt` | `Halt` deletes workload resources such as statefulset, deployment workloads but keep PVCs. |
-| `Delete` | `Delete` deletes workload resources and PVCs but keep backups. |
-| `WipeOut` | `WipeOut` deletes workload resources, PVCs and all relevant resources included backups. |
-
-To check the termination policy, execute the following command.
-
-```bash
-kubectl -n demo get cluster mycluster
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mysql-cluster apecloud-mysql ac-mysql-8.0.30 Delete Running 37m
-```
-
-## Step
-
-Run the command below to delete a specified cluster.
-
-```bash
-kubectl delete cluster mycluster -n demo
-```
-
-If you want to delete a cluster and its all related resources, you can set the termination policy as `WipeOut` and then delete the cluster.
-
-```bash
-kubectl patch -n demo cluster mycluster -p '{"spec":{"terminationPolicy":"WipeOut"}}' --type="merge"
-
-kubectl delete -n demo cluster mycluster
-```
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/expand-volume.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/expand-volume.md
deleted file mode 100644
index 9ab4032d0f7..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/expand-volume.md
+++ /dev/null
@@ -1,118 +0,0 @@
----
-title: Expand volume
-description: How to expand the volume of an ApeCloud MySQL Cluster
-keywords: [apecloud mysql, expand volume, volume expansion]
-sidebar_position: 3
-sidebar_label: Expand volume
----
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-# Expand volume
-
-You can expand the storage volume size of each pod.
-
-:::note
-
-Volume expansion triggers pod restart. All pods restart in the order of learner -> follower -> leader and the leader pod may change after the operation.
-
-:::
-
-## Before you start
-
-Check whether the cluster status is `Running`. Otherwise, the following operations may fail.
-
-```bash
-kubectl get cluster mycluster -n demo
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster apecloud-mysql ac-mysql-8.0.30 Delete Running 4m29s
-```
-
-## Steps
-
-There are two ways to apply volume expansion.
-
-
-
-
-
-1. Apply an OpsRequest. Change the value of storage according to your need and run the command below to expand the volume of a cluster.
-
- ```bash
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-volume-expansion VolumeExpansion mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding cluster resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the value of `spec.componentSpecs.volumeClaimTemplates.spec.resources` in the cluster YAML file.
-
- `spec.componentSpecs.volumeClaimTemplates.spec.resources` is the storage resource information of the pod and changing this value triggers the volume expansion of a cluster.
-
- ```yaml
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- componentSpecs:
- - name: mysql
- componentDefRef: mysql
- replicas: 3
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 40Gi # Change the volume storage size.
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding cluster resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/restart-apecloud-mysql-cluster.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/restart-apecloud-mysql-cluster.md
deleted file mode 100644
index f6f87c23e55..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/restart-apecloud-mysql-cluster.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-title: Restart an ApeCloud MySQL Cluster
-description: How to restart an ApeCloud MySQL Cluster
-keywords: [apecloud mysql, restart, restart an apecloud mysql cluster]
-sidebar_position: 4
-sidebar_label: Restart
----
-
-# Restart an ApeCloud MySQL Cluster
-
-You can restart all pods of the cluster. When an exception occurs in a database, you can try to restart it.
-
-:::note
-
-All pods restart in the order of learner -> follower -> leader and the leader may change after the cluster restarts.
-
-:::
-
-## Steps
-
-1. Create an OpsRequest to restart a cluster.
-
- ```bash
- kubectl apply -f - <
- NAME READY STATUS RESTARTS AGE
- mycluster-mysql-0 4/4 Running 0 5m32s
- mycluster-mysql-1 4/4 Running 0 6m36s
- mycluster-mysql-2 3/4 Terminating 0 7m37s
-
- kubectl get ops ops-restart -n demo
- >
- NAME TYPE CLUSTER STATUS PROGRESS AGE
- ops-restart Restart mycluster Succeed 1/1 3m26s
- ```
-
- During the restarting process, there are two status types for pods.
-
- - STATUS=Terminating: it means the cluster restart is in progress.
- - STATUS=Running: it means the cluster has been restarted.
-
- If an error occurs, you can troubleshoot with `kubectl describe` command to view the events of this operation.
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/scale-for-apecloud-mysql.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/scale-for-apecloud-mysql.md
deleted file mode 100644
index 9f02cea2bf9..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/scale-for-apecloud-mysql.md
+++ /dev/null
@@ -1,309 +0,0 @@
----
-title: Scale for an ApeCloud MySQL Cluster
-description: How to scale an ApeCloud MySQL Cluster, horizontal scaling, vertical scaling
-keywords: [apecloud mysql, horizontal scaling, vertical scaling]
-sidebar_position: 2
-sidebar_label: Scale
----
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-# Scale for an ApeCloud MySQL cluster
-
-You can scale an ApeCloud MySQL Cluster cluster in two ways, vertical scaling and horizontal scaling.
-
-:::note
-
-After vertical scaling or horizontal scaling is performed, KubeBlocks automatically matches the appropriate configuration template based on the new specification. This is the KubeBlocks dynamic configuration feature. This feature simplifies the process of configuring parameters, saves time and effort and reduces performance issues caused by incorrect configuration. For detailed instructions, refer to [Configuration](./../configuration/configuration.md).
-
-:::
-
-## Vertical scaling
-
-You can vertically scale a cluster by changing resource requirements and limits (e.g. CPU and storage). For example, you can change the resource class from 1C2G to 2C4G by performing vertical scaling.
-
-### Before you start
-
-Check whether the cluster status is `Running`. Otherwise, the following operations may fail.
-
-```bash
-kubectl get cluster mycluster -n demo
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster apecloud-mysql ac-mysql-8.0.30 Delete Running 47m
-```
-
-### Steps
-
-There are two ways to apply vertical scaling.
-
-
-
-
-
-1. Apply an OpsRequest to the specified cluster. Configure the parameters according to your needs.
-
- ```bash
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the configuration of `spec.componentSpecs.resources` in the YAML file. `spec.componentSpecs.resources` controls the requirement and limit of resources and changing them triggers a vertical scaling.
-
- ```yaml
- kubectl edit cluster mycluster -n demo
- >
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- componentSpecs:
- - name: mysql
- componentDefRef: mysql
- replicas: 3
- resources: # Change the values of resources.
- requests:
- memory: "2Gi"
- cpu: "1"
- limits:
- memory: "4Gi"
- cpu: "2"
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-## Horizontal scaling
-
-Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five. The scaling process includes the backup and restore of data.
-
-From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../../maintenance/scale/horizontal-scale.md) for more details and examples.
-
-### Before you start
-
-Check whether the cluster STATUS is `Running`. Otherwise, the following operations may fail.
-
-```bash
-kubectl get cluster mycluster -n demo
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster apecloud-mysql ac-mysql-8.0.30 Delete Running 47m
-```
-
-### Steps
-
-There are two ways to apply horizontal scaling.
-
-
-
-
-
-1. Apply an OpsRequest to a specified cluster. Configure the parameters according to your needs.
-
- The example below means adding two replicas.
-
- ```bash
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the value of `spec.componentSpecs.replicas` in the YAML file.
-
- `spec.componentSpecs.replicas` stands for the pod amount and changing this value triggers a horizontal scaling of a cluster.
-
- ```yaml
- kubectl edit cluster mycluster -n demo
- >
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- componentSpecs:
- - name: mysql
- componentDefRef: mysql
- replicas: 1 # Change the amount
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-### Handle the snapshot exception
-
-If `STATUS=ConditionsError` occurs during the horizontal scaling process, you can find the cause from `cluster.status.condition.message` for troubleshooting.
-In the example below, a snapshot exception occurs.
-
-```bash
-Status:
- conditions:
- - lastTransitionTime: "2024-04-25T17:40:26Z"
- message: VolumeSnapshot/mycluster-mysql-scaling-dbqgp: Failed to set default snapshot
- class with error cannot find default snapshot class
- reason: ApplyResourcesFailed
- status: "False"
- type: ApplyResources
-```
-
-***Reason***
-
-This exception occurs because the `VolumeSnapshotClass` is not configured. This exception can be fixed after configuring `VolumeSnapshotClass`, but the horizontal scaling cannot continue to run. It is because the wrong backup (volumesnapshot is generated by backup) and volumesnapshot generated before still exist. First delete these two wrong resources and then KubeBlocks re-generates new resources.
-
-***Steps:***
-
-1. Configure the VolumeSnapshotClass by running the command below.
-
- ```bash
- kubectl create -f - <
-
-
-
-```bash
-kubectl apply -f - <
-
-
-
-Configure replicas as 0 to delete pods.
-
-```yaml
-apiVersion: apps.kubeblocks.io/v1alpha1
-kind: Cluster
-metadata:
- name: mycluster
-spec:
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- terminationPolicy: Delete
- componentSpecs:
- - name: mysql
- componentDefRef: mysql
- disableExporter: true
- replicas: 0
- volumeClaimTemplates:
- - name: data
- spec:
- storageClassName: standard
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
-```
-
-
-
-
-
-## Start a cluster
-
-You can start a cluster by creating an OpsRequest or changing the YAML file of the cluster.
-
-
-
-
-
-```bash
-kubectl apply -f - <
-
-
-
-Change replicas back to the original amount to start this cluster again.
-
-```yaml
-apiVersion: apps.kubeblocks.io/v1alpha1
-kind: Cluster
-metadata:
- name: mycluster
-spec:
- clusterDefinitionRef: apecloud-mysql
- clusterVersionRef: ac-mysql-8.0.30
- terminationPolicy: Delete
- componentSpecs:
- - name: mysql
- componentDefRef: mysql
- disableExporter: true
- replicas: 3
- volumeClaimTemplates:
- - name: data
- spec:
- storageClassName: standard
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
-```
-
-
-
-
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/switchover.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/switchover.md
deleted file mode 100644
index b1b322775d2..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/cluster-management/switchover.md
+++ /dev/null
@@ -1,85 +0,0 @@
----
-title: Switchover
-description: How to switch over an ApeCloud MySQL Cluster
-keywords: [apecloud mysql, switch over an apecloud mysql cluster, switchover]
-sidebar_position: 6
-sidebar_label: Switchover
----
-
-# Switchover
-
-You can initiate a switchover for an ApeCloud MySQL RaftGroup cluster. Then KubeBlocks switches the instance roles.
-
-## Before you start
-
-* Make sure the cluster is running normally.
-
- ```bash
- kubectl get cluster mycluster -n demo
- ```
-
-* Check whether the following role probe parameters exist to verify whether the role probe is enabled.
-
- ```bash
- kubectl get cd apecloud-mysql -o yaml
- >
- probes:
- roleProbe:
- failureThreshold: 2
- periodSeconds: 1
- timeoutSeconds: 1
- ```
-
-## Initiate the switchover
-
-You can switch a follower of an ApeCloud MySQL RaftGroup over to the leader role, and the former leader instance over to a follower.
-
-The value of `instanceName` decides whether a new leader instance is specified for the switchover.
-
-* Initiate a switchover with no specified leader instance.
-
- ```yaml
- kubectl apply -f -<
- root
-
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d
- >
- 2gvztbvz
- ```
-
- 2. Connect to this cluster and verify whether the parameters are configured as expected.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -p2gvztbvz
- >
- mysql> show variables like 'max_connections';
- +-----------------+-------+
- | Variable_name | Value |
- +-----------------+-------+
- | max_connections | 600 |
- +-----------------+-------+
- 1 row in set (0.00 sec)
- ```
-
-## Configure cluster parameters with an OpsRequest
-
-1. Define an OpsRequest file and configure the parameters in the OpsRequest in a YAML file named `mycluster-configuring-demo.yaml`. In this example, `max_connections` is configured as `600`.
-
- ```bash
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: OpsRequest
- metadata:
- name: mycluster-configuring-demo
- namespace: demo
- spec:
- clusterName: mycluster
- reconfigure:
- componentName: mysql
- configurations:
- - keys:
- - key: my.cnf
- parameters:
- - key: max_connections
- value: "600"
- name: mysql-consensusset-configuration
- preConditionDeadlineSeconds: 0
- type: Reconfiguring
- ```
-
- | Field | Definition |
- |--------------------------------------------------------|--------------------------------|
- | `metadata.name` | It specifies the name of this OpsRequest. |
- | `metadata.namespace` | It specifies the namespace where this cluster is created. |
- | `spec.clusterName` | It specifies the cluster name that this operation is targeted at. |
- | `spec.reconfigure` | It specifies a component and its configuration updates. |
- | `spec.reconfigure.componentName` | It specifies the component name of this cluster. |
- | `spec.configurations` | It contains a list of ConfigurationItem objects, specifying the component's configuration template name, upgrade policy, and parameter key-value pairs to be updated. |
- | `spec.reconfigure.configurations.keys.key` | It specifies the configuration map. |
- | `spec.reconfigure.configurations.keys.parameters` | It defines a list of key-value pairs for a single configuration file. |
- | `spec.reconfigure.configurations.keys.parameter.key` | It represents the name of the parameter you want to edit. |
- | `spec.reconfigure.configurations.keys.parameter.value` | It represents the parameter values that are to be updated. If set to nil, the parameter defined by the Key field will be removed from the configuration file. |
- | `spec.reconfigure.configurations.name` | It specifies the configuration template name. |
- | `preConditionDeadlineSeconds` | It specifies the maximum number of seconds this OpsRequest will wait for its start conditions to be met before aborting. If set to 0 (default), the start conditions must be met immediately for the OpsRequest to proceed. |
-
-2. Apply the configuration opsRequest.
-
- ```bash
- kubectl apply -f mycluster-configuring-demo.yaml
- ```
-
-3. Connect to this cluster to verify whether the configuration takes effect.
-
- 1. Get the username and password.
-
- ```bash
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d
- >
- root
-
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d
- >
- 2gvztbvz
- ```
-
- 2. Connect to this cluster and verify whether the parameters are configured as expected.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -p2gvztbvz
- >
- mysql> show variables like 'max_connections';
- +-----------------+-------+
- | Variable_name | Value |
- +-----------------+-------+
- | max_connections | 600 |
- +-----------------+-------+
- 1 row in set (0.00 sec)
- ```
-
-:::note
-
-Just in case you cannot find the configuration file of your cluster, you can use `kbcli` to view the current configuration file of a cluster.
-
-```bash
-kbcli cluster describe-config mycluster -n demo
-```
-
-From the meta information, the cluster `mycluster` has a configuration file named `my.cnf`.
-
-You can also view the details of this configuration file and parameters.
-
-* View the details of the current configuration file.
-
- ```bash
- kbcli cluster describe-config mycluster --show-detail -n demo
- ```
-
-* View the parameter description.
-
- ```bash
- kbcli cluster explain-config mycluster -n demo | head -n 20
- ```
-
-* View the user guide of a specified parameter.
-
- ```bash
- kbcli cluster explain-config mycluster --param=innodb_buffer_pool_size --config-specs=mysql-consensusset-config -n demo
- ```
-
- `--config-specs` is required to specify a configuration template since ApeCloud MySQL currently supports multiple templates. You can run `kbcli cluster describe-config mycluster` to view the all template names.
-
-
-
- Output
-
- ```bash
- template meta:
- ConfigSpec: mysql-consensusset-config ComponentName: mysql ClusterName: mycluster
-
- Configure Constraint:
- Parameter Name: innodb_buffer_pool_size
- Allowed Values: [5242880-18446744073709552000]
- Scope: Global
- Dynamic: false
- Type: integer
- Description: The size in bytes of the memory buffer innodb uses to cache data and indexes of its tables
- ```
-
-
-
- * Allowed Values: It defines the valid value range of this parameter.
- * Dynamic: The value of `Dynamic` in `Configure Constraint` defines how the parameter configuration takes effect. There are two different configuration strategies based on the effectiveness type of modified parameters, i.e. **dynamic** and **static**.
- * When `Dynamic` is `true`, it means the effectiveness type of parameters is **dynamic** and can be configured online.
- * When `Dynamic` is `false`, it means the effectiveness type of parameters is **static** and a pod restarting is required to make the configuration effective.
- * Description: It describes the parameter definition.
-
-:::
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/.gitkeep b/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/.gitkeep
deleted file mode 100644
index bcb33d630d7..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/.gitkeep
+++ /dev/null
@@ -1 +0,0 @@
-take place
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/_category_.yml
deleted file mode 100644
index e7cbbaf2488..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/database-security/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 8
-label: Database Security
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/_category_.yml
deleted file mode 100644
index 8ce89efb229..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 6
-label: High Availability
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/high-availability.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/high-availability.md
deleted file mode 100644
index 0f85677ed1f..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/high-availability/high-availability.md
+++ /dev/null
@@ -1,226 +0,0 @@
----
-title: Failure simulation and automatic recovery
-description: Automatic recovery of cluster
-keywords: [mysql, high availability, failure simulation, automatic recovery]
-sidebar_position: 1
----
-
-# Failure simulation and automatic recovery
-
-As an open-source data management platform, Kubeblocks currently supports over thirty database engines and is continuously expanding. Due to the varying high availability capabilities of databases, KubeBlocks has designed and implemented a high availability (HA) system for database instances. The KubeBlocks HA system uses a unified HA framework to provide high availability for databases, allowing different databases on KubeBlocks to achieve similar high availability capabilities and experiences.
-
-This tutorial uses Apecloud MySQL as an example to demonstrate its fault simulation and recovery capabilities.
-
-## Recovery simulation
-
-:::note
-
-The faults here are all simulated by deleting pods. When there are sufficient resources, the fault can also be simulated by machine downtime or container deletion, and its automatic recovery is the same as described here.
-
-:::
-
-### Before you start
-
-* [Install KubeBlocks](../../../user_docs/installation/install-with-helm/install-kubeblocks.md).
-* [Create an ApeCloud MySQL RaftGroup Cluster](./../cluster-management/create-and-connect-an-apecloud-mysql-cluster.md).
-* Run `kubectl get cd apecloud-mysql -o yaml` to check whether _rolechangedprobe_ is enabled in the ApeCloud MySQL RaftGroup Cluster (it is enabled by default). If the following configuration exists, it indicates that it is enabled:
-
- ```bash
- probes:
- roleProbe:
- failureThreshold: 2
- periodSeconds: 1
- timeoutSeconds: 1
- ```
-
-### Leader pod fault
-
-***Steps:***
-
-1. View the pod role of the ApeCloud MySQL RaftGroup Cluster. In this example, the leader pod's name is `mycluster-mysql-1`.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_pod](./../../../img/api-ha-grep-role.png)
-2. Delete the leader pod `mycluster-mysql-1` to simulate a pod fault.
-
- ```bash
- kubectl delete pod mycluster-mysql-1 -n demo
- ```
-
- ![delete_pod](./../../../img/api-ha-delete-leader-pod.png)
-3. Check the status of the pods and RaftGroup Cluster connection.
-
- The following example shows that the roles of pods have changed after the old leader pod was deleted and `mycluster-mysql-0` is elected as the new leader pod.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster_after](./../../../img/api-ha-delete-leader-pod-after.png)
-
- Connect to this cluster to check the pod roles and status. This cluster can be connected within seconds.
-
- ```bash
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\username}' | base64 -d
- >
- root
-
- kubectl get secrets -n demo mycluster-conn-credential -o jsonpath='{.data.\password}' | base64 -d
- >
- pt2mmdlp4
-
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -pt2mmdlp4
- ```
-
- ![connect_cluster_after](./../../../img/api-ha-leader-pod-connect-check.png)
-
- ***How the automatic recovery works***
-
- After the leader pod is deleted, the ApeCloud MySQL RaftGroup Cluster elects a new leader. In this example, `mycluster-mysql-0` is elected as the new leader. KubeBlocks detects that the leader has changed, and sends a notification to update the access link. The original exception node automatically rebuilds and recovers to the normal RaftGroup Cluster state. It normally takes 30 seconds from exception to recovery.
-
-### Single follower pod exception
-
-***Steps:***
-
-1. View the pod role again and in this example, the follower pods are `mycluster-mysql-1` and `mycluster-mysql-2`.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster](./../../../img/api-ha-grep-role-single-follower-pod.png)
-2. Delete the follower pod `mycluster-mysql-1`.
-
- ```bash
- kubectl delete pod mycluster-mysql-1 -n demo
- ```
-
- ![delete_follower_pod](./../../../img/api-ha-single-follower-pod-delete.png)
-3. Open another terminal page and view the pod status. You can find the follower pod `mycluster-mysql-1` is `Terminating`.
-
- ```bash
- kubectl get pod -n demo
- ```
-
- ![view_cluster_follower_status](./../../../img/api-delete-single-follower-pod-status.png)
-
- View the pod roles again.
-
- ![describe_cluster_follower](./../../../img/api-ha-single-follower-pod-grep-role-after.png)
-
-4. Connect to this cluster and you can find this single follower exception doesn't affect the R/W of the cluster.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -pt2mmdlp4
- ```
-
- ![connect_cluster_follower](./../../../img/api-ha-connect-single-follower-pod.png)
-
- ***How the automatic recovery works***
-
- One follower exception doesn't trigger re-electing of the leader or access link switch, so the R/W of the cluster is not affected. Follower exception triggers recreation and recovery. The process takes no more than 30 seconds.
-
-### Two pods exception
-
-The availability of the cluster generally requires the majority of pods to be in a normal state. When exceptions occur to the majority of pods, the original leader will be automatically downgraded to a follower. Therefore, the exceptions of any two pods result in only one follower pod remaining.
-
-In this way, whether exceptions occur to one leader and one follower or two followers, failure performance and automatic recovery are the same.
-
-***Steps:***
-
-1. View the pod role again. In this example, the follower pods are `mycluster-mysql-1` and `mycluster-mysql-2`.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster](./../../../img/api-ha-two-pods-grep-role.png)
-2. Delete these two follower pods.
-
- ```bash
- kubectl delete pod mycluster-mysql-1 mycluster-mysql-2 -n demo
- ```
-
- ![delete_two_pods](./../../../img/api-ha-two-pod-get-status.png)
-3. Open another terminal page and view the pod status. You can find the follower pods `mycluster-mysql-1` and `mycluster-mysql-2` is `Terminating`.
-
- ```bash
- kubectl get pod -n demo
- ```
-
- ![view_cluster_follower_status](./../../../img/api-ha-two-pod-get-status.png)
-
- View the pod roles and you can find a new leader pod is selected.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster_follower](./../../../img/api-ha-two-pods-grep-role-after.png)
-
-4. Connect to this cluster after a few seconds and you can find the pods in the RaftGroup Cluster work normally again.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -pt2mmdlp4
- ```
-
- ![connect_two_pods](./../../../img/api-ha-two-pods-connect-after.png)
-
- ***How the automatic recovery works***
-
- When exceptions occur to two pods of the ApeCloud MySQL RaftGroup Cluster, all pods are unavailable and the cluster R/W is unavailable. After the recreation of pods, a new leader is elected to recover to R/W status. The process takes less than 30 seconds.
-
-### All pods exception
-
-***Steps:***
-
-1. View the role of pods.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster](./../../../img/api-ha-all-pods-grep-role.png)
-2. Delete all pods.
-
- ```bash
- kubectl delete pod mycluster-mysql-1 mycluster-mysql-0 mycluster-mysql-2 -n demo
- ```
-
- ![delete_three_pods](./../../../img/api-ha-all-pods-delete.png)
-3. Open another terminal page and view the pod status. You can find the pods are terminating.
-
- ```bash
- kubectl get pod -n demo
- ```
-
- ![describe_three_clusters](./../../../img/api-ha-all-pods-get-status.png)
-4. View the pod roles and you can find a new leader pod is elected.
-
- ```bash
- kubectl get pods --show-labels -n demo | grep role
- ```
-
- ![describe_cluster_follower](./../../../img/api-ha-all-pods-grep-role-after.png)
-5. Connect to this cluster after a few seconds and you can find the pods in this cluster work normally again.
-
- ```bash
- kubectl exec -ti -n demo mycluster-mysql-0 -- bash
-
- mysql -uroot -pt2mmdlp4
- ```
-
- ![connect_three_clusters](./../../../img/api-ha-all-pods-connect-after.png)
-
- ***How the automatic recovery works***
-
- Every time all pods are deleted, recreation is triggered. And then ApeCloud MySQL automatically completes the cluster recovery and the election of a new leader. Once a new leader is elected, KubeBlocks detects this new leader and updates the access link. This process takes less than 30 seconds.
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/kubeblocks-for-apecloud-mysql.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/kubeblocks-for-apecloud-mysql.md
deleted file mode 100644
index 9a77bf816c3..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/kubeblocks-for-apecloud-mysql.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-title: KubeBlocks for ApeCloud MySQL
-description: Feature list of KubeBlocks for ApeCloud MySQL
-keywords: [apecloud mysql, introduction, feature]
-sidebar_position: 1
----
-
-# KubeBlocks for ApeCloud MySQL
-
-This tutorial illustrates how to create and manage an ApeCloud MySQL cluster by `kubectl` or a YAML file. You can find the YAML examples and guides in [the GitHub repository](https://github.com/apecloud/kubeblocks-addons/tree/release-0.9/examples/apecloud-mysql).
-
-* [Introduction](./apecloud-mysql-intro/apecloud-mysql-intro.md)
-* [Cluster Management](./cluster-management/create-and-connect-an-apecloud-mysql-cluster.md)
-* [Configuration](./configuration/configuration.md)
-* [High Availability](./high-availability/high-availability.md)
-* [Proxy](./proxy/introduction.md)
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/_category_.yml b/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/_category_.yml
deleted file mode 100644
index 0f245c32f76..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 8
-label: Proxy
-collapsible: true
-collapsed: true
\ No newline at end of file
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/apecloud-mysql-proxy.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/apecloud-mysql-proxy.md
deleted file mode 100644
index d143318627a..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/apecloud-mysql-proxy.md
+++ /dev/null
@@ -1,481 +0,0 @@
----
-title: How to use ApeCloud MySQL Proxy Cluster
-description: ApeCloud MySQL Proxy Cluster tutorial
-keywords: [apecloud mysql proxy, proxy]
-sidebar_position: 2
-sidebar_label: ApeCloud MySQL Proxy Cluster
----
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-# ApeCloud MySQL Proxy
-
-## Before you start
-
-1. [Install KubeBlocks](../../../user_docs/installation/install-with-helm/install-kubeblocks.md).
-2. Prepare an ApeCloud MySQL RaftGroup named `mycluster` for demonstrating how to enable the proxy function for an existing cluster. Refer to [Create a MySQL cluster](./../cluster-management/create-and-connect-an-apecloud-mysql-cluster.md) for details.
-
-## Create a Proxy Cluster
-
-1. Add the KubeBlocks repository.
-
- ```bash
- helm repo add kubeblocks https://apecloud.github.io/helm-charts
- ```
-
-2. View the repository list to verify whether the KubeBlocks repository is added successfully.
-
- ```bash
- helm repo list
- ```
-
-3. Run the update command to make sure you have added the latest version.
-
- ```bash
- helm repo update
- ```
-
-4. Install etcd to create the external service reference.
-
- 1. View all versions of etcd.
-
- ```bash
- helm search repo kubeblocks/etcd --devel --versions
- ```
-
- 2. Install the etcd addon.
-
- ```bash
- helm install etcd kubeblocks/etcd --version=v0.6.5
- ```
-
- 3. Install the etcd cluster.
-
- ```bash
- helm install etcd-cluster kubeblocks/etcd-cluster
- ```
-
- 4. view the status of the etcd cluster and make sure it is running.
-
- ```bash
- kubectl get cluster
- >
- NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
- etcd-cluster etcd etcd-v3.5.6 Halt Running 10s
- ```
-
- 5. View the service address of this etcd clsuter.
-
- ```bash
- kubectl get service
- >
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- etcd-cluster-etcd ClusterIP 10.110.23.89 2379/TCP 55s
- etcd-cluster-etcd-headless ClusterIP None 2379/TCP,2380/TCP,3501/TCP,50001/TCP 55s
- kubernetes ClusterIP 10.96.0.1 443/TCP 13m
- ```
-
- You can combine the service address to get the endpoint or you can use the IP of the service address as the access address.
-
- Here is an example of combining the service address.
-
- ```bash
- etcd-cluster-etcd.default.svc.cluster.local:2379
- ```
-
-5. Create an ApeCloud MySQL Proxy Cluster.
- 1. View all versions of ApeCloud MySQL Proxy.
-
- ```bash
- helm search repo kubeblocks/apecloud-mysql --devel --versions
- ```
-
- 2. (Optional) If you disable the `apecloud-mysql` addon when installing KuebBlocks, run the command below to specify a version and install the cluster definition of ApeCloud MySQL. Skip this step if you install KubeBlocks with the default settings.
-
- ```bash
- helm install myproxy kubeblocks/apecloud-mysql --version=v0.9.0
- ```
-
- 3. Create an ApeCloud MySQL Proxy Cluster.
-
- ```bash
- helm install myproxy kubeblocks/apecloud-mysql-cluster --version=v0.9.0 --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379"
- ```
-
-:::note
-
-If you only have one node for deploying a RaftGroup Cluster, set the `extra.availability-policy` as `none` when creating a RaftGroup Cluster.
-
-```bash
-helm install myproxy kubeblocks/apecloud-mysql-cluster --version=v0.9.0 --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379" --set extra.availabilityPolicy=none
-```
-
-:::
-
-6. Check the status of the clusters.
-
- ```bash
- kubectl get cluster
-
- kubectl get pods
- ```
-
- You can also enter the etcd container or wesql-scale container to view the configuration of wesql-scale or to check the availability of the etcd service.
-
- ```bash
- etcdctl --endpoints=http://etcd-cluster-etcd.default.svc.cluster.local:2379 get /vitess --prefix --keys-only
- ```
-
-## Enable/Disable Proxy dynamically
-
-As its name suggests, ApeCloud MySQL Proxy in nature is a database proxy. An ApeCloud MySQL RaftGroup Cluster that already exists can be switched to an ApeCloud MySQL Proxy Cluster by setting `proxyEnabled=true`.
-
-```bash
-helm upgrade mycluster kubeblocks/apecloud-mysql-cluster --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379"
-```
-
-If you want to disable proxy, run the command below.
-
-```bash
-helm upgrade mycluster kubeblocks/apecloud-mysql-cluster --set mode=raftGroup
-```
-
-## Connect Proxy Cluster
-
-ApeCloud MySQL Proxy is routed through the `vtgate` component, and the way the MySQL Server accesses `vtgate` is similar to the way of accessing `mysqld`. The external SQL access address provided by ApeCloud MySQL Proxy is the `vtgate` address and port. The `vtgate` address created by KubeBlocks by default is `myproxy-cluster-vtgate-headless`, and the port number is `15306`. You can visit ApeCloud MySQL Proxy through the MySQL Server in any pod under the same namespace as ApeCloud MySQL Proxy.
-
-### Connect Proxy Cluster by VTGate
-
-1. Expose the port of VTGate to the localhost so that the localhost can access the Proxy.
-
- ```bash
- kubectl port-forward svc/vt-vtgate-headless 15306:15306
- ```
-
-2. Connect to the cluster.
-
- ```bash
- mysql -h 127.0.0.1 -P 15306
- ```
-
-### Connect Proxy Cluster by MySQL Server
-
-1. Expose the port of the MySQL Server to the localhost so that the localhost can access the MySQL Server.
-
- ```bash
- kubectl port-forward svc/vt-mysql 3306:3306
- ```
-
-2. Connect to the cluster.
-
- ```bash
- mysql -h 127.0.0.1 -P 3306
- ```
-
-:::note
-
-If you need to test the failover of MySQL, you need to delete the Pod first and continue to port-forward the port, and you can also write a shell script. Here are examples.
-
-For VTGate,
-
-```bash
-while true; do date; kubectl port-forward svc/vt-vtgate-headless 15306:15306; sleep 0.5; done
-```
-
-For the MySQL Server,
-
-```bash
-while true; do date; kubectl port-forward svc/vt-mysql 3306:3306; sleep 0.5; done
-```
-
-:::
-
-## Configure Proxy Cluster parameters
-
-VTGate, VTConsensus, and VTTablet support parameter configuration. You can configure the proxy cluster by editing the configuration file or by performing an OpsRequest.
-
-
-
-
-
-1. Get the configuration file of this cluster.
-
- ```bash
- kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
- ```
-
-2. Configure parameters according to your needs. The example below adds the `spec.configFileParams` part to configure `max_connections`.
-
- ```yaml
- spec:
- clusterRef: myproxy
- componentName: vtgate
- configItemDetails:
- - configFileParams:
- vtgate.cnf:
- parameters:
- healthcheck_timeout: "5s"
- configSpec:
- constraintRef: mysql-scale-vtgate-config-constraints
- name: vtgate-config
- namespace: kb-system
- templateRef: vtgate-config-template
- volumeName: mysql-scale-config
- name: vtgate-config
- payload: {}
- ```
-
-3. Connect to this cluster to verify whether the configuration takes effect.
-
- 1. Expose the port of the MySQL Server to the localhost so that the localhost can access the MySQL Server.
-
- ```bash
- kubectl port-forward svc/vt-vtgate-headless 15306:15306
- ```
-
- 2. Connect to this cluster and verify whether the parameters are configured as expected.
-
- ```bash
- mysql -h 127.0.0.1 -P 3306
-
- >
- mysql> show variables like 'healthcheck_timeout';
- +---------------------+-------+
- | Variable_name | Value |
- +---------------------+-------+
- | healthcheck_timeout | 5s |
- +---------------------+-------+
- 1 row in set (0.00 sec)
- ```
-
-
-
-
-
-Apply an OpsRequest to the specified cluster. Configure the parameters according to your needs.
-
-* An example of configuring VTTablet
-
- ```yaml
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: OpsRequest
- metadata:
- name: acmysql-vttablet-reconfiguring
- namespace: default
- spec:
- clusterName: acmysql-cluster
- force: false
- reconfigure:
- componentName: mysql
- configurations:
- - keys:
- - key: vttablet.cnf
- parameters:
- - key: health_check_interval
- value: 4s
- name: vttablet-config
- preConditionDeadlineSeconds: 0
- type: Reconfiguring
- ```
-
-* An example of configuring VTGate
-
- ```yaml
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: OpsRequest
- metadata:
- name: acmysql-vtgate-reconfiguring
- namespace: default
- spec:
- clusterName: acmysql-cluster
- force: false
- reconfigure:
- componentName: vtgate
- configurations:
- - keys:
- - key: vtgate.cnf
- parameters:
- - key: healthcheck_timeout
- value: 2s
- name: vtgate-config
- preConditionDeadlineSeconds: 0
- type: Reconfiguring
- ```
-
-
-
-
-
-## Log
-
-You can view the log files of components, Pods, and containers.
-
-View the log of VTGate.
-
-```bash
-kubectl logs myproxy-cluster-vtgate-8659d5db95-4dzt5
-```
-
-View the log of VTTablet and `-c` is required.
-
-```bash
-kubectl logs myproxy-cluster-mysql-0 -c vttablet
-```
-
-Enter the container and view more logs of VTGate.
-
-```bash
-kubectl exec -it myproxy-cluster-vtgate-8659d5db95-4dzt5 -- bash
-ls /vtdataroot
-```
-
-Enter the container and view more logs of VTTablet.
-
-```bash
-kubectl exec -it myproxy-cluster-mysql-0 -c vttablet -- bash
-ls /vtdataroot
-```
-
-## Monitoring
-
-You can monitor the performance of the proxy cluster.
-
-1. Enable the monitoring addons.
-
- For the testing/demo environment, run the commands below to enable the monitoring addons provided by KubeBlocks.
-
- ```bash
- helm install prometheus kubeblocks/prometheus --namespace kb-system --create-namespace
- helm install prometheus kubeblocks/prometheus --namespace kb-system --create-namespace
- helm install prometheus kubeblocks/prometheus --namespace kb-system --create-namespace
- ```
-
- For the production environment, you can integrate the monitoring components. For details, you can refer to the relevant docs provided by the monitoring tools.
-
-2. Check whether the monitoring function of this proxy cluster is enabled.
-
- ```bash
- kubectl get cluster myproxy -o yaml
- ```
-
- If the output YAML file shows `disableExporter: false`, the monitoring function of this proxy cluster is enabled.
-
- If the monitoring function is not enabled, run the command below to enable it first.
-
- ```bash
- kubectl patch cluster mycluster -n demo --type "json" -p '[{"op":"add","path":"/spec/componentSpecs/0/disableExporter","value":false}]'
- ```
-
-3. View the dashboard.
-
- For the testing/demo environment, run the commands below to view the Grafana dashboard.
-
- ```bash
- # 1. Get the username and password
- kubectl get secret grafana -n kb-system -o jsonpath='{.data.admin-user}' |base64 -d
-
- kubectl get secret grafana -n kb-system -o jsonpath='{.data.admin-password}' |base64 -d
-
- # 2. Connect to the Grafana dashboard
- kubectl port-forward svc/grafana -n kb-system 3000:8
-
- # 3. Open the web browser and enter the address 127.0.0.1:3000 to visit the dashboard.
-
- # 4. Enter the username and password obtained from step 1.
- ```
-
- For the production environment, you can view the dashboard of the corresponding cluster via Grafana Web Console. For more detailed information, see [the Grafana dashboard documentation](https://grafana.com/docs/grafana/latest/dashboards/).
-
-:::note
-
-1. If there is no data in the dashboard, you can check whether the job is `kubeblocks-service`. Enter `kubeblocks-service` in the job field and press the enter button.
-
- ![Monitoring dashboard](./../../../img/api-monitoring.png)
-
-2. For more details on the monitoring function, you can refer to [Monitoring](./../../observability/monitor-database.md).
-
-:::
-
-## Read-write splitting
-
-You can enable the read-write splitting function.
-
-1. Get the configuration file of this cluster.
-
- ```bash
- kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
- ```
-
-2. Configure `read_write_splitting_policy` as `random`.
-
- ```yaml
- spec:
- clusterRef: myproxy
- componentName: vtgate
- configItemDetails:
- - configFileParams:
- vtgate.cnf:
- parameters:
- read_write_splitting_policy: "random"
- configSpec:
- constraintRef: mysql-scale-vtgate-config-constraints
- name: vtgate-config
- namespace: kb-system
- templateRef: vtgate-config-template
- volumeName: mysql-scale-config
- name: vtgate-config
- payload: {}
- ```
-
-You can also set the ratio for read-write splitting and here is an example of directing 70% flow to the read-only node.
-
-```yaml
-spec:
- clusterRef: myproxy
- componentName: vtgate
- configItemDetails:
- - configFileParams:
- vtgate.cnf:
- parameters:
- read_write_splitting_rati: "70"
- configSpec:
- constraintRef: mysql-scale-vtgate-config-constraints
- name: vtgate-config
- namespace: kb-system
- templateRef: vtgate-config-template
- volumeName: mysql-scale-config
- name: vtgate-config
- payload: {}
-```
-
-## Transparent failover
-
-Run the command below to perform a transparent failover.
-
-1. Get the configuration file of this cluster.
-
- ```bash
- kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
- ```
-
-2. Configure `enable_buffer` as `true`.
-
- ```yaml
- spec:
- clusterRef: myproxy
- componentName: vtgate
- configItemDetails:
- - configFileParams:
- vtgate.cnf:
- parameters:
- enable_buffer: "true"
- configSpec:
- constraintRef: mysql-scale-vtgate-config-constraints
- name: vtgate-config
- namespace: kb-system
- templateRef: vtgate-config-template
- volumeName: mysql-scale-config
- name: vtgate-config
- payload: {}
- ```
diff --git a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/introduction.md b/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/introduction.md
deleted file mode 100644
index 08ba1593cc4..00000000000
--- a/docs/api_docs/kubeblocks-for-apecloud-mysql/proxy/introduction.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: Introduction
-description: Introduction to ApeCloud MySQL Proxy
-keywords: [introduction, proxy]
-sidebar_position: 1
-sidebar_label: Introduction
----
-
-# Introduction
-
-A database proxy is an essential tool for developers and database administrators to improve the scalability, performance, security, and resilience of their applications.
-
-ApeCloud MySQL Proxy is a database proxy designed to be highly compatible with MySQL. It supports the MySQL wire protocol, read-write splitting without stale reads, connection pooling, and transparent failover. This section introduces ApeCloud MySQL Proxy, explaining its architecture, key features, and benefits.
-
-## Architecture
-
-ApeCloud MySQL Proxy is a fork of the Vitess project and the support for sharding is removed in exchange for better SQL compatibility, for example, better support for subqueries, Common Table Expressions (CTE) and expression evaluation. The below graph displays the architecture of a proxy cluster.
-
-**VTGate**: Client application usually connects to VTGate via standard MySQL wire protocol. VTGate is stateless, which means it can be easily and effectively scaled in terms of size and performance. It acts like a MySQL and is responsible for parsing SQL queries, as well as planning and routing queries to VTTables.
-
-**VTTablet**: Typically, VTTablet is implemented as a sidecar for MySQL. If ApeCloud MySQL Proxy is deployed in Kubernetes, VTTablet should be in the same pod as MySQL. VTTablet accepts gRPC requests from VTGate and then sends those queries to be executed on MySQL. The VTTablet takes care of a few tasks such as permission checking and logging, but its most critical role is to ensure proper connection pooling.
-
-**VTController**: The VTController component facilitates service discovery between VTGate and VTTablet, while also enabling them to store metadata of the cluster. If the role of MySQL changes, for example, from leaders to followers, the corresponding role of VTTablet should change accordingly. VTController checks the status of the MySQL cluster and sends commands to VTTablet to request that it changes roles.
-
-![ApeCloud MySQL Proxy architecture](./../../../img/proxy-architecture.png)
-
-## Connection pooling
-
-Database connections consume memory, and to ensure that the buffer pool has enough memory, databases restrict the value of 'max_connections'. As applications are generally stateless and may need to rapidly scale out, a large number of connections may be created, which can easily overload your database. So, these kinds of applications are not suitable for directly connecting to the MySQL server and creating a connection pool.
-
-Applications can create as many connections as they require with ApeCloud MySQL Proxy, without any concern about 'max_connection' errors. Because ApeCloud MySQL Proxy takes over the establishment of a connection pool to the database, allowing applications to share and reuse connections at the MySQL server side. This reduces the memory and CPU overheads associated with opening and closing connections on the MySQL server side, improving scalability and performance.
-
-## Read-Write splitting
-
-Using read-only nodes can significantly reduce the workload on the primary database node and improve resource utilization. However, managing multiple read-only nodes and deciding when to use each can be challenging for applications. ApeCloud MySQL Proxy addresses this issue by offering three essential features: read-write splitting, read-after-write consistency, and load-balancing. These features make it easier for applications to take advantage of read-only nodes effectively.
-
-**Read-Write Split**: ApeCloud MySQL Proxy simplifies application logic by automatically routing read queries to read-only nodes and write queries to the primary node. This is achieved by parsing and analyzing SQL statements, which improves load balancing and ensures efficient use of available resources.
-
-**Read-After-Write Consistency**: This feature works in conjunction with read-write splitting to maintain data consistency while still benefiting from performance improvements. When an application writes data to the primary node and subsequently reads it on a read-only node, ApeCloud MySQL Proxy makes sure that the data that was just written to the primary node can be accessed and read from the read-only node.
-
-**Load-Balancing**: ApeCloud MySQL Proxy helps manage read-only nodes by routing queries to the appropriate node using various load balancing policies. This ensures that the workload is evenly distributed across all available nodes, optimizing performance and resource utilization.
-
-## Transparent failover
-
-Failover is a feature designed to ensure that if the original database instance becomes unavailable, it is replaced with another instance and remains highly available. Various factors can trigger a failover event, including issues with the database instance or scheduled maintenance procedures like database upgrades.
-
-Without ApeCloud MySQL Proxy, a failover requires a short period of downtime. Existing connections to the database are disconnected and need to be reopened by your application. ApeCloud MySQL Proxy is capable of automatically detecting failovers and buffering application SQL in its memory while keeping application connections intact, thus enhancing application resilience in the event of database failures.
-
-There is no way to completely solve the application-side connection error problem. However, the proxy is stateless and can be deployed with multiple nodes for high availability. Moreover, restart/recovery is usually way faster than the database, as it does not need to recover from the undo-redo log.
diff --git a/docs/api_docs/kubeblocks-for-elasticsearch/_category_.yml b/docs/api_docs/kubeblocks-for-elasticsearch/_category_.yml
deleted file mode 100644
index 9ef5c05dc32..00000000000
--- a/docs/api_docs/kubeblocks-for-elasticsearch/_category_.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-position: 19
-label: KubeBlocks for Elasticsearch
-collapsible: true
-collapsed: true
diff --git a/docs/api_docs/kubeblocks-for-elasticsearch/manage-elasticsearch.md b/docs/api_docs/kubeblocks-for-elasticsearch/manage-elasticsearch.md
deleted file mode 100644
index 0d27a3b3d29..00000000000
--- a/docs/api_docs/kubeblocks-for-elasticsearch/manage-elasticsearch.md
+++ /dev/null
@@ -1,663 +0,0 @@
----
-title: Manage Elasticsearch with KubeBlocks
-description: How to manage Elasticsearch on KubeBlocks
-keywords: [elasticsearch]
-sidebar_position: 1
-sidebar_label: Manage Elasticsearch with KubeBlocks
----
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-# Manage Elasticsearch with KubeBlocks
-
-Elasticsearch is a distributed, RESTful search and analytics engine that is capable of solving an ever-growing number of use cases. As the heart of the Elastic Stack, Elasticsearch stores your data centrally, allowing you to search it quickly, tune relevancy, perform sophisticated analytics, and easily scale.
-
-KubeBlocks supports the management of Elasticsearch. This tutorial illustrates how to create and manage an Elasticsearch cluster by `kubectl` or a YAML file. You can find the YAML examples and guides in [the GitHub repository](https://github.com/apecloud/kubeblocks-addons/tree/release-0.9/examples/elasticsearch).
-
-## Before you start
-
-* [Install KubeBlocks](../../user_docs/installation/install-with-helm/install-kubeblocks.md).
-* View all the database types and versions available for creating a cluster.
-
- Make sure the `elasticsearch` cluster definition is installed. If the cluster definition is not available, refer to [this doc](../../user_docs/installation/install-with-helm/install-addons.md) to enable it first.
-
- ```bash
- kubectl get clusterdefinition elasticsearch
- >
- NAME TOPOLOGIES SERVICEREFS STATUS AGE
- elasticsearch Available 30m
- ```
-
- View all available versions for creating a cluster.
-
- ```bash
- kubectl get clusterversions -l clusterdefinition.kubeblocks.io/name=elasticsearch
- ```
-
-* To keep things isolated, create a separate namespace called `demo` throughout this tutorial.
-
- ```bash
- kubectl create namespace demo
- ```
-
-## Create a cluster
-
-KubeBlocks implements a `Cluster` CRD to define a cluster. Here is an example of creating an Elasticsearch cluster. Pods are distributed on different nodes by default. But if you only have one node for deploying an Elasticsearch cluster, set `spec.affinity.topologyKeys` as `null`.
-
-```yaml
-cat < - `DoNotTerminate` blocks deletion operation. - `Halt` deletes workload resources such as statefulset and deployment workloads but keep PVCs.
- `Delete` is based on Halt and deletes PVCs.
- `WipeOut` is based on Delete and wipe out all volume snapshots and snapshot data from a backup storage location. |
-| `spec.affinity` | It defines a set of node affinity scheduling rules for the cluster's Pods. This field helps control the placement of Pods on nodes within the cluster. |
-| `spec.affinity.podAntiAffinity` | It specifies the anti-affinity level of Pods within a component. It determines how pods should spread across nodes to improve availability and performance. |
-| `spec.affinity.topologyKeys` | It represents the key of node labels used to define the topology domain for Pod anti-affinity and Pod spread constraints. |
-| `spec.tolerations` | It is an array that specifies tolerations attached to the cluster's Pods, allowing them to be scheduled onto nodes with matching taints. |
-| `spec.componentSpecs` | It is the list of components that define the cluster components. This field allows customized configuration of each component within a cluster. |
-| `spec.componentSpecs.componentDefRef` | It is the name of the component definition that is defined in the cluster definition and you can get the component definition names with `kubectl get clusterdefinition elasticsearch -o json \| jq '.spec.componentDefs[].name'`. |
-| `spec.componentSpecs.name` | It specifies the name of the component. |
-| `spec.componentSpecs.disableExporter` | It defines whether the monitoring function is enabled. |
-| `spec.componentSpecs.replicas` | It specifies the number of replicas of the component. |
-| `spec.componentSpecs.resources` | It specifies the resource requirements of the component. |
-
-KubeBlocks operator watches for the `Cluster` CRD and creates the cluster and all dependent resources. You can get all the resources created by the cluster with `kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo`.
-
-```bash
-kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo
-```
-
-Run the following command to see the created Elasticsearch cluster object:
-
-```bash
-kubectl get cluster mycluster -n demo -o yaml
-```
-
-## Connect to an Elasticsearch cluster
-
-Elasticsearch provides the HTTP protocol for client access on port 9200. You can visit the cluster by the local host.
-
-```bash
-curl http://127.0.0.1:9200/_cat/nodes?v
-```
-
-## Scaling
-
-### Scale horizontally
-
-Horizontal scaling changes the amount of pods. For example, you can scale out replicas from three to five.
-
-From v0.9.0, besides replicas, KubeBlocks also supports scaling in and out instances, refer to [Horizontal Scale](./../maintenance/scale/horizontal-scale.md) for more details and examples.
-
-#### Before you start
-
-Check whether the cluster STATUS is `Running`. Otherwise, the following operations may fail.
-
-```bash
-kubectl get cluster mycluster -n demo
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster elasticsearch elasticsearch-8.8.2 Delete Running 47m
-```
-
-#### Scale replicas
-
-***Steps:***
-
-There are two ways to apply horizontal scaling.
-
-
-
-
-
-1. Apply an OpsRequest to a specified cluster. Configure the parameters according to your needs.
-
- The example below means adding two replicas.
-
- ```bash
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the configuration of `spec.componentSpecs.replicas` in the YAML file. `spec.componentSpecs.replicas` stands for the pod amount and changing this value triggers a horizontal scaling of a cluster.
-
- ```yaml
- kubectl edit cluster mycluster -n demo
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: elasticsearch
- clusterVersionRef: elasticsearch-8.8.2
- componentSpecs:
- - name: elasticsearch
- componentDefRef: elasticsearch
- replicas: 1 # Change the amount
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-#### Handle the snapshot exception
-
-If `STATUS=ConditionsError` occurs during the horizontal scaling process, you can find the cause from `cluster.status.condition.message` for troubleshooting.
-In the example below, a snapshot exception occurs.
-
-```bash
-Status:
- conditions:
- - lastTransitionTime: "2024-04-25T17:40:26Z"
- message: VolumeSnapshot/mycluster-elasticsearch-scaling-dbqgp: Failed to set default snapshot
- class with error cannot find default snapshot class
- reason: ApplyResourcesFailed
- status: "False"
- type: ApplyResources
-```
-
-***Reason***
-
-This exception occurs because the `VolumeSnapshotClass` is not configured. This exception can be fixed after configuring `VolumeSnapshotClass`, but the horizontal scaling cannot continue to run. It is because the wrong backup (volumesnapshot is generated by backup) and volumesnapshot generated before still exist. First, delete these two wrong resources and then KubeBlocks re-generates new resources.
-
-***Steps:***
-
-1. Configure the VolumeSnapshotClass by running the command below.
-
- ```bash
- kubectl create -f - <
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster elasticsearch elasticsearch-8.8.2 Delete Running 47m
-```
-
-#### Steps
-
-There are two ways to apply vertical scaling.
-
-
-
-
-
-1. Apply an OpsRequest to the specified cluster. Configure the parameters according to your needs.
-
- ```bash
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the configuration of `spec.componentSpecs.resources` in the YAML file. `spec.componentSpecs.resources` controls the requirement and limit of resources and changing them triggers a vertical scaling.
-
- ```yaml
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: elasticsearch
- clusterVersionRef: elasticsearch-8.8.2
- componentSpecs:
- - name: elasticsearch
- componentDefRef: elasticsearch
- replicas: 1
- resources: # Change the values of resources.
- requests:
- memory: "2Gi"
- cpu: "1"
- limits:
- memory: "4Gi"
- cpu: "2"
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-## Volume Expanding
-
-### Before you start
-
-Check whether the cluster status is `Running`. Otherwise, the following operations may fail.
-
-```bash
-kubectl get cluster mycluster -n demo
->
-NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
-mycluster elasticsearch elasticsearch-8.8.2 Delete Running 4m29s
-```
-
-### Steps
-
-There are two ways to apply volume expansion.
-
-
-
-
-
-1. Change the value of storage according to your need and run the command below to expand the volume of a cluster.
-
- ```yaml
- kubectl apply -f - <
- NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
- demo ops-volume-expansion VolumeExpansion mycluster Succeed 3/3 6m
- ```
-
- If an error occurs, you can troubleshoot with `kubectl describe ops -n demo` command to view the events of this operation.
-
-3. Check whether the corresponding cluster resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-1. Change the value of `spec.componentSpecs.volumeClaimTemplates.spec.resources` in the cluster YAML file.
-
- `spec.componentSpecs.volumeClaimTemplates.spec.resources` is the storage resource information of the pod and changing this value triggers the volume expansion of a cluster.
-
- ```yaml
- kubectl edit cluster mycluster -n demo
- apiVersion: apps.kubeblocks.io/v1alpha1
- kind: Cluster
- metadata:
- name: mycluster
- namespace: demo
- spec:
- clusterDefinitionRef: elasticsearch
- clusterVersionRef: elasticsearch-8.8.2
- componentSpecs:
- - name: elasticsearch
- componentDefRef: elasticsearch
- replicas: 2
- volumeClaimTemplates:
- - name: data
- spec:
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi # Change the volume storage size.
- terminationPolicy: Delete
- ```
-
-2. Check whether the corresponding cluster resources change.
-
- ```bash
- kubectl describe cluster mycluster -n demo
- ```
-
-
-
-
-
-## Stop/Start a cluster
-
-You can stop/start a cluster to save computing resources. When a cluster is stopped, the computing resources of this cluster are released, which means the pods of Kubernetes are released, but the storage resources are reserved. Start this cluster again if you want to restore the cluster resources from the original storage by snapshots.
-
-### Stop a cluster
-
-
-
-
-
-Run the command below to stop a cluster.
-
-```bash
-kubectl apply -f - <
-
-
-
-Configure replicas as 0 to delete pods.
-
-```yaml
-apiVersion: apps.kubeblocks.io/v1alpha1
-kind: Cluster
-metadata:
- name: mycluster
- namespace: demo
-spec:
- clusterDefinitionRef: elasticsearch
- clusterVersionRef: elasticsearch-8.8.2
- terminationPolicy: Delete
- componentSpecs:
- - name: elasticsearch
- componentDefRef: elasticsearch
- disableExporter: true
- replicas: 0
- volumeClaimTemplates:
- - name: data
- spec:
- storageClassName: standard
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
-```
-
-
-
-
-
-### Start a cluster
-
-
-
-
-
-Run the command below to start a cluster.
-
-```bash
-kubectl apply -f - <
-
-
-
-Change replicas back to the original amount to start this cluster again.
-
-```yaml
-apiVersion: apps.kubeblocks.io/v1alpha1
-kind: Cluster
-metadata:
- name: mycluster
- namespace: demo
-spec:
- clusterDefinitionRef: elasticsearch
- clusterVersionRef: elasticsearch-8.8.2
- terminationPolicy: Delete
- componentSpecs:
- - name: elasticsearch
- componentDefRef: elasticsearch
- disableExporter: true
- replicas: 1
- volumeClaimTemplates:
- - name: data
- spec:
- storageClassName: standard
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 20Gi
-```
-
-
-
-
-
-## Restart
-
-1. Restart a cluster.
-
- ```bash
- kubectl apply -f - <@3l`MlTX>vmC2ijJCvnnWVeoj-T_GKoZ^
zP9m+DT}O$pe4P9Bl|jz%|=zRenot|k#<#qP^|l%kM61Wom`pXBQB?%
z`J~(-)*Eo-(C1dufj7~&9^8;ldu}hL&rw@-jQ`N*@(9^Wt$WVw*>q{^nUia`vYkxL
z5udFn6k1*0%B;g=FUsL#BhuM!H!3<4YS!Lo+IKg8jT33-?~g5kV)nw6v`nv-vp#*=
zs^PdK*bsMJH&1obKR%e{S8d4L`^T^7*GAHPPcfu%JN-Z=;P4J^Zkk)SZuwVk`^T^N
zRtt^4aQ$x|QS6sxbe;a&cU+?qdvXo_xU_%#f4J@4PQib?#2=qt68*nlh}HVS>Hqej
zNdMQ{`NzxbjG>}Z-|}Byr`~yW!g=G(Zfo-L@;)RcCYoRUuWz9|#w~(hbEMdl*?DdXY9?`q%mYb!TNOe$HVHc18M}FVVq$`cPiu`_u+aSj3X#gfC;s);>Re4a
zlYM`f9uE!)*%44imebbNrD9}cY)!X#Phl2$e&ZT)74@T4DJdy;@80Frvd$#vTyl~=D`kr;W@Kbc!b`D)u&7f#DX-ZVC*#~<3im0Cvk(ZAj}
z%kk(4ehE6`ftrZ^j+~tNBv?OAFUh@9t=bz2;0WzWA;1xPW(bWmWKFTIL6Jb&8qe
z`858O)Ym8)0&)_w{(ZxJBkmR()Ld6rXUFB-9JsUbzde#5Hr+oL<-ebzZl;mu<>;-4
z4<9Bu{rY9vnr8N{!SMQLBQML5?_I@S+rNDIB6027wX6lD{ae?qUw=O=jDwn*`iY;P
zbAJ9QzrL)<`O1Q4EWZ}-7#eo<_q%@mD*f!)v;NkzhXW+{`kjnc>>h2)P#KE2e1O;r
z^78VjX=$%NeAsAXW0QJs?g$qbm+aFjm(rU@@Q8BD%4i-vdi3S%*Hf1+`Bob4*}Ps=
zO^t$7R8$ld6SInBZEejdAh5NvvNF}Qm%1`c+-ImU;iX7|*4L`q+ATYF?6_-bdDhbM
zsHv%`xw_2u?c0S;oRHkO2G3L`OJx84b!@`sx#Xcnlf_w+X8{2(cefSL9&m9HyqUF4
zvc7?vi|g*fv>{1CS(%B8o7-f5N}p^Q8XDT)l(=hpw9UhAW;Cz8o&CbgqxI?j>2;QE
z23mHFIu}ONI3jO57GK=Ib$nvtzUtwUk(SS0!^5h^EcRbd-Z@corbFo5zgFMRTT{71
z-nGK7=eC6IZ?$3wI>5X!W{tv+Azw{hU6;3ScNZ2HcUOj-2;{x7N-k6+IyuC}g(^}$
z%o|^OAJCR+vby%2ywusVk1OrVdQCk!#MxI<(mI{qS*@(3qT;@^Frz&^+kY6l;`Zq&CR*33J!;^rxXSs
zH~SWOVY^qabi`(wZ3lBBFT51+r=q0Ps*ky{aSa8^#*?z%KvBD+=~iR$zLuyG=VWB~
zh1D)R_IKuMEMmo_CF)eLu!`Dl)h_WqbNTXS+v(x;B;`b{wf;OB-tR(fsW}`M`QBbW
zAT2FDKKMQ%9OZa+d0}kFb7?-KRv}gq>kkduwCo~Ge*5Il>geokcUUm=vbZyreoe;i
z*uw+g!<4b0h$^C`t!)wSm^vEWe|>{i%cTm6{>Q~9|GAHL9^rXIsos*_^tvt3`^mXI
zdeud%sX5ke@RaH4G*GPa4to0Z0Uq8PG>@KQuYw?c-A^er)YSP;_sDd1cRy%tRo%LE
zD<>BhHSTml{v(=+ZV#Sr>^>I##l^)ZFJ4gd@bEl){=BQd`i+p~Fw^kxaA#kiOH-3_
z+{x=&`=3jD-G7#yojpE1ebhFG%-1-_yo;B2V`*vWlhT{SHuGjZ{=lrSGOwj&JKmLE
zTe=`C8=GKFtVRyIy1F_`nY!)3p3JEl8I=WjIl1C0@s-%bgNF}q@Y{P~73oe}I>S5p
zu*aW2AKScn^Z5KwLP2Tidi?F=pVwYr)a=TCq*ouqa9AVT)6|-Og{e)_ASF_>I2G5LXY6f|thG*ZOjY9zI+{wy7_iHfkGb
zW72AgV{&kCz{*~~m3l4elnb`iE*>6wc6N4@x|5SXD=Z?nT;K3GWmoR(f7!-#RZ;gF
z8H##^`1hjl1(^<~pNUXc*r-d59`V_VM;(Mx1x3wFcZrFo0EPZ1FjEICrAPeoL^>)M^e
zVU_|F23O5lZ|@^9`+3bGcZRd?aObt+J^09H4k{@rWln!LAYP@Wwsr!KH4mkY
z*!Q-!!jW9erc
zj|JpK#BtvoJt7gVqOw%b_TY%>!qR4u(5bbg*_>9E+@2G&->a)PMMp>Lb!3aWySwx1
zlryQO-aXlug0@0(I&Steib`#DZmHkCi5BCW9oTOn!WK2>{GL2wijAe68S7|FtH`pO5pcj0d@$cfpr*9G(1PiamPF0G
z2ev-P@QO{}ziTbclUbZsNS(72J^K$He3+4OqPwRj@n-4fkcD+LGzCCfi9lVpKKuLw
ze|h-$xa8!BKa<|`v*P7D_B&A@?PiRIn-W*ci!TYZ+l`54F3%6CEO@%P<^Ad{o4`{>
zN6N6G)RRexHy{EiNt|GAAg2-MZ0C%`=)uYwg;#H>yHKn{ph*Nu1*19EVgsNtl}p
zs5{Kv!W)aG+JF{D%AK3+O9U308gAa==H@0$^)N;!qdnDR7XX5Qe^Qn~lK-^P!Nie<
zi~Ks}PQW1O@w}G9%J>Td&*gqUsYqAne>K{=@wa5dZ-v#{R!02p!Jro}5daaIz
z&%^fhP^-lJYRao}k6Db}ZH2w##J;2TG`JQZGJ=11oz-AuztH(!NtIYq9N|}7H
z5Cv)c*RLAo_BT@Wq})X9k|!Y{hT*}-*c(h8?52k)NV9WuJNE2Zd*j9pI?IE0c6JXR
zJ|vM+jM`$7)iRGl7Ig7t&Hn0ibe46QgAg40qy>9sm
zUhtx-YOLAIFo*f|q>Zesw1A&+WV}G$*XP{H{sGUPk-mj`Da#6Lf6Y@F6eM{Ky=J+Y
zY1ncU<%PnjICsFM)_kyTJ%A(2kgBTcw|DX!>mE4KZ9l3Po8&)~KOO(_<;(3_T3UmP
zpMWMBrcgF_h=_>Pk?%}&7unLMA5CGUHI(}Aw|_8fV%~vaRQ<5C!if{)n~e|FJXz;-
zTg+fR>EzDpbCxrMY<@b593y9aPEIXWah{7Y>+K)&(b?qd8hD(hM7N@_xmV+)^*HHh
zN=kpWE!`b9*1KIU$*CU=-c^?vHN-OeA69dBaw4gwnXY|v*6Y;ClP5#;<27=;0h~jI
zjM~!IzOo$;2nh+Xoi6L_)Fesh=tNfA7rwrT{%xY)Hmn-1|x+HzYDB;FfIElK0cnb9C}7A;EcyM{X=EtWK5FevO@KvkC)3jt5`TF_>^6Sclw6KahukTy7
z&a3M^yzQ;mF&_KzVz=}BM>CU?g|W?1F|masu?K^%lMgL!R(G;9XKXrgV%J_lh7hrN
zCMBy;r}Ba=mX(zxr&X(g&mv-Cq(#rka6J$I`0-=A066U+g$}(zd**RcC+h9s$wo9Y
zBO@b{lLsTui=8cA?t&p2SFSKT_47-_qFe0YSdqAM=isW-l{ttg+GRjh3QV1nS1$pK~ki+`E@jE#3U2p5Fc={QNt7&y6om
zR;?z1y}wJ$5>#VMv1(?ipdIx0(hwRE;EbiBe#$Hi}IFk7ySqney((d8>=e^w&
zB(=n^-q_>DW2;A-E+#g~S?OT&wW*DzTyW>A6za7k&XJI=RFhd=xroU8J-gRjiVk~o
zD@^Qzh3Ny0e40UlwK*fFrgO57mQEPAr9U$1DZVlHt9N{As<1E2(c7xsh6=qoe7f=D
zEg8}aepRmL(&zHC0w@a9AH#m!o^nx@o6#JjE*kZW=rF
z6)H=SV@$_ZfTHGT*3VHFEmVh6Nh9&U>pu;2*nB*tpj_mf4
zLjbkWIwv-)TNh=q9cn<_NJT}UDQ}AU_RAUv^#NK)PJrZ}3|qFXU%#H@1g`mBmoMIJ
zMD3+uvX#NB7kkoEC@QcT^SBc-S4kwbR;X=g*i7a2PnCe(>MUL6;hbyUQ=c8B8p5|U
z&E%YzXjJlNHm4)aP*eXdf%8L0*U_`<#pPK1q}?DN>~yFt<3>qRRp+8(qr~hA|Em|5
zL4^0phkClZQ$KwCc;|rw>o2@uI+{3ZkdQ@bWn~4Du8FtKGK8{6O$9I;^+1S2;8C*<|y!(
zZu?^@dUnn4pY->0an&^G0PFt7DVn3LX@krv2Bzlbr}1kS%#P^jR8A^XFmd^n3h2am
zd3&FgmZpx0iMg9uJUqY!nMgVN-tqaVfz?
zZiB8e(dEK%>h(pvI~>5#?4q_300)tgM~BzfN!~fmbUlGCj>rF#X|MEe?E>t7t0AMYhR*S>0;ngaz~y)y7OgFqQw$n60F*+pP%-wu$ftW;S%G!;Kl!X}F!NCc
z{(+I14#yJRF#E^n{q_<76-tb9>fP7HN1=x)XILHr>!Uq!;skKP2GcZP{$|~<0oFCj
zmoD80+r9zr=ZZT8Zf?|`>6WBhMGyl5{tY$6`33~IfM(PMN!3flzpz>U`O;p|^wI(-un9n?ZS6ooa33LR7`CKz1?h(7ebTQTA5N;m?RaG|)DRUFl?!BCoot|V
z`s~?L8`pT*yF7ZdLX8DaR0ce!FJ)x~@oE|7KSw}DgznAq
zhQE0;G1nKS4Ty^GIlp_i4_~=-@uCw7u~gO)Fg34sF>U$FWAw&Z6C@xm1qXEZfANt$ix7Rg3szu74Z!Gyu(PNO)5-urd_PSXbp
z;#H}sSCQVneVbcZxdG6>fy>Iw-&wHeUxGw<2{V=Yu~*PQHbGL51kfM=_f|$mZIr1&
zGSpc@FCdfGUKAaN+(pB!6kmuRzBJ@eR#wJm^XsN3Ge0GiBo}}`+q23iH{R|2%8*5Q
zDkD8TzrOy;k{zIwdSArF{Q#V?%UO8bwh^@f$E$d72cRVq;O6Gd-6YNvC$=9ra6riB
z*W1bJL%*WcCz?wc%URDg-RI~LOdd?$l51vg>*HPkkcJv)t*=VM#_XhZJ%}R
zK95ct(J8J>ZROyg$C^pa$k=u47$f*|VON0*-_0*iRBB%&vBnx1|M2|zW+fz5G=
z9MC=hT?Qn0EnZwezh({8P@)RDdw7uBUE<;nojP@@v#aYqlvn6yl)qt;9bO5%fzVC?
z#Zqm_T*R8cb}f2_ui}jC+;JfxP9Y&CIXOA>>SA=Hif7jgm=rb?*BM9-d8D0>xO@-H
zWgRVTA*3Y}(BQ1vk6>Go)9p<**4D2ecY-mVzIxTafws|t&k9)fzZ8qs-)BRhTb$RDN#I~^ALZ;cR=@j>;>rkds*|ExkgcOHq}>t9LQ
zwCUPARH1D^l|(5ccHMg=9^wX}kP&MuA_+>yKR<3>{_SdnpFVTuMy?aZV26y1%mlen
zLmMx=t(@UssBY7xf+wVn2Se8H-1$+=@cXBesK5Y>cL!?r+`M(`b!=>TP4mC6aOdrf
z|F?NUi2eV(tlyv4HJSYXz@_;Y^7xHJ2J`MW*6E$!y?G54RY7raam_V6n2*96Hf$iY
z@COebbfS3;3~#)&>n9dEWGWfm9^XBFrBEcPqMtcBZ1KIt#L{QO(VUv7v16xPj=aE6?|;_^XJdUIu$QoqqV?^5h&v;HAgQUZ@6x}1JECjv3j;I
z0_%R)o;^hm()fLfzj^mpH!=+dB~A!KBb9X7a0Z1+<&)n1v78lltS1sn$y|^$sxD;i
z`&;(OX?}fnU|Xp(6!_(_m1TP9)wtXus38ww12RCn+E(h5Z1-$%pP;&btS-z6XqR}i
zYkkmT$Q#%kUs)wVjx8jOLuFe<
zA`CBd?2d=m?tNNINf{2Zx_|$E-ZIiLGma{zzdS6OzPFYQ=Axz64>+S7ukPRaAvyVx
zv$OMBGsR;K@l%*e{rXYLBx21AVdn17
za^@dDe&oV@iM#&UAy((GR_0!_4-M9F7x(k(*X%AVLSOQI_3`6o7)U}EgU^aB8ydWC
zYya(#dGvMx6E=M|=E%>_|CXpNWj@@r$vAU@k`RO6NcpH7)MzOGKDe(Z)8gZ4Q3F7#
z?AdM_uV#s!?rsu^Xjw`c_E*Nlro1NU4f=^&Tl@Wc#_w^=avl>xfXcBD!zT8hbq4=TH(>ul=+SPhwFWQOnA;g&RGwDx#^Uo`J+TW}8h27iv_T4+00vGzv*6OzxJ~*hXl&F$p0ci3+cQ|n4d+)_pmc|?pIV^j1
zXQ0ELbQf4x_#78&*qi_s^9bCQdSGB6KUCE2
zp;d>yk{&?po8vi;XQQ-w;3^ypWpq2e(|oAm0&rSfIxXB0{fT?m7D`x%+evmTzf=X)
zY9Dr*I5nd=t8adz6nq_6R+a2JB|jJ$w5{P%yjT4KaXTa1n3+gyrx?Kv{z}
zs)gqzLj?|xAp8Q>{>T4Gt@yO_tII@OmJJbRfD}`Lr@(t7e~oH}<%KLU=<*9QEX-_W
ze`Nv2T(YvVvNLwaDEu$?Q?#c2-sA-WMn92`NOf2euBoYc^5lu;z#ZRpFv&T2ko1
zMpXv9+$J-9KFMLtMI9y_JYc9|+NyxVYNud85#l*K07}@-U0q#5raxS-+D>!(a7=Um
z)j{TK7eb8iCM14i#r8}a7Uy__bjOu!ebck}8M=5WANKt`JS9Hj%dU;;c622^98@GP
zo}W<@Nr{Ok;bW8f7xSOF#)c(M*kW)0hLSJ>O}-_sy`re72@Hg4;pF8-2T7eeP1R`N
z&L-crYpJN-ph*6uSHG{j*RYL)Bf*SAt4CyPR~*Lz!_J!CAEkcD%W*_KXw9-?Bmtwm
zHrtMi=lP$DC)e5)8`K|M3vuCHUQ3)iw+;^4Md111U{?I4!RIN7lT%Zt@pV}Lz9AuA_laU7KgWlfWg#U8>yj!Iq{Fa+Xn4d{U%**(^
zICx2%?tqos=~b{wND?L{eBh=e#gavAL)@_*2qr>~%OX(44hzfs$MY2XJD+;($n~4vnN(Piv{=fl)irSrG@phv=0*!cyOsM0BKu#<&N1e>{9q7F0-+=
zLs(e&)J|WLQ*oAGv~v1VG_SgWcBW2dgA~Xekn%=SF4*-4`vpq{UHN_5qr1py@(sOR
zzs%6*^~EmKdrJe15m*tP!2=i)M6-QF!`Se$@v+u`<@dD
z>Ck98QB$t0ETf)lLVRX%PQ;cfZk0MZWwukHdS4js54u?qD1%@_wEz1-H+N^})o|Pd
zzQ3SeU??kD&oIsXy(vM2eM#CL%YrkYY{$A)P$8m{Lzkr6niBp>Pxz{@PC#+#8XBS@
z33C(<_&LCUhHaWW|9bmHQSBNT=@)vEC^$Cd35I6F)Cg*}A-58i}ELGx<9
z%lC40;c#;j!9Bdp(X1YFuIq13+J{@NQyJ_AWlEoQvVdN^?wnHXWR>B_z5be7<1g$T3`Rb^jL>abCT|mO%Y3g|Do$z5SAe~comyQ
zTy}%ys0kHg?{RND-G+Fz_sRDlU?9C@8#e&SHSu;m7sP$2RQS8)p`zPi-86m~!bLyv
z_m6xo2FTP?LKr|f4e2p4T(Q@ZC}sQ)ZnC+WZZX=*yz8u|gq~hhCHdu1!+aD%3MNN~
z+zzrC&^3$U#;6R3y}NhUeP;)sD^qE4&i?=C(WeUc)IcXEs_ji39il2XDDRt2X9`C;
z<(#y1J_O0}Uu8T)tvXZv)z-^%eG`QD0?~nGh}aH?tR9`ZkEj7DD!U!b$a-aIW)mah
zyG``i(B8hgq}(e5_6$Kl-?(}61Kj(lg%2*wc50ry;enOEx6V3EVm%3_XItFS5Zxo1hQQqRrlBORfLL)c2mRa>&J`eF~y0g+yP+6p*MG
zmI+$dZ&hq7H5yY_c@Y1gp{LuV*66MZa_|@B$3M)_@~wZB?&CB2DN80vB4-AEnO{`2
zmcxE(lfzsuBY7GRvjnW{TY`qTSLv#z1V!zf%U(t2Ikm*;K0d+>5=LTD`VLg0_%ZfiXN<`F^~NG
z`Lh(n9)Qv(PDuX+pg!yntIxh?dRt=fz8(F_!CCm9eogcsik4-8DC_6MCH3
z%gD^^hME@+ac%#hLq&iOcSpVp5}g8OISc(IFH!MV=?;;Rk@Pz}cbnEM8FT_QOXub$-&W|Y_5%$#LQ&LBE*!}(r+@%PK$=2z%8>GF8imiC
z-C@1Ls#%4t1rdXAr3ujt+z86Vw@e!|KXpc#f$BFd^L-H6^3k$>@NW)E5s%eQOADA1lKIpdy(hl^`eB-8+xhi{ph5W&?ck>Q1Jh#H
z?#u~3w)}LXfRb>E2zJzwZBK0U!H|^Kyp;yp!3k_Vnfg#_Ry#FJ#u2$6l(Z7q$-YmY
zhA&gyfs#VbHQ+O84_r8B)*i6E;M+Y=#%@&W(-IO+wj6OP$(M72fHaL*R{vPFYSl$W
z#kYJy@qC}IPje3|k*2xRMU0lD)gZQb!Wrn!bEX<}3{P-dayJ@QVv+xw*VZxh3yy!U
zsJO6XW@HrKe&TatVqU6A4>}BCYXfBw1eG*SR48sY=PMI*mJUL`fA6rWe&nQJ*(?~J!1sb|`-KmPIMA{RZA5&fMvq=AEj_(Exlz5~
z*#U(op`qS{Uk;_7>4fD$FdaUNK}A|N;jOrACC430xbNX8LxkcXY&9C2v2uWl_Ua@uP)V~Al*Kk}OnnyG!N=&XU%w7yxSI4EX|u7h@j-V5GQbTc
z#7L+dM}lOvCBg!Qc&5c_T4#E-+)CdK+UQnXGd^K8N=t(BE+H#R3#sKIw8r*P0G&a@
z?J^m+a`GM4YUcdSg``thhjU5H``@Gex6-ekc?K;
z0uNK^{rr!R44Iqy&;fucWCKc|$RwzP-H8sjXKlwiiMg6~%<%hG(#5M+uMWMZ=U|WB
zJ8dfsA$ES?9g=Is2+9#1-MNyEcX1JsyNxU?)Df4Xt(Mj}!M`G60;mtiqC{O8wr+hW
zYB#NkwL@~k*8Zedy{fvpnh14Xx^g9AdFOd@`q#<6Ds6N&0(oxUvc*EoTB$-O$)xA3
z*Zo&o2_9)dNe-(b56loTG}H;mBk?oVT0t4vt_P?{fqdGOXtPAt7vYuL_SIASkE5A|
zIxgD~Z5O0(Z%0nr!Y;F!TCJ)C)Hg!9A?22oNZBU{px^I*{*|(nyC>PmvoW1d{n!Q+
z*+29?tFd;&@gBG6u;SL=E49v>h+~{|rrfc6cVX00;HsWXBhSfnzRH(pq4?K{H?mrb
zBFcp5@C_7-LAzmG=T2VUi`t#Zf2>cH&@IIBq;nLc`f^4}>J9wuxw$!4clT4))
zKqLkgO5j2od#EO6AW{w5l^5{%+a|ZSRj7^;SJ^F+s_+J>&w~FbwVyi
zEL1rzBk}Q^K1eoFUB}os!QqwiB-w}yx|^;Q#Louh#=nw5bxFb^T#Ed>i`cI$8q4)>
zZ6&tDSYdx%ob>cCRfGgn6G8w2pTNl^}>H{m`)GGjSt3>v*|!-lh0t~~G0`}#OE
zEO1_*cp=wx(33c_V2iVlkI!;Yf>g!iW&36#fAKr?Q^{<8MPJxr@F9w_mj(Qq{@Qo+
z@TWl81RAc%WC-dm30z4V>&Vdq-3$aob6poSY<5
zo%3K*LLIR0QKGNY-f++10A?W|Bw_=LLmDeJbM_t}iH2AcN`F6jqOJEN4_>i>5%MS_
zBcq+ZO)=?G<8(}tOCwg8KHc{hPy;I)Lq(BNk{EH$6JMUy&ZE+ZtqSBM#
z6&3+@o*60lHc7K#1Er?&QfxCj;?p`8?KTd9BnWF5rrj#@x2=T%wh=*YK+;0Hv8;FM
z$2472nes8N*$Y`~-d`*lGHpbpwUzWB0~m8${y
zN&c_gQH1_}LJIs)Ogvt5JYMW>e)aA7trIGOelf?pAOD5iu7$JJN9Z&Q7`Lk~$rt)yLFr`SznF5fZah)!H;uYa(1O0`NR30zWu7Y
z=Y;F;H2!wn{N4WyCb95amEAmotD$h}zyHZA2r`CK4psZmWwVgmb})oBAi@x(h48L9
zR%WS?S>A-a3MADoLSjViATpSKnf`46ITCI3dP7?Mb8c~AG0g(BhV;czBbkZ`^l@bn
zZ#He&;(S;wotS<=I2w12pt}?jOSfeh3~qn^85bj_lGT(dc2Ph
z(QwAIDvo5uJBl0;gfz~geBJTpegk3g-`L@g{TS!Yk=}mz=54K^cTEd76MJ>tEENM@
z+%lW|dBJa3;oxt$z}!c7qn{ib6O#{3wi2SXas~yr=JJk
z{`CC)(2j;N9#(aNdV~&AmsEn-!dCb*ry*ZJ7U=5fdBg4$@bV>%6R>qtLVvNtqb2tp
zo^uPY5ePqb;liV&B>rp!O>L2o9ab{GkyB$m&+w-K5?*{N;eI1CGxK1x72K#P2fAkP
z-i=$gzIEu2lc}(P-cf6i6B)^}c*yr0uU6qYpoy%S1AoS-J_>6L=)_@!g)pu|drt+t
z7-A0fNMsWXA42$jNHBP6Zy6HG+l;Qzmsl+Mxw_we{PcU^8wZu}
z)}*AQiseBK$)U0WeexkH`|lYpE-vS*DmFLPsuoU5Md~^J98aD4?Ahqq_*gUZDBG2C
z>)9~X?GOIiU4khKYFC;eGqS5L!R1A5r<{=W1;F)0(jbZ|FXG+19yGwSNUV2`jrl+pBy*ma=B9IA
zLS>Zvpixa&L-+xLlE57;00?`dB>ab_#z!-AvwtftDFN1ICk-yw
z6mN`4H$1l_Vl~Q2G8xIcteBLH@tSaK%5&$=kw}<eI?YFhXg)WuhT
zD5OE2na8nV4a%ch%qkk}k@Cmu8rw6>2OcP?+pKjO_`dK)_KxFC_i0^khk27hV`ieo
zi{(N3WW;F?>VO~dvM%JNk
zvwvV3LBW*y<|j=FdbVIj-{RFy5UK`}Ot$Z|bHcrrzP_pbTi^_Ghs1M#km{KPxgY|h
zSvo-gL8vt(k%_`B$=Q^L#l+Z2cL(bZK;)C^7!FjFlk=Xx(EufhRyqU7f>h5>FNzlvoc*DI1VhKG7dew}Iu9m|@5hDd@pL}Q`zIx%AOc^(93DA1tPm(0i#4U_;
zzmPK#ZEzZ-dQR`ix0!{-9nd?<(YWSxLTUd{L`)cvjcsGqi;)}1HSR5yl00EO&WXe+
ziL_;}ERimIt;m<880Hi$~gFt!Q6V*Gf
zO8WQ_!k4&StkvDS5>PEDNa!0^t3J^L9;>`wX8*qFUJPYcQE_p8ULJ*%H|r&1NBG^4
z;luHWkp`_};%xliVD)vP#@tIqt|H{QC`d#O91iT1T$#feh<8hHVgC3CFL~6yI$;Ki
zJ=Xs!5;0u~4(7v=!A
z;Rc&Er1A~2zi$D?KZa-oc;AMDXD;eWaZ=@
zLuyqHaq@d71(0Ervv
zYE|x#w4r^PA-#wFv&qQ8vWnef0`Vp^hhiU&1i2P$CD2i1&NQ(k=uB>Jt9~s>bq5y!
zeX;;7NjBRtamlx7TFLMD{D4$ejy+RP^3md|kap6Fz-XT$=g%WQQc@^TDNkulBbwMO5mg2Cldo_22vM2Ls@!WU5N~H`8
z0SR9P-iTYs1A@py1;#ZtrJB4c7B(xkF-S9Jcv*#{62gJM5y|}V{Uq#ODgrvepyGTk
zovgET=irDxQObWyTe*#mN^H<^Td3SlUmohaF|70{QKLHH@1TKgFq1&Yc`yx#h>ubX
zTL`AxlxDW?$dM!9{BCd_!U@9>lYVc{`;ka^7kLlX!W=)0mH68f!F$c!Y0L^09xI{?wwM@;o0y3ya3aSW@PNH&5T4agdQAmXl32zQpoUv8RM6k@**GrYy?|oHJTn`c7e+r@Gi{RE=WS3Z
zF_5&HSoPP9vm&hQKD;H~51RJ<`}avsP(JF@mIN7kuZ1N%b11R@d_j*L!A>cp+DWXe{C>
zTwIE%1?G0;$yuy<)%(8gx5f_p88+Lg{`*)P
zfKjX(4s#JvBK>9#fA0{!PjArK5xHQNAj>`kskAWaNYa(}3S*#tRMgI5{D5xPUs-@F
zjK67PvUc!FOQy}_2kQx~HEY&rHh;W@9kPoMc7TK4Ajyu|(y)8K)2djSc^%<~Qp>7k|O_E-@EVY2QWf^el@BPCiI2N?B
z(6Q2xHUe#g7n2NLw}zFP5=f6{{`OIPwm4I&2l)GI4c0|7VP61-Yu
z5TVZLy*&!30yc!l*NO
zcypvy{{*p{j#dQcTw4@IS+yV7w=lu3pu`&FpW_I)QYHAbb3(
zi&fp@y#X5Gv9Yp!Vjy(Ha)Vt+c%M+=Nc9OEvggmAgxia1Kq6u46vnJzY3`XsGXEbz
z&X^=ol+e=t#UOXib+d5ICMr*ibrJ)vc&i~T+iQ&sOf4)Py?_6Hex|%!HqP+r)2GC&
zEHc8#`mQ293jN<7hi;DA+6^89U^7ZPLTK?$l
zbV7uLXzhFU>{0%tcPUFBvF!Ut4Zln5^vx|UCWcb-jB}P6IOq8PF7hiQ(2kjoo9-4{
zSu}&^cY_%7v>=KgzwQQzkMaC*(cPJ1vNj!D)3$?ta(_TWq#jt0o1QjMQ&D*_PbW@K
z|3o29H%H6%cReR4ajhmq*)y_#iyBixzN9F}!L@7%7`Xr8U13a~2;yO+BNa+!oIb1v
z5UMp&Qc}Q>uReUZcqe=NGoVx=fQlJSa7|TAqXCE`ju3k+PW7!L;TOK2sT|a(293H*{!8t4MmyQvHTg=N5
zX@D03`VXMc5_4TB%eG?$Plg7DhCJY_sb=3xYiN9YbPXT5HgH-~4w4U1N5J0sFvaer
zbgZEy(9&QX^uC9W9(Cb%5*%boPIq*Ey|R3o$DYV+*F#kBH;^Nz{Nt>F%T?9_$SZ&W
z$@P_=YKX#|G;+~J=!*tRrcH{4Q&L(j8W(;JzT@a!-lmxuPv4Wgx7eW8#N52lae0!%
z+SZnce5@?wtaw0{JlfA!R41P}Q=0r-L$bG)2|;U+u~Vw5tk{p(AGg_L=XhZS9=x7H
zizs|<##pw;N=duDi`12$D=Ut2wx>APA6k2E|BkwgZx5U~y@qC^`~LKlGn-=9#jaJI
zP1U4$xOO^Rc{+(>>9G3)*PY?9t~<~9adCdoa@BMqQJm*|a_UHq_^+4Rr}mbX2bIch
zR`(ea4*2ox_)J=rea_gH$_yRv4E*uchu=%qJzIi3lW(t=NCcje7NPa
z4@4!QMQURcIRFA!VY^4ZC+~v6>Vz2j5#37G?75%Y--#KZovxvz`~_{-@8!$un~E&l
z=HrAUM~arV_9f7!@S*azoEb1^t5s8oDqP9A#OXwl{Kw<4x@c8d-=
zcGD&^5^+ODfY|(!65`wf47O&fy}ivXDjHJ4Zs&>GY=)e*LKq}I84N4nIcQ?o9E1O9
zY0rK}b-44_sf);%WY5>6?!0_%q$o)sUQuI|N$Ia>T)g16+`*AkuC79F@OX(+0X&NG
zQC^EN84eoq%QErp)0o(iJ-ob65IT!jP0NRdnx)3-OMU6uLYSi5^W?1k>N2-(Br1PU
z;ciSAd!F1O-K%)5#iKh@^}Rs+xhqQe@8Z8RarA;mm*io&Q%albzdc}JdRM>o
z+rF#+cw?s=yoY~`jme|JxW|=MRP4dyhNwe*ps5}q(YeX66mTH
zZu4UkjFYn{5bj>u+*e~Y5lc}&s7C&ATYU2jf$xzA{{e_1GTo%Tf#cnRZrI=%)mu6u
zHD>SsiV^?u@3|d#J}6ILFahSVhpA=R9;-WhVf2L9+>b5Tke}TT>>;A92myQnN+Z}0
zBmf+p;SL0jy}>n{*?T~^=Q{52_{_{cA)%(Oo|gjpr(l0U`{}_YFkCwAf}*mSom~!*
ztj4dM7ur+l0U9Ye4k|?oB*a?<>+smR!_wb250s?i>v!;jY
zbZ@zZdD}uu2F=^a!{dVn{WLgO7UN66l{14vSKHERd}1~yE#+-l+Rw@9gc71)QgVGJ
z;bTdFL4=x25idXcK-!i6T!(L;NV+wiG3>|=0Uf>g<}BS{L!1oq^j57VRLHdV7BOo4
zfXZNMw*v&R5(hYyR#yH5)V&3)U6ew#W=-l+us0ynCOn2C4i4mcrGeUaJ_=!k7JwK=
zIjHfE=hreKo*Wx30K;X5T-)KW5GPfs)Epva&*B7T$ux9lrSj|7ZX9u=ejwm;lLrr!
z%A|r44I1*b=iPm-n|2{U){Tq{y1qAR>b92AIFs0Pvt*7ddvq2gZ;eW|XFA3(M#q`fM($ek|W;n_~AyW1=2rE*{&vCBFw~_Vs2zH+!VP5R2+gk%C
z9PaWtRK9Qve8^%fhb%Qu>0N-pPKb_chm3Tb@pCESi>dm03n@B@8~H!#&l|lmkv)A{
zq+s~J?WpOFJtGeRdXIo}A%hxqEorahV_FlbG+OBKgqq+42PK`Hbmr}^4;A0;@LXz2
zxxo5vK2`)9&dtY%ijW%A4|}<~qOP(3V*n(za)3EuICt-U
zh()w<+qSE(Z_&}w?b)&8KAH#k&^bA|!&VK@=k~)P2P5wR@ki#$5B`UiIJPp}(GMzd
zi+B&k^DxJ1AT7y-iB%vf#%+GK8CQw}4KTsS$BEEU1_UHfVCzza
zX|GMRu-V?wAp662r-iJF7>%Qct1>D*rF6osk3>gV8(Ok*d+nMi56Q6#^a|4%O!~OO
z&iNk=@AC81JrgXNko#I4SC$0yzU7Wi!>pZv^r?VAjMfmwC?uE3369K;-?CKBopYTS
zL*m+{jKB=+_EVRjX&YD(d7vPiut!25st*yJT|g*Ehc&gWAg6T`%i|u5@kI9T!{8$^vM-Yk0j26RErco@6e4Kc~%&RHkR#jPEeiLE}
z_Gog`JZ$b?I6UqfprFLU$<6J7
zF6F(vw9wNtS#o*~L)Jgt_J!_G9{01qJ!?mck84HkI-f?NzT
zIvc2|wJPO#hNY^UW_l~p0$g@uKMyhzEgTX$02u8%3g
z&q?3Aijy%=KXwZUJVUK8gCRgv1O!g77VF}!H+m^uv(5(k-^9jt;p)|Gh+^Hu8-vsZ
z-9-jVR%Z80%ux9vOR#10=2NDoN8s!IK-0nOf4}*2
zWd#NOrVl%CcXY{v^+Xdzcf0&fjtwQ8fL!3C2Z#eViQ9*Xp~L*I2|gup<3yr91bQ3?
z#JPXJD@+B*D|wI|Pa$)Ln}y6lX5DP}z_M{-z#I+76
z&u$i&*SZ01)3T}!6Qw;Jh!~6F9G49hlp_bpyT-14Hev%)60jJoBWx&?hNe-6Z5~Cl
zPxApSC?=QkYI`&;!AZG=W6&PDxcEJNdP+rw1&lEq+2-<)69Jfs3RpP0RqFVOWt&~u
z)-O(UCpY)4lJb_haKYk0wzcFf$9BOJ>}m6@g9Fwh!$LYe(jxqmsz%fIbcT{*7XMvq
z4^0T8#Q;)3@zDSF>b|daNMPU>uve;FEUPb2ExfcbbM+OyG!=o_xlU(#2vln>2C~i~
z!=ss~3^;jAr%(hruB-2pn`{ys)XV{45KH3%>yA~+@W(C4Y7&FVrit6UN36upVTr8N
z!_bEFXzF6Fc;K*+jD*|Swm-|D(=#QNUkK!V-Bg|ocSsBO05o&*pJ^p!c`@-lz=XY-J2LqJOUa(lv*rJcl*#Hts4l>n)iRZkDW1rLn1J~FM)9<
zB1VrtKQ+=4K%A;_cSP*8loY@Hyg8OKF#K6#X+On-d6!R5_Pku51Ku{
z>5p?RLv_tVt0zYyqRau9-u
z2Lo+;d=s--M3*LxOwF+N?5wLwrd;
z>U)$gVX(H>`@|>?&hSadSx!IoG``*^lQ=RZRypwju=6u4$t2W#0*ehdVgn+U0#2cg
zH{>+8+&M5&wO2?e5Y>M>f8qD+ivd_({||HT8I|R^ef@$ZCe|2Z!$J~ci5(CufS4Vl
ziAJ%2SSTt25kUo{3uufTFcwqr(#GT0V-1l{@GS{4QktgK?ar-pPogKIP)?_`XNqSJwH!Nd%|0yp1WB7;Q
zo3)|2HMa#ZN?E5?JRquHR=U;^KkdNW=JVC@UEc4Goc0ozPrlw)cO`LM{@91yK?d1@
z__&;3dS5*O`Pz3BnY?N~6`Uvs=o-e?wZhlH*)o90O$Bti
zt8Z@hkP$x|UD@hdl(-vr$D5BhcB3{I){^$m8iWm{d|t)T
zO}+xXS;8n$lgKx2|Buht-`dgR6hr|^RW($epL{=R!O;(G3ChJ~*u(*(&j#P-&`dh8
z!0J($i9j6Dd|c;JUkj&aTf5BJYz~paiEadA{n$ghq|nxTR|zsS3#ohpC=9)Nx!j66DT=ez3XPX5O_V8p$rq`55&gpVVFrE)RK)P=fw*a
zto$;4JJw;_O`Zub4VXWS;`FlLT{FLLYe~Cf4!>AV8+Kx&MmeQdtl6a_Gb`mVRlm5J
zxpBDru~qfWwsv;TNcR!V)1CWO0jEaFdJbJHRa(TMd_x_Z7pKEImNm&1{!&OHsLu0*#%a-4d
zZk}2reEEgV=z5Z_SY!IZNo@f*hJ!Tr>gFdeJdXeF?Y_cSe@Eq9UEQ#YzpWcYo|=ZZ
zPjt&$Zu-s*d&G~0+c}f7iR$d_rkd{61KOvPZ^QY*-*Zw?kM#jHdG#qJ
zQY}zXcWZ6!s;dIDaem2|etUx+tMJlhJXiKHvX|O*d)S_Ve?-iKtJ2no;56N1*c=6oAGcT@4#rn}0f^OuB3E#$d
ze-_MF>G;cm12+lRM(?yNrr5ce=ci>eEjC$QNSz%JbG2^?3No=KN_27k-pxSyDhyZ<
zo@CqvxZ8h?r*IMWCau0<8L9Mr)|E9s^Xd;x)6C(E
zW%Ad2$en3s7u)Vdou9cQI9+4ivSoG7$ds9?Tclt9z$1OAb8BPGo(W$v^_j^5Q1qWO
zR$}Ap*>8NbzrC7Uf0Z+de(O%P&6PFVLi)64T+BXmCf_$A$KuL0!*OHAq*?7BW4N|%
zm21G}Wl!81j08rbGL?Rr_n5LeeB!1T3lzYGjf;-bOJi_)13pkx`@5EMW{UHUO_DnM
zcXD?LG&&2yaZ+jtF=}mSeST_ajEVADW&M7@MdsAFQs4r=_z~|F7f>h4ST)B)m`B-kf?S;n?7QJ8<4}))H0jS?v
zGQr~{Ii5~?i@;v#IcHwwM(l(fK(g#evnL*K+_~<9G(07)AevCBtCB})-eRr4J63=A
zc;~&%`(4LTO-bdSHty=hl{Y$Y5K=J1*-cm_$J96HYmK&TrO^KT+3^YLYg;42f|Jw?
ziuR7wYbY~{Fx;KPyC?;6>ANU2#JSn|$;+nnM`wyoyqD&`ORBL++u7Lo`ixH7M_b59
z11hcC>+9-*2*}k_^nI;9%DJMmz{HxuT5LZ@9e>FuyS%t;xW2-dQ$CRJ`Bqe&A
z^^%nPnMMz(?K^z>$bw@&Wctnv#&hPrevubBrlG*D*R$)Dy)L%4{+kOxE%d<&fUBO$
zrheltQfvlQo4RVd-fJto;oGvn*sbS4)t~XwRD2R(bJxl>`fyxrrlta(L;;kZsx)K@
zWVlrgJ}(V4-CL)Kq(KS<1b<5}EK!=gKAq0Z%PsC+yVf16c>CD}_NSj7E6Iq`(?6>m
zorR)jD!n`%1X7|yQkgkCWlDcB-87?qXX?av)NBLW+^DpADjO&{dU_n+HR1S@zQw*F
zH9^1XN0u4so*iA2_aLj*Jd3ua&h>ro|L>A)<`&fraV%K%<&v=Fk*P}q4;)zirO8v9
zlp*psF$(`^1_jdYnZ8V!|EOavbmDbJv|PskT0wo?qp>wR>zI5|rB2Y(+wZmP#t`3g
zYE!4?HV$)HwCKRCGU*c(Fy0<+Y%p}lkPL=z1;-m-gVrkCMTNgU>iGvdy>leowm1qUZZ
zMvv+LRgchE!!d1V`6CNBzI~N)XzG^YzosCS3avco9$K`U^g?M`kE}e-b}wc`TsRvM
zB$CFBF@=wdy=$_v8;f?=7oAW2ILp7pa`U+tEeo=bJ8IwXb*jqv-C0*B>yOg);olL3
zzA5F2>-Hx7l(ZU?F;9TSH{e{gFHY_2Akx0WPE`#c(p09W@e9;?d-t2+)3b7Nj$mp0
zxUh6=e)O$dx4cvp4Y7KXqLpHdJlh42f?eT-8V3y-p_7g#K5{I-znv~DfH;Y4sLHnK
zW%%%;M2Fo7?)v7J0{75u?YZEGJcmG1;8J-3W=L>iSyOYfT<6!fhwU3s30+`5GaQ;a
z@rMTyRiH*rf*S+L$v&<7!EXTq#qYG^>%4Vg1J#!G(+8gojeqA-T*g@ur$>0&Ogx*E
zA$;tu+Tiz5re&n+h9_EA59j!{TqKVw0JaPO%?W?EW6=7QbYM^gUc=+)D40JO&NB17
zw8&Bf`<=V?Sw*)eMkIw_j>I=nyw-&^`S#?mN|SzExmhvjMS8oGHfydt?dKKyt%XMQ
z{h)62j<%z!rw!7{cx`U@)6EGzWM$9S|-Z}Y%SH%k}
zlk#L-cssa~6N3xiY4)RgX}wn9#+!oT;r=Y}wT#Zlv0gf}VpkK+Ugkyal}PPc9laAb
zm(`KWcYApa2RoB~q<8PHDG2vo3!SQ_cCfv*Oh;ZfY@Ypq7y&Rlk4@e%9|D|=Ai(uV
zjrUG=+WKqQo(~#92%DIl>%_KHKMvnU_IMC9w?C6z4-}st5cy{@<$;9q`M7ajOkmR=
zw}b46H%_|$)Pu8!I{z#`0DqRPU|obgEZMBjE4XSTfy_=bPLKl+E+pz}hTwB~B7#QK!JG03W~{m-
zK7NA3f}Ip$DlKtdaCb0F+d})CRgue`>CvZbe70pp>e}LTH*tIi{rZi^-CC~ep?bj7
zs_JE!N81?Qjzoo^>;2-+;;|486RfxlRP_=&5Uv^?@g<{5BZVoQ_=hDNwSIJ*Rtss|
z_qw`eQY`AY`}37SZByn=F8rB%$Y)f${!Fp@l}9F(!^HdzYHDh<96hcUIt=0zjqdFT
z(K(%iZ(?3xui@_Urn$fjd~epGCnQK`K-xQLX?88nhWdpq_pqj0`tm8}cQR%us6A>!
zfkIiHLF)aUCkF?KQvY;8ae93hU2hM@dFGTg;Ao$G{P7IRanA`i+XMw~oV(t;K*u0O
zM^bYB+=V6Cd*$e6CLZ}!%SJgkuQpWkP(wk*cX2(tcmMsg-}*0fbeLq;Ai8$WETH8WWdvImfcr)_$%C293@
zo{qqej0Eqokz!|>ob{PAf3B(JkCWGd3dQ=fQ~RdN3W+3dU!au*M-MFyGuGx^&W6Uy=`*8G^BkaZ^LeG6
z9;`6xdM$zXWHJfyPs6;G7LwV{uQPwD;r~m=1mMRnjrzH%JAg-kG)^?WS3N)T$xhIq
z8u{T&lLl2;aX-_Ksqclt@Bmuyi8Y!LBZ0h_;}%;uW*x9Tea&z#y^yqLPA|h#gh9*v
zETXUt0LGb~NI-NjhH-}r%v=2V6mRf_IN;->Z{?@i5~x;_v^c#!pDv=$(4p%$hj$i&
ztNb*cT3^4<9}ZQkd2leNtS2HtmFAZ`qcLXp)%DulFFRB%7f&-90`dBAV--TSq(MW+9A
zgo{I6lN=d4g4704`oTZmbLh~gOvnvORWL$MOi5u@HLj=f^mLxI_M#;g)!#r_@N{ta
z{dVtthqA`1Rh29kxCW$SHXqWd;@lbDqeXNIxc@&&It0ufcuDB*VBvVRC>UE
zl3fB4;5n!F$K{laGjG12Sri&k^I+_T#2||92WJ-!L;4Z&$(`FiNs)K=QNTHID9)P1
zPX`C%I=-}NnOcxU21{)0ucR~wu!uP?-tf*}*4)po$@;-<$@co93uR+1e0NXKIDY+)
zSJG$B-W)mGyhk&h5k%r!X+dvWYvXcjqZb7>|Gl$u(>mrf?u$jaP`GyCE3lt|xGGfA
zutO)O4L44UEMNX&HZU7Qw#g8MHd0|Yxt(5euHd0@L5fe~uPqCjnC?d4>j{}!B*Owa
zIP4FelzryCc3@XolT$1;!;|}nUWGi#`CoQ%<<_fvhbt5osO7{w=*_=A3hDQ^AN5^HaamP|UAvr8
z(b>%>)qXW>z?>hd
zlGLmBOo-|AWO2N^+fet$Rl*Muf)tgnaCWJcah};m_>okHrNfa4CiMPAaZbVf
zi8jY&f45@C4+iL1n47Xh3BD+Jb>5o0Q{1
znDM|Y@Z^g^+MJ3ZOZ>a$Fv<)
z=U9c+^P#RGv>tC42;RGqu+Yor?3;^A$I5ddlyH`>84XsTR0frp7u_;s%Em3s@tjV~
z>>H-~qzgsKZ2blpCMJQgJn{!1bUboFxsh|iu`;~%aKrm-uDGlYORpJyxWN^qd*GCf
zp9z%KJbdoq*9^R!&*_=90E7QXZ1HW`%y3uq%fC{6!Qnmp$B{Qy-=T$}D4KK=cf1B7xcOn4u
zCzVIWF1rarHsqau#dL4|hDy8beAazhZ$3oKEBrld7?tt`XQmj6TRP2VCqSPX{uJIr
zwNp*^X_rc49m^V7J`wV_j`4R5-|^PpG#
z{#^d6n9A|AMuje!gn?RynBtl%k21F9vSs!j41Esl-+#mUYGLW4T7%@4&ldG&R0nQM
zQSdPT+nPNX4J;s@z+suwc3`I$-yEe|QnF$1jUGC-DRxHo$|+jTZkdU@Q=g$D8%aM)
zFukKvr!+(YPS%9ux7+LP^ZH^oICw-NzJ^p<@k6!0FaUVQ!D()eF6_+7f
z+|C-L+`YqX3kdT!0LbPPKDoH+8wH^J4d>StM1`xwIzp20ssq_#?q-J%(rC?m^-o9a
zL->4D*y{P;sz~z0Ugt=R_E%rssoI_MWXZr++jd1gg;X^FDi-RH-Y{8e9BgL3$Kjf%
zox=@CKbT|SQ)xqk7w}U3zBOZi7Rrb1WWhQS7+oW~X-{2SXKs8?=qS
z?7gk|!uyG-q1-4p+kf2dm=~TovVY4mQhKm`tj~$RGTg$T?l0P=1^x9W7(*xUlj01O
z{?i8j@ptDuQ^CO@x6)?Y{25X|l#(4w#b@#DZDHXi((*vzU2(2Am1^c*?5_AZYGCBP?U85tSsdFQo(xOCqmdFeT6*5bRZy!?vQ
z_j-DV?zKygYH4Y?`<>&sCtYT@Y#RuyCiNChCrHpd>i{p#K)sNd2O>3P(@=}F@^rV!
zc80venudllNN5f@`PF{&7zI=0C9U2)kFUxI2xWjxQ5PMd?7Z!QKQ?FBwfI3+Rc+|iwd=2xQVfrUqQ#(Qri+Wq_QNVv`Ro(>b9_2%
z>QuVd%tOwe!y2;sY3@xvM^{N!n7Z-VjPNW=rcpBEgK>CzAA~BKU%x1}|F(YEY-iWO
zAuk-Nsw&med|hnRGjrgPH2!O~bA0?`Q^4vUHlG`9^Rbq)iQ)5?c1!H5ubKyTxe@7N
z^IL#Vy}zN}|02=}ciQxt=J77q?zO)c7Jqv)YI02s5nGfh!tR#<-wGS61k5I3b-37d
zi&oE%s`!tca}>EmumS3ppQ79lWK_7}5G_tEgk2pF4AW^s6@k_mOZJd$ieujLRb-#yM7&
z`PuMf|CktUCoCNR5a$RBl!|Da6)qS?|7_bQjE0|D*7V2xD;ElDrA)%*G^24U?*WgJ
zj;vL~sJx#T^-#v8q?GO3{RkO%21H-QPe)vsApSOg<8?iFtix3VXOV4XgDL@|5-ypg
z%{jz;%AS%i`eBTU>-AqDl7Vw|=Nw;+z4oF`U!DKglyS-MX5|?`Y(mkJ`Eks;^669Z
zmD8ijPy2~#5r{#ci7!-D56~pbIMFl^FhmumJx+1OS8S)bKFt_B8KY$4?5(*Iu8Es*
z=TDRC(12njkO=_W2(IM?saZJ-rZP*-0{5?ZNWf-3)R*pV;Y&mCKP*3Xat(Y&?evY(
z({rv$KYYHdXQpwWX7m2ZkH=Wh<^m3J0(v;?8>nG5fMNSdcx%biNY1n~DY6*vi>XhC
zm;rof0Y8qi*$2Ln%Ss+WvaUSwZ9z+uf}^lBuFUw%_^<`EC<<~o#FMRn#vl&IM-Iv_
zB))46Pv$x~MV%|&Gve7+JDZz*YVrcwZZCT>I7RDT=rw0I^QkK)geEur^2^7?Pa&B1
zJo4bB-B#bm4*J7-{!~`HcTBpLg?^d)x_al2({uK!RhUzFY2?-Cc(uoSRpp|lLw-(14@omG01|;`;I8ffg}q2yJYv58ZHQZEiLQ~B
z*&<=Z^Yj=F;lii0Yj0~f;_HN)%SweMp@wTEE2@OWz3ED=EOaJ7B%tMg!I&ZXjHHhx
zqUN>5Q6P(vAmv{)U^^lA5w-@u(I;)J
zf4NN9(WHiG6qtO7GW^kmKD((Z&xbyxmV#YrcMjiRZ2dqS9M&*HB9`w*X8~}L_#XmV
z(z_Q{5>Njd^=k3C6iOXcWOZ0M-Ui4KE+BuHJQV%}RhTZs+7CV*(F3GDW6Bj^0CLO}
zecep|tPvU-hY1KuRWF%)B;_sR=m(7c#tcxV4>P>4fvl-9agpAJd^730hp?`k3D_43
zx)>0!NdW(M#3(zy{gJe_rPuwYj%U)!`?(usV`^#y@as8nh%05)*qRvTH}Hc7eV-%W
zo_j+iz*8k%CM^uT$wNUv?XqL$^7_JKgy6%=&txVK*S(@<5SI0Wj_srW&dA&2^~(ED
zt&f56D$&V|9NAyC#Z0
z!3qAcB8vBTdFir@;<5m)cScyQ>oeL1k
zOxkgGmNjJz@3sVDVbX!2La3y~m5!L;65cYpg2I|^-L
zAclKOLbC78b$l#@8A6C;YY@kJm-~_PpwGel8Lp~&f2kv-#VKPekHjn16Q&j0bLmhp
zrwFeJQV%>*@n1G=5nd_q=`wS-`Nt;hrU|N{B^KD1>|4$rNbcVySO5P*j@T&wY*)If
zi~zU?Av
z8eyB6p1#RMMJVC_85B{iEz$RyeFZm|4Zn
zp)R`!JA%a?*=INWxc+u0>m8GmRdlbc(=`bkV{>yzUD1#J6R4CyHx(#B2beC#8D_Wd
zy1n(iCqCWB#NIJ`uUh(HmVYMoH9sB^Y!~0THfx)CWs;SqT^EbvU9=1TUiZBD%Hznt
zSPk3SSiBF2c1TFJW%`~1$Q95-bjjKjcnQj3Spu7i25@BNYCY_#~{q
z{oOmsXx3CClgU!%xROb(PXn~887g+(GtyY*i=JC^ygGzUh9SVnBE@UQ3Y;`mY99dL`H=?xELLBp&Fpm`x2FWqM?!D%_
zCgV^oQZ6A%qlx@&>7_mi#70He7~XkGh##Humh3KVs&w
z3;lt?hxj`WJ#X1y^j-};+WXe-90f*UCu=t3E3aaGwndyv?vw6W6n=^)0OHA`{qpz6D8qio9(q1;`mg1OhFtI3&G#;f;aij{`l@AoWwQWQ1#?qwBP@V^51ubo@t%)&EP
zV!ZY}iEqoz#7bh%0Y+rZtMLXJi8w?corZA!T>+{WEJ&a}m=`D;_u}BsBs~hyay|e%
z;s77h?9UBu9OlA
z_(&<7AW=Wpn32Rr-(|*nex6IG1$q-hI*|
z@LY-{g-_iVR$B6|oz?>oZC#OS5&H_jZS-NQW&I3ZncQo>sBLj!SwwQ<>J@7@+!v)v
zVnpiTuxodGU20~$-zl#zQ
zGoP#rhN2VpJ6Zb;*Hl-Jd{{XuW*i9F`sg8EbC0jLsE(Sho1z<$I_3=i3gMw-^2VmV
z(=TCJ4Ref#KI8ezpla4Z_gYZ8)Lvb!VS<`kpDi-VfduqPOa9ys#-^s*RPVCznQH8M
zP_3@Wi$kFMNA&kC)3u1YPbxSP{7Dz>AtsbJ|3@$PwP#MywJ-7xC#>j~KX#EY^Z8Kd
z?8@kjf@1FAmH+9u|CA
zE#LE3vuvOEc#m@_nMYN&iLRWS%XnMF45A>XEBGBb>zI4(hWfd$w#7DY!$<0pXX4S2
z>V8iySvs`!!+vouj;iyez3}%)7tbEUj6Q6-w^mwLM
zbYe_H*yU!N*f;r>O|tV3sX2csW!(mwE5=%dp++U=8jC_*Z0egJe6;M(ZCs>ZbmC0$
z-VlGc%$R=77kta6Mbxdn5)i%jl+CZfg^vHZdHmhEr9HEps`e1s!f~pm#!RCR&qB!X
z9X34dkoz1R7@V$h7NX%vlcf^x(UOhiH-W+778
z^eRbTkvByZPiIKFJr$lI{JmWhjyYMk40Bpmw+s;W>XECL?0z#I{f%bC@J|k@k6B4S
zqkwPW#aK5YH3a;f5c$Cs5;-i?(V~bjbS$(NT0U%*((;xC16#f!mToP&Gp~BoncSA@
zbQ{|Kw-woYF?zvQFP)R+^?L6)16uktf`0AUhag0A~C{})woCL*)J(?f#`baYc9f>qbM96OV5ufI^gB8g65
zkV){I!RI}*=9=faW(JS0dO#)%Ra-H^Jl}Vi$;8OEctyvk!_~3x^#X^oo(~K&ssjO6
zyi3sm%7IL+!!xp1gl23>Hp`@LzyZlHax6?j002_Sxq@rvIH2Y6yU&&{zquG}CW?A~
zYpP1|nKO?+iRH9-C9VESqqq)aT=7RL+;F$&`<6|e8i@+
z7RSn@!%jv_S{F5h5C8J9tC`b6E?F5QiIo_&qzCFeJ-XGM7+XE&;z2Dp<Y86!HXt@z8$7k6BL|yBegzm&62fQ%k+cXVh#?=vJZW@*Vo}N{KZ2<7Yli@_+9j=
z0HeKsD<$TXg(p^Wpa(>Z(E-MgCXq^u2UYyA42{DZ6c!>c*s@y9G+>HNhb`a=3&V`B
ztxowC;R=kVuI(K?IHKHwzAim20uX?H=cKr2xN$qJ9Q4Ff#(PE>=U1qysDvjfMyPj{w1Qic&QU8odj4WaLa-nBh;?UmUOi@B$(VeksT`egG(ya8#u
z)&h4jsz~}I45RB#Gq_4~161r9Uq7F*Dt5fJhU4t14>AjG(B$@n@G>JQbE&_-ztxx8
zx!0rg@5zP?1uVm|dQ2{Oc2`Bex$+`?<*(XiW3hM
zs;{4C@$IO}=u96Ml?Ry!BRWaXKF3p*&96iWGT-NdWZt@
z#Kc_g+-q18aE6mUX=!4lO(R6hv@I-b!|o~`xvWcoZNB>aQ|f+7QE-?VisAt&sC*7k
z-3sjuy+G`qs7WVY$A~tR;@ufj?=dg6%$b^`Hagx*tQ1+_%f~9k7Ar1|PoOy9iSK7=
zjOqFK=Q{?;5E)Qxb6Z``jNFLP29vP|o1B*m`tRlN2xA74_H5MtDr!&gjJcMguV2!x
z>|yh9?5lK|)4mlJPm*ot%o{WE!b2sMLHATb!kf(J
znVnMiW$aiQdHK_zxRX1&Zk>Gh)8Ww{mNj(Q7m?EE>aFJqTU~UNdnxzIG;}11I!FU4WCm^(LX5T
z&=`>ktr~LvBrPp1C!VH?Uxr52GPSkK$M!?Ey0m;sUdV{r^nn#Et^PNZwg3cAh;e+i
zezCc#ujd4(hiobSgm)z%rD%o?qj47!S_D1Y{IwgP1_<1vAc(lSs)cbF0y5-cIgJHN
zLrvVmEb82p)koB6hZzN(uAFH);7DGN88S?4!+68C)Pm7*hXRRa>lMUAW+cZw3XO}!PK}kr$L$i3*G}(fi?M0-yH^d_8~J_
z=AY{YyI?r&Ak%AM&--1X8~J45z>glA$2|f4_$#}C9Or!4Z||;MctibyHh2$Q=N&zV
zEHAH2G&%<>P*hvVWh@h*$y`xcY`$jAMT%osc2b-&6}#kXK^>X$;K4z(;tLloT2xs-
zSbyo#?|57AtWL0bK_F!z4%7Rvwr4iPA8gH7!@G}@;1>h+0uxs%p)^trd|Qp`c>W*;
zsb8C$k06c(Us2ZaseBgPa*`(VykYbK3NpINIgl`G*gBc|=(2JbpNFRdy^S4bR~TJ$
z@d20@y*L1(>@=TRihtRLctZU3tgL|`mbYkr%Mr3-XR(@?3|W$&^e>8i>4-g=9|T$!
zX3|LsSVl`HXo7G&H`7it@}qTJ5#vxb2PDPo*@e8(xsZyKwwvMujBB0;$`0i;i`P_fh`L)p|B_N)Ef(5xm!4T
zuz(Brb>ej8DH~6uwxJXn$l}@X4c|2D>aCkmSLbVbK_1TL&027CG>r4D)CoPZ#94kI
z6HgHtS-|Zdtm)uM#U=tnhLk@pD6`V=BPps**HjBJX7IkCU!r}R7RmwnVoekgZm*}%2bGl}&;7K}
z0n8NGy8QAL(Mt<Q7`_{pRb>FdYQl9Tmrhh&PuLZq
z?)bYG!VTk_jk79RrU!pF&m$}%IIV2J!}hp$;W5*7Hd+O2tc!Yl>OV(IrLFD8{-+TM
zb+r+p)%khvv=i>x*sM985un*0dMHQw8w}Ks!%45W
zf*3H83BJ}|;TI9Q?OH{#J57QGQ3P752&bQy
zmF*;j!3zl2{H5TY`!ttABNY=&jahba6RIbus|_=vY3o8RIWIXy
zlk_BxGdD!zwDg*beWZQGwAamLxA#}x{l!q($&GUx6QlWFcK!1obX@0Egq#%j19Td^
z8;sOx8}H!(Zp?x*b4F~*>%zDF
z^wUw8%6nbkJt(?uPdEIJUp9IHosCnHk_IZ?Aa%k6^Th<|pvaLzkF_on;SB|Ve)YkC
z03+RNP0q_OzrZW^ul9N(%Od>Vz-;?NF+g)}x&l!J5^bx7igQI)?m&g5u
zw{6F<_BPL;#p3*6V`n!EjF%!p^sf)UU94V&z3P!8{h0~LTFTIB?@6oq9HQQ5EXF~e
z!W@Ztr(S}qcFQ?q@oGdn!hW>j6DDM37yjd0_U_%38xoQ5KRBxec0CxP`MzPzzd!Q*
zyI;NjA6(azy8aKYYv*=!_#a%?f=~WWAHj0e|H~g!K_51VHj0}X8-wNEmPf@$FsJ
zm7HP?K)125j++q9nNqzOQ8|=gqIK0X=m>^dX0u3ajElXh-6Y-hq3w!(3f?+U4R?|?z;n36PWOV
zKEPY++O6B2^z<)Ls8FoJ7}8&*4b7H%k`88yP=`#Pg0!&OKaIK3&IA
zSbw77qoi8RX6exC%&g@UY0+>f#P3i6=a?d5mW1rm=n>vRk%f7|{hKUS^`X`Cx83_V
zB`7o}DEYPjyK}LyT*M2mk!r`8Cd#OA$lo5>{#hY;36i`lB|ik@wlC$d?bQ1m=oE-rsDaLYo$@l(pns*E_i=sc7q|(*Fr?c5W~Rn%pj
zGsI=SoQB=$ljZqWC%_d_T*;h#GwYaqsx|2axDMD(uc8l%TdNCop@SL7$`I%vSlhHlm)`JjW%`tx+=lUmJSWf~i
zq%IkY0b3{K=lfA)$U5BOq4CCKZEEM6RvOr=++?0F5dtu*Xls|D;!}W*=jS6P?zwB-
z+M;2&$`6&+sCt@CNz2LWkvQMbSz=|K2;Eu^h3Kl$7!Xt^Lh}IoHY}XC-zCVt{7hI>
z)KPjC@m*j{&z#!og1frhk7U5PpqZ5h3
zEPZLbySAXtmVq7>s)&xz428tjM66Nu6+>V-fAoh80&T(bPqjiWkWJG($^P|=etWmp
zsQC}Oc3O^N=^D|eh`~;1^?|=-s_#yj2Cv^qhE}{XFpPhDUEFw*W&N!Bb?Y`>iS*ue
zs0_s+71@}vb`H<%0W1}0`M=q|^-15|-rgD&Jj#Jz=PW^FKAp?j;Ti5!n^tf5w&KwS
z_u4_lY5x*_!@Rq7b?#ba-_CR&P0#)vZoo{O#q;r>0e$VJ;0&h#AZ~=f3Ze@qGKqT;
z!1p2=MCuiYX;QBc^|s7WGoB0q8(51B{TE4@XYyqCnZ?I*twzAoz+4>T;afGuDPCir
z_)twleEfjmB;-Qq*K{x%Ek}PC0ipM+@#9MYY!v7#iA}3J1ufr~4ch@7WhP-_j8zz#
zFA&h)h%hjn*3$G=iG1Za~-5bgK34l2*(K;k;>v}?1H8`Wyi=$Dm)D{YH?vq
z((e$Q6*&&f^15JB%81FNB)qV&u%@;)WaCpRwb+&^I2|eoHB)$oErg@3;`JfYPNx6a
zt|x-kUg@}&*_#!w3$P$qnxa4|=}>UNtu6f5U%$ZIwCHYA&dhn$D<)5#%<)!;f?5<5
z6r>=`bD9y{Z$x*)!P;=h1?^HLNFy8;0-;^^~&Se%vf8)
zm)VfsfpDTWH(knbT6WbWX47sShG{IdfU&VLdbr*RL6rye=LJ59q~YI5c;RV=L};8>
zdK2Ty0T&NB6^1m}yCfiE9Xu^_UsI}t@%17i6f+7qY
zc!wJr?NT=y60Ou5T);kq2Y1)=uWIZ-=K4T`&tV}5%=B`K;B>+ou<0qF0V*N}|ZK7mr
zb51;?^{E^>UTPwBUyH3`IC)d@nnp2Tf*8g~8yPTtytm{)AvA&+U(PjV^a~1Ml^par
zYfFSd(tW_hgvU$t^b#Qf=7JP#x38$2MrrvAH-Zj#C(GY@w|>~3<`8h~*c^c5Etkf=
zA?qisQB{F~jOse@!bZW@CT&qM@6PCTNT5K(5+UyVH5oX+ZjH;gv6m$%5h`
zvQF~|U;ae_bt`nA?B+`^LxBxCl-$-3V$#-C5?8K$d-f*dtLt*SuRd|S-w1#XdsmT?J0J8^By@Hc+H(B
z@CQ&02GCieqAfnkv@VgcFz2e4R(Vj1E;=F*De1QHF_`;k_?X$pA4Jw5)=2--
zR?Dqt6fbjx(P+IszRf|HM6d`g-*yjMZ#+4|}XMsb&h*jCvV;cX;yTiAZAU3GILbA?GGDbz`6SG%i9ZyrfY%PoT&p
zaJs*vLEwl`pls#c?IK*-aBZP;??xI2wc~dhfJqg@zx-16^C(c3rl69>x>KyG#Xk!Q
z{DDJ<^eSt_;)#zPnd^{acRKKYZ8K@f%WJ<}Kt?xIJ9zEhHnJhZ7B8fKd*roTos
zuPrGrzaz6lkOUEjL0AN65>`5NwyBI#^vCbDb2I9)MG(#2y|?nIs3KH_G|lG;MNzH%n0NUr_HB%y#5)V$#Hk
zAD?aP_URI!h2;LKP~j@IUpKq_rTZR+?<0WLWA1{3v4MIPvwo4FBcbh-+Mzl$em(dP
zp;q73IQ06440AQ=Pl-+7l^EkufUB39n?3+tD=te_jW*EFxmR=kPODJ6h6Fpd*#$vg
zg}(RzsDnT~g%wEx-$IC{q&w2`=0TmMYS;xjo~3kq+$rWZwkZ3lB@ptAfc^X+A%HCIIk@--H`w1v-CwrJdRhDci?-T5FW7@9HRLsbi&c>
zlz%i^YhMKSh}&`LGfw*oB}HG6MJHEQu)<_ZduJsHYkbLwSECnk!b1{4M;O6WUs1)u|3B~O41
zaeMSs6w#P9m>qIMoP~kz&vX$&OJx0$QHYB0+L>`ErWzZ)!ju5eZFKkZ8EI(|1CPk2
zBenyGZ=70|mZ@hNn<9l50
ziV1KpkH(Jp7yVq=U}9Yssa;Be>wyT6s$C)n>dr2;u&&s?V~5yMvMS;xJY7cDMGPlr
zHBq=XWo&R?{JbutT+Yxv>SD)YLrq$gyb{qHLM>=r!p?aZ6FrY8eL7<5BP?yL0b4S9lm*vi*H(Rd;2N
zRuz~fs_qU~lB24{Zb4k5AOfmvZhYN!+wWlpCbfTu8h$&erXSyp_Njx}R@k9|w2{Lm
zo@O*PW7)^v*o%xDnQ|5b8YfC7fn(?0RZk#)%%jMp(jvv=ytCSZ#6${D%4y;1_utgR
z?CVoG7B7aVtnP$X3aO5Gy$raax&+P9bNuf*PgHeW!EVyy;5ssA9ouhj@5|Y-jvI`f
zo_A(a<+bHY4&SLKV(%tDmuIql(xzsX&?JVm5+`rc^>@hdL58;8j-h#?~8gEwzKajL7(=WKU4WVSBO*v+_0
z2%M;nW{S2z%L=KN!aInWL`nTs^Oapj_wbA`k2S_-K}vKp=Abe^ob_4VxT^)y0}A}V
z^Uj*sPD@)l4lp@?)-$reXKRjkfk)=i9Q6PT?~QeCgNPEMsu;8(ZdIrC8s?9psR^4b
z%j)Ya)sA~lR~~%M0`wRc`Pa3zrsPlA>!9&PxZ})XX!RhTOD28XY1I-88oS7j
zWuT5R1!qpXh0U?fX=+yDkZ_q-4st>qvOyXRAhvC}R;B&p8#^zkAFcvsGHhx7!ceFA
znzyKP1e=JWwsHns4sdTxj;S6oa^zw|!*u5K!Rb4C)lL2fyreWOwnNwjMPqvHvvp5OQeT3;xt;cT8MzhC3rg
zzl~1o(K>&rRSXUN=lNo+LDId!pO5)%*GlF$Tg23h9^H;whXw=NJaL5&`u<@1@ayr@
z(;{PIU46<{jdQeLuzubv9gFnJic(*-h`L9IBC7M{zTxqiVlGw*GMH(?-_!qbakDI>
zNpR?Kakh0z#Oc}x_gvx|lO}+bv$N$8a@xm^wmORrIu98&)
zH5bpCHS0phtT7Lk<`k02#qWl$3-Q#yf?Bf6{!6|)rWfCB)(4fO<5e1dlw@U4>j?z9
zKp#-~ZUKE9K5YK5@^Sd7-VY_Y{Mp%Pr1bpoLxt3zrunlupsVoc@{CfB8L5mJ6LQ}z
zbOJP}FIj-LMJA>%bC;mZTo{xBmv*npcv_#Z*O4zD+0YS(7k97Np}yCAUUJX~-!+vt
zfxbr%)?IhEr0zyyXk1TOmqnQVg0hZYhL4As!9M8gqv8MtV)z>u9Q&cv5vHYRRlIlZ
z?7}+xXY?aJSDdL$aZ61nE@PPefy``EQbhZFeDj;{xk%EAm1PBQ;^4NU
zrP+a&Lg}g8V}@BVT?b#@$@?YW9LZ-{q2jO;5#izP=MtoIN$xl55VR696Ww}eW&1TS%U7V5R5BLY$bfz4th;_Z!6Qzw{&C)O|QPy8!|pI
z?!B%)BRIK)Spgq0{kB4R*T{kW4bZ3i81LKjQ=Fmm5LrB-Amuw${VuZTJNUe5#>dT6
zPzSKdQG8Zfnv9C#BQYG^V2}@sP_%1BI_*up6lgQd;AhTiqDb$u!0cHhFWEd|;8~Z@
z9QE1N@p+l+TuXEJ#jjix=x_hDw5&|?s_A%#Hvfy${a!A7n$=}?<+7(r3-zB_=vz(;
zyHI6jVUZJc;r{(a%yC3c$mnt^<4?*Z@r;jP8y{8nj;mL%cC=V%EJ1c~|Jh4Dl;Ijo
zbni8nG!7KSV4QaTdn5~93D06u8?C~QO+PbeZ*p99KMc*`?GzLg9L0NS#NwuSrH2jw
zyl}TI57kWj^2<)l9{sEwA0iSZ}y(!H^>Phh$l`XKb`4h&CD-rSrxVg+SDI~((+gwhJeLW3o
zKFx&Q^7dv`1M@hCL|r%I_J>(n3o(<|coIXgo&j-Ty}`9))#H*=-yO+~{erV!muGCh
z;gWc(K&a%n+tKq++}yYkbV$~X(e|tXNR2c;Qt2Atm>l&G6O)l5W8CHG`8z_dU4X@pX*gqJbq))5dt9CE_VQ`Xbh2emAX__l*a*{fX?e*H!b
zf*%m`uwtpYzMfvE8K{&(3UgeJ6P9yAzSkL2l3J-SU~8rVlG5KW^30n?@6a)|)DgH+
zzM+Eh=GR|)MQmq!J-y|nngV5$rPWpA6qEMm93S)bLsi#&xS*d_X+`&7^^#QQshr&QnQ2{6jP&X3PUB=tTv5!tbKBU+H6E8D$?GpICot%ep+99A
zVUJOYkWcVoJpZWe{44t>zQwD1txK+?%Dv0(1Bfx}4plu4@3;l&Er)q+?Uhd~&hC?F
zvh>mJU?6iTIRU%ap&d4FnOoN1CtUk?q=zO{;$^VV(9ml0JDX>b>U&4Q(wWXay51kU
zLC%^QbSqnOp`xtq;}S=Pc&pd06(l#~!)Cvytslr>#*PWl@;Vi5?ZOW~5QVR${rO{;
z%s;<6QthO@AxoVWlt;DJUybkVulAn@ZDwZ=ASC8Z?7w=fUq%}EQZ||(q?Ng$=ztlu
z4zAdyzN@0yHBYJ2P+Ub}F{EXy`2HX?y4RE}`F$ro`6bHMSTi`h;OY`}x5^oA0wFEv
z_nQky=VSddpL?FsrjhGB!^+Akdd6d-lnR-z*zVv6hiflyhSt;8!ic*3Rkt2J%=kF!
zJrl-`9=)2cGi%Fc{bdbR`cEr28+p#vKY!yP?3G(-X?vx;H)GNy>&^#j7++*G81(bAfaQ*LRu_2Vl8^tw50QW<*Emb+Zt5oL2
z0r!vlsGqoiE&y6-;py}>s<~^X8#6%ws&;a6dJP}JVCr~iU7MEath=S3qsVg9eIlae
zug9g`x@C(Q)s{;Na}VB0MAf}~)yD=Tz9@)X^mxIqr%2)C**(f+bItbfHmK1Qf_=B}
zA@0IU^m9QK#|jmHzOc9qKMyY~C_CL5Uw@ZkHH!Awje`o#>R)o8_C{X&uKa9s99@vbg%4x)iPvyj`Qr4
zq=ihF6IX|e(}DtMzvm@@Jn=3pX6yN#HMY(9A5~P+*irWsiAa>np3|ORp0Z(V$?7d%!#tvuN((c?jNi9u7eebsIk98vG-D;`RGj2Y6
zoR~3M0OJb!MQJ4CE$Uz3>=RsTVC$P7DusxH%8f0G9X+!cjH&;$;KH80d!?EJlsSdq
zL)LDHq6FT@LeLe+!Hm_Qm?>Ek>d3H-u={3l^_&5f;W+f~Kf(An{va`2C+PC!hoR0@0H}0pqrUp;+}p+;ZB2hCPOR<~3m7`k
zIV{V;+DB^B5U7)phD{U(zS!-t1!fq~BUqQB*)p5jH*WwC`ck8XTxqXtQs4f_ZJv{xAm?OI&WiS91$NXg7A){#9?ZEtA0HM8XpK^B^>f$w;bsYAx1@B*8n!2u}tHsh`Eqr16=VNa$xDHV+{j1
zw&EEqiB(V3d6<0EY#B6FKTfpw!V$&AK#d(}sA
zp=tJae5S)+#6e&eqd9U}>zgC-zw^25EC>B@s8Hm?&iIY|!#3vvr-*OuYx9n&Tt9pE
z?0wV8Z~rmY*ri>tCGU*k<%1w?Ci8;fSmDsu3ZLmraR-oxuX#G?5^%BEh}{dE*d@q)
zwa0tcKUf$V(^K6H^oOV@Vg$^WzxWKB`!0+8@^gxLowW;(RUnCMjV#blY7q$T;chDxWJUFPS^
zg0U&K6x8;AG7KNW_)|IGN1x=elJ1t`e7AI@8fHEjl_E0Jd=+<)Yk!adOL_R9w11?k
z-&E_AFaeC5Ojq!ZH!DhriSDh9F6$bAWQRc|nb`iWA%2-`GLD3_v1kPV4|K5ZR15ek
zhNP#DRfipO1CUFG>{vtHJ}~azCDLF2`)2VPTl+3E6Wu90EqEx04juYqpuH|1Om@7?
z9E1rZez6p*b$Qp}DVzeg-VI-pbqNda+V}8c4c60l^;Z#CUpDmR_W_AeC;m*j3}+tK
z|LubJ^6$)GhrhxM7-xB2p(90732(CQ_p-aK5atAcAder~rZ<>auy#3FM3
zL_+G*uiq@7geA6rF4C6^FbdU
zv1J$tQclVkfw38o9~a!{zH;y0`-7w4aQ+2y!jkB_scH-4#ODNYMqjKwQvm$C_?0e-
zQc0DvPGMoMe|&&_s>XXKt>mJMm9EGE&<^j%f5+YZdPuClI^#2PQ-rr8tAOH9V+wUCHuK)1!?0*gSH-X^v&+l?uSN~vz!)ta7LZXw+zy|^Y
zP0FtmnT}?d3!{$NM^&7$#ta5@I65o9My0sDu<0pVR&j!8V%$Vi;V`EKU#nqQ&cN>z
zCg|9)Lb#(G5JMUkYi+M1kPG1si~u!;_*6pUnZgKRdkep0?;t~vpqAUZ`NQ^U-PCR<
zxJ5{WRdy*Pws=#fRy=KMGEPGv*tf7udj8wc!)t%Y5mk;Xw_rX7qVY1gxTPcDDGxy=T1(c?s)?)6}CphUd&^#o8`xBZpZ>@)Fq*dXG7H!2DNM
z-`u~t!Nff4c#i~T@l6QZ#uPe&+l#V+`j|wyuCShZSR9s!eti!UUU$=m9Lh(YV)2d`
z#k9xEns1?|K$bRza#2!2&pFXqWA~t8|KfO$tsj6NYA5&_Zsigz14m-%YTE${*_naGRRBNc5j?1D!AyppNx+4q@%SwAZ75W=H
zZKXe!{`PCX(m9RSvcrqW^O`~TeTJt3%Mm+Ls~S>t-u32M$pZzZ
zF&G(OefIw$VGiGn)NG+PP@HqVcr8oAS9cbc5X3yK*9jc~YsG_5EYmeFgx%j*03ax!
zC1Z(woxAmWcy>Ltu{hV#Vc0*^%&{C>mUFiy7s!G_WIhynuZkXQP!QuUfVxZ0wdUd>
z2`d5ullbDSSRWmfI=SmV@4>EzM=U#rDN+L8q6wOhc^Mf`oP-dspNjjx*n9J^p7Xx{
z`2}RaI%9^E!q*a@(p^_z{qQ#QEOext~EK%P!Td5QYp(s+KkV;aiB#Bb)
z$9vB6y04kJ=DL3O@jHHh+{b;~j`KW^87KAa^Lf8t%k%YoK3~A0FIkK$`OZ>cRAA@U
zxfDzX&;6aon8wB+`r!-HGw9@Y5%gh2ucU%gvu86|p8vCxkP%@0ml5=YY@1H8mFS>>
z@3TY|D6C1~!U!*uB~2r}%n%51*tR%MtXQye^36Rjv)I}CI|b*;amNL*5cGN(goNB@
zKclufzB)+I=V{LZ@bIgdW6JDBxH~aAjm(Jthluw4(Wuy_PwYJUH(N3s!oRd9V+4o`s}$M
zeJD>t>o;`lSRYts@FDIBkrQ8y+0_M1lz0ua%u7qhV)9BR6lwxi)C%4(-FZSYh{Twa
zkI31-!+2OtbwKtK{vndUV)vJ5#1C?yRmw@o7
z{Bkv->&;v_4x49yrAxT^hPVh$JB1+UPD~#d-BG?Ru?|EqAVfWNbtTX*`Ca2lSxS8i
zp)Lt0az2)D0#0umKV@mnJ%+(^sPABh{i_a}vu<6q=I!Fg@y|0>jVr3Dv0Ar{r$ys;
zscDj*Q4)5G|42
zQxNx>tD@NX`>z~X+ASng!uDTmyIuqHhhBOZ4elxw&C^Ynec{|HNA|^fgdZ6;W*X*-
z&n-<%?u)r6QDyCyo6PrwA3K%icf9{2KOPfaKU9dqJ`b+z%Ih!I{st{nf~MV<`KAD*
z8N81@-V*Qzg9m?r;QVck{^a?tw7?~xF#r{N`GaR4o~Tmi4}f0EbfrdTCQGq^(ZhaG
zHD#|9Ye_U(zLp4jD-_jM7hRjSR3|rBB2t7C`4dP%c-&zCxi;z1i>(FUfr^at#oF#5
zP-J8GPmcGwBPgIYQKJ_;?BjvUrI=a6pRvA@OtjFTSQPsXe%pq3f!G&M`cNw&
z?BeN&s5KK}%3ionIHoTnpo`>7?>J`7<3Z;a2I_!xn_#ECWZ`=kZjn$33LX*i@_+M)
zTKNPDXA!$KQK0keOX&_)0UzYHJKIhS
zq>dL&fg!+N6e=PH)hfRvdDDkL5P^z9wX+C^E6|ou1T%d5$LM(-W+Y>g@&<2`JG^DW
zjG);v7gE;Nf&
z9=4h)3;|@g-D>yZaYYjUP47R2PUUMV_7^)IC3V7W2OrSXjZI^XE%u%Wd-QF_3&;O~
zIh8AQ&wRfcJQ?!I8R%}StgSDx@AO9V7c&YpVP8Q4pplyr8tmP%LkF2bqeeY?cTlKQ
zfx7n41m#U?o$&Wdzi;0>3+duFswpU-DGXiVQVG4JM3@v(J02~_d-W=i=B22r>Jd>)
z;4ZKMB!q|`%c*w+i9xJ>!g1mv@Zi!Q?v^Tlg6RltClpjs*KMs@opO8gD*6OOWmzBD!1eYpoN(>2&G)yxo0ca0{^~Fhq$Di
z3d);JuWH5|UpqQHcA5lCIr5W6WNCD#qyfy@g!d4hIt+shdOx;;M+?pKP!`Y@A(EBw
zg1nvn=n4n)Bg)xUABjRn&)0F%g^-gk?djvn35*b%9EWE(d^qGH1_resKQ03>g`Okf
zqYU{^I+CVvH!WhERK|Z-^XMdhsCTwB543Z(kN>2e6Trk4w&x7U{?M`a={|OxMSg2N
z9aPWL(^Iy36UndfgZ|`ahw=cD#rk0$0S)gR5}FgR!6e=Yq`%*Ag;28^-nE<0kF3|O
zduMN~!ir<`MSb%&Gmf6|ke@xGn{wKLwj(bMN;~#)+sYLa<#g9Bu8X}V=XLD)iej(V
z5w&T*-qjg->Dq9gu;DvB2A#>#(~@4lIqhrJZpU6GN3C~!b<;e&Xj$ed&EWA<#s_J*
zy&M1cL}6eiJ>~R^gjH~7^`6u-mjs(%a@|T0p#6+KJ<7~9x}HTjAS2<)LMZiAEAp%4
zIVx!v!O)mZlfLd{{OKzq4ecWD_wL<0gx_c9A`5}%!YV`NDUHhlRFjCgET$JR`X@s}
zhr)SlonY<_`XH@xZ>Y8)rgmr8JV#r*gF^QXbOhc+?c4X?$IN_Z9bw*APR?jjm)YBN
z6~m2%CR*ZA=>DTWjiOwAIoq@UaF8xl3;;IxN%E$mqT~Ge^ZmatlKQDo+w?$PTvA1f
zVfpH{YdeXFj-HFtj2S8cCEziVK?co+kKe_=H?w!^(zwjdPI-G52E9GI->y8v-0)F#YdNJXkN5LsZ^c&!i96Nb(h=PJv>1l!G|NWQi
zcY}
zPw}W-`imERBsdirR8O@oI29OZ*nJl+`|=tK^o)2_9yfiptPK6#(09(%|IP)>`LbmD
z+yk~L9rOG3a*cRYGh-n2MQ5LRyBXm5+m<>$g2>%fPVN9#H#IA(3xzFezkA#a%KQ5Kgv^zY9XQCW0x?0IOL
ztt7IF-~8>De27uToB45hnc-VNHyMeOvvU#Tm-c!m4q0@YZCyxvbgQ7CuVhg7{bR&>
zz7!fKRk?d+t+>>?`~EhP-%p&7K8a7HFKDH#
ztSrHCeP>!T<7A1%z2)2LgeE`n-3J9^WM~@q)J~E2nP+ci*f>IJ5#Z-HUGWH~FXB7G
zMy&-44(VfAdHCRs+-D6TqrZIlB2jYt{ap0#4_1j0$JEC6L(Fe%@8gir57I>n9*yGB
z0b1XF_%PCF<;W%v@#J!+o}&~xj9^TXLXmg++VlUK`uF8Lk@9ee&~J*1qoIr2{(QZI5>!9`2i2`WjZ#AvW`LSbV^o?qt+m>=m8^jCV5i4
zqwnN>xx=H6JouPvY$diwUc7Q;7D=w_ufMhnnNXXbm)8q$N%@-li@1ELlZBq12j}3}
zv11`rY;p~dp!;ynmfPD~h|{GcmA5?7vrC_STJm7eGIW4)^-sTWIbFXExEdO7Y>mU{
z^}|t7Q8!Yb%+u0p!wGndkO)HiVHmOo_UYWr6m^ZIBDzn`rb!<}g%qhlVA0E`;4*
z^!LE0rDb4dd$l