From b5a067c0067e00de8135401c2a515f9146564f31 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Fri, 8 Aug 2025 16:14:34 -0700 Subject: [PATCH 01/41] feat(#1949): Preparing for CHT 5.0, remove existing upgrades dir --- content/en/building/guides/_index.md | 1 + .../{updates => }/collect-forms-update.md | 1 + .../collect-forms-update/xform_list.png | Bin .../xform_name_settings.png | Bin .../guides/{updates => }/feature-flags.md | 1 + content/en/building/guides/updates/_index.md | 9 --- content/en/building/login.md | 2 +- .../app-settings/user-permissions.md | 4 +- .../en/building/reports/reports-overview.md | 2 +- content/en/hosting/cht/_index.md | 2 +- .../cht/migration}/preparing-for-4.md | 3 +- .../hosting/cht/migration/preparing-for-5.md | 75 ++++++++++++++++++ content/en/releases/4_0_0.md | 2 +- content/en/releases/4_12_0.md | 2 +- content/en/releases/4_2_0.md | 4 +- 15 files changed, 89 insertions(+), 19 deletions(-) rename content/en/building/guides/{updates => }/collect-forms-update.md (97%) rename content/en/building/guides/{updates => }/collect-forms-update/xform_list.png (100%) rename content/en/building/guides/{updates => }/collect-forms-update/xform_name_settings.png (100%) rename content/en/building/guides/{updates => }/feature-flags.md (98%) delete mode 100644 content/en/building/guides/updates/_index.md rename content/en/{building/guides/updates => hosting/cht/migration}/preparing-for-4.md (99%) create mode 100644 content/en/hosting/cht/migration/preparing-for-5.md diff --git a/content/en/building/guides/_index.md b/content/en/building/guides/_index.md index 9c41ca87ea..762f42f3ee 100644 --- a/content/en/building/guides/_index.md +++ b/content/en/building/guides/_index.md @@ -6,4 +6,5 @@ description: > Focused CHT app development guides aliases: - /apps/guides/ + - /building/guides/updates/ --- diff --git a/content/en/building/guides/updates/collect-forms-update.md b/content/en/building/guides/collect-forms-update.md similarity index 97% rename from content/en/building/guides/updates/collect-forms-update.md rename to content/en/building/guides/collect-forms-update.md index 27eac35428..428b20ca89 100644 --- a/content/en/building/guides/updates/collect-forms-update.md +++ b/content/en/building/guides/collect-forms-update.md @@ -7,6 +7,7 @@ description: > aliases: - /apps/guides/updates/collect-forms-update + - /building/guides/updates/collect-forms-update/ --- To do over the air Medic Collect form updates via HTTP rather than sending APKs which have a long manual install process, follow the steps below: diff --git a/content/en/building/guides/updates/collect-forms-update/xform_list.png b/content/en/building/guides/collect-forms-update/xform_list.png similarity index 100% rename from content/en/building/guides/updates/collect-forms-update/xform_list.png rename to content/en/building/guides/collect-forms-update/xform_list.png diff --git a/content/en/building/guides/updates/collect-forms-update/xform_name_settings.png b/content/en/building/guides/collect-forms-update/xform_name_settings.png similarity index 100% rename from content/en/building/guides/updates/collect-forms-update/xform_name_settings.png rename to content/en/building/guides/collect-forms-update/xform_name_settings.png diff --git a/content/en/building/guides/updates/feature-flags.md b/content/en/building/guides/feature-flags.md similarity index 98% rename from content/en/building/guides/updates/feature-flags.md rename to content/en/building/guides/feature-flags.md index 5faa5fa238..63fc248ad4 100644 --- a/content/en/building/guides/updates/feature-flags.md +++ b/content/en/building/guides/feature-flags.md @@ -12,6 +12,7 @@ relatedContent: > aliases: - /apps/guides/updates/feature-flags + - /building/guides/updates/feature-flags/ --- Some CHT Core features can be enabled for specific users only. This can be particularly helpful for features that require training. The updated or "new" version will generally be the system default, but users can be configured to see the "old" version. If you do nothing when you upgrade, users will automatically start seeing the new version. diff --git a/content/en/building/guides/updates/_index.md b/content/en/building/guides/updates/_index.md deleted file mode 100644 index 95d95ebeb1..0000000000 --- a/content/en/building/guides/updates/_index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: "Managing Updates to Applications and Content" -linkTitle: "Updates" -weight: 100 -description: > - Guides for managing updates to CHT applications, their content, and data -aliases: - - /apps/guides/updates/ ---- \ No newline at end of file diff --git a/content/en/building/login.md b/content/en/building/login.md index 1606bf01a0..cfc967547d 100644 --- a/content/en/building/login.md +++ b/content/en/building/login.md @@ -38,7 +38,7 @@ To enhance the security of CHT applications, users logging in for the first time {{< figure src="password-change.png" link="password-change.png" class="col-12 col-lg-12" >}} This feature is enabled by default because it encourages best practices. However, only new users will be prompted to go through this flow or those users whose passwords have been reset by the system administration. -Projects can disable this feature by enabling the `can_skip_password_change` [permission]( {{< ref "building/reference/app-settings/user-permissions#system-defined-permissions" >}}). This permission is a [feature flag]({{< relref "building/guides/updates/feature-flags" >}}) and will be removed in a later CHT release. +Projects can disable this feature by enabling the `can_skip_password_change` [permission]( {{< ref "building/reference/app-settings/user-permissions#system-defined-permissions" >}}). This permission is a [feature flag]({{< relref "building/guides/feature-flags" >}}) and will be removed in a later CHT release. Subsequent logins won’t require a password change – if the app closes before changing the password, the user will be prompted again when they reopen it. If a user is unable to update their password, they won’t be able to access the app. diff --git a/content/en/building/reference/app-settings/user-permissions.md b/content/en/building/reference/app-settings/user-permissions.md index f73c1cf173..69ff09738e 100644 --- a/content/en/building/reference/app-settings/user-permissions.md +++ b/content/en/building/reference/app-settings/user-permissions.md @@ -67,8 +67,8 @@ Permissions can be assigned to user roles either directly in `base_settings.json | `can_view_unallocated_data_records` | Allows viewing reports that have no associated contact | | `can_view_users` | Allows viewing all user accounts | | `can_write_wealth_quintiles` | Allows updating contacts with wealth quintile information | -| `can_view_old_filter_and_search` | Allows users to see the old filter and search in Reports Tab and Contact Tab which is considered deprecated and will be completely removed in a future release. Admin user will always see the new redesigned filter. See [Feature Flags]({{< ref "building/guides/updates/feature-flags" >}}) for more info. | -| `can_view_old_action_bar` | Allows users to see the old action bar in Message Tab, Reports Tab and Contact Tab which is considered deprecated and will be completely removed in a future release. The More Options menu will be hidden when this permission is enabled. The Admin user will always see the new More Options menu. See [Feature Flags]({{< ref "building/guides/updates/feature-flags" >}}) for more info. | +| `can_view_old_filter_and_search` | Allows users to see the old filter and search in Reports Tab and Contact Tab which is considered deprecated and will be completely removed in a future release. Admin user will always see the new redesigned filter. See [Feature Flags]({{< ref "building/guides/feature-flags" >}}) for more info. | +| `can_view_old_action_bar` | Allows users to see the old action bar in Message Tab, Reports Tab and Contact Tab which is considered deprecated and will be completely removed in a future release. The More Options menu will be hidden when this permission is enabled. The Admin user will always see the new More Options menu. See [Feature Flags]({{< ref "building/guides/feature-flags" >}}) for more info. | | `can_default_facility_filter` | Defaults the Place Filter in Reports tab to the user's associated facility. The user should have a contact associated that belongs to a facility. This feature is not available for Admin and Offline type of users. Use with caution, online users that can access thousands of reports can experience slow performance especially where the network is slow. Added in 4.3. | |`can_have_multiple_places`| Allows users to be assigned more than one `facility_id`. Helps support health systems where offline Supervisors manage CHWs from different geographical areas. Each `facility_id` must be at the same level in the hierarchy. Added in 4.9.0 | |`can_skip_password_change`| Turns off the password change prompt for users logging in for the first time or who have had their password reset. Added in 4.17.0 | diff --git a/content/en/building/reports/reports-overview.md b/content/en/building/reports/reports-overview.md index 9b36031d26..702ab0ecb1 100644 --- a/content/en/building/reports/reports-overview.md +++ b/content/en/building/reports/reports-overview.md @@ -46,7 +46,7 @@ Using the search box, you can search for reports by patient name, phone number,
> [!NOTE] -> A new user experience for Filter and Search was introduced in v3.17. The previous version can be re-enabled for users by adding the [permission]({{< ref "building/reference/app-settings/user-permissions" >}}) `can_view_old_filter_and_search` to the user's role; however, the old version should be considered deprecated and will be completely removed in a future release. See [Feature Flags]({{< ref "building/guides/updates/feature-flags" >}}) documentation for more info +> A new user experience for Filter and Search was introduced in v3.17. The previous version can be re-enabled for users by adding the [permission]({{< ref "building/reference/app-settings/user-permissions" >}}) `can_view_old_filter_and_search` to the user's role; however, the old version should be considered deprecated and will be completely removed in a future release. See [Feature Flags]({{< ref "building/guides/feature-flags" >}}) documentation for more info
diff --git a/content/en/hosting/cht/_index.md b/content/en/hosting/cht/_index.md index 609ac5d5fa..7d6906d3fc 100644 --- a/content/en/hosting/cht/_index.md +++ b/content/en/hosting/cht/_index.md @@ -4,7 +4,7 @@ weight: 6 description: > Guides for hosting CHT applications relatedContent: > - building/guides/updates/preparing-for-4/ + hosting/cht/migration/preparing-for-4/ aliases: - /apps/guides/hosting/4.x - /hosting/4.x/ diff --git a/content/en/building/guides/updates/preparing-for-4.md b/content/en/hosting/cht/migration/preparing-for-4.md similarity index 99% rename from content/en/building/guides/updates/preparing-for-4.md rename to content/en/hosting/cht/migration/preparing-for-4.md index bb7d5654e9..e2e2d229fe 100644 --- a/content/en/building/guides/updates/preparing-for-4.md +++ b/content/en/hosting/cht/migration/preparing-for-4.md @@ -1,11 +1,12 @@ --- title: "Preparing to upgrade to CHT 4.0" -linkTitle: "Preparing to upgrade to CHT 4.0" +linkTitle: "Preparing for CHT 4.0" weight: aliases: - /apps/guides/hosting/3.x/preparing-for-4.0 - /apps/guides/updates/preparing-for-4.md - /apps/guides/updates/preparing-for-4/ + - /building/guides/updates/preparing-for-4/ description: > Steps to ensure your CHT App will run smoothly on CHT 4.0 and later diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md new file mode 100644 index 0000000000..48aeee3a8e --- /dev/null +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -0,0 +1,75 @@ +--- +title: "Preparing to upgrade to CHT 5.0" +linkTitle: "Preparing for CHT 5.0" +weight: +description: > + Steps to ensure your CHT App will run smoothly on CHT 5.0 and later + +--- + +## Introduction + +Medic uses [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (aka "SemVer") which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. The two breaking changes for 5.0 are: + +* CouchDB Nouveau imposing changes to Kubernetes hosting infrastructure +* Removal of upgrade service from Kubernetes deployments + + +## Breaking Changes + +### CouchDB Nouveau + +A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). + +#### Kubernetes + +Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. + +Please see the technical guide on how to migrate Kubernetes based deployments to 5.0. + +#### Docker Compose + +No action is needed for Docker Compose based deployments. To upgrade, click "Stage" and then "Upgrade" which is the existing process for all 4.x upgrades and continues to apply to 4.21 to 5.0 and beyond. + +## Upgrade service removed from Kubernetes + +In CHT 4.x there are two ways to upgrade a CHT instance: + +1. Click "Stage" and then "Upgrade" in the CHT administration interface. +2. Push a new helm chart to Kubernetes that specified different versions. + +A recurring problem seen on production deployments was that over time CHT administrators would use the CHT administration interface to upgrade. Then during a migration or a restore from backup, Kubernetes administrators would inadvertently downgrade a CHT instance by using an out of date Helm chart. + +To avoid this situation, the upgrade service has been removed from Kubernetes based deployments. + + + diff --git a/content/en/releases/4_0_0.md b/content/en/releases/4_0_0.md index f629705430..6684eb33eb 100644 --- a/content/en/releases/4_0_0.md +++ b/content/en/releases/4_0_0.md @@ -18,7 +18,7 @@ Check the repository for the [latest known issues](https://github.com/medic/cht- ### Breaking changes -To prepare for this release, read through our [Preparing to Upgrade documentation]({{< ref "building/guides/updates/preparing-for-4" >}}). +To prepare for this release, read through our [Preparing to Upgrade documentation]({{< ref "hosting/cht/migration/preparing-for-4" >}}). {{< callout type="warning" >}} Be aware that as this is a major upgrade some manual steps are required - following the usual upgrade process will not work. [Data migration documentation is coming soon]({{< ref "/hosting/cht" >}}), but in the meantime reach out on [the forum](https://forum.communityhealthtoolkit.org/) for direct support in upgrading. New projects should start on 4.0.0 to make the following upgrades easier. diff --git a/content/en/releases/4_12_0.md b/content/en/releases/4_12_0.md index 0d5dbddd49..8c84efa35c 100644 --- a/content/en/releases/4_12_0.md +++ b/content/en/releases/4_12_0.md @@ -24,7 +24,7 @@ None. This release includes changes to the user interface which will improve the learnability of the CHT by aligning with the look and feel of other android apps. Below is a summary of the changes, all of which were covered in the [July Round-up Call](https://youtube.com/watch?v=NSFRQt378Ls&t=460s): - [Update to the overall CHT app Navigation experience](https://forum.communityhealthtoolkit.org/t/the-ui-evolution-of-the-cht/3515#navigation-6) -- Added the ability to temporarily [opt out]({{< relref "building/guides/updates/feature-flags" >}}) of the new Navigation experience +- Added the ability to temporarily [opt out]({{< relref "building/guides/feature-flags" >}}) of the new Navigation experience - [Removal of opt out capabilities for Old Filter and Search](https://forum.communityhealthtoolkit.org/t/feature-removal-opting-out-of-two-ui-changes/3738) - [Removal of opt out capabilities for Old Action Bar](https://forum.communityhealthtoolkit.org/t/feature-removal-opting-out-of-two-ui-changes/3738) diff --git a/content/en/releases/4_2_0.md b/content/en/releases/4_2_0.md index 67e67b557f..d8574de7a2 100644 --- a/content/en/releases/4_2_0.md +++ b/content/en/releases/4_2_0.md @@ -26,7 +26,7 @@ None. The additive actions (creating reports, places, people, etc...) have moved from the bottom action bar to a Floating Action Button that opens a menu with all actions. This change aligns the CHT more closely with Android UX and [material design patterns](https://m3.material.io/components/menus/overview), and applies to the Messages, Reports, and Contacts tab. -NOTE: The bottom action bar can be temporarily re-enabled for specific users by granting them the `can_view_old_action_bar` permission; however, it will be completely removed in a future release. See the [Feature Flags]({{< relref "building/guides/updates/feature-flags" >}}) documentation for more information. +NOTE: The bottom action bar can be temporarily re-enabled for specific users by granting them the `can_view_old_action_bar` permission; however, it will be completely removed in a future release. See the [Feature Flags]({{< relref "building/guides/feature-flags" >}}) documentation for more information. {{< cards cols=2 >}} {{< figure src="../images/4_2_0-7998-mobile-fab.png" class="left col-4 col-lg-4" >}} @@ -41,7 +41,7 @@ NOTE: The bottom action bar can be temporarily re-enabled for specific users by The Export, Edit, and Delete actions have moved from the bottom action bar to a new More Option (⋮) menu located on the top right side of the screen. This change aligns the CHT more closely with Android UX and [material design patterns](https://m3.material.io/components/menus/overview), and applies to the Messages, Reports, and Contacts tab. -NOTE: The bottom action bar can be temporarily re-enabled for specific users by granting them the `can_view_old_action_bar` permission; however, it will be completely removed in a future release. See the [Feature Flags]({{< relref "building/guides/updates/feature-flags" >}}) documentation for more information. +NOTE: The bottom action bar can be temporarily re-enabled for specific users by granting them the `can_view_old_action_bar` permission; however, it will be completely removed in a future release. See the [Feature Flags]({{< relref "building/guides/feature-flags" >}}) documentation for more information. {{< cards >}} {{< figure src="../images/4_2_0-7872-mobile.png" class="left col-3 col-lg-3" >}} From b12ecb029509156e6ec0d82e5a3d3117fdaa1ca4 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Mon, 18 Aug 2025 13:30:31 -0700 Subject: [PATCH 02/41] add all breaking changes, settle on final layout of page --- .../hosting/cht/migration/preparing-for-5.md | 70 ++++++++++--------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 48aeee3a8e..78c240c89c 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -9,67 +9,69 @@ description: > ## Introduction -Medic uses [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (aka "SemVer") which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. The two breaking changes for 5.0 are: +Medic uses [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (aka "SemVer") which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. -* CouchDB Nouveau imposing changes to Kubernetes hosting infrastructure -* Removal of upgrade service from Kubernetes deployments +While this releases breaking changes mainly apply to Kubernetes based deployments (e.g. Nouveau & Upgrade service), deployments using token login may be affected as well. +As with all upgrades, major or minor, you should always: +* Have [backups](/hosting/cht/docker/backups/) that have been tested to work +* Ensure your [CHT Conf](/community/contributing/code/cht-conf/) version is up to date +* Review the change log to understand how end users might be affected -## Breaking Changes +## CouchDB Nouveau -### CouchDB Nouveau +{{< callout type="info" >}} Applies to: [Kubernetes](http://localhost:1313/hosting/cht/kubernetes/) hosted CHT instances {{< /callout >}} A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). -#### Kubernetes - Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the technical guide on how to migrate Kubernetes based deployments to 5.0. -#### Docker Compose - -No action is needed for Docker Compose based deployments. To upgrade, click "Stage" and then "Upgrade" which is the existing process for all 4.x upgrades and continues to apply to 4.21 to 5.0 and beyond. +Background information: +* [Reduce disk space with CouchDB Nouveau (TCO)](https://github.com/medic/cht-core/issues/9542) ## Upgrade service removed from Kubernetes -In CHT 4.x there are two ways to upgrade a CHT instance: +{{< callout type="info" >}} Applies to: [Kubernetes](http://localhost:1313/hosting/cht/kubernetes/) hosted CHT instances {{< /callout >}} + +In CHT 4.x there are two ways to upgrade a Kubernetes hosted CHT instance: 1. Click "Stage" and then "Upgrade" in the CHT administration interface. 2. Push a new helm chart to Kubernetes that specified different versions. -A recurring problem seen on production deployments was that over time CHT administrators would use the CHT administration interface to upgrade. Then during a migration or a restore from backup, Kubernetes administrators would inadvertently downgrade a CHT instance by using an out of date Helm chart. +A recurring problem seen on production deployments was that, over time, CHT administrators would use the CHT administration interface to upgrade. Then, during a migration or a restore from backup, Kubernetes administrators would inadvertently downgrade a CHT instance by using an out of date Helm chart. To avoid this situation, the upgrade service has been removed from Kubernetes based deployments. +Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the TK technical guide on how to migrate Kubernetes based deployments to 5.0. - From eed8d1434a4242c8b1a60bc715453fbd0b57ed5f Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:59:45 -0700 Subject: [PATCH 03/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 78c240c89c..26595c2ff8 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -9,7 +9,7 @@ description: > ## Introduction -Medic uses [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (aka "SemVer") which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. +CHT releases use [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (also known as "SemVer"), which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. While this releases breaking changes mainly apply to Kubernetes based deployments (e.g. Nouveau & Upgrade service), deployments using token login may be affected as well. From 28c8a806e6f41f4fdc73b9a4c54db633eb9b56a8 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Fri, 22 Aug 2025 12:58:24 -0700 Subject: [PATCH 04/41] move links to relref and remove localhost per feedback --- .../en/hosting/cht/migration/preparing-for-5.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 26595c2ff8..6ee5e59ca5 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -14,13 +14,13 @@ CHT releases use [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Sema While this releases breaking changes mainly apply to Kubernetes based deployments (e.g. Nouveau & Upgrade service), deployments using token login may be affected as well. As with all upgrades, major or minor, you should always: -* Have [backups](/hosting/cht/docker/backups/) that have been tested to work -* Ensure your [CHT Conf](/community/contributing/code/cht-conf/) version is up to date +* Have [backups]({{< relref "/hosting/cht/docker/backups/" >}}) that have been tested to work +* Ensure your [CHT Conf]({{< relref "/community/contributing/code/cht-conf/" >}}) version is up to date * Review the change log to understand how end users might be affected ## CouchDB Nouveau -{{< callout type="info" >}} Applies to: [Kubernetes](http://localhost:1313/hosting/cht/kubernetes/) hosted CHT instances {{< /callout >}} +{{< callout type="info" >}} Applies to: [Kubernetes]({{< relref "/hosting/cht/kubernetes/" >}}) hosted CHT instances {{< /callout >}} A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). @@ -33,7 +33,7 @@ Background information: ## Upgrade service removed from Kubernetes -{{< callout type="info" >}} Applies to: [Kubernetes](http://localhost:1313/hosting/cht/kubernetes/) hosted CHT instances {{< /callout >}} +{{< callout type="info" >}} Applies to: [Kubernetes]({{< relref "/hosting/cht/kubernetes/" >}}) hosted CHT instances {{< /callout >}} In CHT 4.x there are two ways to upgrade a Kubernetes hosted CHT instance: @@ -52,9 +52,9 @@ Background information: ## Token login requires `app_url` -{{< callout type="info" >}} Applies to: Instances that use [token login](/building/login/#magic-links-for-logging-in-token-login) {{< /callout >}} +{{< callout type="info" >}} Applies to: Instances that use [token login]({{< relref "/building/login/#magic-links-for-logging-in-token-login" >}}) {{< /callout >}} -For instances that use token login, be sure declare `app_url` in your [settings file](/building/reference/app-settings/token_login/#app_settingsjson-token_login). This is backwards compatible and safe to do while still on CHT 4.x. +For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. Background information: * [Require `app_url` to be set when enabling `token_login`](https://github.com/medic/cht-core/issues/9983) @@ -63,9 +63,9 @@ Background information: {{< callout type="info" >}} Applies to: Instances that enable languages via web interface {{< /callout >}} -As of CHT 4.20, deployment administrators can enable or disable supported languages [via the settings file](/building/reference/app-settings/#app_settingsjson). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. +As of CHT 4.20, deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. -Before upgrading, ensure [your app settings](/building/reference/app-settings/#app_settingsjson) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. +Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. Background information: * [Deprecate enabling languages through generated docs](https://github.com/medic/cht-core/issues/8157) From 91e494c2b9a7cd54599d5ff7148d4ad778b75e4d Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Fri, 22 Aug 2025 13:14:05 -0700 Subject: [PATCH 05/41] 4.20 is not 4.2.0 ;) --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 6ee5e59ca5..a75e88cc86 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -63,7 +63,7 @@ Background information: {{< callout type="info" >}} Applies to: Instances that enable languages via web interface {{< /callout >}} -As of CHT 4.20, deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. +As of [CHT 4.2.0]({{< relref "/releases/4_2_0/#technical-improvements" >}}), deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. From 390decfc1d6245216b71e8266aae0e74bea19e3f Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Fri, 22 Aug 2025 13:48:33 -0700 Subject: [PATCH 06/41] add related updates section per feedback --- content/en/hosting/cht/migration/preparing-for-5.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index a75e88cc86..3dacc454aa 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -31,6 +31,14 @@ Please see the technical guide on how to migrate Kubernetes based deployments to Background information: * [Reduce disk space with CouchDB Nouveau (TCO)](https://github.com/medic/cht-core/issues/9542) +### Related Updates + +While the 5.0 upgrade for Docker based deployments will be transparent, there's some more Nouveau related changes that deployments should know about which can affect both Docker and Kubernetes: + +* Offline users' devices will have their search indexes rebuilt after the upgrade. During the rebuild, search functionality will be initially unavailable. However, once the indexing is complete, the search behavior will be unchanged from before for all users: the search experience is the same in both CHT 4.x and CHT 5.x. +* The Nouveau index data on the server will be stored in `${COUCHDB_DATA}/nouveau` for single-node CouchDBs and in `${DB1_DATA}/nouveau` for clustered CouchDBs. +* The following `medic-client` views no longer exist. Be sure to update any custom scripts which use them: `contacts_by_freetext`, `contacts_by_type_freetext` and `reports_by_freetext` . + ## Upgrade service removed from Kubernetes {{< callout type="info" >}} Applies to: [Kubernetes]({{< relref "/hosting/cht/kubernetes/" >}}) hosted CHT instances {{< /callout >}} From 3e952b4a4a6e3ce59832a55c28a51c852447be6b Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 3 Sep 2025 13:37:31 -0700 Subject: [PATCH 07/41] add two more breaking changes to the list --- .../hosting/cht/migration/preparing-for-4.md | 2 +- .../hosting/cht/migration/preparing-for-5.md | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-4.md b/content/en/hosting/cht/migration/preparing-for-4.md index e2e2d229fe..0d543f2e01 100644 --- a/content/en/hosting/cht/migration/preparing-for-4.md +++ b/content/en/hosting/cht/migration/preparing-for-4.md @@ -1,6 +1,6 @@ --- title: "Preparing to upgrade to CHT 4.0" -linkTitle: "Preparing for CHT 4.0" +linkTitle: "Preparing for 4.0" weight: aliases: - /apps/guides/hosting/3.x/preparing-for-4.0 diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 3dacc454aa..5e49f71dcd 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -1,6 +1,6 @@ --- title: "Preparing to upgrade to CHT 5.0" -linkTitle: "Preparing for CHT 5.0" +linkTitle: "Preparing for 5.0" weight: description: > Steps to ensure your CHT App will run smoothly on CHT 5.0 and later @@ -64,6 +64,8 @@ Background information: For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. +Be sure to use [the new declarative config](#declarative-configuration) as well. + Background information: * [Require `app_url` to be set when enabling `token_login`](https://github.com/medic/cht-core/issues/9983) @@ -80,6 +82,26 @@ Background information: * [Allow app builders to specify disabled languages in config](https://github.com/medic/cht-core/issues/6281) +## Declarative Configuration + +{{< callout type="info" >}} Applies to: All Instances {{< /callout >}} + +tk - all the content ;) - but upgrade your app settings to be declarative. + +Be sure to [update](#token-login-requires-app_url) your `app_url` in settings if you're using token login.. + +Background information: +* [Make declarative config mandatory](https://github.com/medic/cht-core/issues/5906) + +## Increase ecmaVersion ES linting to version 6 + +{{< callout type="info" >}} Applies to: CHT versions between 4.0 and 4.4 {{< /callout >}} + +Deployments running CHT Version 4.0 and 4.4 must upgrade to version 4.5 or later before upgrading to version 5.x. + +Background information: +* [Increase ecmaversion linting for ddocs](https://github.com/medic/cht-core/issues/9202) + From 8da6b821cfeaf989b0ddfbddb89a24f22dc03f55 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Mon, 8 Sep 2025 13:36:20 -0700 Subject: [PATCH 08/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Joshua Kuestersteffen --- content/en/hosting/cht/migration/preparing-for-5.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 5e49f71dcd..01f72b1f82 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -11,7 +11,6 @@ description: > CHT releases use [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (also known as "SemVer"), which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. -While this releases breaking changes mainly apply to Kubernetes based deployments (e.g. Nouveau & Upgrade service), deployments using token login may be affected as well. As with all upgrades, major or minor, you should always: * Have [backups]({{< relref "/hosting/cht/docker/backups/" >}}) that have been tested to work From 1de68006dcecafa40f93f0b4f3fcffa2d957baa0 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 10 Sep 2025 15:52:41 -0700 Subject: [PATCH 09/41] fix merge conflict from main merge on last commit --- .../community/contributing/code/core/collect-forms-update.md | 4 ---- content/en/community/contributing/code/core/feature-flags.md | 4 ---- 2 files changed, 8 deletions(-) diff --git a/content/en/community/contributing/code/core/collect-forms-update.md b/content/en/community/contributing/code/core/collect-forms-update.md index 928f1ce633..428b20ca89 100644 --- a/content/en/community/contributing/code/core/collect-forms-update.md +++ b/content/en/community/contributing/code/core/collect-forms-update.md @@ -7,11 +7,7 @@ description: > aliases: - /apps/guides/updates/collect-forms-update -<<<<<<<< HEAD:content/en/building/guides/collect-forms-update.md - /building/guides/updates/collect-forms-update/ -======== - - /building/guides/updates/collect-forms-update ->>>>>>>> origin/main:content/en/community/contributing/code/core/collect-forms-update.md --- To do over the air Medic Collect form updates via HTTP rather than sending APKs which have a long manual install process, follow the steps below: diff --git a/content/en/community/contributing/code/core/feature-flags.md b/content/en/community/contributing/code/core/feature-flags.md index 619763b4f6..6f10bf7b00 100644 --- a/content/en/community/contributing/code/core/feature-flags.md +++ b/content/en/community/contributing/code/core/feature-flags.md @@ -10,11 +10,7 @@ relatedContent: > building/reference/app-settings/user-roles aliases: - /apps/guides/updates/feature-flags -<<<<<<<< HEAD:content/en/building/guides/feature-flags.md - - /building/guides/updates/feature-flags/ -======== - /building/guides/updates/feature-flags ->>>>>>>> origin/main:content/en/community/contributing/code/core/feature-flags.md --- Some CHT Core features can be enabled for specific users only. This can be particularly helpful for features that require training. The updated or "new" version will generally be the system default, but users can be configured to see the "old" version. If you do nothing when you upgrade, users will automatically start seeing the new version. From 8290919fc23672d34d23a456d158ed434624e4c4 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 10 Sep 2025 16:05:38 -0700 Subject: [PATCH 10/41] order by breaking changes vs non-breaking changes per feedback --- .../hosting/cht/migration/preparing-for-5.md | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 01f72b1f82..54a66d93b5 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -11,34 +11,16 @@ description: > CHT releases use [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (also known as "SemVer"), which means that the CHT upgrade from the major 4.x version to the 5.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. - As with all upgrades, major or minor, you should always: * Have [backups]({{< relref "/hosting/cht/docker/backups/" >}}) that have been tested to work * Ensure your [CHT Conf]({{< relref "/community/contributing/code/cht-conf/" >}}) version is up to date * Review the change log to understand how end users might be affected -## CouchDB Nouveau - -{{< callout type="info" >}} Applies to: [Kubernetes]({{< relref "/hosting/cht/kubernetes/" >}}) hosted CHT instances {{< /callout >}} - -A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). - -Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. +Read though this entire document before upgrading and pay special attention to the "Breaking Changes" section to know which of of the changes are applicable. -Please see the technical guide on how to migrate Kubernetes based deployments to 5.0. - -Background information: -* [Reduce disk space with CouchDB Nouveau (TCO)](https://github.com/medic/cht-core/issues/9542) - -### Related Updates - -While the 5.0 upgrade for Docker based deployments will be transparent, there's some more Nouveau related changes that deployments should know about which can affect both Docker and Kubernetes: - -* Offline users' devices will have their search indexes rebuilt after the upgrade. During the rebuild, search functionality will be initially unavailable. However, once the indexing is complete, the search behavior will be unchanged from before for all users: the search experience is the same in both CHT 4.x and CHT 5.x. -* The Nouveau index data on the server will be stored in `${COUCHDB_DATA}/nouveau` for single-node CouchDBs and in `${DB1_DATA}/nouveau` for clustered CouchDBs. -* The following `medic-client` views no longer exist. Be sure to update any custom scripts which use them: `contacts_by_freetext`, `contacts_by_type_freetext` and `reports_by_freetext` . +## Breaking Changes -## Upgrade service removed from Kubernetes +### Upgrade service removed from Kubernetes {{< callout type="info" >}} Applies to: [Kubernetes]({{< relref "/hosting/cht/kubernetes/" >}}) hosted CHT instances {{< /callout >}} @@ -57,10 +39,11 @@ Background information: * [Hide upgrade button in admin app for k8s deployments, while still allowing staging upgrades](https://github.com/medic/cht-core/issues/9954) * [Remove upgrade service from Helm charts](https://github.com/medic/cht-core/issues/10186) -## Token login requires `app_url` +### Token login requires `app_url` {{< callout type="info" >}} Applies to: Instances that use [token login]({{< relref "/building/login/#magic-links-for-logging-in-token-login" >}}) {{< /callout >}} +For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. Be sure to use [the new declarative config](#declarative-configuration) as well. @@ -68,7 +51,7 @@ Be sure to use [the new declarative config](#declarative-configuration) as well. Background information: * [Require `app_url` to be set when enabling `token_login`](https://github.com/medic/cht-core/issues/9983) -## Enabling languages via generated docs +### Enabling languages via generated docs {{< callout type="info" >}} Applies to: Instances that enable languages via web interface {{< /callout >}} @@ -81,7 +64,7 @@ Background information: * [Allow app builders to specify disabled languages in config](https://github.com/medic/cht-core/issues/6281) -## Declarative Configuration +### Declarative Configuration {{< callout type="info" >}} Applies to: All Instances {{< /callout >}} @@ -92,7 +75,7 @@ Be sure to [update](#token-login-requires-app_url) your `app_url` in settings if Background information: * [Make declarative config mandatory](https://github.com/medic/cht-core/issues/5906) -## Increase ecmaVersion ES linting to version 6 +### Increase ecmaVersion ES linting to version 6 {{< callout type="info" >}} Applies to: CHT versions between 4.0 and 4.4 {{< /callout >}} @@ -101,6 +84,24 @@ Deployments running CHT Version 4.0 and 4.4 must upgrade to version 4.5 or later Background information: * [Increase ecmaversion linting for ddocs](https://github.com/medic/cht-core/issues/9202) +## Non-Breaking Changes + +These changes apply to all deployments. No specific action needs to be taken, but administrators should be aware of the changes. + +### CouchDB Nouveau + +A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). + +Nouveau has the following impact on all CHT deployments upgrading to 5.0: + +* Offline users' devices will have their search indexes rebuilt after the upgrade. During the rebuild, search functionality will be initially unavailable. However, once the indexing is complete, the search behavior will be unchanged from before for all users: the search experience is the same in both CHT 4.x and CHT 5.x. +* The Nouveau index data on the server will be stored in `${COUCHDB_DATA}/nouveau` for single-node CouchDBs and in `${DB1_DATA}/nouveau` for clustered CouchDBs. +* The following `medic-client` views no longer exist. Be sure to update any custom scripts which use them: `contacts_by_freetext`, `contacts_by_type_freetext` and `reports_by_freetext` . + +Background information: +* [Reduce disk space with CouchDB Nouveau (TCO)](https://github.com/medic/cht-core/issues/9542) + + From 7dfff4835a54b824b8023474ebdc05321fa2f57f Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 10 Sep 2025 16:15:48 -0700 Subject: [PATCH 11/41] add more explination to language setting --- content/en/hosting/cht/migration/preparing-for-5.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 54a66d93b5..e6aa7175c6 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -57,7 +57,9 @@ Background information: As of [CHT 4.2.0]({{< relref "/releases/4_2_0/#technical-improvements" >}}), deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. -Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. +Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. If you're unsure if this applies to you, double check your app settings. + +If `launguages` is not set, the login screen will show all languages. Fix it by declaring the `launguages` per above. Background information: * [Deprecate enabling languages through generated docs](https://github.com/medic/cht-core/issues/8157) From dd553bbe29b2771bb791fc392dfbaf6e7ad33fec Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 10 Sep 2025 16:30:30 -0700 Subject: [PATCH 12/41] move from tk to todo (but still keep tks) --- content/en/hosting/cht/migration/preparing-for-5.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index e6aa7175c6..16a1caa5d1 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -33,6 +33,9 @@ A recurring problem seen on production deployments was that, over time, CHT admi To avoid this situation, the upgrade service has been removed from Kubernetes based deployments. + Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the TK technical guide on how to migrate Kubernetes based deployments to 5.0. Background information: @@ -70,6 +73,9 @@ Background information: {{< callout type="info" >}} Applies to: All Instances {{< /callout >}} + tk - all the content ;) - but upgrade your app settings to be declarative. Be sure to [update](#token-login-requires-app_url) your `app_url` in settings if you're using token login.. @@ -102,8 +108,3 @@ Nouveau has the following impact on all CHT deployments upgrading to 5.0: Background information: * [Reduce disk space with CouchDB Nouveau (TCO)](https://github.com/medic/cht-core/issues/9542) - - - From 359562fdf1d0754b08b7413f70c3dc2820f910b3 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 10 Sep 2025 17:14:38 -0700 Subject: [PATCH 13/41] remove repetive content per feedback --- content/en/hosting/cht/migration/preparing-for-5.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 16a1caa5d1..5d0781d11c 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -46,10 +46,7 @@ Background information: {{< callout type="info" >}} Applies to: Instances that use [token login]({{< relref "/building/login/#magic-links-for-logging-in-token-login" >}}) {{< /callout >}} -For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. -For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. - -Be sure to use [the new declarative config](#declarative-configuration) as well. +For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. Background information: * [Require `app_url` to be set when enabling `token_login`](https://github.com/medic/cht-core/issues/9983) @@ -76,9 +73,7 @@ Background information: -tk - all the content ;) - but upgrade your app settings to be declarative. - -Be sure to [update](#token-login-requires-app_url) your `app_url` in settings if you're using token login.. +tk - all the content ;) - but upgrade your app settings to be declarative. Background information: * [Make declarative config mandatory](https://github.com/medic/cht-core/issues/5906) From 2372a63b82909cdac0722ae143dbbcc8c62d975d Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Tue, 23 Sep 2025 13:03:55 -0700 Subject: [PATCH 14/41] add info about needs_signoff change --- .../en/hosting/cht/migration/preparing-for-5.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 5d0781d11c..6c36cdca94 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -35,6 +35,8 @@ To avoid this situation, the upgrade service has been removed from Kubernetes ba Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the TK technical guide on how to migrate Kubernetes based deployments to 5.0. @@ -87,6 +89,18 @@ Deployments running CHT Version 4.0 and 4.4 must upgrade to version 4.5 or later Background information: * [Increase ecmaversion linting for ddocs](https://github.com/medic/cht-core/issues/9202) +### Ensure booleans are used with signoff fields + +{{< callout type="info" >}} Applies to: Instances where `needs_signoff` triggers replication of reports {{< /callout >}} + +In some scenarios where `needs_signoff` is set to string `"false"` instead of boolean `false`, replication will happen when it shouldn't. This is because the string of `"false"` is a truthy value. + +CHT 5.0 now correctly enforces this to be a boolean. Deployments to make sure that workflows that use `needs_signoff` field have a boolean instead of a string. + +Background information: +* [Replication fails to filter out reports with `needs_signoff` set to false](https://github.com/medic/cht-core/issues/10183) + + ## Non-Breaking Changes These changes apply to all deployments. No specific action needs to be taken, but administrators should be aware of the changes. From 81945fbcc315ffd91a6a65f50d47a7b35e00c671 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Sat, 4 Oct 2025 15:39:08 -0700 Subject: [PATCH 15/41] add info for checking chrome version for angular 20 --- .../hosting/cht/migration/preparing-for-5.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 6c36cdca94..267918d9ee 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -100,6 +100,38 @@ CHT 5.0 now correctly enforces this to be a boolean. Deployments to make sure t Background information: * [Replication fails to filter out reports with `needs_signoff` set to false](https://github.com/medic/cht-core/issues/10183) +### Angular 20 requires Chrome 107 or later + +{{< callout type="info" >}} Applies to: all instances {{< /callout >}} + +CHT 5.0 includes an upgraded version of https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301 which in turn requires Chrome 107 or later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. + +To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. To do this, first, save the output of the API to a JSON file being sure to replace `user`, `password` and `URL` with their correct values for your production instance: + +```shell +curl https://user:password:URL/api/v2/export/user-devices > devices.json +``` + +**Note**: for large instances with more than 2,000 users, run the API call after hours. It can have an adverse impact on CHT server performance. + +Now that you have the `devices.json` JSON file, flatten it into a CSV file with just one row per user. Note that we're only finding users of the APK (`select(.apk|length> 0)`) and the Chrome browser (`select(.browser.name == "Chrome"`). This excludes desktop and Firefox users which will show up in the JSON as well. Finally, we're also only showing users active since `2025-04-01`, 6 months ago as of this writing (`select(.date > "2025-04-01")`). Be sure to update this date to be a relative 6 months ago from when you run the command: + +```shell +jq -r '.[] | select(.apk|length> 0) + | select(.browser.name == "Chrome") + | select(.date > "2025-04-01") + | "\(.user) \(.date) \(.browser.version)"' \ + devices.json | sort -u -k1,2r | \ + sort -u -k1,1 | sort -rh -k3 | sed 's/ /,/g' \ + > devices.csv +``` + +The resulting file `devices.csv` will have all of your users sorted by the version of Chrome they use. Scroll to the bottom and find any users running a version lower than `107` and ensure they update to a newer version. The easiest way to upgrade is to open the Play Store and update any out of date software, being sure to update [WebView](https://play.google.com/store/apps/details?id=com.google.android.webview&hl=en). + + +Background information: +* [Upgrade to Angular 20](https://github.com/medic/cht-core/issues/10029) + ## Non-Breaking Changes From d36ed8d5c6a4cc962a5c819871d456f33d174501 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Sun, 5 Oct 2025 15:37:41 -0700 Subject: [PATCH 16/41] fix angular link, ensure CLI tools are installed --- content/en/hosting/cht/migration/preparing-for-5.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 267918d9ee..b3117b7c8c 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -104,7 +104,9 @@ Background information: {{< callout type="info" >}} Applies to: all instances {{< /callout >}} -CHT 5.0 includes an upgraded version of https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301 which in turn requires Chrome 107 or later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. +CHT 5.0 includes an upgraded version of [Angular](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301) which, in turn, requires Chrome 107 or later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. + +Before starting, be sure you system has `curl`, `jq` and `sort` commands installed. For our recommended Ubuntu server, this looks like: `sudo apt update&&sudo apt install jq coreutils curl`. To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. To do this, first, save the output of the API to a JSON file being sure to replace `user`, `password` and `URL` with their correct values for your production instance: From 3540494dc9638951f1effe594207b7ba8ac603de Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Tue, 7 Oct 2025 12:57:29 -0700 Subject: [PATCH 17/41] tweak wording about angular, re-order steps --- content/en/hosting/cht/migration/preparing-for-5.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index b3117b7c8c..6f9a3ef669 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -104,11 +104,11 @@ Background information: {{< callout type="info" >}} Applies to: all instances {{< /callout >}} -CHT 5.0 includes an upgraded version of [Angular](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301) which, in turn, requires Chrome 107 or later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. +CHT 5.0 is preparing fo an upgraded version of [Angular](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301). As this version of Angular will require Chrome 107 or later, we're making this a requirement in 5.0 as a breaking change to pave the path for the upgrade later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. -Before starting, be sure you system has `curl`, `jq` and `sort` commands installed. For our recommended Ubuntu server, this looks like: `sudo apt update&&sudo apt install jq coreutils curl`. +To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. -To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. To do this, first, save the output of the API to a JSON file being sure to replace `user`, `password` and `URL` with their correct values for your production instance: +Before starting, be sure `curl`, `jq` and `sort` are installed. In Ubuntu server, this looks like: `sudo apt update&&sudo apt install jq coreutils curl`. After confirming these tools are installed, save the output of the API to a JSON file being sure to replace `user`, `password` and `URL` with their correct values for your production instance: ```shell curl https://user:password:URL/api/v2/export/user-devices > devices.json From 2211e43ab0561dd31085d76b0981c952dc6eee71 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Tue, 7 Oct 2025 13:28:24 -0700 Subject: [PATCH 18/41] tidy up big ol' command to find browser versions --- content/en/hosting/cht/migration/preparing-for-5.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 6f9a3ef669..8699c53646 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -122,14 +122,15 @@ Now that you have the `devices.json` JSON file, flatten it into a CSV file with jq -r '.[] | select(.apk|length> 0) | select(.browser.name == "Chrome") | select(.date > "2025-04-01") - | "\(.user) \(.date) \(.browser.version)"' \ - devices.json | sort -u -k1,2r | \ - sort -u -k1,1 | sort -rh -k3 | sed 's/ /,/g' \ - > devices.csv + | "\(.deviceId) \(.user) \(.date) \(.browser.version)"' \ + devices.json | sort -u -k1,2r \ + | sort -u -k1,1 | cut -f2,3,4 -d' '| sort -rh -k3 \ + | sed 's/ /,/g' > devices.csv ``` The resulting file `devices.csv` will have all of your users sorted by the version of Chrome they use. Scroll to the bottom and find any users running a version lower than `107` and ensure they update to a newer version. The easiest way to upgrade is to open the Play Store and update any out of date software, being sure to update [WebView](https://play.google.com/store/apps/details?id=com.google.android.webview&hl=en). +For instances with users who share devices, or have multiple devices they log in on, they may have multiple entries. Thi is because the CHT creates one entry per device per user. Be sure to upgrade all affected devices! Background information: * [Upgrade to Angular 20](https://github.com/medic/cht-core/issues/10029) From ece15a9d5d6e894b8b34f13c944bf7fdd64fe21b Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Mon, 20 Oct 2025 09:27:41 -0700 Subject: [PATCH 19/41] add work around for upgrade crashing --- .../hosting/cht/migration/preparing-for-5.md | 1 + .../en/hosting/cht/upgrade-troubleshooting.md | 25 ++++++++++++++++++ .../upgrade-troubleshooting/upgrade.again.png | Bin 0 -> 100493 bytes 3 files changed, 26 insertions(+) create mode 100644 content/en/hosting/cht/upgrade-troubleshooting/upgrade.again.png diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 8699c53646..ef49658871 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -15,6 +15,7 @@ As with all upgrades, major or minor, you should always: * Have [backups]({{< relref "/hosting/cht/docker/backups/" >}}) that have been tested to work * Ensure your [CHT Conf]({{< relref "/community/contributing/code/cht-conf/" >}}) version is up to date * Review the change log to understand how end users might be affected +* Check [troubleshooting upgrades](/hosting/cht/upgrade-troubleshooting/) guide if the upgrade doesn't succeed Read though this entire document before upgrading and pay special attention to the "Breaking Changes" section to know which of of the changes are applicable. diff --git a/content/en/hosting/cht/upgrade-troubleshooting.md b/content/en/hosting/cht/upgrade-troubleshooting.md index c9a777183b..effec6df91 100644 --- a/content/en/hosting/cht/upgrade-troubleshooting.md +++ b/content/en/hosting/cht/upgrade-troubleshooting.md @@ -34,6 +34,31 @@ A safe fix for any upgrade getting stuck is to restart all services. Any views If you're able to, after a restart go back into the admin web GUI and try to upgrade again. Consider trying this at least twice. +## CHT 4.18.0 - 4.21.1: Error triggering update + +**[Issue #10296](https://github.com/medic/cht-core/issues/10296)**: Requests will fail due to fetch implementation if headers are not sent within 5 minutes + +API: + +```shell +TypeError: fetch failed + at node:internal/deps/undici/undici:15445:13 + at async /home/diana/.config/JetBrains/WebStorm2025.2/scratches/fetchtimeout.js:2:13 { + [cause]: HeadersTimeoutError: Headers Timeout Error + at FastTimer.onParserTimeout [as _onTimeout] (node:internal/deps/undici/undici:6821:32) + at Timeout.onTick [as _onTimeout] (node:internal/deps/undici/undici:528:17) + at listOnTimeout (node:internal/timers:608:17) + at process.processTimers (node:internal/timers:543:7) { + code: 'UND_ERR_HEADERS_TIMEOUT' +} +``` + +**Fix:** +1. Wait until there's no more [active tasks](https://michellephung.github.io/Fauxton-Visual-Guide/#page-active-tasks). +2. When there's no more active tasks, start the same upgrade again from the admin UI. It should succeed without any errors this time. + +{{< figure src="upgrade.again.png" link="upgrade.again.png" caption="Admin web GUI showing 'Error triggering update' message at the top, and an arrow pointing to 'Install' button as the next step" >}} + ## CHT 4.0.x - 4.3.x: CouchDB Crashes **[Issue #9286](https://github.com/medic/cht-core/issues/9286)**: Starting an upgrade that involves view indexing can cause CouchDB to crash on large databases (>30m docs). The upgrade will fail and you will see the logs below when you have this issue. diff --git a/content/en/hosting/cht/upgrade-troubleshooting/upgrade.again.png b/content/en/hosting/cht/upgrade-troubleshooting/upgrade.again.png new file mode 100644 index 0000000000000000000000000000000000000000..17c43aa3499ee28f15e6888cf4c5826ca9e060b0 GIT binary patch literal 100493 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

B8YBYn=&)! ze>KA-%^qc;mJl}~B-}6Gbd_(@bdy1NSMBBOX^tHneV95w=hGQkZXllRODQ_uZYp}o z+LEbx%JfCs-hNO{?e<-DsgZbvnQCmyx@X!^`?UG(?K?WwiZQHsHo17RP}l;wLsaS$ z^%nOP(;xADRB@a!kSvuaFW%anMYW z9WVLZt{EMWw`@ET7?ezVv%evX&BGj{eneyr@VEIURQQv3JIU9{*{b_e*_&-`w_m>s z!)fL%(pukm$U~MSd-*($c5tvCM0q{(`8my-^EjzPChJ4jE`0o=<-2Szf2CXpUZsWY zN#dU}^qy){NPt_@9PL`qAORz^ILYqv33;4lL_@X`Vz{hN(Zav}$U4^NLZ#WA5Y0TW(i^_0OU|ozTOQET-D@zGmrl zK^0qirX!ss>Gd{jSGeCa<;G+O1s;Fwv zzyyuxsDj1uuQzA#AHoLIYaiAHC@Fg(BsaW_+d)9q>XynuG05@>wx(=d^qR`ooxg2v zTE3j!vzlh|Xu_8elGW=;0~$kx;d6rQewhB)UU+;ew{!igbL=E&Ov{Pf%@+?jHQZ^r zXrU-@J=^`jGwEoLFuOo|l5qt|Xy*d&))%00N4~6v;7BdzolB#EVcKpy=ufPirOu;)k@Tg8C6@2Qnkfw zjH;scj=c%7sS%_09<_;m;`=+#xz0J)dCs4?5Lxe$_ve1S?(ZlGA68*bSDQc6(1It- ze!&kjK0~h#DUx?pZvy^N(lC>pNboXy^V1lMm{+$uJPB_SKgMWj1-yQ+%^o>0)gp+) zKUI)uAjjDmDrMCyJlL+xv<#-5R)XGxWXNOL8>%+s_6>$jV|&SIQN#^)QA(yJOrdIw zs7rQS9gj&y^W;4xFlT&+d4AsoezrF!;Bk6j_oGLwWa9fi&&1}xn{W2cA$YIY zdB8_?)4*j~gqApJ#AKm7#`j(=h;BJgtbxTq$Gx`ZN#7PW`)9jEjQfjPtQL(|R^;8! z`ly-MtYWN}kjrai=xh01-D?$V3-azJ zGU*A`OR8gP7aslN4=+~Q4bdcmGJjfrXuB?-rOIrF9UcF|rZUGU8gds3)LlH{F4%uVQCj+NHx30mIWbC&#uT~13uCX& zd6LU22Bg=B^HS8D?d;ebh}t4L-l7NyJ8yn}Lx-fOj*7`HYE%62^Vw~1x zhs0ueDoRvb=2H3AWETWC$@@u@e4SR$^*!Mo+rmk=A9hB;n~W91jDy0D%p%MIKZg&= zOCa0a7Jo#t5A1=wye>_H337r zsHDR~&TKA`xa|Z$%TJ0@F~)Z0Tu%_v*6Xs1ORj>R?6MA%2IvAwdyV_K*|9Uae~VHy zpd0fvXt4S&`!S%0nVOtKJnvx0cAA_?Eaju>|H=Z)RHsoH2JWv2;uIv+nVbky$qI8yC02l!3@i+Ow$@)13QjaNA9CB3MN> z^3bk##4>B#I@~TZXiO{6@$%xaw^m@ZvX&0wsSLC&qPZ_r;5?W9S;>;>s;GG1r?dft zf?HoaMXO`Ik`7qs7oAjE$_dYNa1Yjub%5M)q|6#>!KH2j4psTFF=gFH!=H zvDfdD7hJ(8;Y-t9*8`@RT<+H0+wTh%H5Ct)uAa(Mn|GJiSxE2t@EaC11$|ugwA0uT z?_h&-A7xzSXdKE{Sd13TForQoQJ5~)R}D!Ou@~K)=-gFnI`v~2~8());^ZCioIG11?mrsPm{rUx{L$C*_>`IApzPHNo~iBYf0$ikzx zT2^0zH9cOaHJVW6S#Qly@m&}Lzxr`L9{mL3I~o?+3QeFyH$9&7&5Swfe5PfkJGE|U5rPuO-CqS|= zOTy*PYl==+=8tch2AOwWx}yEkP0upA-N+MsY(AjrgZdhWAOc^8K?Yi@0COavqOw)^ zbbWOSaurqQ&_nknqQbe|s&t`XBRWg5*N)ev3R|}|yfL7(#vd4JtHC{*NT@j~t@)2{ zi43^lzNzgc`mwTnzek9AMYDg; z>cvE;bd$zs4=RJ7#D)hr4k-jb#XU1hCaO1a4NDfL%B%fu0|R=7+4z`;B;SA((ZCYXbpL z*%-emsdV%!spLtflsBnZZ_I=D@NKy;u$5&)_*62!HJW%hARkw<6if=`(Z>kbTl#+A zch~Ns4U}GIs+Lbr39VInpE|Z@U=fFMA#5~wFBDdPVR(I$C_sE_iN4b{lMS}I;p(5K;UnCfZcI;iU{LmTyb&Rqbv;n`PUlCmZ;En#l= zi=4np-_}SUozt-8t0aFS(U~3_8K4KJ?~GJf&3P?+cK;q!BqqU%d2jPwHvoSk*Yf1x zx$%NXAZz*CyaG*Md+W-U@Y`3Uy*z37T_K*!h&$`CyR_1Hy0`z|)i^o6k6HXIR`C z^svI^!eZLqs{Xhb_zDHYfh6|!64nOPmh@h%Ei!~7 zB|}wmU#XKoUQW2dy80dHTG&D>4i&m)zQI*4p2b90HHQ;R zG6^EM{-!h$%9|Zw1a0rj(N2&in)BhJ9`9C)$ zC9(6J)lU{tCzSs`zl4M1BeG2Ta!>33WLEz_?n)>c!>D>}{qF$Pm#UU!cqgDP^QC_o z|JRfHe^9RX_vxD5ioOtg)OmkJY|wP!a`MQ5K7Uxs`x8@&;X%{7SQ)oVl;niY)%%V= zv!a<-a~sZ0Y}0h?>+>%v#wV@(_noLQnAwIn#+mzX9TSwZ2V|f@7OuXNRhcykbUx|S z&BK2ZGUhb{F^f^GQsga_kg}a8p!fELz3V$0t0nds^{&@J*e&9(C6UEJ; zN>W+CY0(-*>@}(Mal=$|>B!y$7`M4814-vIk48v1H+_j11`ty-rAfc9j3Al*hR*QlV&A5H%(Ihf_MA-u+KJAl{UH|NUjjw3@|U8qe>AyAHBCi)_D7bSmjrHUSV+BSl#@VECi^~u zO^sCW&SUK-wSx2$_W51BHAXjP=g;8$T1mcno1>g`SNG_sk>;4FrMO-KVrL8e`V69; z^2o%m&`tfH#lFv!Bf=>~Vx8izA4>OV=f_cfUfKJYL!nuz2@qPSV&>y)ITsWIn|+eN zpm-z!EFbDISvK?C&0Il$%n@@@CDXDbR0w`5#0B*DvpjRpkdf_Im|itSLAAPi{&>fK z)$zL7v1qMdVc0kF>-|n`tQZly9;m&}JJqwC>*S|8Q_<^oHM`JaIhqhfx)8WRxA5Gk zEeMnO)h{!-Htj!lT)kyZgpzLpMA9g8AHw=*W z5%^`Z&Me_cZNo%~`iN2(jt<$R>U6R?p~gtzK_dn(l_fY;Sc7O;^nBUK|4zunHTP&0 zWXL*R*wFnLUqS6FY;Kj)roD4H?JjnO<2E7A#t;SVG~-VB{Nrx7?(US9#kIaj5$KraKDn*$*;wx~rWr1||b`3BC#RPD4?cBT6NU1uu)nV@4z0@L2bHe1z`u4`u^P!D4i_ZI9ZYnvi%QG z9Mr6tdpl_Zt-t?B+stm<18&`*E`?QylSOz>?q9e}u3nFR*r&*$rJ4^D?-dPH`pR^_4eyg|C11M}h8Y_#oQ1xsYc0Fc^#E-Z=@z9Nw+SFSDIwff zk|C{ZCe8}e_cVlRSAuIkPF^~ur?1J8uf9+N(3_2ZC2k#U!BVY1Q&3kH2Y8Q3ZlR-d-{*k!bV)p219QSXn z2q+(Th%tNT_DqH_3Odvln!c(@bE6!H47~%AcPRO688;UQSFvI=?+6jneWgs z7<(hg&+Vy(M=4}aGd6&9j?K|~RX2W{)# z7$D`Y;+{8S5BF+kcyE5j4s^2Hzz@Vcj{p)X)D=W0FQqGLGeeGN9>ni1VwwMVw7yGM z-23bz?I+g;bG*X&ha^>Lq2>JRn7Q^z|5MN}idqv&)Fa>>MxSSjPV+CcTcf%#ZNg_1 z3a%Lj@*W7<0xkmjk{$E{{{=NB{YAf*9A#V4)^!*}aZI2^Q(sZZ>M$+lS?qP5D=}S; ztYcb)0xLR4Nn~hwljaTNkizxp+q_33);f9CkBzp%=PveCeapN0-xXAM;jb3LkAa>E z#Wu5Jseh^agrvgGNL#JcA8$RUIfBU!osmdAYfYqZ1ae5+_EcFdi_8w1tgyoIoCA96 z;lSY?(GC-*+h?&NaA7)%tGZ{>Kg5Ld*lE9OO1^tLYG_0qKJnK5CgxL9PVZ-SmL@c@ zyAFa}o~F!qnax2anxiF@*q&{+9ECkR<}K5qL1kKSGh<7%*9>15k`UP7qJEea!gTVA zFLI-#MOPa93})XX0OSAyQoi!hiJEHVvDqS^byVw@#ZJ$pj*2}^uV|$=v|A6ST$N*Q z$?v+uqq-l8!TBLHmzV>csnlqsa+w1_6MLfWdXMJ(l8)hILez@{NPUsMH$X|ShpV*r zE842*1w}vYaQgg`&2EzDSH8U8PguFUl(?!ha2RgP$)SX6;&QwqE^~G-{z(zj%1N9s zTrdZ;;KI{24Cg<;KT$T0u zV&*@tSC@8WNTKN{sf=&&$tqqs__!H^R=W#y9I%cP?~tJ_F>~R~rU*^jgAMK`49+Nf zn6Z(xRd;uf@~+<>T%5Qrr^_upjiTwt4A9|aqus-$H}jaqE(ITZCYl%c!d%iz<&2uK z^MMPcU>mT^F92xL=xzQloWAAY(UP1iPNiOhe^D9mHPHI2N30lG#lIA^4^TvAhJM+ z@M`%~Y;hUEt-9d7s8c7|Vws#K0JBpt5$TS4(i7AZ&{^6d$>Hb8`E5gHcr-y-e)apI z>jEZI^oy*Qjtju`sU?Ih^Cv%f`u#*wR>m=%D&nzu|Fo|Z?@lpt25Ty6(`&jJoFfg+ zt)IxWR=|6o+uy3Ph1dS`-WyJsWlJKdb&F6lU_~MT2*D89`Id@uqu+2{ZFx6&m9)7m zH3V;ly`Ti)=Zk=b#jlgNatA@mg1y<1+L#Fk{BUOO6N1Jz(Nq7lE`0B^{Vw8u+#Y?} zLvP`jja*=~5)C+9AT8LZx=w~C@>MBv?vZl9^*38MEvh{=TnEya>qg(quV(#QY)u#C zK5hyPV0KisR2%kUu^DzXh6wzH`{keG>stAHiH6Z=@%vp${{=Aw2+~0w-#-#vT6%^z zM;BjJWvowG5;&J;I+^5x_^lQg4?g2Q)7%<-CJUyTzZX3S`e^5w?Q+j{>MRM*VrjrT z{lOu3TfV%`rw(f1ZA^3?qjQtT?0)&(i8RjcFgsA6t(|)lLwiV|&``eYo;}QWZiVqn z>!r=zL0W8TWv-eET1y*Q_3QEUvzIiY^SL}FA9q*(2Z;FSG4+a{-0JAHxTe9qy`#D7 zF~-j73CIs6_FH9R;vOEA0MeMx_Hr?B^+5dpt_ggyhjZx(KWv&#*OWU&w!{Nu$Z-<7 zlO?fQQ+C;Xz}zkw57ZtaUbj!jd9a zowdwDhtukySi^tVJky)c=`u^i1HY**YaMo`Mpvq47V~uz+u7(?_6SyRoQ&d#`}S?| z@ztCr=F8-6lGEhiUMGd1rdd3P>b5L7`Ik2qxj+0A^ozLaeMFC1$MnGj*jTjMMpMOF z#<+NeE?B3bi?anHlsAN^Vvj|4=>va}z}t-u&E|LlOpcPuk7NRIM1hs=0&kab{XuB~ z2i|`4>1f>w(!e-mx!eV{#|ZBsBaGMJiG|4}Eg~=T%X{k&6?nTRk9?(^TCB7?{}HbQ z(VDt-jhS&)&<754(%SlQWLB-A>+Z0eZRC+!rqWnO+=BYwjJP^;|!-0Dj}Ax=0Y>dy~KItjn%|0 ztI=jc8;S%9>(9*Wo;}dDQ?RO>!PX+D1d7~(_#TCIQtX2qPS+ZrlZ7Y>Q8Q|%WXBT* zWd{JXo^(^Yn@3UMKH$B51U6t@kTsohY)7TRW`Jv(CJu{&i$ww>2Q|t zAg21~xSbAS2~{?~!}7-=)%0K51d4Ejjk7LB^D0^~8*BdSABhM3+d)W~%R~R6m+aF0 zhmDJhA0!`#k-rCVWTn}u3>}8DXewInj@uwYSb7!GKu;&-xOR|v9kKDFjLl0%TC}6u zDZLR9u@MS{?nZee*0Hu_N=P6Mx1B$#lhNR0I<+@Hl*w3Z>4;u#OjsmHpaIIus|{ito)!;; z(Nm|KiB{-Le0~}2kGHVpZBUF-K3bi(R6BZF^aZ7@A75Do8!1nTvj3uIj02=5EPI*CnVNW3|gQA)CozxT?u4@XnjG;<_WE@ z2!&|Z0>0!lcR*yI)z!4`rQI&Sn_^@J`vQ0>@h>%W38f_Wy0~+yJUq=TQfx#kxwq!W ztQXp`;+xxrSqC$;&uV}?vj(AT+^%Qy`MmYiv{fH8wE=eJ5%g?ltA>UP)7eCo6n!}) zC;+`))8JIt)UkmI=aNCA5rN`Dk(LQ1tJpdyfbi#y3!?Lb8owkoK)=Y?Z3r|`1ycCQ zeE48Kn~Q+vqf8?HI{iA>lcxyfei(cB9jBWz61nb|yMg=`aPSsPLPecwN0W8;m+Fdi zHYqhJx+?WSqf};o_%(N?y|0!9P*_wGb@`65&7ks;OBbV>?&xv76CP&IBqs%ZeJ!!T zvLA7GNH%mbxB;&54)-ROEe3il9AX5OCRW|+j#&ZutkK~15p4Dg){yJq&}KKsPhQ;% z1KlQ7l#xe(*Y&bF2pWQ@rjzs->OyVNjS97{D=?!K^}U* z0L|y7ag4XUrV3o-ztw0Mt$O!`I^TEmq4$@4Qi$J@uSm*SAn|a%MCRXhsa-%vTwXWm zl{)%)?vE%piBWd;C_$xR zFEB=9mLE851=OQi+r+i^@X8$XHL(k7!8QGsz)j^MOPoC*PMdwucNw?! zmXOhVdsIixBF12u*@6=AZ-)-}Fo191SU#%Zo6-6@F>{iV=kJUz(w$xmfqnz&!jX9X zIm41D-lP8YRdo?ocUYT8)c$IUzzD;OIN6mqB6v)a+4h6k4*X}|V*co$%86FxuJZj= z0yYqMIxo1qv2dFb&8#1CkWMzi$?s7A5^o7wdWrY|KIHSO6Eur&~Ho7ISy|7&z+IOXO?C;6<^GpQKV)%=pPx(`Kdi)W+7EAIC?xh_GWiM1J z$XmXZu&bjq4^22tmj8e^U9yzC;Rt zH(eJ&cc|vmh7pZt>AP0sN-DHQR4i@!Qm5{Nd}GBe?VLZ~8NVc@DwimbAql%=QT2F2 zRPePw_|UZ|OwRNqX8xxZm^X$ZYaEjE9>Km#mevE2Q^J;>O*&vZPUC2-&SN;{yiK?v z)u>1-&n0mj&cY0EuMa``3%i2GKYXXP1?QhFXj%#6{i4epWEHO;WR+W}7_50_NbeCN z^lK|v;}v#CS4NvntX#PtXB}6YK$NwgZs8W-8}p_WrqCdf0+Pu|kl5!Rm65dzm|$F6 z4AmmVtJ9SrS62U3mdJuXKF0O1BUR+G^9U5&{#$gJdS}0w_^sVuYUrvfUD(S&L~j96 z|6Yn~|2Z}mHZGn2Pu`nVdK?9!9DYmjb-b+5L|Oc%@mj~lWg5F z%pRBH#NZp8Crr3^%`du(opAz%$ZpzRi})Yk(Zb}rbE2$F=_t~tAENmfPBb_ddx$3~gyqP0 zDu)ppcki$|v*y!6+n59nY;i~T1JB0y!GFF9_5sXJumVwd!Y>OO6$1&@A<$w-GOCNuGt6?j|>pRktxR~7*O zr@TJi?wUBRF1#1QQxui*7ivWIu#M<$8?u)NmiM;A9jM((XA)5wnncJuUiX)-<8gr} zbT8+}2V zX{+PaRzq*RWOk0}gP~V7o!o@8EGPd|YkhUy8$zcJd~eo;IQ%bJ>;hnZWF3hf#N;BO z0Nh9|Zl%6!JOLmx0grUa`yeuUy~i2M;xVlH<5-Jj{}G&-BcV~57G9_g_@?tNB%L*idDDMJiO_*;rVBWjoPJXIw#N% zbNukwt1UX(q!VRE2Rz_0WCVkXlI|xSZq;;LwBq1&se#haeircWBV50=K?vWw4 zc<1^f@caFVKb3^)pF>LxTHXB})1~ZsAmsH? z`gI#eq>7$64}@s1OOC|fU&BI-;h$l~YszWUjVO>~{g-FC7;e;ROG}k8pvqkVkqcF`M)#wP+_77qF z0g-*h^EZMfdvTtX(Z#tLd~d$-FD0XDYFaN_D7`1csg-4vUAja-BVHUH>;)Uk+&8&> zFfF1F*5A_0;6!`;!@CYKaV?a!_OA{cm;I6_f~c3$7viAZ{#k#3db+O^jziu;d~Z%w zzyAE(mNecQDivl%cZyLyx#fusru`;t)sXIV`w-RXwsE%<%E95SWcv~o2Ca#bKG(J) z>k$iw`fj^hbnwBR_iBkKUSvhV2y?IeabqVd!iTsC9f6?+F)0<|TL+@G(bha~gTzyZ zkXidC!SgHu7xGtBH=K?Iv`B|$IL(vxv4ip=ljIeg?SSj|WeGORtLN16j^0H*FF57f z`Ock`0$06=1NQ{By2);Vd*Lqar2OS%X1@~HMJO06I8L7g+m?KbTcaH=xE-_Q?Cd*0 z@f@Y?4cxU&t|A}2B5Gl)l#^b^qY&s;k zgiffgE|mY+&J!+e)0*!Y)&9%ZiQ=Iun4>dR!!-RDTolVlG{7&KP!p-^XYtpWz*$ME zH-dtQ8gons)-jM;O#E{VZ6asCGRFpcX>GahlGjrkln{P&+e3xJUt5euqxKJMh?w&J zIkkHu^RmmjGY2jji$kXr?ozd!qRCD6R%re}_R z?~@#}Mzg0ZoDs?-w9s)6S`Ce5*8!ChCoVsrL=_5JD^Xg}Tq2i3_(!Lrc)>$UxBaKU z`|$iH-&yu^AnSbVz5x2EjdhWT{B^SEk`?2leB2DS&=|~@B@z2mhmzJuF^N=va8ijE za)c6RZq>p@+0pmj6zyVaJrVSsBL_~7T1R|o1ryT)26Kd_)$w5 z@j25cw|^l~bVYSMdweg_oT0Suxr_4a&5r3yziZCaTXn%w{ zN8DBtp55x~^5l-P*(f3U-2%?tyRVB6SEN&33kh6P81ei$&if+#R}Hpw>Z+K;0~_Hf zusZEjPp^{3aTj{?_C?Kt@9$1KDD~R&-5z+)$FEyv#@lmU!h4!qW*`zG9`S(lPl2_Y zKC%~+Ew?Ff%_!tVLh}(JAK=YRrRmU=RX$*hUR_dL1X%rs7?jx1FY2RM*k7STrl@kg8s(gHH;Ksg)%zgFc z?D)xG1t=80vFZ@f;)F2gn%r5n+qKFtGyCZhu~4JsJesv6>$s=JD+?4^trBxnEXn}W zoYOWy%b6qnC|g&m*yl#pjsd3PW@c)4K)1Jjw@&X#dA}Jqxv}CZZ`90VjyIi)F~kT5 z4GVG7gVoxb1CHe|A9oy4q$2qPe_|3M=TT|6w74xbU8rh+slvxzsToIFKZztslMcUc zwSWx=q#-9vC}f}07GH51d)KqoujabT<_kv zQdH%n=Kxl^R(!2u!o%<$mnyMJ{seqUjCeT0&_A-Hqme%7-;TzI*dYqK=c1|{80_^G!`ek|jMmVE0Ldo=JKt2N!_pfV-q`7m3 zcbj3dA<#~Kf5DeiaNa9b)1H> z4~a;xT)W$#mA9H=cNs{K|L>&1d-M5k^;eY~xM5&r%+)KaNJ}k=-Zq6&_NWmp%2QU?nKj>KJ?*em(g!3;60E0Nz&=XGp}y# z`taSaF1?yVVyv^SCcxQz*FRK^jr}c(wtkY*R!3?AA$xCZO)y{2L2n~$XRqU*(kEbw*9jiCo&=Fsvs37VWc}k$&PnS~a4eGLM&q)(r_???VC3Vh=ce4;_Ed`CY3{u!&4 zO!ia9fhrrdrZ4#wxtXG|)B3E|4l!?rnUE0pBa)3F4M?aZ+=ymLv2goNRA&<&Iu0e@O?t92E+b=LuJZ&goKwY}M4Nv8}C^J2e;De=?)D+~{ zOxUv)m3~;S1ptq0inF*%gii?=v^%4rv)dFJA`jr;Xd_CmtV* znyrOsoHcGMU9EoZRCDLS3O!fwVcA6RXM5#};e1!9 z3xI}`puY}c+U3OdQIh$RhQZ~im1d{#7|{!S#YGj8gDA78M;wsqMYkDsQbL!e@c_RF z@jM}>$G!GYze+zF)jybKq;M!wz)*^--Y)2w8_RQyEpeViu7zEBWuI5*;;17F&K-ye^I zla^{c91WE%$yn9U9~KT12C5OtC+X1%ezDqlw9HO%B-D(Fs{G>L=sE3^Q67>8;?V=Y zU%QrhJsvzsN?(G7M#Hz2o=hFQWGYlWp3#S=4@cdQ0Y@12A}RP1mflkKprqj6{!%-K z_lDXKAG43>;~f=PgR4hUy3Uj=ke)q;h$)}UL9(6-fKVU6x=~#QA-7*yRxCuv#&=@n zhwjgh)gP%I!gvBFpn!5QsEZqJu|AN{!nak$6Y($C)|$reMYeX02XTAxjddm!1dc+a ztF})bzg-VTgzkHdkwLwZ{Z?xZ)fOip`R`nfqEuRO=vzRC9d$>X-#MC4wUeHeo8Y2? zI(0vl4Wx2mxuaCKtg#13P^)igt^qIcmnKgh`79=V1|X$>uQZ^y6wFodZ5VdV&e}Ug zU6yh{8z4_%SU!=)MlIokSRX36!6XAbNZHVz0?$8jRB0XHw5vmD)Uh($O*yoNG5rMu zf841Vuu4LRa3N3q$|R0_V3_Xn3of`tuZq2|ym=VM1&JCe8PgekC|G25sr&Cb z_6{A(@pa13U~yerzog%v8xZnlrT53BX4`9{k%6?DnC3@4my9Q?(YT3yyjP2&$x+Nq z2xPmi&%R>7cn+g}Fx$}SeFDM#d`lIE(dzT_ zpL9B=HgO`W9LY_VR>V(qmdZj6xc3sw`H+tXqHbu0y;STYmqKMX+VBT$w3Z%_%+~ah z0uE->6&~hyk^1y&r+Y``;s1P?h~weqLhqH@hj*rax5^(OFS2$)|DxuFz{*Sci$qeJ z^FD@&bE zd$QZ-UgB9n(OL8eA~Tun1epmKjWmA;W@Y@U#<1LLFnpmd*XExI6h+3jD3SZtM@Gb_ zT2A@XG)7b~MNDX3lRgOA-9f!sF5kFjANkRP%0`9Fl|y z_D!v#@4q<3U(^JxqrEDVPoHGWRCPO5u}EkAB`i z7nDc8u+_}8=bbWskn^*gi)uVTr%19>T>ud zK2GW2m!6N>5HixH>EWqRdDE0>%}Pf{8L6cZCU4-f2@UOhAPN$C@+l~bE-FjwDKBrA zB|+(<_r}evnvXSwZU()Lh_ZXV`PFy`{dz`qC4X4|YSS(-H7NIc{D$1<{OM5>aZlB2 z&@caWQjImy@ZAP?nW6ABPg}X#7U!Lo~Fd+)ug zHgDJnpYOX?s_xSV^1#lW)tW)S8+>)EPfd^!*y)*-rhQ6-@`x0y#tbQ;&=H=Kd zSKIn-t0(916D%fS>hN6Vd!;%SrV`E^&vPVrKS9fb%T{33HN$ButJ5M&qf&T{5Tu@k z?&3=B3c>g7yR6EOOMfK?w5{AL%6v(eZ;8d=m0FwsiWo=QI|Z)BodGdv+_$nL6bf~z z91t2Paz5;AE@1Bnbmv*Zci~mPq zF~w_E)2p=d@=n*Ez*Q!Lld*HJt@(FKG=b`G4=LqGB~*0Cs_aFBY>7Ef0d$G_VF%om zzXlEF@^~^gA73Kt+?MIgdQ%Rcyf}!z8Qz&eT-sD2z}%U(ksJ&f#^qc!!%I>;Lh7sE(5bRq$}WD?x^)=3F?(RVC0k5; zF~xLm6?4V9&s80ke=RnvIf;@S9;0fRxY@J<9%==85R}c?iin!=^`)93G{TUS{w$v^ z$76?UV1@?A5x8qlo1gj)Oh0d6T^BJw3k7SwFE1~TL-TQL0A{~v6OlB)ju_N}%ReCo zIcXv0hFOqG)Tf0%BqD09$J?(~LYVy7_Q6V&-P>rPq^BCGRge6h(tO7E>BZGNayaI& zh_I~~K2fFf3wjlXe!V<~6I((vbLL~J6&dZY$6K-aMuI#Rq`{bRU`#9=OLE#I9L2F3 zyf`s{q@9pL^r3e8C% z5Rn#sq~@G_Lfl-+ei((M)>DgI&rJNPn4b=SUTB!>(RlYrp8=@_ z*FF|Ra7|N5!mFV?K;Spcb&7unMZB>i8;wm0B1tdEM0SZl8+ajHo^#cb+x<0?D6l|7{bVV%2`V$Z(Ww-mF6Km)gN3Tv2y~LdAmAx zYi}ac=6=UsbNYOTjhD-mJtQgQu}wjuMZXNOMGtDyy|oAfajCRZ<-ZhT%P@9ejA0%!a2bISUqc@U3q_86kDWMcN+CA?PB ze?#tS=23HV^j+-dJ|g+Tj(l_8*+Z!tQX?7B<==`OLGH;SL4BXxzZbE85n;TFNc?PM5 z0?L=pa`rEyxvmiP=bzAcUt4chlO}vT1fu-+hQ9TBD>VK9W%=&~&-+&^SUBbDB0Um| zIyjhp$gG*j+?p;W;kGKh^N>uDG7&I0jD?zYUu&c zD}y6;PRMWY)XfSDS4Lk<+g4PY+}`T5p@`fg?W-=`QyQ|<_U3%i)=O0W(_Vn{siTY| z%`)^81@3ND*-8hb4)=<0l96ggI)fny2#eY*{@)eJy;NQFVs!dPzZ$1?F8K?!>~<`rMk$aT)d@qs zcoQR0?15*Bj7cPxxlipmrf2l#Xmif0bRPd-#@_`@WVNqZ^+M~JYpx)M93mkona}$} zQfS7@F#9*q=*(8y!SnoC+R@{n`$m^;xH$%9Sa`pZ|5oE~Y_+KLS=!$F%Hh3|Gie=4 z>}$S-;n;>ImNk(1vijMj^uooE+UXW?N;rX3uasHLABEpsop}{R*YW7R@|)4O5r#Tp zr5>$;B5$(xtGL)c90*rj@3h|T4Bi)<4&KL72bBff<1@4ZS}>`?-`qD?(xQDZ;yO;kDM<)VYKS7SpQw%TIPLa7FWn>p4=l}3|A8=f$=y` z^%ZRjd@Rt|*48zoS@&y zYbmK`-h0WrzrnfeFU`Gc2%gwPlzDaYI%6;o)9VhLgM03%AhqstqRgDrtiGx5bq8~q z$a{?tVI%!Bfn{E^r6*jB5-Lc_h4URtyv3*VwQHmA_R+T(vdHZi0|mJrV>B%e$-Va_ zHn1J@^9E&u5!ObzPihYDcTA>u+ykaDVHwK@yPNh%dLQOE)-pBhCvz^YA#{naNKEuq zP8@x4^1vNNk+?PTvwGfjI+a@p6^ur-6|VH-D&BLhm;NtsV|$7jUOTccqmH*qaqQKX zTwIT0ND9bYnG$e|&?xryJ25|rE1|p#Tpap9`_)Mq*P^)}eIc}^J&XB3J*w)u3`< zd9swRhVb-bDI~+>Ozqh*qq|9{bP;hDCgA~GsyQCyoxotOA)|8}wCD$9Fr?bk; z)da7iCMH>U!^n7z#S)|5G(*{ybyUEyX9{4&1w@VPzZ>L#BbyWl?MhMS2QTc(Sq_m7 zzm>=SyYSI|6OUdFTb9NRO&xn?$!f!DPliOfsZ>s@@6I1*o`e5k+GmoHC;3kL2*v&5LN@R?iWicfl693awQ|PEU^PbGe>+kkUq{Ues9OG8# zgtxxK&lbiX*^Ef&Zdk3(a&i|E06UV$e2bz7pWJNy_wZbgp2mGGe+_#3gNs#LPG0KK zeVZmy!BU*&Fq_2xceE#{dVBMC_k#rQxg*v4v#xB7 z+0D8&{{Mrl_l{=s5C8w$YUxm;Hnoe`5{j5rMQy59?GmH*7PBq2cdXPNr5ZCeTccJG zM6KEsv4SG@{>A5fKj-|u@9#PHKRKM7+{t~v?$>o)&*$^uYWz>VvC*z|H_p{*j<5s~ zGP!C*j|n^@&Aul>u*Y5@|2%W~xpvSCsf}g_-wXv|tk#)QUfs=Pa-Ip%p;>1)>aQJn zkS>OSQ%~cqT9qr0Ou?}i|EmQ^|7n^(ZbZNr9;L5V1Z_FG&JhrNDa{dX!6?xjUHctQ z;KDZ^ife14xxJwi(adib z#NDZlJ%K>GgabSIvq>t%{;6+*{zj?nhp7W1b?e%vzaTMpjiGy)^QJki1oEHB+DMCR zfS*l*;OP!0zCinGDF~Y&lM#9LxCQ$__@LCxgT%yIl9$Hl-ik$V<;>J9&oxXmzV-_G;RV9v9y$kRm_lu;sC$pAi z7uR4$rHXZ~A3HFuA=mS6;lbGxjIYocPqx|L5WJ#9Y@6h)cFTSo?YZ3pm!J)k+~2i5 zsR5R>jUEQ?4`bt;w3rv8v_LO%*IIUy1smvDO(*2`nQ}wFdPoY&zJ1UmItg+SV-gOo zj@g85*K$!3NgHlf?JC>u0)B*C`vQBo8zU;~_7lj07;*)z?5hUu40wuL;by`na<4C= z<#R@ViB53cqdIK#W*fWMuNx0-pcxa-9BpXG)}AWUC-a;tb7LfzVnOCXP1gc`r1sSW z*O5c!V07zC#evl*?e>|9)5f?w|2l_m}e<_YEWDGgiVIa(|#8oQ)$II0a(42_|QM# zq|c(|_@OoX{7?cHlVrF)Htu}S{Vo4Q70~hEtCIL{{<**8f8Pq6F7fMoO=h7F{jh=L4(gtuV!R_%CD4Al9$5S3XvX zPu{7%arTz<*y$X#>MFjdMSyXke7b?zBV?CIMK3VPT>E1!q1FplRyC4$&7ll%l;H#I zMIjLS&yM_Cu-9TzIUEbG=q8Tpn;}XsCCZ`-sM9I+7^XNj=vX8j#tv;d!v3VCz>Ad^UXYmr~> zFJX#fZBrJXjauWG_IqJIgb60wiaP9~Ie%czz$43mLfBgw#wN5x^88l3`bV(jp0k={ z(dRt25#pY+guSuu`{U>Bv{~*ho$cOyQ0^*7zoX#BwuJi4!BY;jae5j!`A%$c%P6p~ zzI^xWDY26*OZB!_{J(}Cu8URSK)cOjwZXLW%{MXwB()A?FI)B%e2BKanSt9#i_TJ7l#;F0vyHm*##t~d-Dk> znK#vLlXraL8`3nb&&NSo=qE~V`7<2(-~l_sZDm6JMDdU#hLmG9OO$zi=HaaCKfCGH zl7U_DQC7fq!0MOziXYzFvUXcEEgP-vSFM+h<(n!aeuc+<5t2Z0KY*zC-~Bw zJuz+aEbKsKY~YQDCU3YY7WL|hUukr3LZUc|`{xF223}ySe?5xuZ!>Ngtpz3D$yPmt zo@(TD!Bn$AYN7$m)``jHDYDF|Z8wQd4l7P$hI6Ifa3fM8^j#g`d=F0o4v%X7)e0{2 zNPrbTlB$tY5mnw(S7bDNK`YZ0Vt!-vKx+@z$E zr}@zPpFO^MdM7Yd7=7;VF_{uG?tTVtXJHN0Ozyp_b#21xuBn;Su*%RqwGSRbtzEfrg)Bwy(HQd4N!`P1gRoYl~c5&@$CVdk)`EFZsB1ucTx9L zd8^(1di>f52l+@%*a!))JU5EA-!1NuYkM%k51(+6jRzvtMt;RM4vMss!uHLu&rL=L z`@SDm&YqgiVJE4q;Xa_P)q+H;zh-K$NYxQ5Ry-H0PT7$U9ym)_fAlyuo&S7EN^((A z)%(*8>|kMLgZLx%5Hh1CFQaW+r0`)ZfoVfDKFN&0c$w|$vD@tBAU2K!N-a$xgL%;! zO%FyQ{N&LY;sx6oW|nLur)e7Y2iZ1c+Q|1n<6pmXVp%8O@y_?1{^CVssdGKd zDpEXLRy3Vb zo9OGoCb;(m79=3PF|wbJ`qHWDzCSrizaZ^N3OlApjZ`Lk&Tr5a<(g>OLf(MmVz6PP zJ@uD=LWjJj3DDbPg}PyKnCo^@dVhDPlFxz4+-@W2tnH&l;(UK^r@~56eNQGwI1s|V zjpsGrUZMTg#2wSOoLA7<>l;Za%vkp2Y^RYDCJr(;@6;ld z(DrTbke;*1D*ttG3U7>NqrTErUm|E51z&%hEP&o<0^6Lvn_sW*vBoryB-m081@dO? zd!rYbgAO+vjru}w+!I@|8aEj)F)Pgu!m!ebZi`iLoC z^?HY|VsWe0gnDO(sdbmhI&|fqcB!~R&fM*Mcgg}4Ieb!~$_s87F-d5Q+S8j>&W0Zd zaLZ}b&7q?B8|#)&1+tsf0tuNAPsu>H6;$4}BlN^h^h&8qN(epXrJuz2B<|YpaGx{Q zwwW;s#B(QL>@BfuVvMmzPw(Fn&?2f7dx+r{Bd#QUvd3r80a9R3A+9m%^nQkCJ4%ZDQI$Zj13jhWtd1&qA)Y6A%V1eVTXSS=Zfb1_G^!Cl=aGV*xq18l_Jn%Se3{ zp^`Y(cTGqJntQ`ll}P2Uv-?yqa#u_8mrK<|qBnHrylSX{=SC~b3X@f0lx=$Enr=R) z^fxr#_e9t95TE$>naqJI+`cXWhz#C&`{0j@cnG1Fbj0jDSpFlgpE1Om#9>@?I2jf$ zV!kpB1HcbIUDIm^;k>I@CyrHajb5fcd9Y2_;0tFO;{k*0Y*1!UZrOUnXnnl# zw0nR$&V5dtEpU_ziuzc#pmB&S01D?$WglzY=%ojblFbBv@HOzLu{P1D8f%m%giuXx zG*S$bqljY1I!1C1Yk;OQ47MYG=GTPxbqxZ0icZHX?dfp6zv#C)Jf7ESIdF86mSKGq4xrPGD$iQ3X_z3F;=9%qZQqn4{$)`JSochfQqqya6-aH zMypa#I|uj)(Ukrv>$2t*Co6n{q3j?EyLLy|ugyrVzvttT>@}yGZf*zpPWoj?jG$bD z#+eY+Oa3_OYqmv*@ zQt@D)_4~S}eK3zpJhyK}F=h3hA%j&-M8(%1^nfQtR~+YsLr(g--N&w`Rtq-h#wfw# zK4DLZFBS;WunA1f*s9Db*g8aerL(t6jb)z)-=M}S3Hf4XSFaE=m4~Wo;OR)N90q(4pOoIl@7Neqdr{IH_(7KpV$y)Gv+N@EMXTzF2j_N^9-zgP7IrH$mJh$U+ z!WzX2+o@bG%oWm^brd(aqz}oVautB`h+Z15q90c>AlY*I1qXO(*A-BLp1fA+1BUe@ z!M5{2)^^j@s5?RJGCCpJhXtHA3l683-#mMo3UevyTRxLQf-}MS;FK2qAAP6`D1?W9 zN~~G2WeKR3)B9emmVbFnxD14GNp+W@uBF?GCxuNat{Z&T?`s;R&)5Cn!X_?hFG=hf z*TGfBQwkMLHWzU74x-4K9@LcJERVeQKg~QBGG%!1uD=5kfRp-$q*) z2tUOU4_->zs@?Dss~7A(OlcKiZMtN)$FH@Gssd^!YLWo}=%oNC zUA>swYr0aE?1Elb1HGbzeAeB~2i9R;Pk%JDE-i~Xz(r6@VWt`TYUwhav!j+-QdxKk zlF7snq=+owbx^pb!60DS7(Ncvu?^y8f$GuqX8Jr&The^L05axcns5=%sGQ2M>#(Bq z4RMZnd^~@n^6{R5XuFD8GS8N&Z0B;oP<|3Oy}QK|M;kiDz>Dm$!26-6Ah&7%{5fQh z;^i0D8wb;Wv1WmEWV{fyEUl>W`4J5u5$RC9Fer z?n4Qs0TA^jbS{nX<0jSzO-)_T;A2*h0iRnip>;dyTP)oE$K94;r9P>3+h$j=MuJtk z4*fNdSZ~|<`vOn8IJc3IVLOPgge>Jzl07gQbJ_WJTus=Qiuo#iXd1rV=Y z|D@rdZ4jOKRJyyGNuNQH(;yoWE;*@&h32}jt;tj_}&Pa zv$>zaSlyOdxE~Y!#^P9mS}S!W+pY*`!&*ew{2)ir66=u!&?P@2eTRIehWL=xV|5YCw5R%NaY*a0LF*FrXqh=( zW1ZjPW9f2X{Wb-a=cpL{(;B}PmoH8>npcVC$f?mLpw`T;-*-)oW52be2T)8w(*7=+ z`mPM#_|(%qY0U45>flcsJHB)|Dqlh*VY2*ImtS&M8FV>Lg+G2uw~592?`Qvzo^B+N zALVnA8{8pdo*Aj&Gt~5K&h3>DwCx3$-Xr!4=_6_v2#v7N>HQ@`nah-s_7XW$Bjq&x zX(h?8OZ17gSM*}E&^8Ttv1_*(xSyz&$T=rD)9>H`gW-XpP1um)n>k%^NJ=s2ZJylj zZxyS=^J7v+V&e-xQp(*TGlWCjc)FA=ZVwc|)&6{d(~Z163HJD z$lP+{jT`+1BHer{ZU7E^@z5g;<_w;HB~sxH!5ewrVti6C&=r+e_Ml9Kn`7i+I?GaovT8=xwq24(ExhV)f+4kw)x*2hH*CFKrEf_Hx*B}#;=kgJkODa* zl0a(TF6`EW9FGY#S)WwZ}?uFSJ`KhXqX^QnS+7Ae+Hjk8D& z*&qo}n&?|V!c;}w=Xf{sH^eIq*(heMpKYT5mKyHCPTxLBsUP45_1PE)iInZ+!GBzy zWoo>XHv#UepjCq3o@+2Alh1cGdwi}q>iO8vV@mcXYdrjW+(*(+QAdkbsWiXJa;&~x zj&ygjrRo10O=?oA*3OljKCBJd5;fr-9(>vN%=WD{sHk!ZW96`S%6ihB91-SW%MZu* z{k)enXl<%X*NAp8o~<|yigh`~L4(o*dqV3pcqM|r{KHyUI3M)D&X+39Yw`hixxZW* z8e+A;__E}PpvjOGTLu`1H%9v9WeN|~Oap|Ub(x*mz*{@Kmg!Dkeh4|MH68u&O9ETTWqPar>6fxON8eaCRG>Fch`Y1qe9gt$}G%t6GR8X!z5C8D*2-h##nT$jRyf6{nHw~NeeJ>dAhO7$QVlEQlW(|AxMLod42v!{R)bTavMrIi1>C*^6x4M=V_hUcG$lo*stXK^N;#=?Iw z2Sjamxb4h?Nm0)tyda+@{fz6eEP`RvGVXoF7?o%*z$?xxI5uPOS!3^w86r2=kH@kD zd4ldk+F@#{B;DnS!+Q%UzXw~FZy!L&l#TgcQCUCqAlmEhIj!~TW{!4lyxAVtS^akwRVupWCvDyTsoqYg$KcP^=HR8%wgG4w7@LoK zaaAywxyAJT>8t5U4c<3jShW}zQuOzoETDw>qHH{QlIKZsFvfQ`6WBv;9ZbvoHjHAM z?;_dD)4q~M)xp*&h3cuBWpncGG^9ccx~zlq(0L5WM5=}pazJ&04c13&SMMYCU1L^= zMtnu%?aFep4U4wA6N?j`+Eo?2<9}ASY3m9O#UL+*AF!h=a@ZUE087|`x}|}|9zWnl zIncGD0iDrhL=`HV?mpc#8s$7L16gd7NjPbedm*=Y2NJ&=a#8W4&RLle`c@z+n63ZY z)?5C^w7q>!msBM?I2msx)}(E}yQet{x~-H9!$$*|=~^S0c9P|EU^+W=D#VtQC!uej z4Qd8y`JrY4cczM&i!v9>=CS9L{JNnOQ*5#&ZwQ}9?TGgU`pj57so#z4FufQ)K;Hev z9An75<&`yCCTMrl+rVz}T{iRPLOLVo@J)?7fcwv+VAP;cAL7@o_iTtO0hjKd26Mgx z9<@`6I6Rt~RDCrwd0s5yevqw25jKbud+-GVyJczFmv#%PzdKxH1Q+4&F8c!JXAX1w z-uv0td$gV5br+AT6vgsWhE>$p!qjnk&f>K7(nJA#I|X+%xhT0}yc{ z!&OL8vA?bXU7H=*Q@>u4Ii>f8r5AJx$_FW$_K#M!+2yp?r)r6^uznBC`Z36^gcCD) z^wujQ9mOHO-VJKtE-zJgHm%@|Ft7psX6ecAeX6*;`Q6xjR6OmS16!MNUOg_b+ORIc(cAP4*nwgkMKfe`@4&#;-Kb?uNM5J!(*!rvVSSl$_+& zP1Z0RFb+mc2J>3ehVK@^>uLvVe6RazO+eD+nL9zCy%MsOm=-umX{MqXQc?1 z)aoReY})q0F2xU$KV|!6zExzopl5Q*9bnLoiZOjR?|xoaeqQGX!FAd#TfQTm(7V_8PNH+Ll*DINqGu&#PnIJ}mkU+^;JCX!;kh43uK z+EnUuJ4&ghX;&1rM-vd^Qj`(_M2%#8Y9Ef?o^USb>f`#nPq(KhU53e~6`PaEO=#&ISc5)AoI zj!m1<30|6SyBz+mu+T0g`x+0~rCv;u@lOkr0?4SNL4vaGkms3W>=5zB^znM2K`<$9I>$dEPVk2&Q9x)^RQg3ulg((9*37eL zaIpJeS4g2!-ClqvOa9RT(Hh!qTin_Jj$6miD zBavP^P2cX3`0Y|_)hw1hsa3-cr%^pOQ&^O}s)OMt7eJh9oL#BaZg|K-VHujD@(8-_ zTzh3|;M!v0J!3(g?r&-NYW|eR^9H`eWwh-zj~Rqeq7CY=NFb^tCpym0&oEH!q8yjIuR+HDs*ziRFExf~VSvv@O4#bIidJlV z(hH)&n-X|-&4;tkI*}QUEZ@_g`c|lvihyH)3Z~qy_$rMLzu`EUu1rU&ksDR){rJzS zsa1R2itxz3pBN#-m^z7^|J4Ejor@#O`Aiv#QXeF2+F7jdNixY7v6flCNq5rR+ZP#>iU znY_2Rzjvy?CATLS^qMxKZny+)Z4U$U0Oo3^%IY$SI@8CN3ZPCHn(y}c^Bw(?#R(bc zcQOfB+0~Imd3?sSXtJ_Q#DJm4O4t#ndZX@(5bDCROF}lwmI0c!aE#A7&4YV;N^j-) z)Yj;43E?1!HCx<}qO4BY!0cGi3LVN}ST;&pq|sotSFDb~?#}k!U9;P4~pZTx%tMk_;d-=(62Jm{HFLBrfuKszZMHrk>z9 z#7(m6W4isU0(jFfO)j!Pv#sG z!M%LO;8MFVv`&7Cx1p@CtyH z)*J&g%6CBquwMQ_)~1RNH%&vm(-xC0Lfan)t%nF2?;2#U9<_x zI=IY8Gn6tm8@}s_4(7HQ{@sh~sqQZ){@x#UB+K7G+?PEVrUv!(#|Lt=2-F!h?SBzw zmgdc>Lz1h48-8~+aO9Nv!6HTnnp4xb*C3)9U!Xw9{9dkvx z)y+Jt`h7AsheUsCndwTvbhGcX7<||4H^(QZZ_bXZxOgf*lL-pb8|R(?Khb>Cp1i8@ z4^~guN>1jzrqAn<#*pBEewOxs^Pcr-o0{~-)X8l3mft26!IcP|f= zXlo=KEc>UqNwyriTS7XR=0wb^9aCZKt_Hxu%|z)?FoTEp=VMabu&*UM(Q1p|sG!^_ zcL0=^%;q^$Dse}|p;Gwf!eCqe>C@;x27`K&?{dBrUIC+EDu$8Ed0?2KvUJdUsfjXe z3fno(;BaE)c=^*p`Kg~zqc@jg6`Q6Q9nZX;9Jo+tXL)DFxMt_!;`dp zucAO~GVTLv9tRGWSz;*!ny)jZj_arF)`PU8BUt06yELD|E(2) zj;+KdC-vMmm}aM&(mz~{4oD5=#aFuiX>HIFT7r4>CA0*TM63wCt$oLuakLyqnxwd8 zAp5qcQl#aiIs5wAXaBt^&BH)N20m&?Ms4;bdn*NsgU3oosGS{AxptQCJ1|Jsnk@q@ z2J*{yi)YY*c6H}i6{eAYfbbP0UR8X|f;PU$N=`M+;^@bCT#&NMOSJf6rzVO(L-EI^ z-W>nA_*=ZUx@JFO>eHoqz`b03oV{)a;0^e;?{{F#hwjCApfPkTa~{3iA33nngL2+e z+>=uaGCdr)SAM?wM>d=;x?ZgK;*&?feAY918AAs;X{)8#eszx)jHCJ9XW%yK=1E>6 zYPx?SqHtq2uCl>~U#YG;N_)<^>y>hhHX2@?F|J6$Bcc*YovNJnYRYN6q)xw73n7Nh|FG6Re;#Dgm{w!uO+K`%ANmisRiR7xJqK+_? zh*;%YmU-O1dD$Fir>g*X!G>$W{hB7b&M|9bjkBuQ{SVq z$gb#3LNTTr-6~t;Wnc`^5+8_K!8;8L#@2X03gfJQV*fYn1y9&l?tJ==>1^?u)OY_g&q-*1q& ze$RZ_jtj%WpOx%suL88@ySxM6l(+}cDf>MJxh*~WkZi~7c&Mbt6u|6Y`sn*Ccf~uS zuD)A(vBf2W+IxQkV#na1)fCIPser{NdKoG}I^`TJy#K2nGC7k9`R$qbq7at{H9%^5jkS{m24(q83Oolg%Xiv+DL$OK7O6FtJ z&%4jw{5f1^4=0AS-J&{3-{?)zo)q7pTABTqOyfs&-yIhBSU`gLL61U8Ak;7|mI)jC z7=joti^z~Eg>B}>ro$u;k`}ZlDabnX&nh%1^yJqo-L<55ro-$%U-@|?@w#VBEMxpm zrqoyr*5!L2F%V>n7Si!NU@!MSZk+Nc+mk-t{V7t09`Wxr@(0@7R9Y7>B8cwge$dFJ z)CDimI^V^P3>nbIzT3v=6rW#iov-D2;Dp+V;p zXXxsv08Vs?;knC!Gz0lgk|D@}bU;6SLTH1i*YI?8GidN;+~lpaX=bc9V#}Upl1&@z zAkX4}#(6d!z;USgq`iLq;tPG$WX*E9NJ10D+`dIsC|fl}UuCy)s)S+b{7Ea^4#z*5 z zV=QoT>T@Qu2UTyACu2?ZdPWXZt7)XOv{F=V<;Drb+CU~@gtdqK&tg=PWgV-oOBPo5 ztc#N+44XYP8VE-FlTNyC3^vMM(wQ^$wX?SL5f&Ct8Zw)}xuqbeh(vnbrNJyhIEcr( z;>Vy5kNb=6o^z>-PxjJ+6DtH@NE-tNTpa*rwr)HyLquWu{MlUwb`zTqZ3Z=vpTCn3NJ-(KufdI{y_M#Ar~*ZgWr-mQ!0_#;m;V3 ziZ|6y27V~nwYp(wDH7skLc7J9L>4ny%ro}SF*$FnIy3i3l6_>@kmRxpNMZhygvIRR zqV%!8&E-9<;ko`XlWwl;6rSfWq{fje?^z8g{MT9Fo5QlK47Mk(?cA>IG2;o_utDen zTJfD|Nw&|qZrg0nI?Zx5mwKdwPMW`!abFoLnAhQc z82dTc9&q53f5emlNKSGubE}eS*VQhOrqys2JPA0LDLK7yMBRnM z1sCfc&Q&+}*&n;y(k4xaZQVIkIMDWNtw-S$1`SH}Ev{%)#}S)3R8{y{V}h z=l;VFBgdNIP{#5pa^Xc0>3=0nBU0+d!|7-hEN4*VmEl(UN^h&Ap6}l2pMg^ikf`h9 ztn59Fv;6gA@oAFNkh+kZx{LLhchXz-{K%xbG#TY^e8^Ns!6n~9U5CszzWw_<7n(6# zRkgoQMeVGd^PFVP$pYbCGS9_+-(Oh2DsfKNfW)V_Qnkup?f6vStQy_a3nGKQlPI{4 zG~wxUmW{D4u>!Gj2aKHb7hL*C*=lx2PgV>1{}QNgqVid9?QpIW)@*PHF1}D&33lLL zHz}6-|3O?4-MhRVU-;f9r&kV)Xjg;>^3CY05Rw|uHKbEujp~?A>pTB?aem0qxC|j7j zkGCCRz{0KCtIdeDb+CPusb#M_QA%n3GxeL(9=iUkK+Lcyb+9h9@ED`VRt!;P9;i^h zFY5ZmotRrPK{ z9}E4QFwm~{9A1t zkdt~;UUvbxu)|sNgIeD;7Q-R|6DC`FhMMZK-#q*DI|RR#K=z82K=i`z^*7|bf1qWY#!kv>Bw(`;hc3k|tDJF0@=wsYRTHZw znjFOb5&|zf(NS&_s}pIYNPc+hX^0B#&FoJX`RXqQCPE!dL2Vr&0c`7<5e9Xiy?DfjTisCa!V`_Ib7ne|RM6arZYrJ=@wN zvi;iTPTHr_Vj4}*r|s&D&fy$803p{!n!LD5z&Go?;~9^&t1&-P3`eRKS+ z0UsU#J_M=!YVlmfV56sk=sd0YK7>ZxAnLr<_q+G|$bF(wSzQ;9n)&y)7wY-y7MI%- z3b%|ZB75f(pO)S`bfzLXCrDwk1ldQ&&b6_bISdQG(q>BgoxKo-aObC@4=rvTs(|-< z;>d!f0ruaisywS6fd@Y5n-({W!zYX!)^C@1=-(ooF@kF1oqUsj|3l+j9Su|VV?!Cv zfxZ9>G9rOo!Y5ROy=Pjfam)#dIQBrP840Fe(&fg3!VOM#1jG5(&0*YES+ z!wv9A5~tJewP*VO{E6_-ZflRe0vCUm|6FOht(N!SgG}|-Q{~6WV}CT#pWRFO&+#i? zJr5PBSpVRF+>?GgV&4O~byaP~85DBF zZZJpIx}|I5kW|99;np^RnQ-jqv5i!Lrp~9zUSr2lNEW^XB*6{B%Cc=kP@S>Ln@9Nc z1G^vdO}fgd|L08quHGFLU8JCk+^G2J(y$oKuWa3}DKT49FZK_0K`=X29Z93hHl|uG z4=Tx7kAIPby9V!N7UusNdo$O%RuF@_VtC?nihUzVoJ1b9rr4oxXjVG{=x*xcfn)&} zeiBGZ_B%V1H8Yu9VKm&=kQ-$(k`2#+r{kpQWoOplUbZWVF}T4YFoSPucil=3-ad?9oL); z!dM~=PYB~1C+ErWTU1beF~_?Y?6WoX^!$(O#UHl~lX-th+}FZzDlN%{y#75O(XNdS z+0AP=n#v$e0w|Z@pDiTmF}BOruZ-Mk-wOE8bwzUL10yF{^t*{*Zh|Gll{EKa(=OtF zbfQ-5sK^m*`5-ZYJF$>I#c*gake%Ew1J7E4%MYe3IlpY1eBhwnDaF zT=QYJ-(8IvTF9bQjkQeiTo(-py*%ihnHBMRhK_-NPV0@2`_LONr*i@j{lT492eRwB z!@P}6WPk&VjLx5wJ$#=qYwA&9f}H>7-@D#KFaj?%H#l;rfb>xw9D)ut^NE>gQ{U;5rXVoo3~Ez zMu0oC=)(u(O4F^AM3tI1b$N|tZ5h1aU>(daMG2l_cv4Ip z<@ez(0@Jk}0EMA8>&QGbatM>1lbpxE2>|~j8w|%ud<#M?EKIyTw?O7gzhNQUn?AVP z&}a4!SueB;OB>v6`)$|sW--4YmVhPWi5Lv}=h<;hNLlb9*gNRM=^~Lmg;n$m__4}h z?|%MC9gE>K5@`B%*8GC!cF`pV0?n6$9iP9)LxxTo8=jdj;g z2-#+GO&43PtYvF@VSu;y6nF8FtIPz?+fJFCtmA8`Y-u(j681TQ5}#@A^iMrm?&)Yr z_%-0F5UIr8OgJUc|Iuo8446DE)_65_?FCDSPCo*CP9QKkP^{5(U#1q~SqXU~D$DW7 zJgn3MDzZ4;C50#qV`A&I7qsw^TIpGr#d+5P!4AgM2j0&AeRciv>kBn1Luj6#XdZ#% zrA^OrHqrf0|J*GZL%7-Jc7H!t1ALjOize{%);r7y{*WOzHrGXDvXC6Qr0EhCg4af+ zdN2F!gt9iJUszm>S;Wb79VMqX*~m0J(mp|6d?>g)UzHCL^AidGs=n#GwKGF7Try$^ ze!qqDy+PKvJ1N250E}<*hFPK2i@DS!4ZsmH;<@(C)}8hTDu=im0TJr>!@NY%7k}e^ zdhq?M>EVL2rR#B~1oHlmiEUSQ)!LF%$jWZ8i-3#RFOio;a}`o{UC`DybnUFE$orT1 zA{V6B2~jFnheqT!8q&vot>=BZv{!BN$0SR2_YXSlcgG2|k|l-A);;M~QT$N+&WIM) z?2?`syM8SV29S_G#J-q*6d^S%*Hj|dLxj27&%GQ0lH)HH>0157Y=Qm+ipu$beIgqS zzvX$b=IJgfkZ5&q^qxeWvsU+)k)D$miCvG)bK;@hNmP%1+EQ`}G z7K}7+`T=7&OhOad&ZRu>iRiQA$8@MC5E}~J;Dgdl+!4Wvi~D*vCIYAwEHQo9miVE> zf2Ga6?G9b+wy3SuueB#3xE!E{G4CEOgEE$*(%kK{99d}!59%RarIZ%6il<44^UDid zq{^iy==>96QMWzbQxZk)xcZM|DjT42DlAp6dHh6Pe&PkUF={(UWbFkf#!Dr~Piy87 z7X1W>Wg=DXkE6fn$oH(^5Q3Ew_@@-_sJJ*PzBrkrD0`t@*ZZ#NCB0acm(N{>N8!64 z+Y~Oxf^gc|-{e7E$4MqCJ#2+k3~K|-B(6MjS*id3UB<8cmzKF%3<}T!nO7MAB?Gha z*Lq>R@2FoXlibgZc;qlP>1!}seyO)#UZf|)YrI(GrH3j@*2@C)rueD}Dc%fKHl0sr zZUH=2N_?~)@oF`He^($c5{flGr&fpL@4xB+*c-#?=Gf z%YI(9DYfzLTTWJkU!U^bme@@VR#LM+o)Bo2F8i034VDyn05v@$(+k-%o0tcma&DDx z;x5z;2r}%IRWkcqnH6gt8;Y*fSR4voJScSO$!&9I{sPGvRUb`r zni{lzqKfc6e;M&e=>uI3rOn*^6Kd#ivUYSHE9xHqcI>T2WnjeJH{g|Jc5^Gws=Pp* zbI)f*^Vj<~1eUnkq-`ur zJHW!Z)H+ZdA!uHYnjs6IdpJ$o{0Z)vF};eP%`uZ>EON`%oDr|3HOkeJV!6A7=#OQ) zEcx0uXutxser%bQ|F^GI?0i5c?YkX=KYJMt`+u^_*MAz55w0E;R1(M~RFIznoJWPfe4 zUSVc7fx^P*n35my9&&;R$)NadJ`yXf5sJA097T6e!g-G&nN7bq$@YDO9F+k*bVqCP z)jz)nmIY)zoUZp-$iM=yK#?MmM>YYWNYwy;s&KKYc6T1{Qo&`mS10Ld4a>45I$H9E z<|wwTbCLVags=npX5Qp^CxzaJ0@6t(EhhghX};eUf2#b#s#pXgEy|Ir>)()mw#DqS zqH7B{HOQhOQ5ydyz@=f7YvN4DZK#QU@(KNOB=p{eCOg*WpT>=UYbmy9j;`N-$Ps%Z zTQ|XU@AJc?{bkqyBPmvBBkI6)!boP=uAae9qF&xe5Mz7?@66hgx<7z0{OG0z)YE4@=9X2SC;3IMA*ue`fBJ2~g^REjU~{F_LA3G4T8!<-avX-#n? z_l5DFk-(K3m=r7VatD@Cppseh-jg0dCQ{p`yQ9)w*)pK19S|Er&pPZ!ZjNj9*C6NG z;4a>aN#tqZJ4-nFH9Z7DQfL`VFKHiu-{#4AGF=+eqW9nLW$&(2AAQo^Kurpl%Df$&DS-0f7x`82AVVrM`c=wK*&}V53Fv+B7k(3IrzOjMx1Ky!mlK1? z5@J#mF$<+Z&8HwjW|4Kmyks!fSxr)=KHw`By7rBfqMTjheQHDH`40AYqk5YVEnIqm*_cOmj z$%(EHaj}!bq?&QN2#W|*f&{4*$4}@hu>fCl$#lSFdhA^2b+tS?={xQwIa)CkgxRrC zaZ8kFZ1~e~cJNuPR8Qan+Ly2q>|58)qrurMN}@Rbe`7f&NiE@m|EGM&Cs$|uUoF7@ zDJYCS{VKLo#+JR`+!`#WI85@KPe5jc-Y6#(mDCybT+80}C=B(y0f=;=*{P@sUW{(- z*Uv`UwYGSLeR(3alX#OuBCsDtsiZdt6JEF=XxR9|@3Jx6ZCK)u@dWyj>Z}#Siv9+S zjE35z-p_cb2*l30e#)lo@}YKL)lqhEJE9Xh2gIU3^l6Qxvqsm;H1KvYY142@0LLCVnzIZkZxi2MIb*h#nPSh3$FQA4J=uVgw&;2r*5E3aVMYdHaR)+MTI4gL^ zrw3B8hz)vsc8d_O*xSLe9hWtbFMwgNI%ZQrCp&7SN}D{d^DwfjVDU~B2z^1y8%sHY z0QQnwlN8=ky!}aL+VxymlNdl8=``CmA16dA=(5i?zi1bmm?q|Aj22HT?@@>~`Ty8^ z>!>KZwr^M(lm=mF2?3=+0i~5t8c{&0fdMgyLAskEh7u_$6%dsM327J@8Wf}?hoQTN zp6?v5_x_$+yx#x6Z>?vo`C|swdG5WBz4sBnqpZSN=Q?u zxz(l1DF$xKNi=;6R(iMQNMbxSZDHP1*ZwqR6~X!t!kolA^NQ+*S08|@%JnDt=k2M& z#8CQx8B_J5Q&;K!dtHyIo1wm5eV5}X)0{VFHO!Cte-LHdxi{*>KPMg{08^=UjVX`%TGT{CD0){!W8 zTMy}^-B>EU;1fd!A!M(p1}X^@fo`FmU!Gc^T!p`O=psXRj{yc73TKVAZ*pMKezK*b z>yVr@ad_m4QEQYO@%BDoKllhr1O?l%x_@%>xGEyw)_j~g5&WLKB2bjx)EyNPBqTR! z@vJ0$0jIV;gTFhlZw18#ad(iWcmp*uWQV>9;uSb8|H6~)qu{k?^ zfDt79X~6a+wG;tG5Se!Uj&A>4yc;1zTYgHNtwrLFS6rwopEfcIXI2}BznCkAQ!MvO z@*#5#8;%CiHEMz5_`c5i3_5Fvyx<}YrflY1(yc4XJhYN{FIr0(5Vmi> z2XQj%gXA#<{%U&Nym^B-8$)23-^XcNq``}>u&8~kBg5n)nl z_6NnUGZE6JoJ&4tJpBl@^bQ!5{<)3Wf#!H84^_YQVp#L%wEn*GtnGa7<%di&LY(j; z+Gwtrg6i%>SoTewUM|S;!}?i1V`fqBUYWI_IPhd&pY0X=QX;S9Dr4fbQ?6L40)8H<99TG_S$}ZBEUk$w^wNL?KAJI zfCM+WI4SY)5K-AX?eD64gxFx#MI(3qum}{%R^9MZnYs79mbK1-c>nyI4&yFf!b?DC)|KJ9?Phyr0-1g^1$Ds%c$hb|q%McWBysh&0*8jT;5=t}j z6Vyb#)#Kpnm@cZ2F++C@D&*hQl7% z7~t$dIJU7#`644xU-Al>>v#(R_urO8XgJP;rFOM;>0>IfLO;FDUyi5W??ps5K7c4k zc+IESPy+qPdlxC1?m;J9hNIZYaWx`CIj{$92pqQOn1|GkqJc3^CVu=^r6jSj6G>`w zcYKDS5`?QZoHt2!6Ql!WUKW>7dV zdlOezbo{#I7%6v0frHP=R%Mys_B|cxrLH!dqwHkWMq$irvXyNe3fqe9j@Oa**pTUL z96*yO95huCg^+}`DZSnH85^5)?XKAoOG~%V2rm=PM)4UN%ytbipd389jH4~&Dl$of zl5Wg)*wi!T7I!uyvSDr&bBX_r`~LpU8ck>*sVaC~79GfuK})|Q`{t-iq`~{3KdJr( zGZ%=+yYHP+$H!O+-h)&n?#`oH=h`-Y#ZjP^e}g%xj6z3 zK3I2asF9L$6uWlXYjQ?}By*lhJgs zHUQI*S};ADjZ{JbK2Gej18OYJizlYN@H{M23E@WN(SBDoi-en;ciS1bY`#?k>FYN_ z`=ZiK}<5)9AMUGiA{3-tmNbr^R*!cDU=w(+zkiN^Q@Z(~N=YsJkR z5JGD+_c003C3kjFuG#nb$C$b}y%0 zzDa8t-TGBXtAr&u%G&5F#~n*6*B)5RaYcqO~LUGqn?GiMuLC`I^n&0Z{c_YJ6s>8 z)yQ%W^v83lMDQaNsKS?A(ssUZZiNSl1=3jT?^BGimL_mb(!cRBR{xprY@XJ_ z^a7iOPios1zST8b#8liI>5pBJv6-^a1mZQqrU$2oC`nXq!(R^vyb|TwR0R_z`_u|( z_I{lHF?~UO66AZ*C)0x2o_7ch0?ISmqYV;NtYeF2A2U4Uh3%We=&v(qAP#ztEP@;H3_)haCkh6`x4E zo;At@sfA5}M6+ACxnSVlL~G{ZujBFys=rhx5+%sv^6K<=kf5U z%qQTr_7cF{r{wI>n^Hk{?8l+e!E2;&W?4ayID;G<)SCw$nGSDSoEE*0r0kU8#&;k= z!dNeKyi{UmVg!-RXf;t=XtXQ<8@E-n1bGQ7z1Mb3PP)C|NAg5GP*ieryFG=GoRPAS zJ{My*OwIdz>>^hKmG5Sd8UY~!zS-HL$j!zIa!%6-2s&W2GrqO0{Pn8vU;IdVoYZy< zghv>IrwRiCfNT!h)#SymZx;?bs}js*E)d?ugIu^ezG1ubE`KbeF}Y-Qh?M=}E%Sg< z?It&~kguggfpG{S`Zw;VxvpC@az-7D0MfVm2&Aq1wuYq*@tlwo5P? zo`qYY?P*@?-_VkmiHR1}gQKciL~3EE7Ao#`Tpiy!!yI1U42F^Wkhet$t;Hu9|3d53 z#`UQ&cLvU4AAfO&xr`tFfqnYm>Vzv&%DTnr=th~q2U;on2!2k@UYoFz#szwh2+!V> zSavFy3FGx1TaV4urT|V0&mn@W(7v25P*a{F=A=Q9A9+r(jIm_e!i*7I+ z`k>aPEb#CxKHHpE1|#CB#Rum;ji+X511pjX>6yj+^({Gq9q7_x{UF4b4NY|BE91nW z(gV7UudJ}F#&XT`w-b=g#XmuM%K!3r+`mM~Sj$DYUz+@1{tZ`*qUj>tJN}!lz+ZfD zaF4N?Vptia_d4`#P6JszxY2GTP6@xXqh=ghfgm9>5SNqYO^HLHwk4A0MpP-WezbzNKt8KPkbDkE^Y}%>=owF|J zT+O5yt5@n6rA_^`6b!xL*vEZYrOOoGn78<4AF^z&@^4zOHW3zLk;AYJZ0ZzCXsZ3u z2EFSVv-Vl56HFrGwAKRCWA92B|NMsr_$IK&`N+@j&!61s2D%ZWzSA@8VG(Sl;V=pt z-mb@&CY^Sc*T<^uGfo$Z`m`QV)c&TC3x_jHo_`#CiO{yESOrqHFfuk}A-xjf=ODda z=r(qzo8k$+8YOUaqSLDF@1HvzuJ@*q0!5(u;~K1O)zWfaV%yge7xbGQj+<#`D}C&) znckh-n-qHZYSg$Fyz8{rJO2XJ=@|vj4(QzRWLeI==-Y?0D7cOMOX)ei7^c3&ML@4E z{z32QZ{7OWJx!#mS{E>9_ubs^^^=vbl<9MHtM7t-EMRe~9dI?@SN)DUeG*63^>x^K-G`iD@qKbd#!~xCgR0K_xUqG=6wH_Z zd5ytqg!Z*3+o&4sj9X}GVV!GcuFuItFH`SHRD%>NP}g*Ar;5dbjI|p#bn?qwk8_+v zdYVx9s1N(RY8k;X?r=C#?uCIaqcfz__JM7VzI}FZnyAe!91s)^+-4GeyBi|s4k^jy zfR_!MhbR~p(=fLGKEe1}_xgY~N3VD9PG~&){$@e#Q1MmhJzQjVY<|Vl>T|RAqZ@HT zMm)tDYFu=4g4Y0lg$G~>x1UQD{6RP%m^`#m zXL5TU)o+L$CU`w%s>UHVz8c6!m3!J>L|GFpx9>muK0LAU4EOk1_E^=q<3jluU&_>} z2Rix^>s>Wtx&aD}%9EpNaoSC>p|Fw15Fx@FHm3>VyaxmWPE`SxbsAbha}Kj$r6jaJ z7?OfTns1e&j*5Kt{4X!G9Ls^F(T5_e(cfBysEpX(LdjM&aJ*FGZB*W$B$(dhDF$$y zIj<=>ll_GvCi~juPJ#!jV>h+EItM~i<>rS)p zL(`ikM}>y2JO7CVU@T%P^zNI=p9_uhQ1npSd_67nBbSi!5ik$dFE@w1&#yxiABcQ> ziD>oPHYYZgrfe^JISic%^0h$AhBH#CWqQox0nLPk0@A4g_RF_>WdA4oZH&_Zqjfc4 z#I%He}KP&6ZA($QaR^df=Fx3NVR7zbYC$J?J~#yLVa8* zl(~{4w;W6tI^a9Ug!mleH&eXwX@Z1@O6x0-y#Ww_>AkP{A08rLQN}z_v~?0iQteR! zVvyr-jG)2=Ju)`oE4>raaEsNi(y1c(m{=s>R0nsE`l_y-lbfvX2@6k8Y@{meYrPMa zsQjQ{Qd`>z>BI4zP>GDaaSP1nT=rzy8-ujTcYzl~sQgKPK;o+5djTyZQG9-oqP8IZqc@EKyZ|)<3Ijf#TL)B``e5`bBURGL zup#-d_cofub_MAOFhS%Hj-|LQ)UeWY8@C4~;W&cB#0{Hs+X>?gcqzZvL6OyxNv=?{ z*hccvnI(fJS9Vzp!PKyykNOm^EidZv?2DQ#j)l9^@cWsO8#%!WUyHN@XHe)N}SNWEhLXc$Mcuguw4K280Tu>5Xw93Y){; zCC`{5H{JCYjWDy2?{7*q8jzV(I);o@*6$UdaDmv4s!lIUuP3S%>nUdr!vULFkH|M3yN;)&c1q0nL7UgN9VY=6Db|c4izkuNqArQF8a!1Wu zhqH(_q9LQx(LP^ScK}V1ss%D0ShZ!hT1wz>VPg+b$@wYg0WI`Pcbx@d>hik0D0eFKi}B>}*mA2Pj0&~9YQN_JE{ z(gA1)L=G6Hr=d8D57$`6>4KAoJ6{j!ZitAt#jL%ye@(-0gQhV~eL9;&!Ag3o9>XH+ zg;)s%B=CF_1?!6U{`gmv*jYs-xgmB923)<<+8>JjxrF<*c#omtNrX67JP@t)yyqGrtcd}4W^K!2|VMFBrrtVA!%Z$BS&DgV8oc;mm z)zAal=>puYINZ3W8=*5%$-e4Rt~4u1puw9l+( zDc!0N(wsoZZC?naR{Cf$t8L?CzolTvEk)3?ZL0aut{<_MsMkU_Z0teDOZOh=5}J`^ z*y1ey#x1unJKR_rNCL)e&&YVhn{B6W&P;a9u93!dFqGkB-;jFamlGU>?3jm#IK)M> zY{?QL$tFF0clVB*(HcmCQ;(w)>(d&s?qg&qoQf$@{G&BFo&9Zlk6{Td4c}4lwJA)`+r`rBM=RCl8tMV4|(KOUw`_{NnOKMpAqZF;#4gxF);CxabF z4mMB)pvf|HWuJt$jS{4wxxWRcwt}??qrdGHz{;?r4WPoK?I)w0=msfn;< zc77&Ogq?yGm+{lq5f&bHT9bLUn+wC`&7fz$&vsjdjI9!|Z~8m3z&ZwCKx48WJwp)@ z7%k^BAUVOcYEPAbVZ8!q@U;oFLwgQ~*@T8iosb?E!{ltMaLFHq(T~$<)`3n&i<^xk z^3d+08x26HZIplwkc(!B464@rP9le^T>1zg(DI|h+uFnosS&>W31GSPdpf(|NDikS>B!uLs;9Iy8 zBQJ;=U)Z?5fxB&vY4N<=QFc+=H+{TenI*@#M7&9{fgwg>Hh9TQxaGLy)9vU+CYA-s zbicDhL>BwrCr5Hj$_-!%#MDkC`B4LV+0tKsJ$3>DZHwjb`LHwJ5aAfVY3Qi=Su1o- zW>S7cy`fYJZAq#D=5Rx>W^9@{>o|FnERrO2YNm1q66iFSU>F@rN_Q>v z0-flVMBrvH7)p(7iTTlFrDGN%Ms|t=r@R;Maxn8fYJR(zVw(~ymi!w}YEi$X*_h^s zl5>1(`<68#6)#ZC+SJB^b^g`Z3=Ym{l;;N9h6R{Rv5SyIxEo;ij*+yg7fGaI6bS)>)Ij#$td7}79m+fgZQquc z-Zyx~k2Lg|aNryvg!=Kutu6F#r3ZWQq65L#BdTr+B$}U%_d3&2jAT$XcIr@sE6RV3OY)+U2_MLKzB^YUmSz=_`x?hD~v z6l*oj?4|3A*$SS?pBma=ArY?KY~GSFbCkUZYL5~_5*W*gpLNgof~>o@Z zL$Y%h+k(CyTy9Nu3@{9p1sTs=ZG<{_i-j^})dL-$VxI3XY>r8<$oTC9g2SkzEz?0I_I+%{);8c@?UH8i~)F!R;zH22% z@7aXkO_Rej3}w>kXdaBEsMc~VrEb40lf51z;^$U18lQPPZU3t|v+Eix2#eWF!=jTY z)g0hdl}Bq+C2hWIbGCsioW%@~;P6MhoCad~vB|rSN2kv^YB=e{=;#5*Aw6#pFE729 zfKn~x%+Zou;ahf~frKVC6RYMk%_ksn&A@zQvhAF_Gacw~boEHvLt;z9k$xSQi?!He z(fmc$AY#@y!;(IZG5&h|$6UF!=UHkbNk;M4>F&&Re!IN#dGaHW=!^ri;EG3{>R&H= z)` zo>!@mC?VQi)7$-qC~mY8}{oW5RWkcc=;<*kx33YrmA2|K;+&=~Cu07(7 z_01P=B^q>yuN%+xjqOk>`>g}13F1M*x0iNUj4wh z#$=xE+O{g|{CDFTZ88;DCMy0Nc}$`7s}b?58KpuBzWiIhwGb29=+Zv$j9;kZBpo{> zs-zE;RCfJM)DMLPrVh0V+U;kXlv!Q7L)05j#~<0t+CttG)*7)UGjrGWwOg!edU)LK zG^Wf>G+gSqRI&9D{0tnnWt92}b-;(2Ee6YmRNUEZh7?Ju=Km<+NP`)k|n;MLg5 zrH&brOwbLr->T*;?K?u2pjQ;-zM1`Y-P>+Qhy44vwqD3G?(M~e+y#y9*Kn~Xpw1d0 z;$G#q(JzsS0t^p_iR%Ch7&q@_tkf6WYe3Q3r{wgzY4XCq&v4ZftrgmYaLvB zgQ_f{Vy8lGmKHfJEzQdpbqEB6-}us{=O^ke`y}l!2I_(0)sT_0GjG$!56siFue%up z-B?p9A0Aw$Mv%G!I*jgO$ZMbYcyiMSsyJ`XWB)y(GJu;^HdD}gt{?>0a?HXQ0 zK`MKi)AR}Pf`D{oyAec2mEJ*JCgc~xMPu=8-JjP^Z#{gKC=3bN2thY3m`=LFhdn?8 zc0Qs*RVoNAI%IOTHLIl+_+cMH)FL%-jc(>ETM*4%(1JjC49fJ^E%(_N!6aRn z!CUa0AX&V4JWqVxQox%XI2TDJ=?%Bvhu4Zu^drd0)=pGX+Gy0{B7BH^=8YRpnd$WH zRT6(HrhD9dP_YQLgoKpwY}dJY&$FSaiinBvuq->a!_#a{idRf1J=54$;A$1>?jUlw zT63g1>o=xgJf1O1H0p}T)(FHloN?+Q?MKJ?Cl4Hr`Jr;3x5RX66>OEn3elgtM@Xeo z-OwJjf`aPO+;=9OqFzw0zj1i}F?uF$(dTe6;JcdZnB5X!BKu}EuIo$owv6eH==jcN zwHZsQ7Rm`)GYAeM9;Ex8GR-+)4h9O`SD^t_znQ zcS!B)ezFUhzG;zGN)h;;%Xk}96NLw7Kz{UCpcb05IPB(xEdagYia|-Tj4>Cww~d8%oozQzNSS)|cy8G)x*7V- zA^gvSBp;`aC(({HzTDAo?rN-B3etCL*ZuNfb@2 z*ah7gt$ocf5T9m*ruxhh*rnaqknX0JPCAptO#Di3+RhdB_|l#X+kxUcZ^mwEKC4|( zcFc9s=u&>R-{C=L@>I*U^Z_r`xMkf+u)`sv-~S1%yPN5cfZ0)Ge`U!{qi9mJFm9E| z*n&5C&{S}bY%jd0mmt*5V7!Ku&;5=)D#9KeuxI%ffY_(RSVz7*8%O0dipGkmNt@Ba z@yWTix=EiyXwmm797H!|u+0Z8jhynvy0vYhO-@bU?u)UuO9gewX4RG+P8z5YUw}9k z{%|!8eRa^y&6aVo|CN2PT^#(ty_4#0=kBsDF|!k%s-K5cG_!+`eNCh+09|-wmE65O ze*wt*d})8BTeb*!*BswC5C_POs1Zu;X6t7{o1p!7*(FVm-WpOE`WytkoT_#l2z5N_ zA3g!l+T%%?w8Q2p*61neuve23lW(^^N(l=cXtAg+abTPLn2V%LpN<@%#$1#%+~bRyrFqJzut(ZBe*R)3J<~4s=S12-9+{2MnI}OoRU|NSA^Hm z;9)J|f(7lYX*@UG{dk>t4v&&$NZ?{+e5cm5CV7GG+&j&9eaC}n&eka)2}i#z{9&yu zt-)Eg-2;Q9{-8VSsW{A-JI%lTEtlr~VT??C;{jOE(*3)`7}vYLijZda*t>~L+^m8f zRp}D&-3=tZDRU$eX+}EMVvP`MfjI`qg+ei(w z!)=ScZlUnVZTHjR`r9UF)mX{2vu>M$8jzNQ0`*9_n8)LdCEnxr)KR5>dL?kEh**Fe zi|VexTEgh{;l77jOBuD3Bmy0NJ<@dJ`p@W`P^AHX;-(3!DX2F~_#CW>E zcfk!tw|?jbyYC#VAF9~H3{0@~?ty$iRB%swRx ziL!(HeUsgO1<C9uM1S)NQp$Ss^q*^qtKdUP?~za^}> z)_%F1G|c~x&p1OsiB+?w`GMciPUJ$=?%NQ9w`ZF&1{j@;>tF5j8iq;l!N0315h^SG z@nH}Puu`jWk;f3Q+;%R0$4}p?Za3I)>?B}ZQ~2(vp!X^6F}}YZQ*I2UT&>iO;ft&N zr6+nrT~2>sS>ag6V3w)m;l)VY9IMTi3;viOFyC$_yz!f!8Q5=oXXwa`R}x}2YgT15 zzxXn~&TpLPN#;E?y>;b^7#B(GVDR}z>1hL$S1zxdtZa;JmT(jOShL2Sm>cb_%MtxB zbP>O+Xc;U|#&re%+$WwEZ1~myn=%PKRcDys~%%&E}FoQ1n0&Beo9=S zZgBo#Ds>hUl_o78RQAg28N$$SnAvZ^&1vk@lhn(2k5#)brfSpT(NO>QC!qB{7`(wU zw1;jed1&r%hR1)sG{Nu4A>XoV=wv0;)0qt~oaRXJ+^*w@8m8#^ti9Ur$ZZI--1T&6 z7v7t`5(LqBE9=|hS245v_M5%>-V`zLbS0inZp5FbCalqtms-JXsPJssOY-PPN^P_5 zX=9LTD20;-S;7equo((Pk)Bu2(=|j1Y}8Rh=(!rPWH3BdEXmO90 z{QYPAlLbcbH&=>6C6)=Ug8XNY!xvpu2}E|4>n*(M%ka54I7%6*d`<-Ap5+9D(Sf& ze15aHzyE|Qu6_6{&;0L=KD;yCX|2()K+j}W2qrWVC-P)ew zb)Tj3StpN^hxNnCzs{JVE17#**zP5)l*o+AxODMupWln2;iQSJFBM~4P>n9qhi{gb zUm)(>QTgM-{&RorRj;hCGa=R);*zZ0+au0U8wK;3KEvZCS43)(d$beYyqPV3L&kxgRdF8v-_s*uK zK(=KgS^G7=y(Gy*P5M>P#cya8h}lJt3(GZs@Ax`daf*)fSL4!x9$LGC#AkgcniWTR zH3As6x7Lv^nSQ_C)*r&kWQ}us5&;%E`g*|QJT0%_$J3JD35ldb-yyPWz4?P{a3J07 zXCij1;p-PK*E!P$hF36vGP8MkCFiC*D~AUkl-OU6L_G7cb-uy<@N1=w;I-xrro4!U zI(@Y!MIYWi$vceqb5Pma+vz{^mU=SF#!oCB82q1D0Abt6N)`jN`C)frZT29`a0kM@5SmhZQi=219W7HZfQvgn@vO@vIISoIvC6wP0Y z&&K^e27*c!HR2Q!%qzHR)hleC6+aiccCF;~!+y&;Q^}#xCHxTM2ZU18<3NY|4;%X- z5flVTYteKYqkY#a1*^MsA3U&fxg5mc)LZh}(#v-2qQLdH#`o`7wtP5Fe%^R)>_f#1 zc$QW??1J13H7YF+hY8;Enm)8u=`wiITD@mrX689@Z3)Hcg-Y5OtvQZ<^2o1JNQdHA z=Wc9)`u<}(Pv)z@~qPF&y((JXE%M*}vuJ$VGa2SUJLhoV9dgaIJT3dcM4zOW?Y&Yl%&_YMO;` zL`#^7t^v!rQGlPfxI|C+jtE+jb47`RcS zvFfe`4eHVZk7wPdB=>}Hx3STic3QsgG~-wv<2R2tPw?LdDBy%QmO!Za6_@Jfjn!tb zY)gdhKV&rWCal6rP>FJU`tJ)pD--aoFF%e>3_k`QETTB~Hg1DMdQS%@i{?Ww;9l>s z*h67Hc>RCGLx}1XJ~3`+XZwkM2Os|2Rh5d5)q=`ZBA9ot7>VhI#9kMlwah;KNtl5i z`M8}tn3Q1j8JoUErZYD8K6tN1Uvjk}>;27x;~w8tT7`-a*(0@|HL#355;=iztuDt(-YWG>HC_oz3!|yLuaw(| zhxcHeX4F^5seGa=Tio`{&nKsk(lz>HR~ z+CRAt`if@HUVn9cz4@-{?8uyXbWi!*(Dd_DYT;0mPtvRA@Kg5oUAWCdCUtFLokw1E zZtkZsMW4#c&&qfWEVItmZV$=LEO^SSyJc)UUA6CNBDwo0qLGU`cHc{bE3VjG*1p54 zUr0*aEzwfv{u2X(r#U$}43Vv}7Z$pC(GRcBMF#E)^+o;4v5QX6f0LACtfCSEXabsf zRA0NKRn^p@rkJQ87OX!n4KH-|KnRlEE@ye#^X-kbao=v2lRWiMpquA29+C;$qt^^y<=Jsdg@#^ zpJuVcW!8_AZ5b08#4@=Dd`}-pI75W?V0B$SI{OFv))l_bqta_`KO@^f4<)$lm&?6e zE6=j46jCkbd5hY%L5A_Dc7sNnrQZ)VSQ)X~+I=D&qBOcO{ssIVnwz^YR`&I_kpTRF zu?)h)?rZ+|(Thye$1K_#;e0`JEfc~|#uvCqmW*Z8;_XMl70oed?DLv2tjM~HX5!?Y zHlrxJu^EJ=PVUHM^0d38bi~A*oiH}fo-^Po@tv>;oV@N%RQ&28?|o3rChPuP*tFW} z?%lf<0}WOkv}50#awnYnQTD9NtF~xE8L|-4mB57O9m+9SaQ1ImPQIGrL0ttsVSS^~hBqJl^ zdq|E((yt6Tuhp~T4XQnE>F<+eeey4pM9k|8Q=_7y_JOLgL>WKx{?USC&#}Ard;+BgHm9;Q;$C;LJsBj=*Gf||)FQwIYQ+fdcfy%p9_SZu_ z&3`NW;3GonA5&f%rVW_PONr0Nk4wVZYvp~{yT_a5u&bjCjMox1;K_tyLuA|;c(&~r zVN$xAXa0MqiNY+KB=1Lse>Rl9?|02FEYmL_@VKUG<<%WO$kzpk+ukh6V(IHUD%VrJ z#wFTIVF`$bAw9spAcWa>kCW&*{mVk@0(r6GgEi%Mzg?mUBWrPW$1caFFSC^k+)Y_L zj5@QncSaEyQd#PNQH>>Z8oH#XScK!*i>>`=XNoZ;x3w#YD%ST4>>QnVOr(CDI)u~c zo8GJw!RLZX;M>-g1OruX7@Oyry72O;-=?M_p0d33Pcru%^#ww?Lbaq>mhQp9C9p`9 z*^5dnamFNAzoXqHuu9{+cUv^ua7u?Z{blM4)VF{tzTu7->g8tjnS(7fYKg&;=#qxy zss3d`dSwd2U^R9R9wX-~>}j$d;_#gWL$eZKcYgw=P>}BSa$eD|&IExqr_5uMMZQyC zAONd5@5`6Y%(MayH}pGpL0;*MBXiHC9O%hpotIr#qL9VOrXm=qxhxNv0s`vVYPyoM zh95${AO9ntCAhy&P1yiNcGasY6%MBF+W&BKNG=NvB}T~h|NKdxkD`v#$&f|u3|Q1) zCQXH%+X9Vf9yf{kZFN>rL?8OdpbOgts$mj+Jn>bMym!*+m8s@0%&WHSwEH-Gkh#+K zKx9w3O>_7Z`t*kV#-h^HRGORH_OOC&UsZZd*I{1UuT{(8*b<#1<)GUtRJI&f65DGSpv~YpD3^3tnyD=1CiP@IQnJY zh9ch8C1You_f4-UP?hj_&<*#Fv7DZy$?Yva^*zclSO~kY_;79GmZ>@A;IPHbXhw|lAd#9baQgK#7N0W}rrid*;gcfMAkq&iIUF%7 zDwzV&-29wCJCJK(5G9V!StQo|eyB^MXaoA6nYTVlvu6EfSY=oJft2@=lHzw&07qO~ z%FU!qq!E10FW9T9sv4*p5Q!goOAy3g1-`;CJ>!2BFH$h$1Wg=pwIx!d9+ZE5Bn_fh z>~riY6;~%y<$c9gQ!q|iOfUPL11YK7xT9LJQ8FkAWq{6!wi~M;N}_BbKsMq#4t&&V zS_|H?qzTv~6lNB@O~VMyoIYr$#jlKdW)gO3m!%0$e$)SwpM+#I1TR97CY(mECO*ok zVpwD0A9G7n+uuvH8S(b!OP`EtiEfFM1BE#yWf5UvGW^|0k+Wt>))5Yqn;Bl~unNo8 zSBwQ4#X#wwE$G>2eZIBDAKXI|6Kj|~XKBXwzQcvbCzxtoJ`7gEhI*U|<`EtEsh8Db zYepq=!}Y+VN`~}T7)=-_z;T`yBj1_LQ%5U_KCbiZ`8rOuGgobR?7MJAp^@J-F)rZK zP@4Twmh>V;eN6K!OYEqy7e+I;{BZIjCw?BRZ`~QGHE6KHFl(DZ%^GdKM5VwnK4PVF zbgXsee?S?7a@$~wa-F>s;{&a4D?A7qDac!1&2XWpXoV;~oZ;H=%GEfF-Ji=UaBXU( z2@Vg@1+35DJn0@WaJc_q(}X=ufK2OSH@|0lBbSVBYO28%7b6J?^I53H!ejz&B2;2l z{B@g-$GvH@o$44YUxR3?oTiZh)B!6*mMu{h*Qur2Hv`5CvaaiUB!1`ZojhWD7p~R4Azo&h-L7~P=S(B7{0Q$4g4!Y;5uE9kt*IT$6>HZ z7;zZCtX3A3{j8O~+qa~2S}r=pXi;QOwMlr1BanRW6?^T6cbU+}U%^K7g4&lGU)?s; zYx}K;?~*|q>}*YF=RaLy>?Ltb@p602q!ilK7IaNYQZg9h>D7g(ZK)mp`IB{hnCT_y z6ra1?qep}93wwL>nhJuPT-R%5Se^D>s6ok^n1c@EZ^hi2?$3$z-B6&Pr^y%Q?@l$c zG^usxGy>};cfTXXY!<&QBVRLR-8tHwn^LE&nmwmbZ^+zic+(&jlk7(yn68_{8e9VN^vixsn_SJfvDn|`d|KX^dZjGrRrdRP(# zw9eDShOuqCmZVjQmGc#FOI}eY)aUt7Cn1SNK$>AwpC#1An0E-Ss%q}ctcU_e*b3?N zou+uMj79KG(Z?vP2S+7YxAEvRZp-4)vrPom8c>|gwb&h8);pikBNV(-*9U z8Y&hiYg@c;3uTWB9!{#?%^9OSXb+@y49XN_r6DN>H{JQuOOA@tKfL@M$yH|%{_zy7lUKlEg`oBo#DR`pT=F%D}oM_wXGpx zm)L6$(!q9(rxo?}oa0{KD!H{~x7%|AUGQhNk{V71!5)m4=SlNLfOQ1Vbs`u^y%hm~dc{fI{M_B!2X4+b2HIcl^K=$kBQC9~OODcyKrKdva zP1o@wiA}EWr>~PU&|N)iOz=<0sn=fImK$)yvPHtQGUQ?}q=;}lXW=lqg?DV4teD-n zjQ=C>NTJ;2^F;Z_NtGzQaGITCG2N9i&f>|QaMv0p>X0hRwKFadPavK))#dEcZwweb zf#6g!T7mJO&tQHX?9Y0YQ{^tAM%JNB9WNWK{{c`qi;UIC9I%m*I!naKDvf#{zT=}>L zp-AD2g^X1S#Z5L6y@7Bd4$EfSOAD%n^s?p6>UaT=3L*>tkOf>Y`=)Z_2)*D5v>@yO zP{}=#E5e5+oKo-0z$Yrf8y$%Okrxd(aD~#Fn-faV>$I(d{%q)5p1aRTU)=Y;X!&X! zP~gkhqI>Cn!w$*87li3`WVc4I;AcuZ%G&OKW2D27FhfU1aLrmiAIv7 zmtW$yRu!$}$WM?D{AQ$#RRb!4?3JW#uip=Ite3)Wd*t+0d~0oC_B(hoV~L10mIEIa z_Yj3gTifqVKbN9mJc7le-V1o88(;1Z=ThFRO@@qeyHu+j6ICLO=06bHb6v`57q@(G z(s2!`(q=sA`WCpq+G>}XR$& zy4Ea%v1JJrV+(`gCVQ4-nUTy`+AI;W{16dFi>0#8ASo5145lFxk*wL~|CW2)?)~36 zbKdiu_q^x(e&6T2J>Tc^`94op#*kH^T5USWA5)NkhB*hJ&JeXyIBz6%rqlaJq7R#~ zaMoW^jlfuoS)h)O!+a_V4Ne#$`0ed%D7M;;7}Ci?&`-k@fNdn(Wa7ywSzeRJ^6^0O z6IMp-2rQ_jNvm{~Qtvx=0edqjfbpEp)y0Jc_ICNnCF_W?nwq}+TTQo~_&#vuRoAk~ zr^8C~@@{QjLcK~X5@lEk#AbdtR*7e~MBw5wgv{9*EG zNIAkz))4_Ivq(eBIekY=;;T8pA_NQM`+3p8(_r@9iFT0JgZR&u!|&B@gAIR_d}B88 zLAIF)kGK>P!;y{J3qOLdt*4F1^YP1p1#i4gX21%uX7lSWC?uJZyc&u=hfK&~3_Qn> z#j%R&FoP)g3KtO@DMZ=CI@wf{P9$f$q_fs=V3nR-}TlFr7Vb{w;O zZ2OSu9yTJj1$eM%j`&k!CQyAEs7-#fm9GCY*@v+=T7@E~zD(a14Pyy8bnuWaf1E_x zT?flTbM@>v1*e)`z2bF6K>|vTRGcH1IiMLYner`0$}CuqMjj1n)wpvbann!5+mufy z`D|gg+dDkW$c?p{7i1D|x+S`HBGYl=F2_dV3Cx84yt44MAlGTA>xqS$H@-0gcW_UZ zC&S0J*0Rv>)t1Hgk6P5wuGH^FkI*JC4;-}wQVF!4h0`*^`y<3;I*lOB9aH=VDco-* z;d<$U-t0a1b&JC!+{hOrhwQDb#m1Cm24p_IJA3$pAfI64n{P>@Q#4X2J&()HP}T7J z#A0MS<{E1#q5d@0aq08-+hW16obR|iE&JO~$K2x-8C9VX2S<6G5Vg&;sG$>)%Bw08 ztFOCPANfA+rOP0vqoKPc5AUQ-C02Q*vaEUH9ux|o znbftPG0M7cyv_cWP!BFux_p3?kc(J&xpM7cDJjL%>)1UTCPIZO3j(LeB}qR$K52;n zanSn*lrUc3xWz#Ol%J7(K8{~|((N8O#=Bv23Z|u$o2$c8MG&%*Impy53r+s3aI*qcU-O|+b97sJ*P`jdIBtq)NbXq zi!5p4F`bjv^DAhm!WV_Fx$af-LF2kH=_J`IF%j}XXxxvU=`-h+s)bs0DPMB`xcQhO zD#-0Y3+%5WUQZ$6lfpHE)Uz#!k|UDYtoCebhyEN8m^;v*iv%~)x~XPHg0`3OkCcxI zw`P}I3E)>qOfn{rcVx&DJ~McVcF)Zlgk|dCdk~(Nfo7x_w0Ct_!}UkG!Mu~P{Na(; zSq!hN!{iQo=d8HEWa>)V>On>z_+?GDi_z~6Jf>)0H4SFdKmnGJBDYwD)O&UOn*=s_ z1X}>*eZ>Rtq`Uz=8LE7Iooyvanzq6=+>hO2W#(FWh zmj+96BUJ8>dMVFTLq-&LVH_nV3p0G*7X>j5OW7VM>AHI8sBs}+08@G{iuYb`2Wj*k z#zEL;>U5Yk1@uSan#8 ze=^(Ndf;&mKSmFOv8q_1YkA66!($%NoZSJp+9J=ErXi#MJt*R9xy3>##wXlU6Y;q=h)5HHg^s-H(O9&Zt!3|zHeeG!hi*8 z*_J^KHwXmr3GnwP{`5kKLs%e6h#)iyCd4?0`)SySYe)+P#C>NXaOz30K;*a2I`@Sr zw@TWf+9jX2z?q+;`Wo$#c+4NKMKDY?Q11KuGB`|ovIQ6O<9xK!iVwRu4e*n&eFbb+ z9g=_BP9k5dsb`TPUIfgJhl4rmka%RiGZAANC9dcxO^m0H?~tcGkDFNTqBPPL@Ws)NGqVJ}14 z+rHP9m%p2lip+|5BY{v@jfpW!n;9P)8=G97D7!8$8QN-cvdh=ollsV0se9Yvna`5g z9oUkn#2bBXSAWx-ev3uRCwuJlK>&9}OUK3eI<$}@zTSay^i__VO=^up}?6P8Qy znNJbPpb&3qW3v;hX%g>%$>pO5V02R3T8*!=dWEff2soJ$}P(EHsX(- z4fXi!Bo!!jdSy!u?Yrl|{0j5rP8S0XS6-6DL%@sy`O(LC$d}tns6eu?WB7@L*KInb z_bySftT@l5E}@{2+PKxK*PNOYK#VEA`K4}As4`-(n>PRcY$2z!7FgtYw3dsW9aQ1~ zN1dtmDmjp^}uCRm73@FnWlf=AKfMX{cYGCP@wRyG@$a%e; zm4OIq8{@U7yCwQSd@7@APvUd_9t7?Mi+7Rj7vq4DCy_yDJ2Phc$#WiCE-<;M!reE} zO%u9b#!|)wZ;W8mXj6o)(=W%Sn28uWSK868EQMR$-eTew!SvXbH{HezFRVFAN?=Dp zOIu_<5Ab5G`;%8Q` zqS2N49j8ZlL&~s00Ob9Va#uk;JY9cI@aw{(K;O^V(8d?u;>OkZTUQ@mYIOm zQ?xFyU(@2)>#riBw8UlohcZ2CP1iPN5Q=1Czs#gLp6f?@IhoDXXpUMC$-kD`;WJ$UxJk3w z6jxyCGAv1@wS(7^KzXsJ?d$3YPU`ISgq)=x{qb>cQ>}Nvs@p!o51$)nn;uq{-X>l2 znt4^=rTEmm^?5?b5k5$@n1mI0)3g9>>8Z(a%XKHcbY#w=&PY zo5pkeZ+F~_k86{1A5_c;PplSTDySxvjX@UlCf?L_cqFW5hdF5dk@tC{ zLAlEgQ^Dn-F->1XUFEsq*6qWbxzm!L4mhKaUj$ zqNVQbsg%b6+urWQcX@{DKOtO1P+WzHN?;54VU0(3fh1ay4Y#8P32n~3cc$JDQn@hr`TBXZ!x_WfjI)Z#$6 zru#cC{hb-21`oB=77Jf6-V6K%i(-Gsw(S%~dusZt%(SjAj~;L{cX4&?98ghImT9)^ z3+f+i-t%N ?LWEthi9Tx0DWpb*>$9B{$2z1OXK)rK<;+rj)eN!is7qm|o#IV1aG zthKB=F(UjpxF~9C%!zZ)HJ*e_KtAj{(8qfCh$Jlct%MnM6UNM)=d7gb@@p5j zNA=5YZl@oK|J=MSTQPhUpGLqHs(L&0+AbBT9|56_VWa!Zsp*Wi&whGLwNe#o?+fHs zS1*XGP6ImyE_Llne490R3YAu|CX0b8ujb!t0s9`hI39NYrT~^9^^$+K!_NxDntEvhU z0I)(LG=9VF_a8{T1<;PjF<&)8|Ax=^*$g>+02gYS`H3L!{;U2Hj^Ir0Sr@jgM9JHC ztPpJV)Eg+kI~ESlD*n5eMkNrLOm?K@-YsuvZ@FKNAUzMp@lj+HvV6-NT~7s?ddmx0 z-9?ac!ZgAC;X2vJT$1j3)mGK?SU%8sS$-n}UJ3tqkpROYpxVmHN~z%LXigBzsX!YB zHPGqcyy`!OPJOuYX?4xswKaXC>!KomLC<#|-NLF8;zM4Y2h&~buB}hSWkI`yR>2ns1Aq9hbV$2zc~U9hV%0JDw}0mUz8RZZ|+c%?43`pEqIu5 zE2cWgPwa(Lz(+@?FCZx9)rs{QqRQ8n&Xh2!!O1E1e5uByt=zXgduaOp^?MG(C=n&$ z|J*xJmShD76F(d|M8&akA@3#2WR{)kO$3F}DtK6wfpm*id9KC<9!oCc!J_Yvs+V4V- zJU|fCA>Z%%y$bs>romWMQ}fJhxJ%~#z260PJTfGN$ji(7>HM`Id9zXn`MKFyqK|rR z!vVYQ-yhtU4SqI!b#Za~MsDq=Y<&|`c_k$c9^U^RYumB_eeCA2BOIm}>Xb&@Hm?-< zH^cUqP8E4T>d}C=#$odJPy0*8g2cttN|4H#&Hs;U38)8>1gI@3R9fTUf2dmy1`JB} kDdWn#eMSB))Y*Zz<1cK3AYAqdRSdw-(iDg{XzYpmKTiQeN&o-= literal 0 HcmV?d00001 From d957c7097c80ccaa651bd5e2f5bcf7a6962a0f87 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Tue, 28 Oct 2025 20:40:28 -0700 Subject: [PATCH 20/41] add final links to helm chart info --- content/en/hosting/cht/migration/preparing-for-5.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index ef49658871..db9931cd36 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -34,14 +34,10 @@ A recurring problem seen on production deployments was that, over time, CHT admi To avoid this situation, the upgrade service has been removed from Kubernetes based deployments. - -Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the TK technical guide on how to migrate Kubernetes based deployments to 5.0. +Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the [technical guide](/hosting/cht/migration/helm-charts-4x-to-5x-migration/) on how to migrate Kubernetes based deployments to 5.0. Background information: +* [Add documentation for migrating from 4.x medic/helm-charts to the new production charts in 5.x cht-core](https://github.com/medic/cht-docs/issues/1943) * [Hide upgrade button in admin app for k8s deployments, while still allowing staging upgrades](https://github.com/medic/cht-core/issues/9954) * [Remove upgrade service from Helm charts](https://github.com/medic/cht-core/issues/10186) From 6920b11fe8619f783924b06684c559ea999c906c Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Tue, 28 Oct 2025 20:59:23 -0700 Subject: [PATCH 21/41] add final info for Declarative Configuration --- .../hosting/cht/migration/preparing-for-5.md | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index db9931cd36..9859062762 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -67,12 +67,22 @@ Background information: ### Declarative Configuration -{{< callout type="info" >}} Applies to: All Instances {{< /callout >}} +{{< callout type="info" >}}Applies to: All Instances{{< /callout >}} + +Deployments that have not compiled their app settings config in a very long time with a new version of CHT Conf, when logging in as an offline user may see, `Error: Rules Engine: Rules are not declarative. Updates are required.` + +Additionally, the web developer console will show: + +```shell +Error selecting contact Error: Rules Engine: Rules are not declarative. Updates are required. +ERROR Error: Uncaught (in promise): TypeError: Cannot read properties of null (reading 'doc') +TypeError: Cannot read properties of null (reading 'doc') +``` + +The fix is to: +1. Update [CHT Conf](/community/contributing/code/cht-conf/) to be current +2. Recompile the app settings and upload them to the CHT. Be sure to replace the value of `--url` to the current password, URL and port: `cht --url=https://medic:password@example.com:12345 compile-app-settings upload-app-settings` - -tk - all the content ;) - but upgrade your app settings to be declarative. Background information: * [Make declarative config mandatory](https://github.com/medic/cht-core/issues/5906) From c13de561faeea797e393cc3f8a0105c890ffb6f5 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:20:33 -0700 Subject: [PATCH 22/41] Update content/en/hosting/cht/migration/preparing-for-5.md --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 9859062762..1c121b36fd 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -45,7 +45,7 @@ Background information: {{< callout type="info" >}} Applies to: Instances that use [token login]({{< relref "/building/login/#magic-links-for-logging-in-token-login" >}}) {{< /callout >}} -For instances that use token login, be sure declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. +For instances that use token login, be sure to declare `app_url` in your [settings file]({{< relref "/building/reference/app-settings/token_login/#app_settingsjson-token_login" >}}). This is backwards compatible and safe to do while still on CHT 4.x. Background information: * [Require `app_url` to be set when enabling `token_login`](https://github.com/medic/cht-core/issues/9983) From 1e41198efcc3aea394016fd9715ae41d26ab73df Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:21:28 -0700 Subject: [PATCH 23/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 1c121b36fd..446b946a5e 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -1,5 +1,5 @@ --- -title: "Preparing to upgrade to CHT 5.0" +title: "Preparing to Upgrade to CHT 5.0" linkTitle: "Preparing for 5.0" weight: description: > From ee0ca154ca842482f94db12047774fb0fcaf5285 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:22:37 -0700 Subject: [PATCH 24/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 446b946a5e..9a0fa06e1c 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -4,7 +4,6 @@ linkTitle: "Preparing for 5.0" weight: description: > Steps to ensure your CHT App will run smoothly on CHT 5.0 and later - --- ## Introduction From b4ed013da7f87bd53ab567d878cfb3598bb8f39a Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:23:08 -0700 Subject: [PATCH 25/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 9a0fa06e1c..39860c24e3 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -57,7 +57,7 @@ As of [CHT 4.2.0]({{< relref "/releases/4_2_0/#technical-improvements" >}}), dep Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. If you're unsure if this applies to you, double check your app settings. -If `launguages` is not set, the login screen will show all languages. Fix it by declaring the `launguages` per above. +If `languages` is not set, the login screen will show all languages. Fix it by declaring the `languages` per above. Background information: * [Deprecate enabling languages through generated docs](https://github.com/medic/cht-core/issues/8157) From 8caf2d30902745475bd39a882712c87d3ac7e400 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:23:21 -0700 Subject: [PATCH 26/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 39860c24e3..955c9bf4dc 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -152,7 +152,7 @@ A major feature of CHT 5.0 is replacing the old freetext search in 4.x with Couc Nouveau has the following impact on all CHT deployments upgrading to 5.0: -* Offline users' devices will have their search indexes rebuilt after the upgrade. During the rebuild, search functionality will be initially unavailable. However, once the indexing is complete, the search behavior will be unchanged from before for all users: the search experience is the same in both CHT 4.x and CHT 5.x. +* Offline users' devices will have their search indexes rebuilt after the upgrade. During the rebuild, search functionality will be initially unavailable. However, once indexing is complete, the search behavior will remain unchanged for all users: the search experience is the same in both CHT 4.x and CHT 5.x. * The Nouveau index data on the server will be stored in `${COUCHDB_DATA}/nouveau` for single-node CouchDBs and in `${DB1_DATA}/nouveau` for clustered CouchDBs. * The following `medic-client` views no longer exist. Be sure to update any custom scripts which use them: `contacts_by_freetext`, `contacts_by_type_freetext` and `reports_by_freetext` . From 9836d226da46ab3de859071bbcb41eab0819773a Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:23:37 -0700 Subject: [PATCH 27/41] Update content/en/hosting/cht/upgrade-troubleshooting.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/upgrade-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/upgrade-troubleshooting.md b/content/en/hosting/cht/upgrade-troubleshooting.md index effec6df91..bc72a40463 100644 --- a/content/en/hosting/cht/upgrade-troubleshooting.md +++ b/content/en/hosting/cht/upgrade-troubleshooting.md @@ -38,7 +38,7 @@ If you're able to, after a restart go back into the admin web GUI and try to upg **[Issue #10296](https://github.com/medic/cht-core/issues/10296)**: Requests will fail due to fetch implementation if headers are not sent within 5 minutes -API: +API error: ```shell TypeError: fetch failed From aef3265ba12b0b0900a7efb28d9fa769a531eb8a Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:23:45 -0700 Subject: [PATCH 28/41] Update content/en/hosting/cht/upgrade-troubleshooting.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/upgrade-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/upgrade-troubleshooting.md b/content/en/hosting/cht/upgrade-troubleshooting.md index bc72a40463..d14ce26044 100644 --- a/content/en/hosting/cht/upgrade-troubleshooting.md +++ b/content/en/hosting/cht/upgrade-troubleshooting.md @@ -54,7 +54,7 @@ TypeError: fetch failed ``` **Fix:** -1. Wait until there's no more [active tasks](https://michellephung.github.io/Fauxton-Visual-Guide/#page-active-tasks). +1. Wait until there are no more [active tasks](https://michellephung.github.io/Fauxton-Visual-Guide/#page-active-tasks). 2. When there's no more active tasks, start the same upgrade again from the admin UI. It should succeed without any errors this time. {{< figure src="upgrade.again.png" link="upgrade.again.png" caption="Admin web GUI showing 'Error triggering update' message at the top, and an arrow pointing to 'Install' button as the next step" >}} From 41df9ab0e42180db5687715498f79fa4a51bc630 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:23:52 -0700 Subject: [PATCH 29/41] Update content/en/hosting/cht/upgrade-troubleshooting.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/upgrade-troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/upgrade-troubleshooting.md b/content/en/hosting/cht/upgrade-troubleshooting.md index d14ce26044..70b625bc3b 100644 --- a/content/en/hosting/cht/upgrade-troubleshooting.md +++ b/content/en/hosting/cht/upgrade-troubleshooting.md @@ -55,7 +55,7 @@ TypeError: fetch failed **Fix:** 1. Wait until there are no more [active tasks](https://michellephung.github.io/Fauxton-Visual-Guide/#page-active-tasks). -2. When there's no more active tasks, start the same upgrade again from the admin UI. It should succeed without any errors this time. +2. When there are no more active tasks, start the same upgrade again from the admin UI. It should succeed without any errors this time. {{< figure src="upgrade.again.png" link="upgrade.again.png" caption="Admin web GUI showing 'Error triggering update' message at the top, and an arrow pointing to 'Install' button as the next step" >}} From 4da46ca2818b6010fa3cf28a57f6a7fc010e8705 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:24:32 -0700 Subject: [PATCH 30/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 955c9bf4dc..057bc09151 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -110,7 +110,7 @@ Background information: {{< callout type="info" >}} Applies to: all instances {{< /callout >}} -CHT 5.0 is preparing fo an upgraded version of [Angular](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301). As this version of Angular will require Chrome 107 or later, we're making this a requirement in 5.0 as a breaking change to pave the path for the upgrade later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. +CHT 5.0 is preparing for an upgrade to [Angular 20](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301). As this version of Angular will require Chrome 107 or later, we're making this a requirement in 5.0 as a breaking change to pave the path for the upgrade later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. From a56c1580578dae26675fc6b18471b6243c515d1b Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:25:18 -0700 Subject: [PATCH 31/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 057bc09151..04d776ea9c 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -112,7 +112,7 @@ Background information: CHT 5.0 is preparing for an upgrade to [Angular 20](https://blog.angular.dev/announcing-angular-v20-b5c9c06cf301). As this version of Angular will require Chrome 107 or later, we're making this a requirement in 5.0 as a breaking change to pave the path for the upgrade later. When [researching the impact of this upgrade](https://github.com/medic/cht-core/issues/10029#issuecomment-3358338361) we surveyed over 100,000 end users devices and found that less than 0.5% of users are affected. These users are running Chrome 106 released 3 years ago at this writing. A best practice is to have users always run the latest version if possible. -To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and of course filter out users who are running Chrome 107 or later. +To check if any of your users are impacted, check the [user-devices API](/building/reference/api/#get-apiv2exportuser-devices). This is an authenticated API endpoint and will return JSON for all users for all time. As this may include multiple entries per user, it's important to filter out duplicate users and those running Chrome 107 or later. Before starting, be sure `curl`, `jq` and `sort` are installed. In Ubuntu server, this looks like: `sudo apt update&&sudo apt install jq coreutils curl`. After confirming these tools are installed, save the output of the API to a JSON file being sure to replace `user`, `password` and `URL` with their correct values for your production instance: From b2073fb6616d48f4d21a2aded75fef6b085c58e7 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:25:35 -0700 Subject: [PATCH 32/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 04d776ea9c..a9f5c7568b 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -120,7 +120,9 @@ Before starting, be sure `curl`, `jq` and `sort` are installed. In Ubuntu server curl https://user:password:URL/api/v2/export/user-devices > devices.json ``` -**Note**: for large instances with more than 2,000 users, run the API call after hours. It can have an adverse impact on CHT server performance. +{{< callout type="warning" >}} +For large instances with more than 2,000 users, run the API call after hours. It can have an adverse impact on CHT server performance. +{{< /callout >}} Now that you have the `devices.json` JSON file, flatten it into a CSV file with just one row per user. Note that we're only finding users of the APK (`select(.apk|length> 0)`) and the Chrome browser (`select(.browser.name == "Chrome"`). This excludes desktop and Firefox users which will show up in the JSON as well. Finally, we're also only showing users active since `2025-04-01`, 6 months ago as of this writing (`select(.date > "2025-04-01")`). Be sure to update this date to be a relative 6 months ago from when you run the command: From 905c49f2f682cffe11ce85db1f804f31b8961982 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:25:47 -0700 Subject: [PATCH 33/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index a9f5c7568b..56f0c1aa92 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -138,7 +138,7 @@ jq -r '.[] | select(.apk|length> 0) The resulting file `devices.csv` will have all of your users sorted by the version of Chrome they use. Scroll to the bottom and find any users running a version lower than `107` and ensure they update to a newer version. The easiest way to upgrade is to open the Play Store and update any out of date software, being sure to update [WebView](https://play.google.com/store/apps/details?id=com.google.android.webview&hl=en). -For instances with users who share devices, or have multiple devices they log in on, they may have multiple entries. Thi is because the CHT creates one entry per device per user. Be sure to upgrade all affected devices! +For instances with users who share devices, or have multiple devices they log in on, they may have multiple entries. This is because the CHT creates one entry per device per user. Be sure to upgrade all affected devices! Background information: * [Upgrade to Angular 20](https://github.com/medic/cht-core/issues/10029) From 406748afbc673d1def86865dc4a371b21febad5a Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:25:57 -0700 Subject: [PATCH 34/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 56f0c1aa92..7846b7ccba 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -146,7 +146,9 @@ Background information: ## Non-Breaking Changes -These changes apply to all deployments. No specific action needs to be taken, but administrators should be aware of the changes. +{{< callout >}} +These changes apply to all deployments. No specific action is required, but administrators should be aware of the changes. +{{< /callout >}} ### CouchDB Nouveau From 10714c80b0b542420ebc78aea1915d02cba101d4 Mon Sep 17 00:00:00 2001 From: mrjones <8253488+mrjones-plip@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:26:08 -0700 Subject: [PATCH 35/41] Update content/en/hosting/cht/migration/preparing-for-5.md Co-authored-by: Andra Blaj --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 7846b7ccba..6ae4d506af 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -152,7 +152,7 @@ These changes apply to all deployments. No specific action is required, but adm ### CouchDB Nouveau -A major feature of CHT 5.0 is replacing the old freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space has been shown to be a major contributor to hosting costs, hence Nouveau is the first feature to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). +A major feature of CHT 5.0 is replacing the freetext search in 4.x with CouchDB Nouveau. The addition of Nouveau [decreases the amount of disk space](https://github.com/medic/cht-core/issues/9898#issuecomment-2864545914) used by the CHT. Disk space is a major contributor to hosting costs, hence Nouveau is a feature meant to [reduce Hosting Total Cost of Ownership (TCO)](https://github.com/medic/cht-roadmap/issues/171). Nouveau has the following impact on all CHT deployments upgrading to 5.0: From 7d24f6cb1ae74d0c7a9d8adf44841c22f704f1fd Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 29 Oct 2025 10:30:23 -0700 Subject: [PATCH 36/41] remove upgrade warning per feedback --- content/en/hosting/cht/upgrade-troubleshooting.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/en/hosting/cht/upgrade-troubleshooting.md b/content/en/hosting/cht/upgrade-troubleshooting.md index 70b625bc3b..64febf8aca 100644 --- a/content/en/hosting/cht/upgrade-troubleshooting.md +++ b/content/en/hosting/cht/upgrade-troubleshooting.md @@ -10,10 +10,6 @@ aliases: - /hosting/4.x/upgrade-troubleshooting/ --- -{{< callout >}} - 4.0.0 was released in November of 2022 so 4.x is mature and users have learned a number of important lessons on how to fix failed upgrades. Below are some specific tips as well as general practices on upgrading. -{{< /callout >}} - There's a concept of upgrades "getting stuck" which mainly means that after many many hours an upgrade is not making any progress. Most likely, this will manifest as the progress bars in the upgrade admin web UI not increasing and "sticking" at a certain percentage. An alternate possibility is that the progress bars disappear altogether. > [!WARNING] From fa2872c10401a2f518b74a0b98ad030bc82c5f0c Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 29 Oct 2025 10:40:58 -0700 Subject: [PATCH 37/41] add k8s staging screenshot, tidy up helm chart wording per feedback --- .../en/hosting/cht/migration/preparing-for-5.md | 6 ++++-- .../preparing-for-5/k8s.no.upgrade.button.png | Bin 0 -> 48854 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 content/en/hosting/cht/migration/preparing-for-5/k8s.no.upgrade.button.png diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 6ae4d506af..edc0d76570 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -31,9 +31,11 @@ In CHT 4.x there are two ways to upgrade a Kubernetes hosted CHT instance: A recurring problem seen on production deployments was that, over time, CHT administrators would use the CHT administration interface to upgrade. Then, during a migration or a restore from backup, Kubernetes administrators would inadvertently downgrade a CHT instance by using an out of date Helm chart. -To avoid this situation, the upgrade service has been removed from Kubernetes based deployments. +To avoid this situation, the "Upgrade" button has been removed from Kubernetes based deployments, so only the "Stage" button will show. Here is a mockup of what it look like: -Kubernetes based deployments will need to follow the migration steps from the deprecated [CHT 4.x Helm Charts repository](https://github.com/medic/helm-charts/) to the new [CHT 5.x Helm Charts](https://github.com/medic/cht-core/tree/master/scripts/build/helm) in the main CHT repository. Please see the [technical guide](/hosting/cht/migration/helm-charts-4x-to-5x-migration/) on how to migrate Kubernetes based deployments to 5.0. +![k8s.no.upgrade.button.png](preparing-for-5/k8s.no.upgrade.button.png) + +Deployments which used the now deprecated [CHT 4.x Helm Charts](https://github.com/medic/helm-charts/), will need [migrate](/hosting/cht/migration/helm-charts-4x-to-5x-migration/) to the [5.x charts](/hosting/cht/migration/helm-charts-4x-to-5x-migration/), now moved to the CHT Core repository. Background information: * [Add documentation for migrating from 4.x medic/helm-charts to the new production charts in 5.x cht-core](https://github.com/medic/cht-docs/issues/1943) diff --git a/content/en/hosting/cht/migration/preparing-for-5/k8s.no.upgrade.button.png b/content/en/hosting/cht/migration/preparing-for-5/k8s.no.upgrade.button.png new file mode 100644 index 0000000000000000000000000000000000000000..5a081b78241490718eb7a2b7385470f0ececf2bd GIT binary patch literal 48854 zcmd43WmuHo*EX!8fHZ=HG$? z!qB{X@b`~T?{PfGaX;^Se^DHVYp&UQ?X}Kzp69wkv^7!Xv(tRcQ$F4>jDR`qde@q0{pTCs9*Lo$Cfl!QRENXA;CgqY3 zC)L#$)&~?yMJDY8tatCWhKBkEXQbm(X+xDd$_tYBdOArGYGE@~D|>Y#iPyF?_BGg- z?xPm(FP|rqDd4mClPLsu?RcZFV}HW_^QU}<=EckSEO*0|QvP|*W10}iKkvvDxZ(Ww z7xAH{x7YspwTvdU;eW276!0#W;-5^t4?wF{+Ku)(JjkA5?vQc09daSdS{R z8ozO_ae^~e<@~i8RkeOnY|)!|Q1bVSf6Up*h}1mxzfMsSdAv7jymhvlc3z=xQ`t&< zON3MEe9Ez}Rqj-E=U^eK+J2#}HK$sHkebhFce&S53XTfr|GOkm#9iJsufrv3{uwgs z<{(nIZT)H4@n-pK$-0!whTYd^h5HJ)XpB}6Z7(^S%E`jNmfbMnL0DDi2M%|6_(}@A ztG48lvDe{eE&hM)MHR`%o6g1_Xys*_O0UzS0|!G!&p*)f$!A80J9RN{2{}ybz_(1? zC6(Uxk?Z66mF9i+dm3U}yZ6)^H5bH$Y??cg^g3}pKkrQvuTBt#SztWC=akqLnKt8! z!;tjwN$c{%J)aYGdU2a6T?&$s0>kw!bQ2-JE4-;SjQTj@o~~ktpv#7CeV~Ao=v19& zwXrQtRc0U_Dg+_D+aoMXRNv>Pr(G?+b!(@SBh3}vt8o`yyx~L)i}< zn*)g*{qRWle`^^P=$G@6tmze*yse*IN%Ka{`Uy20J@j(l?G-*uy9h?dZ|(I!JwO)OOS;x9YM__d#Yd;T%t_?I8) z$yTN2K?nth1>a|TU4c1a&m$)cc=_m@%_^9%DWqPKECiP?uSWQVpJhu>{pP*l#kVG9 z70fSmYS3+TvP2noTduOaw#Q7v-QTH0#;e;{yJt3w+Zi3V>d(E{+X6`#)`sv|hz-h* zSzmEHOkCW8&5`S~ATmhoUo8duF$g8Je*Xh&Fd4{D7OlTb;k+o`cZdGP$BHSZp@-wA zv3!QN&L96h#9}!m86v=EmwE^Z_`8Q*2Sv^M&u=_6C2G z#VgCZ+-vcB84KZIMtTzp!-9@~z-bvVAQWV2+|ZgKifd)-J0%zF*t2WnpmatE%l8D^ zr$m@3JiohUx3UPYkZSv7(!)PQtav>D!PD0+=G zc71u`xqnRV!m+bhX{FV83G<)xbPu}}4}3vrI}rn`aNtQ9M!mA1;39qoVjn*m9$+a) zde2nlxPkC-U;PyH2H74T9USnnk%+`5pt$I|AV%5XDlvsDe&}$Oi0ga^$NR0(M^KpM zvcx>8YiVGFd*J%@UUQ1_e(APw+J)v{UT^#}__T;l&yKgoiEg2ydQL=H@2rs}C7anb zOhL?CpM_~vX!a>Fl>R^nOsd7ZvOoE|-DTPDGf48yX7z-fD^Ne1{jVmaXW?H{%=G)= z7KivHa-pC4g)7%}vX0<+`oW>UC&P>tW7YhW$ii*m-P*_|{| zH!a!2m(#rtk1}iycb3lR3qJ1^IgrH)Q#kL5MHTCf#Kvg-JwjdDdQce36Rr7P`4u4) zGvmJXGdb%1^$;?Pj0$8pT|wYpWWUUiKWR1Z@&IE7(*OB^{*;zvJMzQagrEh7WYl)} z>>b%AL)NgGq{in`7DCnwHzSWx)%?G2By|ynu_d(+H!E>(*~Wt{2}1l+QGz2gKxo6| zAiem0C6wgOW$a&Sl^FOU*j2_1GC7s~wcLXt29#!Ss5^4EPtKTvD((TYG(?Ryv__u@ z6_?K|f^L1@URZbZgX#VO6$-J4v~mfg{baY&sv=O@vb9rZ-(KFCFFb3M zK{8g7CNP&+sX|FEi^zzyov}}KvbY)8WfaO;fkYuXq$ePCPD^idPWqY?j#NsL7V~+UoYT z!Iu?Q{e#xOPv{JLf~2H(GQPn!)BB!*I^pI5#U&N;xepv`@zy1nNJGl7Ciu!ht>Y8@{1G_ohWVDT`n|y7}uTuP2B>qSdz1?rJ7N68ihXUt6q5Q+D>L zoExm>K?Yl&W(~pfU5eGWL0dMDxutFG(1Ku;fd(b5>1fF;wMNNs*p~5LTPJ>)D|+;l z$phT94Ki8Mh!ZV6c&l7>q<)U%)}zH~o!a)apA>^g7$8oo;0M(^QTyo*|3+*r=h6TE z^#7}v?*AHC{QvsGhW;P9pH(T6NVe?#9%}!lTg+O=b8!z zn4iy#D*-Z_j9`+J#jliNN6MZ48QPfI-<&k8_d4}RzF5aZVvzM7*ntvzL?S0F$wDV? zl zj_o>5N)>n*D`X3v|L6+4o2pvFU;F0~=5Qr#)ZbPsQVJ!JMq)l*W}P%?Sy=nN={O^d zZ-RI0h1%|A9Nd2@j|q?SQw;jf#Rh3AgAKYNz1@J5V5jhhrebv*G2+k|$sjeQ z2TS>w0<(_2UJtgEgAk8B+m2d#CE2lLR$$?(_^gMc3le2|etxuG=ov2!Ew`IfkW(}t zZNizOta|fYI^J68QrjH4tK7-9B2}G?yxRPOu6&rp!U(>>?T~d)Fqw=U7TO|qM|Y-l z;F}Xm%KRB(%K&Wc*WZx|z&1gN*RkvD<0JI8nJC$QE`a*TF^JLa)w0_mfD$m%ge7?a ztC^bd6uYMDXY^N)0)po4w6NqkSfY{Z+%<28cddtJQ8FWa6N1fUFFS9DJ1+NZFmgdv zb&q*{Hxgi}=u-bo)hJ|Bpm3O}v}+s)=iX`-BfG|HwAqa0>m}SfT8cA1snph(wr^+9(_L8nptV0rCJ`)HmzW|D5?3In#qBc%(?8|Jw&AFjtu=r?)Caxq>;=urmWNss(SWJm0&%O*hAe^#1Y z{W0vRE~$ETNMAk0nN!f(hVz@(9IbtoP2ICt8~ek4?Mliz_=(Z`1by%xyO~NktWXZ6 z`y=1<&LsiDk) zRpaZN6sk0&tg}gV#06p(Ap|Ms`z2Z5hj?kCM(i#JR`=9ak6fFH#Vd&E#110V>yA-U z7?2r8dyKQY~F`a^CO!k19`ciLAp{q9c-tP7U`+3^Vcy0s!WGJys2VS zL?dckoxbNP#(!p>4#xRy8(m;!P%$4mU8mEYC@~@%I4`!RufJR2u++6de;9~Q zB3@38-TYTn0C&E+T=6imWA2_rD|0RxwQ0pRjhK}#m6(TIn824C_S-VFq%MI+?4Gjql}v?xtROD z75|k4sCg{EN8zw-rTCS|qWmh(xWNHm3+o_nq=HCsLg9;6=7znxj16R@(tS?Hq%v=nURpL zt&+nbExDim-C?S#VGslQAR^lN)|;qL!J}uV$H#h|u2fr}f*5y9$LVU!QXU4{x5dJ|9=nDbWw2p$^MTitkrp|$+F%Q z5b`#&o)~9P?{!_gK#jks{OxTKbbiJg$SUXck|K};Bl$0OCsv8f`3$y_WH?OBBa{Olr^r?5=dvFrJ$2mXi_k585wJc} zTP?K|qvLUqr;}4v=Xrc|Y&~9bhr|eH6fh94Myuhr;)tD>m=3n63J@&Qgqx&tCjumV z*i{|)4KnpWr+)@2l)J!=$@9-U{W7bBBw5d@Nm!ca$zkpOME5DE%V;fqWm+h8TX81n zh0Wp&UGzMv$f%7yimC1E&(GXlB5Aw-3o+o|o7n}Q)Qhy9t(ykWwy*tf3K|C}Hsizf zYeRtHdQ)KNG@v~G18`r*j&u3r01`Z*ID4ppN!PwVKmCDJ#x>U05)~Y^vWNQ z>!SE80k?Q)i9br2C1{frJP}_$>os}qGS?LF-{3(rdms@q67bESQiyOiH3J3c%08rE z<_}l&3w{etsm<>j9;(3*fBI7E9?Bj5KJ!wFk@0}_D>^*Szjp)~m%P01(b=0I+-}@m zjmKADpjG**z^Hb@*ev3L16C4d0fmEONNqU9Y4E;isp2Nrno7j2k15z@u%sxTzjT*@ zW$jlhwXu`q3UZIt8W49j^DQA>`;pU}&%QmsiP!fF-m(k!D2)H`*nabamTU+=Ld<$% zu}}^y3HlBO-0rcZutiVsU((bG+v7M1eabbPJpExg>NemjVXE$lEZt?DOP5ie2JcQw zIR=bjNfDq>SM4y}l)>ur_6rf>ZE-?Io_kN2`rL$_v+N06>K5H<6CkpJSX_WVpm7my zStG-=8$Pc`Qvo9ME=bLl0%YasVHugT+}VK{6%||!)p>}dboSAI^@fdN0l>(8bbfg@ z-&QGZex4b7(M)31HA1SExQny^xd{>$B*85sl9sJ{e>F1-MRk^)WYg7jc8ZxDZ@bHT z)A`f!o%P>D7G)bAurP=PKVZpD4xDhSjd!?$A4`vSez5)d(=XzMt|EZ`J9@ECCTd~w4mZB~KpHPrEn*G%mnurvF3TRraB+$Wl0yZx(C)@W{-J^%j3KxPoNDab4PtlI$b z?3Q}Wi61_yUz)*}Xxg!cD9vKQV;Td}=szXgNeGZ4dR3)JNVg2Sg~G@xfLR(cpe-;|c@oUH){K7e(j17gD)Y96d)Vl5M*#8o~vO&Emf>4;WTsmV`ik@R#O#%byJU}4;Me^8GxYJJ8)=Q z?oBGS17Q;OPc_1J`-#4QpB18DpvN|VstnFC)ys*NQ=kIf!n1w$FBbFuo_x0dMzjI(O76;Y&ovU3o zL%k=KAKxFA0qq_jjJEztM^z*@oHMutpzt2S_Tl8&VzVHr^OId+`I48N?-SPnc79uZ zveP|{Jqi2cFeV`Gv{&LWx;6l$YOEKp-5;+jeYBcc8@2)@h>aQ7g@|8~d&<*<{58Lj zvd2~+l^$0DDr}UPMxa3kEK9-|y^NdFzJ4l&kZF_u#x0Cssyj+j-0s&sZ%{GatAzWc zhiU<_+Q@(2ohWKKbtleXzL_4|V*)1V^}Ad;(Kj*YhIff8f&%CuPOo}p)ZDAvN-waD zk|Q&AF{Pn+Kmc-KXIB_)3?QVg!WOQyS&;l|$BOOd@{KrOX-Y1|Y@EB;MSWI}v%vIH zIDaw;i<0-lJrr0U`L=6cEaA^AAvyc?89xRn9!HLIGUT7>_c6nHI;FE`pesYA`;km+ zR(c-q_nsL)9%gXgD6XDvA2b0>gPsw+UBhM3c?pd;Y!R-g#&!k%s~Wf0lytPUhKpm7 zEmuoj8iiRe?*)pzgTe}21jh8IlEv(rIC3VMkjP=#d>#^T(41Tr{*4ms1knn_A9f%S4sj(9Mg6piWTfid-G9>R|sb5j^HIU#`e?%KSF#GF6H2|^vm|90QpRD}4< zYO{Yq+)$2I;bHCHRW|r%m05%|w39)~Ihz7R;m4G2se<}5H_&y7CL z!Ud%!D3S($6kzFi3i<9h{yr}$v$k*^qEZu=)bUb@Gy2_?K8)!mE$BTx_T60pdtB;H zdDGecR=f}4EC77wDrE$i?m#AM5o@%d5Qd0c%+m}yfKwgw}SIYq=q zy0CKR^^uJe@IvZzW^OLw&?Wej!Q|ZvgFw2>u{J&`ZxTnmn}1WapHj*z0*&FhvW}jS z`PQ)0e5$1M`1A^pyh^sMrtA;qf{u5swxaqc0829)zX-N-FDV`55`I~$n)@AN#b&1} zY$uj0Jr8ey{ug`$q|z-`{L29iMA!O27WgoYQ&6+>zTCA@tr4b$A%f6>~$s)Ij_edv$r0L=P`Gt~hzFh@je+Hpu z0U&L>>2)@V6|9S6n9IL|zE{&`IwsMEJ^7#yZ?upnzUmNPhb2IIo&SO$dhB^&rgHWe zt2VCp^5WG$X+)D*^dGoPW1)R3Evr8R@3`KeODWN{-grT?nrO&IQFBfA9n10g7K4>-_;^oNAP zzE)EX*yiZ>K9H+h8ZR!c^Z}&bDrp9;H7x%j(;fN6GoNmBSl}#g&-Xv4#V|FJ(wR=o zYJ2^%`~Jr7(RFOHw~x*aqE)e=K19tdc77=R5%Tx_lK&Do6oUV^v*H5*i1lyfQ=+2= z3z68StkxZlZOpLsx0+ViqT-u=d0S&rD6f85#XzQNwOOQO+a?e>WKp20u>+|PUVpNq zPG2*9h?Q%z?tduxe%lB$>s>!tY^F;8oos!y5DwG>XHawYFyJ3)Sep0Ly}btfg{s*_ zIs!=MfJblVQ@uZ7IUPt$H*X?4^*PRHjYN9;UO8a+sz7=jmjP^x4X9G0bAhBxC{T=} zrX&4GAi3-pUX?Fz0rWDAHmr831VzTVT+`i^`9U3^yAE<5URJm+Ujp>V>PA1jYQR`m z3YxXO^j!jX809^PGO%yGDJz?`j@4yQ6$>QinELb6Es0l(vH{TfT2jCnw_v_2of}MH}!)Cu@Y(t;nh6T~rJ~=WX>-tT-L5DI0YUdVT&34nqa~|fz zYx56I$OHs=Q)n%T0iV8$PLOo8=sg6chl#W_Id8AtLlx$#Gys*#!P+M7_FQ$SzoQ=e za)qz%;06D@0!tW;>Lnq|*8=Vdq3xhq+=4;QK`q^w!nXE&)f*+uG1%hs1?%N8Br@0} zkv%ZsC)uBJ)G7zm)O0}_DBlT1?n@t^l~}T=gm16d_38h3^Kt873m_vemvFrj(5^^V z=p18x9|x{ApczMhz749d0}dXElZ^ZRADcu_w(OI{tiN1u4xa#^YfJWcLs%|JS$B%I zuo?vcg<|%ne?$Th?xOktyj)O60Vd!ND%!eHYO7`;P1tru`Wyq?AX7%}n@iI|W_(qv ztXl*V`2I|osS0~D7qDZIy9H_3Be!}ByO^y2fRG9`w&fdyJ~Q?dC3GBmC~m&;a2Tt! z^lj_WNReI8-F7+qrl89IZRhMI|ea%xjOJBz5RM;tFNjmUY)P9Wp8U%PIj8rZhcXb$?M?Ld6M^G z675L*MPnW@qQYvYXH1>V#_G8-R&4YO9?1O_yXq5Epf{|d>65`2us7)j#ri&k@DLTa z28KW)6-i}=LF%(afvV$7ZD1$wk{TfnxsqfG0bxH4DD!165KR)nX`K_GGM-xL2VbA; z_oRTfOO6x<#1r1JoZK-nqiym4#v0KT``6No(TX+hFD>OwQd}lpqx>l}w^0cVM7R5h zrv-`i70a=nrboD?j`)zBpT8t~&g@gYEAf&Fi;x8~wHK{k&Bemvj}Bq^IY0@%=xAbQ z4c8tPw0t?1C=>~zghOg}hR3L8top%@ffBy3<=n<(Qvl(q=*WA)1xm)AyYoVC;&TZ{ zV=r40kc&!lM1kWoQ*D_F8bGgw8}kho92Lc^cPC$DlUznZD#5{&lful0@gGUlgJUb- zaV`W$O=b0q=oZ3}k}C(}oxrSAxqJ(=gb7v|B*8qg*m6~!vcaMXC@+?!dQrsKeU&Ed zsv7iVw$0w!&+$WS<2ENVNiiij?tEjQ*-gMv^5w#fuxD$(c8PH_NJhIUJ?_4pzPH|J zMJuH;QA-|y|H@)CzSD|0*cR29ZyH?LIg*seX8pqM$IEifs~nd2VGZFtHu>T+u4aE3 z?1z!qGZc<>)le{Qc*OgT(-MAouG8MQ5%borXg7srjmVMLyxU7auqB^W*Z@s#v*DX- zW)?#UOSTU@uerx&XQ=c`C}|Ii+3PD|t24S(22$iYT;)$Ka1ixwmTU7reDEP7)T|I| zYa{5G>$SJsU~7WkV3`+coKKA^9PCYGxad952y<7bPMp4Ho8m3jQ)0LhC^3atNjbBf zN6wb%zm(}Y6>^%rI*5bmj_oO%W9*W#H?z9Vz6!iy0|)Q%#PwuVqaQfRIydx~249Ex zv(MM@#3a?cy@V~TBK%m^MV{$Od^bBDF}0 zxUSE3D@JQ32(@n6b*|t=0=DMXTR`3Px!SkzCHODtT(df9Y~!%Pf5E(VFnoEvr$X*Z z9D~?6{nhg3VN@bZMg9(*>@6gGVNBPbLE(_hHF$HPlO!22#?BG^W}cpD4p+RwZGUy3 zImn!tDI=^`EB*=L?km7uoTUQoZ^;I;aPRwNRw|aRY+=wm70KZe-&#~=eVxj2^q(Vi zQD#rdXCfhMoY*4E|7J}3>Ok~SonC1$WWHB?pNt>>*3@-!(ctQsgXdLFdFMv-3WWB) zV^wp3bZ?ZnGf3uwq~08$?XNyOC_rp~gBY;reQk^Ug!S6kR6n@FWVIrUH@9Kf(%T1QUPG$9ctjOf^4usl{c;4}6}+fJvyl(e|L2^sW-e=;a?=V;RM#kx9k*}?V( zdtcp0qxW$Ke!ffdyl6~7kDzeEwu%oex0!})5gY;eukA0nHGvgbTjYEr$^LpiQ?Mm? zo(cOWNN-jDvp$4>IWoX~{;%CIgRbo}~h+Cp}@qeB$yfc}(yECK!u+3fwWMIwQH` zjnWIdEG)(ODgAdH&TchC01K^3k%CtN0%7)?ZqUeCd<&7WnVX!Osd#UtA#$!c=(s6pj<~N-uax~PFE~1P z-QWcjZ}auW+1arz)-q5HFj-67#9n1YE;auGg-pNfN6z zQ_iD?XLVRT#iJ9H)NZWD`FQef!`jcU(|{sdky?|E0_a>y{9wuZ5G3+xa9e9wZE&=n zh+d+f&gm`&Na@cgVpW#%a#9_>KK+kFGX_ zST?lg7jUxd*#xw_^T?6rGprJ+P?uHSl~@MX+IMalOm^nMDp>AV&$YnfEEYM#+L2OQ z(#CipvtTP$uGo@y;6XD>&QMpjGI3{9vpG!E|DQvwzk{`Kyf|h0EFDyCu+h1zl4X2sl#Ew!jr{r@D4^5P@#%YdfDth{P}uJFo|Zpm5WOQ~VY)6cnaGd>aNwhC@$LwV<*qaZ+S z8*}!JNn1J=6UO93vx-g45c7Y%PQiY#({x&NrzJo-0Vsv#urZo0sI*Bx73NZtX`!9t z3Im+JqDNjd(IO)B#zTB{yA z;UE{)#_TW6Y%53=>@w5ZMTPtQvuRjx72wNz#oyP^E%{Wuw`uvAF39|lyv-_7zHR^? zYLRcsVr;EM_Dsg&wWL)Gj~5^1H@OkLoMe*WHo9g!%r+)SsJu8fw$ug1tI$LN}OqU@Z$aCS>a)nqJCj|6~}-3({O@2*`{ z(>;3sROQ_XNjEW$QWiC$rIw~<&bEayONjyT`cQddi1|j`k7jS z&LbNx=(DyNZQLFU;PLGvHE3B1a~-&EK^EY#a5#2-W{7jQhgBP%YfEHRWOViTf#HLn zhpc@zk2yjoPBSRKt&AW|^%0B+dFkIC*+tvmg@^TKuGs@q77VsUHTXB?;oFUP$L{ay z#!M#&NpMrcS)C&!pkZu5u`?S{4rpnx9k{ zAK2%1w3xM{#%z zO^>B%r!#L%l#(<0H!t13n%RIL`T%7o&2J8l#-~G-^lzJFDR$t5J4uuIL@y;Qra;-P z$f514%=N$=-Du!O!y>xem$n5+{--BXLVN9lskr=8HGa53fdU)1KX-&to5z#jq{J3| z@Y62WyT7KZ_Xt7XB=ft!#aSfqgl(ocEL2oY#40eNL-;PEf~Ohf2rg6TBK*r#{IR)o z6H^#uP3UzOzK8Uh0jc{lmHP_=Lm6AKH=KEYi2E3(e`wYSlgGP_(rEp@oWPYU6%z*r zld6`b71A)C!0uP-sGOGajAKV_{FF5&4;xZ_yAU%L#3rkA!rRMTD)A)N10#Bp#CQ~! ziklITWR-VS7Km;uHT)EFuVY}R98Ts}u(Ir4bmmzLo%lkD`2Em0pypFSkOv4nS!v&n zhShfyerIgl0+4DrwOqLy>=&4OefYXXfn3&EpQ+ zY8ZR21`hpxtU>fN{wcmjBxShE&={ThP6H%dWaiu3&3VCOmc`4NUV`C|b~IFcBZN$K zQg$mEVOczU6v|^orheWtU^u1JaSuX@cI+NzQa^sY5*!$U$yYV1;fymqBr?qs-b#p2 zTe2r|j;t|V=BE6@GV+#)&M3VxL;i(Dce;^w*@9auGcLyDvLt2a*5gX9yKA5y{5U1@ z4X-b2SIvx8=g;&D=;(8IoG~H`3L*$ByhsP7Q~Jjm-9xjcxoTu%;)gI!y2G=(Q3H9W zYJ~}Vl%1+Cr5f}De{Vv0C&)5`G#gj8rh^}! z_P84n?EWH{*5$AGbtTPMtVp-*-^X2hHM}dUh&(PPsur4kN%vZ?s>>z6R?)kn0$skQ z8ukOq)SFM`^Q3`|)4EsE??9L$&~!QVvCCcg0~;~FKsp7DWEXbnH3oY;F@G+%rZEza z@X#Ij>ZBIEy_{O(@er+8*Wz1en(hs^2MYo3TGXPEEfE7ED2ApVkInAYxLQbbJ!7}} z;>aj|uxM%IMoS}NU>xtsdg@9_l1d$^JGw62(#Nag&9kY)@Sw{vQx9F^n!u^Hx%z5p z!r;;_XJWgcNNCT|Hqjb2pR~Q|yOZWku50VI3WDaD#fWz7h*E%M%xs>6&g0>6W*zC0 zDg4xs<0qjRTU23HLi>TD^fBf&gldi|=bh^Q7OOXu8L<jZ$89BvY* zvlZ-`r-CD%9z4zeAi>RM)1XFHkd%;#gooC?8XxSlk3-_EqEF2lWBn9aYKCl@XsgTd zx`#j&pI0Xiv9_-LcX2RsON!`_vbxmV<@m+cG^TiN-v-^o;wPM(BS+?Et=`LCzRXym z(Y{5`_{pT_>#_ZziOYw29hcFXIE~?t#T2f0v$_OI)BG*J<%SKBSHPqXo_zOOmf^qV zDcSU#DeyXhQsOu2Aff%Q8r~&cPI^$))*cG2*zr69i(&3dlw&cuVTQ5|^Dtqx;Hnyu zJEOoBX0(2_CB;?XW~4Dhg<>I+`>}4cSu<^u!jiz|hD@$&1#?#9*xp_LK>q`wrYj;v z`O5g-I)yBsac(W^B}fNLg+~-QE5}ekQt}B|PJ{K6`)JZKQn%}KooLPx_dzKD$ zer9VsTUMk~YW&T{Cmka~WsiqH=E?01)`?~mq+Tk94!JRe3L%p5Yym)S&0-wy%fJp0e#Zx034B*KiT#)GFPixm$JfZP1F60!s$P7 zh#V~5LA?KBTcL0xR-ObxU1s_OyN6ZH&)?B(nCh-{OG_1MQvNtr=F;iY@y%eQlKr_4 z7)}}P7j!RU5Gyqfi8q{;*Pa_C&uhBV&bu!!IfuF-wELcZ4qh;gk1(P5SmEK&!YcQ3 zOR#Hfy9O>SADbu|dQDG%%1{0tZp1vMta*f6(dbs&QnQlb7q1fBa7*^JuCeP%hF$y2 zi8NzxF1GCj^jS7`(?|_|qc7oD$|;Cr{`KxJY+EH`op*2?{y1X4`Xu8 z9!ubYQ@M+<7>=#i>C>$ATcjmUa*6ajwI{~szOkNoAY}l5QDmtX@3O2(j%5EBFguto zV6F+fyT8}|gxgEC!TRd?X1`~t24f3Do64^%4;GlV=KU@2PeD0In_OvW2va+k@l_Iv z@<`N@XAcU@cy^20n#D2%H{1nG{Vdn1bW(y2D$UolYQOWduI9Fi%Gb2-EoyFY7IP=`D{VoHKGSPMuL+Qobj*Lx9PGdRz_~xn1KyOB3%|%)MzIa^rfdkay_c|d^aFms zw)gAH^A=-~Z$9Og_Ub%}aK@se9HR+pa%TiO!|DTdOlJ|f$#ZTS9fFN@A>-Nb)Vc_(XV%F-dPC$ z3Nk2z??-lr7;#ZsZHMq%a+pd|@$0=J2-DV;*C{D>W&s&}$gdRU8?wSL(Ig)P&DRjM zkwyfBeN_{7ifmmBdz?R@4=g9E{`;UwF>7-2=k3X`pk;P*x(pec~*aTgtm0hT_JqiDOJRN<(bx5HKuk5#rWnVI3+$|qu1 z%pwTYDxm)IckV<8=;q@zzv{1;SGo5*X!Z;D2fREIGvG1W@o{K$tdKiwvND~T;~?$O zAE7KBxE|Q*QW`$0A9Fov&8OwCS3DTskNggDks;;P~g);>kh zbfzAY$r)I>!q->Z`T{ck35~t^0PSBgu5ysP8q$J@WHUiGnXW~9{H9=6He4Fh&tAIE z{ryN5nGQAFwt41}wjHD@+RgHmU7}0z2ilAss)G@cI0a!U{|XtONM6(Xs%Ki#W7641 zZrQ1?DLu;{OLD!j-4JG}xVbQ)XmEdF?DRdxJZrj+L79UNlU!uaf22X-XV1YLSfzNP zyRLfJkS+M2$96%lp3CVnq_wf36Wa&V;X=Ooyr|1!?tucIrUru+%3ZzveQ)y<>nt@}e@_W;Dw6D4>zi9C%VZIhhpoyb}$8u*)KpU<4bm85# z1{2{Xg`jBHxhh3dSZ1^7h+wLm9DNQim$2*!* zvJ+}6;kKT3(`5tS#4~7LNF}l8>SzlJ9?>w~r9Iz)Pq735@;8Q+v*r>|dp)>2#Nb|G|n)Po>j4bdxh^b*UjDNppK`tTZfdRO92I3iBnQKrfz`eYU>{rOXbIh8DkrehF<=dwb$h z{de9@Zm;N@qN4PV+O<)KF08^Ui)?e`322oY5j#>(Y`TIW4a5}XN`oJq?l8`+h`o5! zN5r*bgILN6uALKad0WGb>=7A6+-nGE3W==z_>5#H=zGY}=MLfD9_Y8_eGA=Aw zYUM(G*HOt;Ee^8_9mXahcBEeh=;ZG*vgB8`yXeSr<-|OLtfOsPOcg&#Z;bLF2p4ejA;U&84i^-uU{mKs)DlF+CYiEkvZzZ{|q=yL# zwz<9L^OiqVKABAaB4!|*&*fP5YTU;7nuw&cIp5T$zXJFT46%yhJiYvg_z5jdZ}@cU z7yQg&nmD_WZ(Z7lh#c0K>)c-+8sR;1BBpUtBzsB@33F9k>^%rByEdwSbg5XIT;V&3 zzPp}nKlFq&q)IG(CRYXeijpRROQ>Y9M?j$kU*nBg?3efAx8gE1bfMO_*Q)q>h_Xkn zKD%Z`Hv9Sp1CF(v@Xb8Y6ouf}#v^^lS*q6PTuU4<^=xn_z75tz5OZ>`jpYUH zS>sDutQ=6wt(MG2zM--T;@4haP!(Tpxn+zEl3pRu8K(?~bhmKGL?Fr1!wPGlQkCZFUwr>zc9SPFQNapKiAd z)qpkKqQD$zgqHYXjE*K6H+{x_@tx{Xk-5?!u>5Vz?pCg(hVlQPvuD#|uj_39R`8OY zos-?Zas=&t@*F)?7AQvU?0N>)zk>qP518|^JDUS&ZuKWhhU$~}1CX7;+Dxmh3j-3E zg8@%xDL8nPG%(?%_aOLtwoRdN{Y;K~5B4b%!1%CoVe5IM^P#J`2Cnhh9M(S}#B!z@ zN97!6dP_+G73bk{a;D$4c4+* z+q##xe%p-u?5}3Iw*Tk%5O!pSA#MLV{P}lk`Pmkq?f0)y;gzE55FYE(xN4cKojuLp(1(_U{3x2fi zbaSoN>@KfVVi_mJyf=6RKru4h*RA0)o~s`mObk_nr`mMGU8(tvHu`jQo6W%3$XPjM z2G$~tozs<_dW*-nI(mB!MdL@e2xjP(tKeIxQGPU$*DQ#xX~@%LCLljxnk`Z&P@xe9 z1bL71Il>km1TBL#pZ#X$kIpdbEyX2e+<;jD_uWb%6oH**#QN-w@4NEPpn;%*9<~43 zY|igB0*rU1$8n#6bKRE{U{ioqp9V8^n?q#fK45C5f&q+jP>E4K2J;c6)xc;}E5%XI z7J)T7VSp_1()3ZjVfDzg%cQm5t!V13AuvB>+0+{G@-E3XFwq!&Vs+|g;HmXQ+$KUrqt~one7hRd_;x7ENMbT8dj7(Wido31FvpCHO6P$`W zQkOs}d;aotwXkvzABj~piC71W?b2q@xZpg4P9GI8H3QcT3MsKbWK3m;_rU%_#3)15 zLBD(CFxRz^!nc6Ud^ApdL#|*8NVtadHOl)_2cX+J-BqKA?B=hZYJXP~4m1%uGi^*U z1y)5Z42p3?^&Zi7Jto?`T;I67V=(f1$R11^*UzWZDo+GwEU~q9wfrLy#?|s85{_i{ zu=?MQ*!z=t1_i02R|BlZ?VYLsY+`50f03N`I__Y=PB{YME0t8;vu&mYq3MRM!Kztx zwR49YU{KozVIvm5Jw{ckzbrP+_}fN|tXj#-(HNI=#|lsErWVOg@VMN@voGEhA8x3c zZ#-4~)BQ-{_Dx%>I|acbm|wHNmSt}J6PS#)Hs$G=<_Ysw?hWi{CF`=wADXj=R=M@d z;~jbtVLCE@h)HXNWo)T=6mj7(c@#x)9441=DR0^ilodl0$d>Z5ax+W7tVwE}aCqZq zg@J=asaw}*7Zm0i`h}}{-)j3{pPYpCN{T1<$sXssgF*P(xzFzdRYKpDV*TWFu$IA| z1Yu7w-FFv5BJ~su;s!|po4Ch2Zd>?5H_Rb9il&-%f%OWSpM z=e4|?Dll1Gg;lDI7tTe9z>MJjdcG^4N`@}f`a8RQ(i_u(@EBA<&}@rRplG2ZILDoEltL>5IvSd^6*B8Zl*He;UwQVp{E zR9_^^B{g?T`qfMQw8WoycBHxXNYo-Q1X_gY2flUZjX$Ib_lMOmlkilNImNtfSg(jew{ z`V~nJ+gfp1f%UkCVoxrgI!n+zu!1c14|s}6jBPq+CKogggSt?M^442|gw#?^2(jYO zhO9CjUo#|RQL+>|#tS)^64#`L2O9aHycIQxA^((cMftdg37s%`NT+uhtfK} zH{O#8rGsXBwD?!^(1SEV+$+A%|Lk|{an6@L#`(k;N;Jt_ zYyQ@n_q?xZtEo~w#`;6=u>os@801}t5!1{&H=>iyT|>PR&Kb%}eeR5_(f$S9hK9{w z4S&}p%xLwb2X4;Jc+BPCRJ%VTzgWpc4+6710U5#Jp!&Qh%ed%*nj0JG^-zY3jef|+ z;7!P}QtY>xePMxjt(?&Jt+$~O$FViE$pJjiUPU%UMOR_+vbsiytlH@tn*o|Ab&|Y8i;9k~Y+>Vb$jctsL}vYt)iAk6T|jb?JF4 zJP^a8Kt`&N(RYjpFtpx^M-s^z7Faza93@uIye>#h375F-naZ&vlYJ9f>dWmeoy;s#GGG9 z2Z0CbHnSP)E3ngNoBSJiXrPvyWS-%gi^emxYaK_%rCQ9@}PrQ&IOnC4q17)%eHct|GsHAGLu?mKuc4vm;Aj=_6a4v)2bYrhO# z2{TAK)pe5N$q%<6X&wz4+1~6)B3#qMJQtg=BJ%i0^B#IpcSRfWlzZ{zm-t!%=D|y)T~;8Osw5Vpv#kDICK@`DzXwsUS#L0^bV8wq38gF+UU8C@OBPt)V? zY5e%!cr}_OxI^P7y?K|1o$LCDy#f{)$#7wk$v(_rE};zB)9$jQnIN;JR$XXH9wtUp zq45qj_GVZF;OLuhed~>gms<-3OPMtZxCKzG=PhtIjh+R~ct#3g6kJg#A9_3UQrG6T z$KgaM!`qfq1_6QCBsSi3O>-1uEv1Hn#Z%{@AublyZKHg1A5Q(LMBZiI@(;I~C2q?; zq;p`2{x;+7z+~h@mAoPSByx_viXtVk?S||@OZFQ#b_J)t&eQb$2&-ll>|A&aF34}e z-#QdG_6qtD9^Kt8XMD65?wFzU;%(}$-D8@vPoLfuaJ(U3r!G9 z;}wIl*-v-I+={-A#>RN;=<8T>E9g%dmKxj0?|&}J4_)nS@1EzJc9BLJsZI6dm)|eu zaduIC}YMfJhdnx5AlUoJG7#)5I?9PSlwDzUm*XkQtgHCsjGXL~#Nx!CY%K8x8q7{LdYPKlOl#mvAwC9#o zrPDBUomX$iuYQ`U6&5i)G}j$xv9-!sq7)Q zvwE&=)xq6Zj!<(hmE8M}BG^O{|vex}mZ;yC?gB`lR2s$Irge*lIi@(UM3$)oW z)(I$(i=%C9?dfjla((uNleUqASJ`07T{+-nke${d?w!;z1IHk2=}mx0I8w*r0cVH( zD6hrk;WoK@(E@iyXsmN7d6>y#aeqxqAA7rWqu$FTXQr*h>xNn2GHzq?Iwn>CA41bB zO93MYrQk^nc{lu>lCz>wd`7m=Y^spYLu<;mKV_~jyfDU}vmciE6L`W*XXqE!Q#iVW zC*mpS4!->xXm=q4wJ8RAfs4-~z4XEUF4sILS6dr>Z^wL3;iT{^Bq65&thN{1SXs;P zC<8U&xtQ_%i|WlGjct$WmDZ?{YKrKSaH%5Oy6BpxE}h?9yWJHyV5m?E^{gt9d>29S z(i1m)=Oj!WM+4Z-fwzW+}#-&Rx@_&;JNBdt2KcOWHj2harVmC9C9~ zajWr-WrI7R!qikFB=x;nAM{H7JI~o~r~r+$w>xtvt`SdzMLD7Spn>ywK4ZTNCo(BE z#s6rL@LuO^Wy>!WncMv7Y2AB0RC6$_{HWlH7Tu=IZpK1#!v`Otarj~$Yq6RYAKM(~ zB8QNG-Mp={4$Hf2H_b1~T_%}=zg+Vb&LMGHf25blm~RlKcU&Rc@*B`bI$E;+yM@{M z26%2`a_&kp8;uJ5isAU5%?pF5)J17U%HnbM1Y458KiTIPXYlbjgqzhd+AV8{uGMSk=K$`-x&DE>Zj1h>W1Wi{iL2=&C`VJRO z`evJdqnA#uz9HOh^4y@epBf55`jV^-?yWPtnxoX1nx*M-idHE0W~`jQIyf!-a&RU^ zlttKua_iGS!!Llggri`MFp@a5ZGat%n?tfn zKM{VAq2V;hx-e&|c?xeTvM*f7xQ~;phf&BM*f~(cK^#JzT7PfxvtS1igabgRSYOx?WQrdal; z1~@h`WVM72*%nJ2wMJJl)cT#MPS@)g0S{k_E<~3!nm-?DbCR3!wrcl{BamjV1_v+qHH2v-RYik350Y~Q zn~bESer#LZoF!0GCn6W}n}a`?JE)j`-hg|TJ{kAi3}I{jWBx1bY=$wwo#{dM)~-ik zjXcmu{}ZaNXo`16AXLV=y-V|4b_J(Nn$Y{_y(RkQD_0J5Qr0J}( z?^z3IU~{~K20RF?XI`hxg6DdvrZxAM@{%sAuy~R4BC=g~lV4ReB77=o`xK3pHOGH#2Wbv}?GztehY zX`hfPe!H@ZobJ05doPd0#w+4XnWg0OFpcbSep-xortW<|Q;j7aZ`ZAKO>5XyZSJM$ z7KpD@Yi%g~_1~Mud-KE-Q6qGCEE{-jkhd}CZ!@z*&)Nm8hgJ-V2A*3!f3WT$u0#WE zPm^6RbZXSK;b`Bk#S^cZ^2JC*6P*YG!f1><>~*w_!;SRUWwhuS=JuQ{8>uR}4VL4# zHSauZ<<7r_%Q|rSvHlo7tmbZv$4c2U{oUQ|>JfURF!c}}2GP%Te=g8U61H2jd1g~r zA!!#8zK0E2>ppndGyOFv8hPE*KZK&nLVi3lMRNqyz4>N zcj9+p&ha%YQ+P|sA?Wv#8@Fz=qhK`eart2p+{sLS^&N0kmNpk~ykuGkfC)l{X`xec zyJ3CA4Q%IlrRW6SKb{#;d3hCulJZ9jqI*sSu3CoY77cDXiPy(P`FJt(zdQVl<9L43 z*vKXy_`WN7{WibKAa1CQF5iu9ykKm6pnc{s5#QS%_UAL)(RiV<&ug#ArUX_Js%qrx zKnkkha#Dr=Ngwovve&v3LkKBVnJQORbPQ~N=-6j?gmfu{_TG_D&(;ixkabWOMs`O_ zzaQPWTEP&F&wUoQ%KrNyw}$m_Vgt}Su?c##(N{fJp8#Q!=KHoMC1c%P=v)+6>yaYA}442g4;GI#Xwmua3f z%GcVgs5FEVDk&zMDpHm`+G)G=gph^k{59W6?$C`V6XFZDRsGFk&ti6L4Bny-|4i*h zCxsm!_&HE|OcvxbNLhNOimi>rcYK!=OI=6~80Qe1PMa(v(^>ooIciXsbK`R@}EnF>wJ zd>gJNBs^zqetxT71R`fsaEnD~O-J632t(_`nWY~4u$~Ik48XzeTD6)?&h~!5x1}Pa zs`X0|vnNP7d#MuY1UkalPW_5Fbc>iI*TrdL{TWBWy;bMuev**4S9uAw2E!4@4^CR@ z`fFJN$rw5Ar^QJYP=%-*M0x0Z)T4XpgS(vlVCzfoxIuWUI(;EFz@V3&KT@6LDE36m z;T#=6B_3}PzIUT}jhI80 zmKwS`(H-q!Y1Pf@f{OiEUz}3Fo0Z7SnObZLV4$YuOD5e~BqV^>S{u z_K0hrcG^+1`7vC7KLOwX;h2tXq_M{zH35kJ1sFEJ0OcKX@oZvE2vw2 z6x>M6H?iW=&awh}ogAP714E97R6vq!7HpG&O|gOd==+dQ+dYGahD6o5yn{H$c5f^j z8~6lAOJ()WTo_yt*IyN$gR9ps;tKk}CbWPn%#BjA%Fpb~RC8XMLry`1@FLKJ_LBI` zZ$5b@C0je>vss%S`pstr1K#wVJq6^ZCpi3#nm2hB{t*a~2Qbg5kUEBYkIMH)b6Xn{ z8mS+dOzCDTF5k?I@ZX3ERaTXNjjjVjeK{o>tx=lc)`H*=a3cl6bc`-3F zGUyCW!)d*`&n1xq_cT9!(mvV_Rt(f-r)gHAkHOE$;7I|%|xFGOpyL3Wx)8+XsjpG11fUfv(TLQuG6tN zL)b5%QDi#`N_6l2x7nu6p~BL45t{sJ6DR?!OB0iT5+g)L7Et-M%oOLzA64=OX7Yor zmq1%c4|VxzU8<2P?G+0|j>btnx#7O}bLvq5&F3X`YyqYq^F|!OwvEX7E0BT~kYs>H zcQgv#&I`Z_OOqIUV$tm5<`W~{jO$+)^ZN#*o*#})YZN_s>X8fWZ}48?jpN{NfT;f& zRQ}V1#cyVCXD#5-eE`!6&RjMYLnsx$|2o;*+w)v`Lxcb#&LWNgAaTNT&9i_Epz{P; zHWHtVEIe&W)Je-YuFKpQ>|RLy|TSoNiAXSk^a zkhbF8xTR8th&&X}*Y;%H%Dho6s`(TRXOmcsGmXB8w$kaT=bZ=Je$m=aXnLNN#U?h% zcY)k7LrKiuLn2E)IGSm5Q`fC}UfY>Qyy<=o$r{c3X@4;SEU8yp_dEYQ-xFLA;NI?ny!8VZH&+uAZlm(LyebuP<$K-k>0&k>CC7fb}$EBvW@pcb7!!r1c4a zhwKgy$P7H>5<48w*>p8k03Ozm>E^Zb=k;G7m6D-kmqA}?8Q3#QUml$(V32BcXBqM( z`OM2tKj= zcT?-T@{4&h=Ythj>;I!Ld7^3c*ZPHrF78{dEuS~p%pVMj@>$GtgUw5}=>wAROQPfS zI)L&m@Or%?MF5==+U7jt?mL&Jgve+GgnPFDb)=we@KBDQtw*ALOjaXbyuKb2^+<64 z%b9%4t>w^{mJX?qiOYoPYZ~{$(yCaGR3hA}luWIlUu_ur;P!*{eG(mK>*rp0>ww}k zwDh|S`0F0wZ2Cyja?Pa`M1E%Dx5qBz-y+xhW%3l)B`}3Ee;S~C=q&#T(d>(%wq#4M zhsff>;V`SZ>zI=KJ;YYU&lcuB2rALE;?w6X%x|2@o#i=}B3s=`eby++BJH&@ z3*9}stD%F5rq-!^@=23dt|d}3yoJ!T8W-t2j3A}OsqN2*J(Z1Y#@X|3K7DyDu03>w zpkIx|q@1jF@Sf&zte~?Xvmm>mQ$u7mJ~WVz;H8I=r}!0bqsNI;9Lvl5e2ct++V8 ze%|YQ6%A=U+tlu0`%}!Jy{c~?rXpc*e~fqrOo*5~kORxX_zlseeokl5BKQ;MC(_3m zWr93+&M3qi;I_@>pu_)!JP9g81U!^>9~(<-`k&KTy)Z=D!wklc8xu6-Xz{OjqGP?; z&hG85X~e1T`+~U|rZ`9F$8hA{*j=`-w|1>!Oq1Qd@(!kq#~6N)L<=D4`F8GAG~RZL z^a|DDe>HL!i5GMA4SsfyZ+>U7O7W_8*N2+OQM9bxZ(=R%DE%j$f$8CpTuI1=6N>6A zg7DsX-$`Nl=AXbYoae6UQ^P4)Lyx0}qSIKF{ z8%!0Gz^E$ziRs9m=P+oo8flnZ{psr?i%*Y11|>qveJeg-kz&MQlS~=_nsU69;x1*( zH|fZl*L!+0gXd?0E!p;cX!Mq3;+fTP{xEdDp#^}1t{V(!;~#A(V3e-mx5}ZMjSYy9 zw;SS5%Bx2MiAGqida^6k@@K*LM)#@$6O!4O?PG|jKizoy6;-(4gt~@~Ssy+@UF`oZ z)t2T$)sGc1Kbw#!iQF3$Sv|*=bD+e~LX_c+rM(i!U-@Mi=*+z41C4L|OXb7U=tg1{>nFamMB{6U~=w_60cG7Zj`N_a5&uFTB zBlMwlYo&w4YOt)RDl5NdyeG$a6)6pSxyAHvHierD62pd`-lm)+zZ=KS7Fu$yZ?jcC z@tK97wCzbSjrX1J?h(3G`H9v))jBJTc00=?2hQ z@_Q_j!73QR!we@s09#qGF(fSjSe+&VcvtWU@CVI4GZ*WIn$YstcVs?pFg$ih@RQCs z!jcpZ%CNJq1}6JrRFc{sfW03+*tN7xglObtA+Bol`;q zJVI1rsgY`$U@w0a$#QUUzJY1gH0Sa;V-A+Z-kfGcm+WM^FImt{Rkyf?->j?7AY_qN z5_gA7q$!Veog;0%b^Egy?(`?Z+TT3C^a3gY6RCSX*Tl&JZ&+uE&I*v$0U2!v|~Mt^532 z^xh-ipmeOEC7!%oRL0i7z7 z$4#X-zk5Di#4_G}-~a<_r1GDjbx2B$UNrV4U;(jKvsQlaHJ75q%x!j6%;7^5tbVGX z`$t=ZDnAeU|0(#Or?p&Ns`KpuwO~nEdT@qT!ckY1N@!%JoDaSwEUyZ!ATJ-)I9BSn zRrMvXU(=mmnI+LMB8$kH)2zK}?;lgA+StJ9o4$r-QY4J<_xn<}^mrLrb?L+q_)xMZ zYuAcw4QRh{kmv^wS7?8#2wy~2`G+u;9P$zR4&uBGT#IYea7eM6a9=~ z_baaq4ia)n!p}6f_j0Bmcb}vwE$X=^0P(}dxl97 zR*GR7T+!B8)t~R{I|9-{f-#jrswANmil=xp^!?A%9l~6mMM>F`crrqpME8>WK0Y)y z=o`Lf#NvN~srX^ZoZlis(#k32PHf#-CEB(VRM+G_pY+)ZEB7TF)}>^i6w{#e6I-o^ z|G_mGkzg(EFY|qt68|>7P44c6Br3m=5Q90a`See5spb6)#~9s;-N#NA6ki#%4NQGA z#l(|D*{{VA8)1-M6^n?R7^e4biBLYN88e4_&jq_3_fPLH+`kjZjOFu7yOyBSloSy8%%^+dkO++g)02c@hYrPM{^#PjXwxSrP-6P()sd1?%!>3eF%$F$d_ z)+!Y6+#9-_&rjVPNTFoW+4gfulE4(|r*CCoO88HXNbfJ$9u?}&{8O1}#xCJOo2pU~ zifdGi9+svX&nt`>FQ?@GcQk#{;M(KfdNz_|ec`q~P(O_@c~*GhncK;KlKsy6Wd=gi z&#!(?)GSryP;5ke_l)Qj?qGexf})MKLz4IxI4^`D4(AhM(~#^5Zl7dzQP&Wbq;7+` zvi2Y}bN(VfMf~Muj<-!&u%=c9(?4~5(q$8`WVLM}%fBbaTG zoEFj;m-pFY=H%o2a?wkEp*ko0=^fQ{LTpuz;O2dICX_|Ix zng9w>)U;BS6b3W`q3ivAguJgz*8f3$x%p$L=y6AtmqB9AmL}^A3EGyGj8Y>AzP~EeHX$%O-`b>jf zbWVl)vR_id^zD+Z_ms`gsHeVuErfiDE|PCQ+u+jH=~p|ON5SWwitvWW28R@>gld&K z&pfTDxG|J?o*daMC*o}r{`(^-1_Mug-vJZoU8X#@hMv#Y#iBxKZ(XBINY2Y$ejyUF zk_g54Q{}Dkgdi-pDJi)*;ScLmAGMUeF6la35tQ~7nWv~EmCx?pey8h;fDZ@FZZZpR zX0)Y}mpx2g7fnOhQ;lXOC|i-S@%IgiIbRvf@BEP#iy5(+U;hfVfTlIv!o(Ps4#OhT z<)LDmp2bPMmNFML{OI1BQ@E|yFx?R4$`@(TGy670?>NIT&+EwjG{t82hQMJEtUOKlp%!>ZaU$H! zI8e7o9S(j8GjldP(K}Y-th>0>?W6v$ZC9#^L^DyT-qR$-IpvM1GbR zW6D43i7|+cu8K`{1G>h|RG!e2#L=v0?+KyfS3V9d90b_ujv_-5D#E6_PXu@O5AH)_ zs4t90~!&G_3CnHm6O z5=6glt`Kic>rM2P5iCUPnX*QnW+G~+s7I+1t_qL~B%yt&nm6(h-qR>Q=A7Aor{OTjc}G2gXDN6(k-l{0YYhYY+tw4ppCmd_Py0d9omd@iaj=<8`V`$ z%}D-|@XtXl5$dfz6#bc(?W>h`uB*#ehDUC05 zHj0Ufzhi48FuB+?l)Q&`g`2^2gI;0GN}#vi;jf6-nG7c8QrSF(Zi=q+yVt$NO3LQL zQs~PCQ!=-?AO=KyQb|-c@v!yVwi;ze-zd>OmPB zwtlHVHa@2;Hi#T7R(t;MY1!%L`_Iy7G8sE7Mym0{o<;Sd*zlM0P7%cU###>4Ft;A;o3j>AN`i(D)Jy{8R4cQp|7h*+=6A?CVgs?pTpd`KLy=(|L%KK6Gt61hM}Kq^GxFS6@ndt6ij_r~ zo^jLIi(RD4RV!q!k&g6DCDTp`o!=}w@!*Jseg7-OcBpPzx-~HD0!}UU@yvaj`Yd6` zqkP?wagGpbg_-(pc-H_mx0zCtdHN$uzQiS+vbiomSSm!;p>0D(Hb&-15S_~UxFX(G z%9y+CA=4C~2(wO|u6TQ57tX=i^pex>_ig|imaI;;c@J8-6hd;a-jb?yU zxcc*w7*jHpVgqNT^+%s3uf!f{;pR|0WB2r|6(pb{U?Wd5puHhOLc~YVN*VDk^(8W_ zN3`XgZ6azB$;C{`Wtc`CI0i-r&8>xM;Aws=Di}zVk#X@ zk)Q|Z8f@o-!ksd=rs9SC*!rSJ`-^?h64!1sc5N#G<5T)pn0>cI7c}9|sWcQ~E-A$_ zI`;RfHV$s~AC{H781`cn6`x9zxiFH*(M*uK9Ls-|mPHV-B8K$DW^B0HDzIYZVta7{UeSZM`uh-rDF0mpXeOybGc1ni%8Q_fR z*$z&1_yKt~ImtIn5rXh^ZxL_*zU26TcoZS>H0-yn8S!~9zqS$6p(xw%pxe=aAFpvi z1Ma0i7^g(!(-@)|^hUi4<=I#c?Gx`<-mZrj6fbLoE1$V)s!Zbjm?fD@l*3xpa$CYCO^EEn_jev*ME{)60dK*zAU0EXO|A#T>XxKV3QbG z23V+Heobayn*0XN8I(3-2;edo{~CRDX)IVF5zn;!;fqSTF_#x>D%0jaA-adX+md9w zk)Vfj$Lk=4VQN^05K2A2ZQX1{9fEkWT{o%s71aJ83+e$MN3mCY?{`4jEt3RANiWY& z5eqii+qdR2MB@+p7lbPrUDKo-ifsWJR_PI#wdQvOcmqj7(W%Od8TJNJ)x#t8_sGS5 zgdhOzwdL{Ccy-1Q*?#M8RR8w-vVW!$i;XvSbnh4y8THW)JTxy{T0g!EzF8EqFPDMR<`J;Q~RVs5!z}4^s$8_LS%Ro8t)8l8Qg&&nJ4`RO(GP%Yru{jK-#K*v38GjC9 zUp>thz1f#_A`g&sUqOK;bwmXH43J>U!F&1QbwrcF2HS||W$RW<=*y)zZ*L6*jue#k zkCZ(CvI}W*=HUnCi?5E^FCVdZ^>cg$yzlgp>!Vg)lq7yDhM zj*S&6=@w`2AalOMv5Fdj=XeK=$w^29aFzT?Ou>!fI_cKGCOTL$!-x$~a^)4*iFdqemG z=Z;4C39zV`ygHv>o`9jHD-oEFr5U^dSLR%6^)d!=JR%m;hU&RzWrfym@R!E4)v?uX zG3z**%$nF-QYe&MvLcm$)-1;#$UcOF(xV$tWY`RwyFU()Gb`u#mFty<)q6+n1P;rv z|40Dm?Pn-&XZ#*04f#>^HkvEl^?i)~A~6}3K3jF^$`|t~YA|Ha2ifPEz4QUttz5d# zr8T$DLFcuUos7>Sboys2Gy08JdW-sOujJt2drmeF%V{(F=sLEG0I;?SUfyGZyJ3$& z*)4MfX3lDCo$D6Fr>@`)Uil9o*zJ}a>CErceIfLwnyS`MST&ULv_Akk1i$HCLh_vD zmet_*n|sAExfGFJZ`Qp#uX9J8{n9kH;2HWMn&-lj!ZZklf(`Tt_r~ghctsI23s7H5 zgCb>JttAS z3K3vTv62vyvxo+Yv%-hT4JPS`Ya7#Tmq(R9pc=GeTzp&K$1xE&DZ}a{AuK}<>3v); zUrDY0JOt60Q4MQ>U{^Akh}3>>%XMhRa zf{a-~Yw6MPLe;J=SiC}J1O;rLiA$q^zK4QUHY?5tJ>fGx{vZzplShhOqAvzSqTi*i zWVXpHZxd~ed#tvoF}!J*FYjuy1lsb%$thatPwH_9At&t3mEd>$BO-~CgS>rSZiAgQ z9ld8y+jymL!1VjFEWwcSD_0cbAF3&vEcLMlxc(Z+&>WE?FSVW9h^`Gl%;VR*xZwblKp?iHnW6~*L*pkhcYH`KVkbVnsGik*sRozqT zK*g<_!k(7Aeavvz&yJ)UCXJ59&DebU(%*;~o! z;1HsqoX%fiie*E;OQ*?*jrjOk*@{I_SoEKz{rq^H-jZe)0zSeeW2uW8S8;5UrTl_b zG|7#pS&d>i@-0P@_rc*Tco@AR8oaNJ!~)-iO*fV~nyf(`ud?M_f{czP^%9^K8TccS zNqg^~c+fD@l;huR5wz6w#ME1!79+v9}XUpxVfY5`S+e)E~F0Q z+_}yQ*H#3176!G-)a>7nI{29ij#vblHtJ2nVtb{*Dc(A}_WY&&14f0S@aDoUc**dt zq)f6nVUd2eqM63J@Q7!t8oOx4a-5@VVo z#wAMZ8Bo;G=L=>hADHf2>Wlk(#kWbL!@Wm6hdeps2*sqJoo0;L<)bq6e&AoqF`LSpqK7arMHoZZ4#fmioZ8S zp6h0f@%r>xAU}OSh%q15^t!}!7Hx}M4AjF1#8)#{R)2h)o@8Y3@D(Nbz&6TiF$_=XzN&x4y_>6uUw^VFR!$RI+AH#26nw=-97aA8+o13 z`&k0d>EF&Sa-rXAHK}D4eXi*a561d`GENFzd6^IjWKWA{!b!e49Y^=O!dIW3`9{F+ zDNyTzq=DN+0|LV%K^mi;iYCv}-5MCkRq#+5B zT-NsnQ;bq8!OAEb)GsV?#4tufk90D<<{)La}%xRY(R;;A8(=mS-!T#vpPg@O`^O8S`GGT2b^(#^y<(*((jg8fd^Qb zD^eXvmgH02#|uNoUrYR;!?lW!Wn8l>lKb*7IY%%UKkJ0o)A!vpw)wH;1>Ahk2C8L&Rux{7S*+u=V!P6v~irq-5n39)Vxbo1C4XL!npGYjyVsN$?uzRQa3ADryi`%wk{i@&>#)Zjz z2S66cPH2;sGNDDO;b$Bc<&py_^d-pr9=^V%QOA)8H#(HRRi zL8;I1*#{+1n(YzJU)bK}&hC@-%=*!kb2WbYs^#EMfG{EK#cG@1#w$nKTdKd}61RzIw5RdLh+dGVp> z#905}GBEsU`ua?fz*}54FU8x6LLvA948e#lOqIelLM&r;kLL#b+Rkgs$tK=Ww`rHp z6exVD>UBc=j_W%u^qBcVa>=Be7`M+~3k4(|TTz`s&E7G!bz!a>SbxZFitpP0HSXVZ zUXcviFRrI1a2*qkjBKMAHL2FK zQdKf|T}?s9>+8`!#Y{xfjFUhn;0R>HP7q}o5061(IF>MII;Vp7%8HJXSM2&HP1|Gd%cyF-mWv&;aMPfZ!5n6-7r``|90!ckze2&m)BQ#mVJ^X zXMmdI&VQJxYTg!8q;0_`{`FS;69$#Xo0Shd?H$b&sGRV;qU<^q{cQ#V6%2ohmPF=? zn3%~Reji4Liws|6D)B$gv$M&R1W8yF)qN}6QPhmP?#t=cevaUlFj*c&=+#Oz<#9-q zR-Bknuxt#AZ{rsHg~xO#v}p|QLjh=w@l#4Piy=)77GNvZtD5nVHs;-(>m7Q|f$cF1 zL4X-DJfAG+3?}xG_v)GwEA5D%pT(VLbc%4E<^;!b(1_1%@ws5{j?PUTDWcX|lBuIS zmUvGYxag2uwL2%#>)j#KGK?MkY~S`HPDEi>=iF-_PBys$xd0cuys+@BWyBs*b%USn zctO_!dKS{_XT=)sC^%0D1%VUc59?*>YYJ@TWaL4W!*fjE$_;tCO@8P`oJlb99AX%= zq39M0%9F#{vqKLKWXj(FdbSJ#`7ekMTI%TFD2I|TbDS}NVR{2kA@eO$sK?J``ydR9 zZ%@2GB}falD8ZjJD8#t^_cOB$Q4`wkTX)gPi8pl@MfQoTl*Pqh8a3yp@@1gbE^3p# z5v6b@0rnxSLJ};Uzx&X)mU;?2G!v1C+wjDgZ_V#)kJKW3)Ha^Ts&M656GETb=xLoT zkdrGWp>JLLB5RqTyY4)2UpKXQXv#HqH1BGhzLPTQe%I?&*)ywm4Ro(q1o3w*Jv7Vs zo$lL*jPisr^rURTsHWas^GQn6oIOj-R-=FdDn>-xByup zRT^%gn3ut^Mcn<6b*)h>L;u(0qs0ThL!$XRO38ii7`V(U-3+AU&aaQGgBDH&>7WJq zfgb3bxS>{%F)wnuMduo|M?B3nq*i~I_vwaN;(LlPJe>bO&q3dW z!WMdKUv|aFyfKzB$r6oZ>SwOCocEqb&9T5+hDxqB4Ah>ZB*q)ad(TfZ0^hTbZQ3|E zf6L4SOUdHn1qII*$($-a42pW?Zl+-PIkUeF+HtHlHkcy_k1=TXd}I7TSTUJw6x+gX z-^&@yDaxG+x8)^k>t|C$*%fti7-L_1wzLTv8ygtrjIDQP^7CoIL#v~RAl`05mt5m_ zN6?3_M1>Z6t20wtlUF4yqxjJjGcAlk*Bi9obXFJdqpro+<}O4d56X!Kn=JZ0`HOFj zdTyWTD5iHtymaK^JWfQNEwXbN+w$BZ;1RPDDHQ5^rxj+K+BNoD|8nK`P+hM{Q-(2# z72|Vzatv{QiP|jpE*YpgUi8sJ`QrX_u{*&sxPItmiFSYo39mj_66^Qj-QQw;OkqM8 zn0y+|8hn50gOmqM$yb{cT@<#PSoU|{#7bflnBm?@bAb1KqbKOYl zDG%dN23sq&SS7aEbYnPBLw5J_y|2@i_nQ62mXRB#pbcZab~i&RqL+c(^*F@;9X14; zjT*;2w>xxIu~Z-EJfjbq#ETFc#YV}vhxeRy$XzTRN*0!mh)WM){(Sl{#0y*A04v?8 zUwRRviIRG~tm3oJ0=d*zHFSpp%}*A* zVqBtrZ^-88-nV$|!*K>FS7w>BZtmI-zcEb#`DamgT+mH;E|wqdO^2K71cBt0}5bIa#KeJJKUs87%7|;=O8+;-yH>sBB}TIHXtDj_&m=OEY}Sopk$kFC&8d%m15sVcdwM2(RjNg2WQ)Kw{H2S^VswcS>0tYx32@UOdkuuEk$V-@7?Y73v_f z5bUk2`i3N4CF|8$vt=a(I&&12HvB3u~Wq_G!si z`?CpD_?MPU%-k^&^FMA*MMITThweO3EvCrUx0h(8hT=sRwyaX$uI#3KI+?DT|GwAw zKg(+MSAhsMIt4D+C%Y?+Chw9wlf5BqNZ}bh!5&pQGrw7EH0@tB?1Qijk-<`&1yczy zhop$Z5e3^1?qBx{wzUCzC6iT*T;@->dLzeI+di-!`S;;3nsd_`9YM)}{;n zg(t8&`$uaI_LrPLTC#V9H++185rWgZ!a75pGEV-F8nv0CuJ9g*ZDondW;KJ%Md3DY z(xr z>PCxX(mOTANIz>Rf7_G0&Vd}^{dl7h!R=A35By6C$LXgYeqi?f*5qv}bs1dSp-S-Q`z7uHK*zP|%d&*77-+#e9!0HUM0*U)F<}1E#n_ z(;3iJ-cO||FG}O4ssDqs=S{XXfv()v#{mCP29Qd&-B?_U_+y(l1Rnv>rx^j{^D;n| z%E48MClD73+{4j1?v-DT8MpuFN-c^Pz1&qbILZEVQS1*!eQ5Fn!DR0vs2hq9)Pw(P z!VIWUVz_B(Bt|&U2DZ@rngV~rjNMl-3v}Aca|coD;*Jm1Jzwteqr^xj|8E^*IPnm? z)q;T@AScOyX*5hBh?@!ue|bE~Lc_PbWlPeH&y|)!5MiwTJUjMQ2HfD=AFfy;{5v88 z+D)Zt0+_DZW$Lu%cgXGM|CJ_Qb^HI>`}4c)85rxKJ?efStDp)7&uoH;C4lgDL?ci? zWmGB!0WB}uU38jVXwet@pijIM%wH@1*`zJ>@ooc1R8w-F>_`c%yF-K=?5y8lgFSL zvW04I{j??!I7Jw$Gvqt4;A3o1&j)4nZ6F#CC=B$of)@lRHqsZEs`$QU{qEEO9580;wo9`gp&16=mg zS@A(zvM==*y6fCRG|vMzCiw)vS*Pw>_`KZ}q(IZcD2J%VNiYfWijvy_(RUUKTa-@A z&s+W8FlE8ug7!G2AYe1661sgEj%$8u@J2M+)C>CB$6xZ-P5U_s@o{;>6ub;SKX6xd zk2&L2yu&72e8iwKR=*N9UM7gW1vQ%-9hrfQ%5Q%^eFKla%HA(uwNhSv&7_-t=6lKC zb`z1XEO5$=Kcwwmu|0e=;`f$74{$uZk1*1MM{TozC@o)?$u#3C-yPqQ@ACoMRAIbW zm(W`{=gfzvcNk<Fj>W7_uxo^@V6wc#`wy8e5k~&40C`V7xS5IrWbgC-;g1`!ld(0rF??qEWig?wSJ?JKcPai*^ zLp2ZG6M;?zV;(DR#?Q)|mrypsfVsDiG-(t7!9nmsm@}&lLxkaI!w_*}3_LA zGJ!T|lK*YqR(|>{ehld}r%6mzQV0a=))(R1E`PeyLCelH26vYE zIWW06b(s5jOu+?3Cgo%!9R^t)V10Gf`a&M7E2&yUq;SVcQD9o`hEAIP6ZDec-1H57 zjY#I|Yedgeb(W?WHr0D|V~7!8ygH2`Je7w-1Z(}o-+(7%Pch3Yhwa%8}tvU34EA-sKlqSbeO)pxH#g_oEbr|Jb3%w$xC`pyaed?-)u6e6-=fHjI-{>Br%A?dl5ssUdGf-qdgG8ZMAXZge zYIJ%e9}-)3kYr`_)hJ-KV#WifuEb_1ekA|JOV$kzG$#Q$GqbFX#6lDU&wYK2>(=m% zH1@ltaJnhz*+bG2U02$t9%pVAG?XVQW;D{B^;P%xegB=dC3%|gPNHtQQOd_RfJQz= zYY5sG_I#D7D4*tA6dtSEPfD1GLE{oFVCkeKmL;+2zv-oyar0Jm$P8r=or4s_4N*#5 z$dK~2ZfuhB+x)BeXSJt7v}2<5wpgR9V-AuloBa*-udx#(l$3D^AFUG-zNP#AIGaf+ zI1uM9!Ku+BaB7WC7+EsNV`Wn|4=}y7fkzEJ5DFzi`-Ls{W*kfsRP1Qi#Pha@^%FN* z<_WPX5`h)0gr9^aolFLFb_4;>0}FJSLLi_Z>i~7Y9=dUXNy_1?_Z4MZZMP= zm8Ve;Su2ht<|dnVs#KTxGDnx*QB|ncrPgS}dqq`wRu>()mNx7-!>OzC!Nu`e1WE-u9P{bn zlx#C&#OG<4-zB?gW@c)gWKTQ5*T?@(&D6S9@C-zE!vx%UcJNUJ^D$AyM3(9v|} z(K4ePM_gOY;jlvHYI!8{e<);4RX1$HbtBy-dC;-O9!KQ_iD4-Z8?^+*%> zs22v;8A~NN`PJ8*Uv>_bSv83K@b8Y2r=W&Jz8Ys#^{LL zv)?A{)OBcdB2tk!nFEj+jsmS|x(L?8bo@HD|L3@~9{*W~-TUHS>yZB%2I8i#Lx4Bq zft`@3g{%|h{fx6d(xWxwxR4$aSIR(Na})YX`l36|^=F{}5ot|coex%^k*5*qhRXSM z9sb3SmR^GuJZ+KxS;{@ve3NW(F(nm+Ld`tcKyjj zT0q21+p8@q-3myxYt7xB9*vw%bNaqxgb4(E&EDQ|s-4y)Ze@U=DzvAY&Ei z7~UYGnQo&AX)aUkiM^1Z#3%>jzaSaNFbT3N(VIL8fRr&m=Rv%sGd}=nLC>LXP@2g2 znaw~Nln>I7ic&mcLoEY?>$Omx2S#W>|JOZ--87a#AQI!64GPRqX}V=_Q@vpZFczaL zPmCb}eAi9A$%T_ap1nosWv-BAakxEXQ0ZuDoo7#$9)5IL2-BzxVTl#T`17-v@;p?wIfd<&;#j50?G_O$3oqMJ-ZFkdG7b^| zdoJN^_#%2WLl_AEqn=#kqz0F>d;ac4di0L!3C0T@3@R*c5ellVyzq4VuM^NyaDgo; zs1mvd6X*kBg09Qu0@;JV<*DI$=Pg(7?Bp|&m?J|L2{v?h;Pjl=+;VT$tnqLarV%k{36U z7a-ft>Ywqudr|)n@wJ(()XYu98r|c=s7Axq3k~BnOF{@yj`C4Ytq$! zt2_wns##k*3SN=Nyu}K5#ie%PS(#Hb>7R}enm*yW4&!Hu9GRNOy+DY=s7;45SKir{3{e4;nm3Y_ z=d#!Kv4kjOoc+` zgjgsunQPwq(FrM=^4=o^3Dy0$#I@o)#&@f&e<=X_GmBLqW2Ow3H8H)d9rfWZRLaeNMohrX=`R{c)M-$fz4Wj#GA#bHN{BX) zwTDV>OjSoNF457w^|1PEGxE=mbkdiF{(}KczR-79I4*i!Sv1MrTsAy~EC|Gwrjb zN~qcM5|B~%4xE8!s2FHpocStNyYz72t+l0tbT7cX-DgqDtVH=lDPd{<%vswM&+;43 zuUJ$Au}H)9+Q!#9h<|1^w{^hVzih`^$NKTmw?i*jzg0mb;qT))N(dYk!K^TLG6s32 zLlpd(9+$zJ zq0yp)if*-$Ow>k2XGc1?eA}gcG}rn5x23}Wr&8np-#=gJMoJ52esk2!YXTv~gv_Hd zG>Pev%5M<9G2=cWkQUS9Kn6}Tj4eS77c!3%$nMHuBDui3Rhztlc8M1|jUWV!-`3i6 z0nnAfWMYL2yskH74r1E2cmapol^~L&x4j#aswG-svm9T$@mc|5Zw@%f%YC(kkUjpO ztYB~@WJQ?>5oy>|0b1Nxv70;OC6Gt2`+*w6k%``4AR=Lz&wno@f#_BQPS!1(iPTmK zG3TZVOlw#xzX}ET70~y-UU#k_#=*}K(6NY?#HvvmMGEU^dSQ=O{&J4y4b~_bLl)5F zC#sGl+NT&J1MLO%jnTc=8E~9}UA;E@NI)KLw?EKF+RA6G93yCUf0c9yu7qvPL*IK8 zQ52h<|N2a=+dYK2D}fO@P z;s?)r0G%2f0VQbTI~L{7&y^aYL0QSHY@b)wcO|t12sfs<2>>=ZK)U6UKv3?15o?e_ zwqz2r=N6fbGGc&xdgIY4pJf6KgnE3oC|N3qy47VFc!w~rNP&(BMJx_i0{vC)7H+@@ zh}O}ryxVyPNP|^;@NixZoI>QrA|U4LJ^57FAP-VFhX5eKfU7GPOkV_s?k4=7R$03w zF2mW-#ZXyl&{`S*7N!jJn3U{GAMS3vfUu*(5^|dwy$mk^#4tvgS#&OBKjYMLFw-!g2{+ zx4G85xMv#yb=dKIP)*lY!dKriDF@#72I3Mh`H5&@-@g-9`T5zpr?_fS)dUf^gOK^H z!dz*O0c|iotRG39k6fw&+O`)o!MBmVFTrz=MnmHcV5X2R`i9Rg&yNA1QpToL+zoeE zi2$@if++*o{MxN`RsO%!{}SjB^w!r{P}e(3zqQA(i|5O=O27-SHa1BQ6-0Jfi}mE(&! zo!h=4D6WuMjhB`vT;f-}flZHS8||d1kO?MQ?h;T z=b$1s&k%UPmajU5&X8D%WD_P}kkVl>TicQ>%0qSGG(IIv4t(cl8E=%aYOG)yPc8%J)RodEXO=8|n2OGGHR z+j!r)bAsetVU@|B{QD=(}w0Q0aecUUz0#UT{CDo+cl#p%@|ut?~U6-!l9f~Nq=RB$CR zCIB`B6_lTT%lDY8txX=x*Iq!8VZh?0ZvqQmg~_mgl_TVeB5#EKd$-f?M6uRij>frV z$&A&)Pw+16;Mgziq=KB+L0kP$!2C>c5)IY~BkpB5>XQA4=)3WtdU91uo?t?@P`bCj z*l0XUtYHVULMPwcy)46k=uiM;y*+rAud<_8w8sw*5!Y1wF9sGXDn}my zZI@pQ>}t>ABu*T~w=90=X3Kr}YF*;$QT%dIfv-k{7=9nQM>ZBetnwNH1 zDyT^~8ZF2rt`i=4L5<(cp6mO@X%@uzRF6Tc@~8!oPsrLTz@tt-%RIya0LeqmP+wz> zQ?`Tgc0#p891M{h{JFV?KXQnWThgh}3uQ&+FQ@5FiaXv?_b{A`gc6AGP}mVE*8Yhy zIbLrQs829#N2cZDYWP!~P91JIORMyh2z~iqZAN8miDRjIRSq1AFO#8xYdQK5B+h1eRUGfnfdr`dEE{l&OeKM1@QHElNZI9Xl z#QbtL_;KiuOF3c!kyZWXua zMxioyzi0peEw{UaWFqR~-@?%XI*PW1R*vzg5=~A*>_L9y?RNo4{(2P%E94co|M?X` zt<->R>qJxf2Y!@1<386b(>3I)%aeGOtQFHW_4oF2vK1@gr0#x|{LwWMmGnNcW+&IHc9)rfF_$BXKupa>(=(PPMbCZIx94^@kt(CQAgv&0*$~0?>QEh z$Un+Hx^?Q~(8iXmo$;8>$#C{#PKBz=p(-1ecT51o_EbVMGtMGkFx2E61)9aN;h=1; zF5qLwsrKjn9{}*mTWun4Efbiwl>?7SdF52n-8bMZwrpIFB6!*sO2*xv41aqKyn?o8 z&5^CsG4}e6ya&T>StQs}xr#=?VPpVJ?v_fbY9o=WCY9)~b!$|``I!dq>Z!W*77r=) zjE*12c#Y;L3(38A&3%(cQ$s_XgDU+ptCWnkoAhe4nf*y4q)J(pW5Vy-IdAD4bf|g< zbk7@vgL-zu*f!P?Muqbfh3#QtCCq^mp%+PCO`&z2V8W2qQ;}}+Hnny;2eC=k+iU2z z)aD}L_2%gp_dXndW&^o;KtN%Qz%o>z?&|=u)Ty*AheGIe4Zh7t5;Vih|2gV2MpoQfaoAoE5)mNs*Se1F$)s(TVk1u=kWO$?2a znGawp2HZ)k&r*l6Jr(Nw#|-f!cFE2+Hdn2e792E5(UL|pNqy!4!H&?SFF#Y)&m*pX z)O&ife%rNjrtew}7hyRS!T{yg$%Os(H5Aq5m6kExz|rQF&Po^4!HHKhy-TV7rgJ~P z-OA1q0ZVhr`fC5fXA`MwKY7>2aiuS=zDi#{l7zD7DgXf#*e=mCWk^y}=wzfH3jHEQ zs{J9Uh!fK^5R0w9(q9UeznjOLOBaQ4OPA((WShtna~au&Sy}yA+TN9e0o$~O##=2a zTSX?|pacUY^%la$MXtW!lu}-Q&8^J8OoMFVy#QUW0!vZR3q{IU<#~XbJVjfeTE9A1 z*bvbhr6rn(*~fVj13WFhIKWyHdGg^WDv%Rb+H#}Bz1#jO@RP=^H*~+!^E^N@+jjnp zicbHEbM>Y!!FZRlCMmzn*7)X}B6>7a!`CwKdHNMPK_%~1d{xa3>-_82Tw3_!;W=R= z45drZ;S7p64InTvNc^yxr1vJ+Q}g<6xo#fWF!f)H?cI0!MNH6p095xIr=fvl(To(B zaG#Q1cx+wg3D|ht`$Q-|hV)PpYn==}Vx#40l>#cRavDj#%+^(?m@z+=j^aqu9veG- zd&$i>Mp8(7bd+7G@K{d_m=3f{7hHAxeS9L=1_LdT*bs{=-Iw&~g-m;-@Kw)HF(-`%J@D0Bw3$G&%ET5phnn-E z2@vSt6 zC72$iRFVhYK_fb;yZL}2h*p}U*OEq@S|v@^CuioNo#5Hcjz(c(rFMH11Nu82@-lNC--Q#sr4Fuqk0eyAX;M&Wmj)0=zrqcSibiqZ%VK6qD=M{d~ zkNA!gF+VOQr$wkgRYFIho=6%czNGZsn!gSeZ`(3RvonihPDCyO*!ux2egS0Vk&a*% z*HS~VgWQH7)UpoagN#h3A$!sZP+1*MFR4OWsd2Irlvc<2`CY#DzOG_$72ZA15P_g~ zEdI%XQN|*;{$vC2x1%pAQ*E7+`2@tqtR}3g$CirMa*0sEep5sF%fJs2nsNp zV3R`_4YRYsvGUIWfsR}g^IlO*@o^el8HT0O6~ zXhMfx8Qa!hr#_@*egizq=-?6RxxU@2S$oQ#{l`yFWj!f#-k)IEe>=lVUFc7dR9x6< zFC8`i;lsZfH{7qXMOdY}H3U_T@c9TGB-&t!toW+;DW=3s6#gs~k)6;Pg7Lu9&+A;-5_jxH?rN>zW z8lZYyXJCUoQ_@z~GPb2Zx3N%wFP&Rk-S$88VxMjs{sc6|>I_&;ufI$8ylA8E`&z{? zb!a~aYTSz}0Q!ZxdE-X}H*>{+-K{W25;Sm*z0dCg+%ZoVuDN`5-=B(DehH7M z4+pl3z;`!oH&848{MYtz|D)l2ru}CQ^6H45N>*c`hF#k5&-$6*Wtr;va6)qPto2;B z^)Ykb?b;ND!}xAf@_I|}d-DKuzipg-0C_I5*H6lhIY=`)TNH^7l}KW`_dy0cIDacZ zPu(2Yf~8+Wvf*9mPlt>iya7A^&DX|K2-V>jey;B_4&ls5CHSrW5)nZhZSiLTVBF*_eSmSUa_y9LzNew7dvb2ITG%0IMyg~R5mWvd&;=? zY))=coYdprr5vEIFRp|RP5HFAF$}Lp^%2ee!xU3$eb$Km>Q3_z|8szr!8-y~s8zzd z6vn4wuix1&AGiDTz-dMUvJ?!CRnAmnUMpj8U8i{3c{{u8!ZXQ4%!^&XMiE&Q=2dzC zfw)|Y6{u0q(i14&h$YAMSBDx>7WrpvqN#L`$)yh9e8TmC2su+5`bmFt8to9 zsFZ)<*?XUR<~zGD01D2m5oi~6e9FN9$1wn@h@>^r|SYOCcx$_Ti|QJC-Bv Date: Wed, 29 Oct 2025 10:43:37 -0700 Subject: [PATCH 38/41] remove empty dir and files per feedback --- content/en/building/guides/_index.md | 0 content/en/building/guides/collect-forms-update.md | 0 content/en/building/guides/feature-flags.md | 0 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/en/building/guides/_index.md delete mode 100644 content/en/building/guides/collect-forms-update.md delete mode 100644 content/en/building/guides/feature-flags.md diff --git a/content/en/building/guides/_index.md b/content/en/building/guides/_index.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/content/en/building/guides/collect-forms-update.md b/content/en/building/guides/collect-forms-update.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/content/en/building/guides/feature-flags.md b/content/en/building/guides/feature-flags.md deleted file mode 100644 index e69de29bb2..0000000000 From d6b1206502795be6a408db60ea4fcd325992ac83 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 29 Oct 2025 11:02:34 -0700 Subject: [PATCH 39/41] add front matter to helm charts migrate page, change weights for toc order --- .../hosting/cht/migration/helm-charts-4x-to-5x-migration.md | 6 +++++- content/en/hosting/cht/migration/preparing-for-4.md | 2 +- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/content/en/hosting/cht/migration/helm-charts-4x-to-5x-migration.md b/content/en/hosting/cht/migration/helm-charts-4x-to-5x-migration.md index ae8dee643e..aa00f672cb 100644 --- a/content/en/hosting/cht/migration/helm-charts-4x-to-5x-migration.md +++ b/content/en/hosting/cht/migration/helm-charts-4x-to-5x-migration.md @@ -1,4 +1,8 @@ -# CHT 4.x to 5.x Helm Charts Migration Guide +--- +title: "CHT 4.x to 5.x Helm Charts Migration Guide" +linkTitle: "Helm Charts 4.x to 5.x" +weight: 70 +--- ## Overview diff --git a/content/en/hosting/cht/migration/preparing-for-4.md b/content/en/hosting/cht/migration/preparing-for-4.md index 277e43ff83..1b9afb4d7f 100644 --- a/content/en/hosting/cht/migration/preparing-for-4.md +++ b/content/en/hosting/cht/migration/preparing-for-4.md @@ -1,7 +1,7 @@ --- title: "Preparing to upgrade to CHT 4.0" linkTitle: "Preparing for 4.0" -weight: +weight: 60 aliases: - /apps/guides/hosting/3.x/preparing-for-4.0 - /apps/guides/updates/preparing-for-4.md diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index edc0d76570..259be26ffd 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -1,7 +1,7 @@ --- title: "Preparing to Upgrade to CHT 5.0" linkTitle: "Preparing for 5.0" -weight: +weight: 50 description: > Steps to ensure your CHT App will run smoothly on CHT 5.0 and later --- From ae895a657f81e16f8281e4c62f0068727d74b3d6 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 29 Oct 2025 11:05:43 -0700 Subject: [PATCH 40/41] remove note about self hosting in 4.x per feedback --- content/en/hosting/cht/migration/preparing-for-4.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/content/en/hosting/cht/migration/preparing-for-4.md b/content/en/hosting/cht/migration/preparing-for-4.md index 1b9afb4d7f..8fe0a84cb3 100644 --- a/content/en/hosting/cht/migration/preparing-for-4.md +++ b/content/en/hosting/cht/migration/preparing-for-4.md @@ -12,9 +12,6 @@ description: > --- -> [!NOTE] -> This guide applies to both self-hosted and Medic hosted deployments. - ## Introduction Medic uses [Semantic Versioning](https://en.wikipedia.org/wiki/Semver#Semantic_versioning) (aka "SemVer") which means that the CHT upgrade from the major 3.x version to the 4.x version denotes there are breaking changes. The key to a successful upgrade will be to understand and plan for these breaking changes. Aside from the Docker hosting infrastructure (out of scope for this prep document), the two breaking changes are around CHT Android and Enketo. From 6dcdf613fad9c7993ff8c9e53ca3fc5a52c22649 Mon Sep 17 00:00:00 2001 From: mrjones-plip Date: Wed, 29 Oct 2025 11:10:41 -0700 Subject: [PATCH 41/41] remove confusing line about language settings UI --- content/en/hosting/cht/migration/preparing-for-5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/hosting/cht/migration/preparing-for-5.md b/content/en/hosting/cht/migration/preparing-for-5.md index 259be26ffd..dcaa5e91b5 100644 --- a/content/en/hosting/cht/migration/preparing-for-5.md +++ b/content/en/hosting/cht/migration/preparing-for-5.md @@ -55,7 +55,7 @@ Background information: {{< callout type="info" >}} Applies to: Instances that enable languages via web interface {{< /callout >}} -As of [CHT 4.2.0]({{< relref "/releases/4_2_0/#technical-improvements" >}}), deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). CHT 5.0 removes this web interface to enable or disable languages and requires this to be done via App Settings. +As of [CHT 4.2.0]({{< relref "/releases/4_2_0/#technical-improvements" >}}), deployment administrators can enable or disable supported languages [via the settings file]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}). Before upgrading, ensure [your app settings]({{< relref "/building/reference/app-settings/#app_settingsjson" >}}) has the correct languages enabled. This is backwards compatible and safe to do while still on CHT 4.x. If you're unsure if this applies to you, double check your app settings.