From dee602db89fe29b3bb433918b30f587b11054528 Mon Sep 17 00:00:00 2001
From: Daniel Gergely <72557709+Danielgergely@users.noreply.github.com>
Date: Thu, 5 Feb 2026 11:07:46 +0100
Subject: [PATCH 01/22] [T2945] REFACTOR: gift limits are now translatable
(#2074)
* [T2945] REFACTOR: gift limits are now translatable
- REFACTOR: Added 'Gift' to the get_gitf_type_selection() method
- REFACTOR: Added methods to select the value of the sponsorship gifts
- REFACTOR: Added a method to convert and round funds
* [T2945] REFACTOR: simplified code
* [T2945] STYLE: pre-commit
* [T2945] FEATURE: added frequency indicator method
- FEATURE: templates using this model can now directly call this function to display 0-2 starts depending on the condition
---
.../models/gift_threshold_settings.py | 18 ++++++++++++++++++
.../models/sponsorship_gift_type.py | 6 +++---
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/gift_compassion/models/gift_threshold_settings.py b/gift_compassion/models/gift_threshold_settings.py
index 04ad65896..432c0e6c3 100644
--- a/gift_compassion/models/gift_threshold_settings.py
+++ b/gift_compassion/models/gift_threshold_settings.py
@@ -7,6 +7,7 @@
# The licence is in the file __manifest__.py
#
##############################################################################
+import math
from odoo import fields, models
@@ -32,3 +33,20 @@ class GiftThresholdSettings(models.Model):
"You already have a threshold rule for this gift",
)
]
+
+ def get_ceiling_converted_amount(self, amount, company, date):
+ raw_amount = self.currency_id._convert(
+ from_amount=amount,
+ to_currency=company.currency_id,
+ company=company,
+ date=date,
+ round=False,
+ )
+ return f"{company.currency_id.name} {int(math.ceil(raw_amount))}"
+
+ def get_gift_frequency_indicator(self):
+ if self.yearly_threshold and self.gift_frequency == 2:
+ return "*"
+ if not self.yearly_threshold and self.gift_frequency == 1:
+ return "**"
+ return ""
diff --git a/sponsorship_compassion/models/sponsorship_gift_type.py b/sponsorship_compassion/models/sponsorship_gift_type.py
index c90a5a921..09bce2437 100644
--- a/sponsorship_compassion/models/sponsorship_gift_type.py
+++ b/sponsorship_compassion/models/sponsorship_gift_type.py
@@ -12,9 +12,9 @@ class SponsorshipGiftType(models.Model):
)
gmc_gift_type = fields.Selection(
[
- ("Project Gift", "Project"),
- ("Family Gift", "Family"),
- ("Beneficiary Gift", "Participant"),
+ ("Project Gift", "Project Gift"),
+ ("Family Gift", "Family Gift"),
+ ("Beneficiary Gift", "Participant Gift"),
]
)
gmc_attribution = fields.Selection(
From 4347ff0f45d722e5328a8790ea61b20fff6b4d11 Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Thu, 5 Feb 2026 16:23:15 +0100
Subject: [PATCH 02/22] Update translations
---
gift_compassion/i18n/de.po | 872 ++++++++++++++++++++++++++++++++++
gift_compassion/i18n/fr_CH.po | 870 +++++++++++++++++++++++++++++++++
gift_compassion/i18n/it.po | 870 +++++++++++++++++++++++++++++++++
3 files changed, 2612 insertions(+)
create mode 100644 gift_compassion/i18n/de.po
create mode 100644 gift_compassion/i18n/fr_CH.po
create mode 100644 gift_compassion/i18n/it.po
diff --git a/gift_compassion/i18n/de.po b/gift_compassion/i18n/de.po
new file mode 100644
index 000000000..2762fed0e
--- /dev/null
+++ b/gift_compassion/i18n/de.po
@@ -0,0 +1,872 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * gift_compassion
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-02-05 13:05+0000\n"
+"PO-Revision-Date: 2026-02-05 15:08+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.8\n"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract_group
+msgid "A group of contracts"
+msgstr "Eine Gruppe von Verträgen"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_credit
+msgid "Account Credit"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_debit
+msgid "Account Debit"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.gift_accounting_settings_form
+msgid "Accounting"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction
+msgid "Action Needed"
+msgstr "Aktion notwendig"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_tree
+msgid "Amount"
+msgstr "Betrag"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount_us_dollars
+msgid "Amount due"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic
+msgid "Analytic"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic_tag
+msgid "Analytic Tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_attachment_count
+msgid "Attachment Count"
+msgstr "# Anhänge"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__attribution
+msgid "Attribution"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.cron,cron_name:gift_compassion.process_gift_cron
+msgid "Base: Auto-vacuum internal data"
+msgstr "Basis: Auto-Vacuum für interne Daten"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Birthday"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Cancel Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__child_id
+msgid "Child"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_collect_invoices
+msgid "Collect Invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Collect invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__company_id
+msgid "Company"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_res_config_settings
+msgid "Config Settings"
+msgstr "Konfig-Einstellungen"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_uid
+msgid "Created by"
+msgstr "Angelegt von"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_date
+msgid "Created on"
+msgstr "Angelegt am"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__currency_id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_id
+msgid "Currency"
+msgstr "Währung"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_usd
+msgid "Currency Usd"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_partner_paid
+msgid "Date Partner Paid"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__delivered
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Delivered"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__display_name
+msgid "Display Name"
+msgstr "Anzeigename"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__domain
+msgid "Domain"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__draft
+#, python-format
+msgid "Draft"
+msgstr ""
+
+#. module: gift_compassion
+#: model:base.automation,name:gift_compassion.enable_postponed_gifts
+#: model:ir.actions.server,name:gift_compassion.enable_postponed_gifts_ir_actions_server
+msgid "Enable postponed gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__exchange_rate
+msgid "Exchange Rate"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__failed_message_ids
+msgid "Failed Messages"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Family Gift"
+msgstr "Geschenk für Patenkind & Familie"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__field_office_notes
+msgid "Field Office Notes"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__company_id
+msgid "Field is retrieve from the associated sponsorship"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_follower_ids
+msgid "Followers"
+msgstr "Beobachter"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "Beobachter (Kanäle)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Beobachter (Partner)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__gift_id
+msgid "GMC Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:account.account,name:gift_compassion.comp_2002_2
+msgid "GMC Gift Due"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__payment_id
+msgid "GMC Payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"GMC gift payment accounting entries are disabled. (compassion accounting "
+"settings)"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_id
+msgid "GMC message"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gender
+msgid "Gender"
+msgstr "Geschlecht"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "General"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+#, python-format
+msgid "Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_attribution
+msgid "Gift Attribution"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_collect_wizard
+msgid "Gift Collect Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_date
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_frequency
+msgid "Gift Frequency"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_generate_gift_wizard
+msgid "Gift Generation Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Gift OK"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.open_view_gift_threshold_settings
+msgid "Gift Threshold Configuration"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_threshold_settings
+#: model:ir.ui.menu,name:gift_compassion.menu_gift_configuration
+msgid "Gift Thresholds"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_type
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_notify_ids
+msgid "Gift Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Gift Undeliverable Notification"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_id
+msgid "Gift analytic account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_tag_id
+msgid "Gift analytic tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_expense_account_id
+msgid "Gift expense account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_type
+msgid "Gift for"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_journal_id
+msgid "Gift journal id"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_gift_type
+msgid "Gift type"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_sponsorship_contract_gift_form
+msgid "Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gmc_gift_id
+msgid "Gmc Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Graduation/Final"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Group By..."
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_suspended
+msgid "Hold Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__id
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__id
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__id
+msgid "ID"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread
+msgid "If checked, new messages require your attention."
+msgstr "Falls markiert, benötigen neue Nachrichten Ihre Kenntnisnahme."
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+"Das Senden mancher Nachrichten ist fehlgeschlagen wenn dieses Fenster "
+"angekreuzt ist."
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__in_progress
+#, python-format
+msgid "In Progress"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__instructions
+msgid "Instructions"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__inverse_payment_id
+msgid "Inverse move"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "Invoice Lines"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__invoice_line_ids
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__invoice_line_ids
+msgid "Invoice lines"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Invoiced"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_is_follower
+msgid "Is Follower"
+msgstr "Ist Beobachter"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__is_param_set
+msgid "Is Param Set"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__journal_id
+msgid "Journal"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move
+msgid "Journal Entry"
+msgstr "Journalbuchung"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move_line
+msgid "Journal Item"
+msgstr "Journalposten"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift____last_update
+msgid "Last Modified on"
+msgstr "Zuletzt geändert am"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_uid
+msgid "Last Updated by"
+msgstr "Zuletzt aktualisiert durch"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_date
+msgid "Last Updated on"
+msgstr "Zuletzt aktualisiert am"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Hauptanhänge"
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.deliver_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Mark as delivered"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__max_amount
+msgid "Max Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error
+msgid "Message Delivery error"
+msgstr "Error beim senden der Nachricht"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_ids
+msgid "Messages"
+msgstr "Mitteilungen"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__min_amount
+msgid "Min Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__name
+msgid "Name"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families Split"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid "No Birthday Invoice"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.actions.act_window,help:gift_compassion.action_sponsorship_gift
+msgid "No gifts."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Not sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__number_gifts
+msgid "Number Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Anzahl der Aktionen"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr "Anzahl der Nachrichten, die eine Aktion erfordern"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Anzahl der Nachrichten mit einem Fehler beim Senden."
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Number of unread messages"
+msgstr "Anzahl ungelesene Nachrichten"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_partial_reconcile
+msgid "Partial Reconcile"
+msgstr "Teilausgleich Offene Posten"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited
+msgid "Participant Exited"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited_more_than_90_days_ago
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited_more_than_90_days_ago
+msgid "Participant Exited More Than 90 Days Ago"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited/whereabouts_unknown
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited/whereabouts_unknown
+msgid "Participant Exited/Whereabouts Unknown"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Participant Gift"
+msgstr "Geschenk für Patenkind"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__partner_id
+msgid "Partner"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Partner exceeded the maximum gift amount allowed"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_income_account_id
+msgid "Payable gift account"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__open
+#, python-format
+msgid "Pending"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_sent
+msgid "Process Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.cron,name:gift_compassion.process_gift_cron
+msgid "Process gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__product_id
+msgid "Product"
+msgstr "Produkt"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_id
+msgid "Project"
+msgstr "Kinderzentrum"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Project Gift"
+msgstr "Spende für das Kinderzentrum"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__project_transitioned
+msgid "Project Transitioned"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract
+msgid "Recurring contract"
+msgstr "Laufender Vertrag"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.send_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Send Now"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Sponsor payments"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Sponsored Child Family"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_id
+#, python-format
+msgid "Sponsorship"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_sponsorship_gift
+msgid "Sponsorship Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__sponsorship_gift_type
+msgid "Sponsorship Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_sponsorship_gift
+#: model:ir.ui.menu,name:gift_compassion.menu_sponsorship_gift
+msgid "Sponsorship Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/contracts.py:0
+#, python-format
+msgid "Sponsorship gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__state
+msgid "State"
+msgstr "Bundesland"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Status"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__status_change_date
+msgid "Status Change Date"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Survival"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__suspended
+#, python-format
+msgid "Suspended"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid ""
+"The automatic birthday gift will not generate an invoice.This means a "
+"birthday gift will always be sent to GMC even if we didn't register a "
+"payment."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"This will cancel the message for GMC and put the gift in Delivered state. "
+"Are you sure?"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Threshold Alert"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert_type
+msgid "Threshold Alert Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "To Verify"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__undeliverable
+#, python-format
+msgid "Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__undeliverable_reason
+msgid "Undeliverable Reason"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread
+msgid "Unread Messages"
+msgstr "Ungelesene Mitteilungen"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "Zähler der ungelelesen Nachrichten"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__verify
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Verify"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website Messages"
+msgstr "Website Nachrichten"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website communication history"
+msgstr "Website Kommunikationshistorie"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Will unreconcile the payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__yearly_threshold
+msgid "Yearly Threshold"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.constraint,message:gift_compassion.constraint_gift_threshold_settings_unique_gift_threshold
+msgid "You already have a threshold rule for this gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/account_partial_reconcile.py:0
+#, python-format
+msgid "You cannot delete the %s. It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "You cannot delete the %s.It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "_Add to gift"
+msgstr ""
diff --git a/gift_compassion/i18n/fr_CH.po b/gift_compassion/i18n/fr_CH.po
new file mode 100644
index 000000000..2dc43f77f
--- /dev/null
+++ b/gift_compassion/i18n/fr_CH.po
@@ -0,0 +1,870 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * gift_compassion
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-02-05 13:05+0000\n"
+"PO-Revision-Date: 2026-02-05 15:06+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: fr_CH\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.8\n"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract_group
+msgid "A group of contracts"
+msgstr "Un groupe de contrats"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_credit
+msgid "Account Credit"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_debit
+msgid "Account Debit"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.gift_accounting_settings_form
+msgid "Accounting"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction
+msgid "Action Needed"
+msgstr "A besoin d'une action"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_tree
+msgid "Amount"
+msgstr "Montant"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount_us_dollars
+msgid "Amount due"
+msgstr "Montant dû"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic
+msgid "Analytic"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic_tag
+msgid "Analytic Tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_attachment_count
+msgid "Attachment Count"
+msgstr "Nombre de pièces jointes"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__attribution
+msgid "Attribution"
+msgstr "Répartition"
+
+#. module: gift_compassion
+#: model:ir.cron,cron_name:gift_compassion.process_gift_cron
+msgid "Base: Auto-vacuum internal data"
+msgstr "Base : données internes sur l'aspiration automatique"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Birthday"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Cancel Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__child_id
+msgid "Child"
+msgstr "Enfant"
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_collect_invoices
+msgid "Collect Invoices"
+msgstr "Collecter les factures"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Collect invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__company_id
+msgid "Company"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_res_config_settings
+msgid "Config Settings"
+msgstr "Paramètres de configuration"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_uid
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_date
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__currency_id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_id
+msgid "Currency"
+msgstr "Devise"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_usd
+msgid "Currency Usd"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_partner_paid
+msgid "Date Partner Paid"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__delivered
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Delivered"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__display_name
+msgid "Display Name"
+msgstr "Nom d'affichage"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__domain
+msgid "Domain"
+msgstr "Domaine"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__draft
+#, python-format
+msgid "Draft"
+msgstr ""
+
+#. module: gift_compassion
+#: model:base.automation,name:gift_compassion.enable_postponed_gifts
+#: model:ir.actions.server,name:gift_compassion.enable_postponed_gifts_ir_actions_server
+msgid "Enable postponed gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__exchange_rate
+msgid "Exchange Rate"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__failed_message_ids
+msgid "Failed Messages"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Family Gift"
+msgstr "Cadeau Famille"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__field_office_notes
+msgid "Field Office Notes"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__company_id
+msgid "Field is retrieve from the associated sponsorship"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_follower_ids
+msgid "Followers"
+msgstr "Abonnés"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "Abonnés (Canaux)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Abonnés (Partenaires)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__gift_id
+msgid "GMC Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:account.account,name:gift_compassion.comp_2002_2
+msgid "GMC Gift Due"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__payment_id
+msgid "GMC Payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"GMC gift payment accounting entries are disabled. (compassion accounting "
+"settings)"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_id
+msgid "GMC message"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gender
+msgid "Gender"
+msgstr "Genre"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "General"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+#, python-format
+msgid "Gift"
+msgstr "Cadeau"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_attribution
+msgid "Gift Attribution"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_collect_wizard
+msgid "Gift Collect Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_date
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_frequency
+msgid "Gift Frequency"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_generate_gift_wizard
+msgid "Gift Generation Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Gift OK"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.open_view_gift_threshold_settings
+msgid "Gift Threshold Configuration"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_threshold_settings
+#: model:ir.ui.menu,name:gift_compassion.menu_gift_configuration
+msgid "Gift Thresholds"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_type
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_notify_ids
+msgid "Gift Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Gift Undeliverable Notification"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_id
+msgid "Gift analytic account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_tag_id
+msgid "Gift analytic tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_expense_account_id
+msgid "Gift expense account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_type
+msgid "Gift for"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_journal_id
+msgid "Gift journal id"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_gift_type
+msgid "Gift type"
+msgstr "Type de cadeau"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_sponsorship_contract_gift_form
+msgid "Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gmc_gift_id
+msgid "Gmc Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Graduation/Final"
+msgstr "Fin de parrainage"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Group By..."
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_suspended
+msgid "Hold Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__id
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__id
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__id
+msgid "ID"
+msgstr "Identifiant"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread
+msgid "If checked, new messages require your attention."
+msgstr "si elle est cochée, de nouveaux messages requièrent votre attention."
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "Si actif, certains messages ont une erreur de livraison."
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__in_progress
+#, python-format
+msgid "In Progress"
+msgstr "En cours"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__instructions
+msgid "Instructions"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__inverse_payment_id
+msgid "Inverse move"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "Invoice Lines"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__invoice_line_ids
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__invoice_line_ids
+msgid "Invoice lines"
+msgstr "Lignes de factures"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Invoiced"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_is_follower
+msgid "Is Follower"
+msgstr "Est un abonné"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__is_param_set
+msgid "Is Param Set"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__journal_id
+msgid "Journal"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move
+msgid "Journal Entry"
+msgstr "Entrée de journal"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move_line
+msgid "Journal Item"
+msgstr "Article de journal"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift____last_update
+msgid "Last Modified on"
+msgstr "Dernière modification le"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_uid
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_date
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Pièce jointe principale"
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.deliver_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Mark as delivered"
+msgstr "Marquer comme Transmis"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__max_amount
+msgid "Max Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error
+msgid "Message Delivery error"
+msgstr "Erreur d'envoi du message"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__min_amount
+msgid "Min Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__name
+msgid "Name"
+msgstr "Nom"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families Split"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid "No Birthday Invoice"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.actions.act_window,help:gift_compassion.action_sponsorship_gift
+msgid "No gifts."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Not sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__number_gifts
+msgid "Number Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Nombre d'Actions"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr "Nombre de messages demandant une action"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Nombre de messages avec des erreurs d'envoi"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Number of unread messages"
+msgstr "Nombre de messages non lus"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_partial_reconcile
+msgid "Partial Reconcile"
+msgstr "Lettrage partiel"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited
+msgid "Participant Exited"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited_more_than_90_days_ago
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited_more_than_90_days_ago
+msgid "Participant Exited More Than 90 Days Ago"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited/whereabouts_unknown
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited/whereabouts_unknown
+msgid "Participant Exited/Whereabouts Unknown"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Participant Gift"
+msgstr "Cadeau pour un enfant"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__partner_id
+msgid "Partner"
+msgstr "Partenaire"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Partner exceeded the maximum gift amount allowed"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_income_account_id
+msgid "Payable gift account"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__open
+#, python-format
+msgid "Pending"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_sent
+msgid "Process Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.cron,name:gift_compassion.process_gift_cron
+msgid "Process gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__product_id
+msgid "Product"
+msgstr "Produit"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_id
+msgid "Project"
+msgstr "Projet"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Project Gift"
+msgstr "Cadeau centre de développement de l'enfant"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__project_transitioned
+msgid "Project Transitioned"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract
+msgid "Recurring contract"
+msgstr "Contrat récurrent"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.send_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Send Now"
+msgstr "Envoyer"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Sponsor payments"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Sponsored Child Family"
+msgstr "Famille de l'enfant"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_id
+#, python-format
+msgid "Sponsorship"
+msgstr "Parrainage"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_sponsorship_gift
+msgid "Sponsorship Gift"
+msgstr "Cadeau de parrainage"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__sponsorship_gift_type
+msgid "Sponsorship Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_sponsorship_gift
+#: model:ir.ui.menu,name:gift_compassion.menu_sponsorship_gift
+msgid "Sponsorship Gifts"
+msgstr "Cadeaux de parrainage"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/contracts.py:0
+#, python-format
+msgid "Sponsorship gifts"
+msgstr "Cadeaux de parrainage"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__state
+msgid "State"
+msgstr "État"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Status"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__status_change_date
+msgid "Status Change Date"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Survival"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__suspended
+#, python-format
+msgid "Suspended"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid ""
+"The automatic birthday gift will not generate an invoice.This means a "
+"birthday gift will always be sent to GMC even if we didn't register a "
+"payment."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"This will cancel the message for GMC and put the gift in Delivered state. "
+"Are you sure?"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Threshold Alert"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert_type
+msgid "Threshold Alert Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "To Verify"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__undeliverable
+#, python-format
+msgid "Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__undeliverable_reason
+msgid "Undeliverable Reason"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread
+msgid "Unread Messages"
+msgstr "Messages non lus"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "Compteur de messages non lus"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__verify
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Verify"
+msgstr "A vérifier"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website Messages"
+msgstr "Messages du site web"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website communication history"
+msgstr "Historique de communication du site web"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Will unreconcile the payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__yearly_threshold
+msgid "Yearly Threshold"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.constraint,message:gift_compassion.constraint_gift_threshold_settings_unique_gift_threshold
+msgid "You already have a threshold rule for this gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/account_partial_reconcile.py:0
+#, python-format
+msgid "You cannot delete the %s. It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "You cannot delete the %s.It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "_Add to gift"
+msgstr ""
diff --git a/gift_compassion/i18n/it.po b/gift_compassion/i18n/it.po
new file mode 100644
index 000000000..3cd46c318
--- /dev/null
+++ b/gift_compassion/i18n/it.po
@@ -0,0 +1,870 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * gift_compassion
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-02-05 13:05+0000\n"
+"PO-Revision-Date: 2026-02-05 15:08+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.8\n"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract_group
+msgid "A group of contracts"
+msgstr "Un gruppo di contratti"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_credit
+msgid "Account Credit"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__account_debit
+msgid "Account Debit"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.gift_accounting_settings_form
+msgid "Accounting"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction
+msgid "Action Needed"
+msgstr "Azione Necessaria"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_tree
+msgid "Amount"
+msgstr "Importo"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__amount_us_dollars
+msgid "Amount due"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic
+msgid "Analytic"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__analytic_tag
+msgid "Analytic Tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_attachment_count
+msgid "Attachment Count"
+msgstr "Numero allegati"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__attribution
+msgid "Attribution"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.cron,cron_name:gift_compassion.process_gift_cron
+msgid "Base: Auto-vacuum internal data"
+msgstr "Base: pulizia automatica dati interni"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Birthday"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Cancel Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__child_id
+msgid "Child"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_collect_invoices
+msgid "Collect Invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Collect invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__company_id
+msgid "Company"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_res_config_settings
+msgid "Config Settings"
+msgstr "Impostazioni di configurazione"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_uid
+msgid "Created by"
+msgstr "Creato da"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__create_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__create_date
+msgid "Created on"
+msgstr "Creato il"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__currency_id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_id
+msgid "Currency"
+msgstr "Valuta"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__currency_usd
+msgid "Currency Usd"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_partner_paid
+msgid "Date Partner Paid"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__delivered
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Delivered"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__display_name
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__display_name
+msgid "Display Name"
+msgstr "Nome visualizzato"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__domain
+msgid "Domain"
+msgstr "Dominio"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__draft
+#, python-format
+msgid "Draft"
+msgstr ""
+
+#. module: gift_compassion
+#: model:base.automation,name:gift_compassion.enable_postponed_gifts
+#: model:ir.actions.server,name:gift_compassion.enable_postponed_gifts_ir_actions_server
+msgid "Enable postponed gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__exchange_rate
+msgid "Exchange Rate"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__failed_message_ids
+msgid "Failed Messages"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Family Gift"
+msgstr "Regalo per il bambino e la famiglia"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__field_office_notes
+msgid "Field Office Notes"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__company_id
+msgid "Field is retrieve from the associated sponsorship"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_channel_ids
+msgid "Followers (Channels)"
+msgstr "Followers (Canali)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_partner_ids
+msgid "Followers (Partners)"
+msgstr "Followers (Partner)"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__gift_id
+msgid "GMC Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:account.account,name:gift_compassion.comp_2002_2
+msgid "GMC Gift Due"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__payment_id
+msgid "GMC Payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"GMC gift payment accounting entries are disabled. (compassion accounting "
+"settings)"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_id
+msgid "GMC message"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gender
+msgid "Gender"
+msgstr "Sesso"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "General"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+#, python-format
+msgid "Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_attribution
+msgid "Gift Attribution"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_collect_wizard
+msgid "Gift Collect Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_date
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_frequency
+msgid "Gift Frequency"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_generate_gift_wizard
+msgid "Gift Generation Wizard"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Gift OK"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.open_view_gift_threshold_settings
+msgid "Gift Threshold Configuration"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_gift_threshold_settings
+#: model:ir.ui.menu,name:gift_compassion.menu_gift_configuration
+msgid "Gift Thresholds"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__gift_type
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_notify_ids
+msgid "Gift Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Gift Undeliverable Notification"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_id
+msgid "Gift analytic account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_analytic_tag_id
+msgid "Gift analytic tag"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_expense_account_id
+msgid "Gift expense account"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gift_type
+msgid "Gift for"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_journal_id
+msgid "Gift journal id"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_gift_type
+msgid "Gift type"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_sponsorship_contract_gift_form
+msgid "Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__gmc_gift_id
+msgid "Gmc Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Graduation/Final"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Group By..."
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_suspended
+msgid "Hold Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line__id
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile__id
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__id
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__id
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group__id
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__id
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__id
+msgid "ID"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread
+msgid "If checked, new messages require your attention."
+msgstr "Se selezionato, i nuovi messaggi richiedono la tua attenzione"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "If checked, some messages have a delivery error."
+msgstr "Se selezionato, alcuni messaggi presentano un errore di consegna."
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__in_progress
+#, python-format
+msgid "In Progress"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__instructions
+msgid "Instructions"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__inverse_payment_id
+msgid "Inverse move"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "Invoice Lines"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__invoice_line_ids
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__invoice_line_ids
+msgid "Invoice lines"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Invoiced"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Invoices"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_is_follower
+msgid "Is Follower"
+msgstr "E' Follower"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__is_param_set
+msgid "Is Param Set"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__journal_id
+msgid "Journal"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move
+msgid "Journal Entry"
+msgstr "Registrazione contabile"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_move_line
+msgid "Journal Item"
+msgstr "Voce del giornale"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_move_line____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_account_partial_reconcile____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_generate_gift_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract_group____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings____last_update
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift____last_update
+msgid "Last Modified on"
+msgstr "Ultima modifica il"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_uid
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_uid
+msgid "Last Updated by"
+msgstr "Ultima modifica di"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_collect_wizard__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__write_date
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__write_date
+msgid "Last Updated on"
+msgstr "Ultima modifica il"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_main_attachment_id
+msgid "Main Attachment"
+msgstr "Allegato principale"
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.deliver_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Mark as delivered"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__max_amount
+msgid "Max Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error
+msgid "Message Delivery error"
+msgstr "Errore di consegna messaggio"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_ids
+msgid "Messages"
+msgstr "Messaggi"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__min_amount
+msgid "Min Amount"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__name
+msgid "Name"
+msgstr "Nome"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Neediest Families Split"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid "No Birthday Invoice"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.actions.act_window,help:gift_compassion.action_sponsorship_gift
+msgid "No gifts."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Not sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_recurring_contract__number_gifts
+msgid "Number Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of Actions"
+msgstr "Numero di Azioni"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_needaction_counter
+msgid "Number of messages which requires an action"
+msgstr "Numero di messaggi che richiedono un'azione"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr "Numero di messaggi con errore di consegna"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Number of unread messages"
+msgstr "Numero di messaggi non letti"
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_account_partial_reconcile
+msgid "Partial Reconcile"
+msgstr "Riconciliazione parziale"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited
+msgid "Participant Exited"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited_more_than_90_days_ago
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited_more_than_90_days_ago
+msgid "Participant Exited More Than 90 Days Ago"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__beneficiary_exited/whereabouts_unknown
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__participant_exited/whereabouts_unknown
+msgid "Participant Exited/Whereabouts Unknown"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Participant Gift"
+msgstr "Regalo per il bambino"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__partner_id
+msgid "Partner"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Partner exceeded the maximum gift amount allowed"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_res_config_settings__gift_income_account_id
+msgid "Payable gift account"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__open
+#, python-format
+msgid "Pending"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__date_sent
+msgid "Process Date"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.cron,name:gift_compassion.process_gift_cron
+msgid "Process gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__product_id
+msgid "Product"
+msgstr "Prodotto"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__project_id
+msgid "Project"
+msgstr "Progetto"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Project Gift"
+msgstr "Donazione per il centro"
+
+#. module: gift_compassion
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__undeliverable_reason__project_transitioned
+msgid "Project Transitioned"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_recurring_contract
+msgid "Recurring contract"
+msgstr "Contratto ricorrente"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_has_sms_error
+msgid "SMS Delivery error"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.server,name:gift_compassion.send_gift
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Send Now"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Sent"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Sponsor payments"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Sponsored Child Family"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__sponsorship_id
+#, python-format
+msgid "Sponsorship"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model,name:gift_compassion.model_sponsorship_gift
+msgid "Sponsorship Gift"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__sponsorship_gift_type
+msgid "Sponsorship Gift Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.actions.act_window,name:gift_compassion.action_sponsorship_gift
+#: model:ir.ui.menu,name:gift_compassion.menu_sponsorship_gift
+msgid "Sponsorship Gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/contracts.py:0
+#, python-format
+msgid "Sponsorship gifts"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__state
+msgid "State"
+msgstr "Stato"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+msgid "Status"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__status_change_date
+msgid "Status Change Date"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "Survival"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__suspended
+#, python-format
+msgid "Suspended"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_recurring_contract__no_birthday_invoice
+msgid ""
+"The automatic birthday gift will not generate an invoice.This means a "
+"birthday gift will always be sent to GMC even if we didn't register a "
+"payment."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid ""
+"This will cancel the message for GMC and put the gift in Delivered state. "
+"Are you sure?"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert
+msgid "Threshold Alert"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__threshold_alert_type
+msgid "Threshold Alert Type"
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "To Verify"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__undeliverable
+#, python-format
+msgid "Undeliverable"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__undeliverable_reason
+msgid "Undeliverable Reason"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread
+msgid "Unread Messages"
+msgstr "Messaggi Non Letti"
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__message_unread_counter
+msgid "Unread Messages Counter"
+msgstr "Contatore di messsaggi non letti"
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#: model:ir.model.fields.selection,name:gift_compassion.selection__sponsorship_gift__state__verify
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_filter
+#, python-format
+msgid "Verify"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website Messages"
+msgstr "Messaggi sito web"
+
+#. module: gift_compassion
+#: model:ir.model.fields,help:gift_compassion.field_sponsorship_gift__website_message_ids
+msgid "Website communication history"
+msgstr "Storico comunicazione sito"
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_form
+msgid "Will unreconcile the payment"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.fields,field_description:gift_compassion.field_gift_threshold_settings__yearly_threshold
+msgid "Yearly Threshold"
+msgstr ""
+
+#. module: gift_compassion
+#: model:ir.model.constraint,message:gift_compassion.constraint_gift_threshold_settings_unique_gift_threshold
+msgid "You already have a threshold rule for this gift"
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/account_partial_reconcile.py:0
+#, python-format
+msgid "You cannot delete the %s. It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: code:addons/gift_compassion/models/sponsorship_gift.py:0
+#, python-format
+msgid "You cannot delete the %s.It is already sent to GMC."
+msgstr ""
+
+#. module: gift_compassion
+#: model_terms:ir.ui.view,arch_db:gift_compassion.view_gift_collect
+msgid "_Add to gift"
+msgstr ""
From 2ba6374bca495fb43ede26badbdcc32fe204e121 Mon Sep 17 00:00:00 2001
From: davidwul
Date: Wed, 11 Feb 2026 15:12:52 +0100
Subject: [PATCH 03/22] Update compassion_intervention_view.xml
---
intervention_compassion/views/compassion_intervention_view.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/intervention_compassion/views/compassion_intervention_view.xml b/intervention_compassion/views/compassion_intervention_view.xml
index c261155bb..a5c242614 100644
--- a/intervention_compassion/views/compassion_intervention_view.xml
+++ b/intervention_compassion/views/compassion_intervention_view.xml
@@ -107,6 +107,7 @@
Date: Thu, 12 Feb 2026 14:31:05 +0100
Subject: [PATCH 04/22] T2792 Ensure child protection on children page (#2059)
* [FIX] Add obfuscated location to the project model
* [STYLE] Add comments
* [STYLE] Refactor comments
* [FIX] Add timeout for the geocode API request
* [FIX] Fix typos
* Update child_compassion/models/project_compassion.py
Co-authored-by: ecino
* [T2792][FIX] Make obfuscated coord computed fields
Co-authored-by: ecino
* [T2792][FIX] Make the obfuscated coords computed fields
* [T2792][STYLE] Add comments
* [T2792][STYLE] Remove useless get method
* [T2792][STYLE] Use proper randomization of coordinates
* [T2792][FIX] Updates conditionning of the updates
* [T2792][FIX] Add lat long 0 fallback when no data are provided
* [T2793][STYLE] Modularize calls to _compute_gps_obfuscated
* [T2792][FIX] Use proper compute method on the gps_obfuscated
* [T2792][Refactor] Renames compute functions
* FIX obfuscation
---------
Co-authored-by: ecino
Co-authored-by: Emanuel Cino
---
child_compassion/__manifest__.py | 2 +-
.../migrations/14.0.1.5.0/pre-migration.py | 23 ++++++++++
child_compassion/models/project_compassion.py | 46 +++++++++++++++++++
.../views/compassion_intervention_view.xml | 7 ++-
4 files changed, 73 insertions(+), 5 deletions(-)
create mode 100644 child_compassion/migrations/14.0.1.5.0/pre-migration.py
diff --git a/child_compassion/__manifest__.py b/child_compassion/__manifest__.py
index de2b6c177..48a2fb002 100644
--- a/child_compassion/__manifest__.py
+++ b/child_compassion/__manifest__.py
@@ -29,7 +29,7 @@
# pylint: disable=C8101
{
"name": "Compassion Children",
- "version": "17.0.1.0.7",
+ "version": "17.0.1.0.8",
"category": "Compassion",
"author": "Compassion CH",
"license": "AGPL-3",
diff --git a/child_compassion/migrations/14.0.1.5.0/pre-migration.py b/child_compassion/migrations/14.0.1.5.0/pre-migration.py
new file mode 100644
index 000000000..cb6a83a99
--- /dev/null
+++ b/child_compassion/migrations/14.0.1.5.0/pre-migration.py
@@ -0,0 +1,23 @@
+from openupgradelib import openupgrade
+
+
+def migrate(cr, version):
+ if not openupgrade.column_exists(
+ cr, "compassion_project", "gps_latitude_obfuscated"
+ ):
+ openupgrade.logged_query(
+ cr,
+ """
+ ALTER TABLE compassion_project
+ ADD COLUMN gps_latitude_obfuscated float,
+ ADD COLUMN gps_longitude_obfuscated float;
+ """,
+ )
+ openupgrade.logged_query(
+ cr,
+ """
+ UPDATE compassion_project
+ SET gps_longitude_obfuscated = TRUNC(CAST(gps_longitude AS numeric), 0),
+ gps_latitude_obfuscated = TRUNC(CAST(gps_latitude AS numeric), 0);
+""",
+ )
diff --git a/child_compassion/models/project_compassion.py b/child_compassion/models/project_compassion.py
index 4e1971037..6f2f998b0 100644
--- a/child_compassion/models/project_compassion.py
+++ b/child_compassion/models/project_compassion.py
@@ -11,6 +11,7 @@
import logging
import re
from datetime import datetime, timedelta
+from random import random
import requests
@@ -85,6 +86,12 @@ class CompassionProject(models.Model):
zip_code = fields.Char(readonly=True)
gps_latitude = fields.Float(readonly=True)
gps_longitude = fields.Float(readonly=True)
+ gps_latitude_obfuscated = fields.Float(
+ compute="_compute_gps_obfuscated", store=True
+ )
+ gps_longitude_obfuscated = fields.Float(
+ compute="_compute_gps_obfuscated", store=True
+ )
google_link = fields.Char(readonly=True, compute="_compute_google_link")
timezone = fields.Char(readonly=True, compute="_compute_timezone", store=True)
cluster = fields.Char(readonly=True)
@@ -516,6 +523,45 @@ def _get_materials(self):
("Plastic", "Plastic"),
]
+ @api.depends("gps_latitude", "gps_longitude", "closest_city")
+ def _compute_gps_obfuscated(self):
+ """
+ This method calculates and stores the obfuscated coordinates
+ (latitude and longitude).
+ """
+ api_key = (
+ self.env["ir.config_parameter"].sudo().get_param("google_maps_api_key")
+ )
+ base_url = "https://maps.googleapis.com/maps/api/geocode/json"
+ for project in self:
+ try:
+ parts = [
+ project.closest_city,
+ project.state_province,
+ project.country_id.name,
+ ]
+ address_string = ", ".join(filter(None, parts))
+ params = {"address": address_string, "key": api_key}
+ response = requests.get(base_url, params=params, timeout=3)
+ data = response.json()
+ if data["status"] == "OK":
+ location = data["results"][0]["geometry"]["location"]
+ project.gps_latitude_obfuscated = location["lat"]
+ project.gps_longitude_obfuscated = location["lng"]
+ except Exception:
+ # Fallback to randomized gps coords
+ logging.warning("Request failed", exc_info=True)
+ project.gps_latitude_obfuscated = (
+ (int(project.gps_latitude) + random())
+ if project.gps_latitude
+ else 0
+ )
+ project.gps_longitude_obfuscated = (
+ (int(project.gps_longitude) + random())
+ if project.gps_longitude
+ else 0
+ )
+
@api.depends("gps_longitude", "gps_latitude")
def _compute_timezone(self):
tf = TimezoneFinder()
diff --git a/intervention_compassion/views/compassion_intervention_view.xml b/intervention_compassion/views/compassion_intervention_view.xml
index a5c242614..598d47684 100644
--- a/intervention_compassion/views/compassion_intervention_view.xml
+++ b/intervention_compassion/views/compassion_intervention_view.xml
@@ -102,12 +102,11 @@
+ readonly="1" />
Date: Mon, 16 Feb 2026 15:54:09 +0100
Subject: [PATCH 05/22] [T2987] REFACTOR: moved language detection to generator
(#2076)
* [T2987] REFACTOR: moved language detection to generator
- REFACTOR: Moved original language detection to generator and made sure everyone can access it -> sudo()
* [T2987] FIX: added 'advanced_translation' dependency to __manifest__.py
---
sbc_compassion/__manifest__.py | 1 +
.../models/correspondence_s2b_generator.py | 17 +++++++++++++++++
2 files changed, 18 insertions(+)
diff --git a/sbc_compassion/__manifest__.py b/sbc_compassion/__manifest__.py
index 93edf97df..a473a2f98 100644
--- a/sbc_compassion/__manifest__.py
+++ b/sbc_compassion/__manifest__.py
@@ -37,6 +37,7 @@
"website": "https://github.com/CompassionCH/compassion-modules",
"depends": [
"sponsorship_compassion",
+ "advanced_translation",
],
"external_dependencies": {
"python": [
diff --git a/sbc_compassion/models/correspondence_s2b_generator.py b/sbc_compassion/models/correspondence_s2b_generator.py
index 99b197a1c..84952f5e4 100644
--- a/sbc_compassion/models/correspondence_s2b_generator.py
+++ b/sbc_compassion/models/correspondence_s2b_generator.py
@@ -82,6 +82,23 @@ def _compute_preview(self):
for generator in self:
generator.preview = generator.letter_ids[:1].preview
+ @api.model_create_multi
+ def create(self, vals_list):
+ """
+ Overwrites the default create method
+ """
+ for vals in vals_list:
+ if vals.get("body") and not vals.get("language_id"):
+ detected_language = (
+ self.env["langdetect"].sudo().detect_language(vals["body"])
+ )
+ if detected_language:
+ vals["language_id"] = detected_language.id
+ return super().create(vals_list)
+
+ ##########################################################################
+ # VIEW CALLBACKS #
+ ##########################################################################
@api.onchange("selection_domain")
def onchange_domain(self):
if self.selection_domain:
From 0aade427a65ea28161788617effa02cbba8a87d8 Mon Sep 17 00:00:00 2001
From: Daniel Gergely <72557709+Danielgergely@users.noreply.github.com>
Date: Mon, 16 Feb 2026 15:56:20 +0100
Subject: [PATCH 06/22] [T2986] FIX: direction is now explicitly set through
message values (#2075)
* [T2986] FIX: direction is now explicitly set through message values
- FIX: fetch the whole action instead of only the id and set the id and direction for the message
- REFACTOR: added type to super().create() in gmc_message for clarity
* [T2986] STYLE: pre-commit
---
message_center_compassion/models/gmc_message.py | 2 +-
sbc_compassion/models/correspondence.py | 5 +++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/message_center_compassion/models/gmc_message.py b/message_center_compassion/models/gmc_message.py
index 45a730441..115ca69cb 100644
--- a/message_center_compassion/models/gmc_message.py
+++ b/message_center_compassion/models/gmc_message.py
@@ -94,7 +94,7 @@ def _compute_res_name(self):
##########################################################################
@api.model_create_multi
def create(self, vals_list):
- messages = super().create(vals_list)
+ messages = super(GmcMessage, self).create(vals_list)
messages.filtered("action_id.auto_process").process_messages()
return messages
diff --git a/sbc_compassion/models/correspondence.py b/sbc_compassion/models/correspondence.py
index d1adc9581..c0efdcc50 100644
--- a/sbc_compassion/models/correspondence.py
+++ b/sbc_compassion/models/correspondence.py
@@ -695,12 +695,13 @@ def create_commkit(self):
)
messages = self.env["gmc.message"]
for letter in self:
- action_id = self.env.ref("sbc_compassion.create_letter").id
+ action = self.env.ref("sbc_compassion.create_letter")
message_vals = {
- "action_id": action_id,
+ "action_id": action.id,
"object_id": letter.id,
"child_id": letter.child_id.id,
"partner_id": letter.partner_id.id,
+ "direction": action.direction,
}
if (
letter.sponsorship_id.state not in ("active", "terminated")
From f2795a63170e37c151918845cdbd687e8d0bc99b Mon Sep 17 00:00:00 2001
From: Daniel Gergely
Date: Wed, 18 Feb 2026 08:11:17 +0100
Subject: [PATCH 07/22] [T2996] FIX: sponsor letter now have the status "read"
by default
- FIX: updated the Docstrings of the create method
- FIX: added email_read: now() to the values which create the correspondence
---
sbc_compassion/models/correspondence_s2b_generator.py | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/sbc_compassion/models/correspondence_s2b_generator.py b/sbc_compassion/models/correspondence_s2b_generator.py
index 84952f5e4..cca05985b 100644
--- a/sbc_compassion/models/correspondence_s2b_generator.py
+++ b/sbc_compassion/models/correspondence_s2b_generator.py
@@ -85,7 +85,8 @@ def _compute_preview(self):
@api.model_create_multi
def create(self, vals_list):
"""
- Overwrites the default create method
+ Overwrites the default create method and sets the language
+ if not already provided
"""
for vals in vals_list:
if vals.get("body") and not vals.get("language_id"):
@@ -168,9 +169,11 @@ def generate_letters_job(self, preview_mode=False):
"original_language_id": self.language_id.id,
"original_text": text,
"state": "Draft" if preview_mode else "Received in the system",
- }
- if self.image_ids:
- vals["original_attachment_ids"] = [Command.clear()] + [
+ "email_read": fields.Datetime.now(),
+ }
+ if self.image_ids:
+ vals["original_attachment_ids"] = [
+ Command.clear()] + [
Command.create(
{
"datas": atchmt.datas,
From f72a9adc64d2ff294a363b86ca31f31e8996eb36 Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Wed, 18 Feb 2026 12:01:41 +0100
Subject: [PATCH 08/22] FIX missing file_name in letters
---
sbc_compassion/models/correspondence.py | 36 +++++++++++++------------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/sbc_compassion/models/correspondence.py b/sbc_compassion/models/correspondence.py
index c0efdcc50..38ee50d90 100644
--- a/sbc_compassion/models/correspondence.py
+++ b/sbc_compassion/models/correspondence.py
@@ -144,7 +144,7 @@ class Correspondence(models.Model):
# 2. Attachments and scans
##########################
sponsor_letter_scan = fields.Binary()
- file_name = fields.Char()
+ file_name = fields.Char(compute="_compute_file_name", store=True)
letter_format = fields.Selection(
[("pdf", "pdf"), ("zip", "zip")],
compute="_compute_letter_format",
@@ -610,7 +610,6 @@ def create(self, vals_list):
# Make sure the translation language is set correctly.
letters._check_translation_language()
for letter in letters:
- letter.file_name = letter._get_file_name()
attachment = self.env["ir.attachment"].search(
[
("res_model", "=", "correspondence"),
@@ -844,21 +843,24 @@ def reactivate_letters(self, message="Project reactivated"):
gmc_messages.write({"state": "new"})
gmc_messages.process_messages()
- def _get_file_name(self):
- self.ensure_one()
- name = ""
- if self.communication_type_ids.ids:
- name = (
- self.communication_type_ids[0]
- .with_context(lang=self.partner_id.lang)
- .name
- + " "
- )
- name += self.child_id.local_id
- if self.kit_identifier:
- name += " " + self.kit_identifier
- name += "." + (self.letter_format or "pdf")
- return name
+ @api.depends(
+ "communication_type_ids", "child_id", "kit_identifier", "letter_format"
+ )
+ def _compute_file_name(self):
+ for letter in self:
+ name = ""
+ if self.communication_type_ids.ids:
+ name = (
+ self.communication_type_ids[0]
+ .with_context(lang=self.partner_id.lang)
+ .name
+ + " "
+ )
+ name += self.child_id.local_id
+ if self.kit_identifier:
+ name += " " + self.kit_identifier
+ name += "." + (self.letter_format or "pdf")
+ letter.file_name = name
def data_to_json(self, mapping_name=None):
json_data = super().data_to_json(mapping_name)
From ffa0186fea631ace0559757d0a27deca252d38d5 Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Wed, 18 Feb 2026 12:07:12 +0100
Subject: [PATCH 09/22] FIX FIX missing file_name in letters
---
sbc_compassion/models/correspondence.py | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/sbc_compassion/models/correspondence.py b/sbc_compassion/models/correspondence.py
index 38ee50d90..24a5edb9c 100644
--- a/sbc_compassion/models/correspondence.py
+++ b/sbc_compassion/models/correspondence.py
@@ -849,17 +849,17 @@ def reactivate_letters(self, message="Project reactivated"):
def _compute_file_name(self):
for letter in self:
name = ""
- if self.communication_type_ids.ids:
+ if letter.communication_type_ids.ids:
name = (
- self.communication_type_ids[0]
- .with_context(lang=self.partner_id.lang)
+ letter.communication_type_ids[0]
+ .with_context(lang=letter.partner_id.lang)
.name
+ " "
)
- name += self.child_id.local_id
- if self.kit_identifier:
- name += " " + self.kit_identifier
- name += "." + (self.letter_format or "pdf")
+ name += letter.child_id.local_id
+ if letter.kit_identifier:
+ name += " " + letter.kit_identifier
+ name += "." + (letter.letter_format or "pdf")
letter.file_name = name
def data_to_json(self, mapping_name=None):
From 6b44dcaaa5b72bb4d91534bde56b5deaad5d8b3d Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Mon, 23 Feb 2026 15:09:21 +0100
Subject: [PATCH 10/22] [FIX] transaction handling for
correspondence_s2b_generator.py
- Happy path should use main cursor
- Only exceptions should use a new cursor in DB
- Remove redundant calls
---
sbc_compassion/README.rst | 28 +++++++++----------
sbc_compassion/models/correspondence.py | 8 +++---
.../models/correspondence_s2b_generator.py | 26 ++++++++---------
sbc_compassion/static/description/index.html | 8 +++---
4 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/sbc_compassion/README.rst b/sbc_compassion/README.rst
index 813f196d4..f160fac02 100644
--- a/sbc_compassion/README.rst
+++ b/sbc_compassion/README.rst
@@ -35,15 +35,15 @@ Installation
To install this module, you need to install dependencies:
-- requires the following libraries (names from apt-get):
+- requires the following libraries (names from apt-get):
- - libzbar-dev
+ - libzbar-dev
-- requires tesseract for extracting text from PDF files (for S2B
- letters scan):
+- requires tesseract for extracting text from PDF files (for S2B letters
+ scan):
- - tesseract-ocr
- - tesseract-ocr-language_code (for any desired language)
+ - tesseract-ocr
+ - tesseract-ocr-language_code (for any desired language)
Usage
=====
@@ -56,14 +56,14 @@ Changelog
17.0.1.1.0 (2024-10-01)
-----------------------
-- Replace FPDF with a QWeb report for the Sponsorship Letter.
+- Replace FPDF with a QWeb report for the Sponsorship Letter.
10.0.1.2.1 (2018-11-02)
-----------------------
-- Change how we send Original Language to GMC. From now on, we map it
- to the translated language in Odoo, in order to avoid unnecessary
- translation at the National Office.
+- Change how we send Original Language to GMC. From now on, we map it to
+ the translated language in Odoo, in order to avoid unnecessary
+ translation at the National Office.
Bug Tracker
===========
@@ -86,10 +86,10 @@ Authors
Contributors
------------
-- Emanuel Cino
-- Emmanuel Mathier
-- Loic Hausammann
-- Emmanuel Girardin
+- Emanuel Cino
+- Emmanuel Mathier
+- Loic Hausammann
+- Emmanuel Girardin
Maintainers
-----------
diff --git a/sbc_compassion/models/correspondence.py b/sbc_compassion/models/correspondence.py
index 24a5edb9c..378d33a9c 100644
--- a/sbc_compassion/models/correspondence.py
+++ b/sbc_compassion/models/correspondence.py
@@ -693,14 +693,13 @@ def create_commkit(self):
datetime.date.today()
)
messages = self.env["gmc.message"]
+ action_id = self.env.ref("sbc_compassion.create_letter").id
for letter in self:
- action = self.env.ref("sbc_compassion.create_letter")
message_vals = {
- "action_id": action.id,
+ "action_id": action_id,
"object_id": letter.id,
"child_id": letter.child_id.id,
"partner_id": letter.partner_id.id,
- "direction": action.direction,
}
if (
letter.sponsorship_id.state not in ("active", "terminated")
@@ -856,7 +855,8 @@ def _compute_file_name(self):
.name
+ " "
)
- name += letter.child_id.local_id
+ if letter.child_id:
+ name += letter.child_id.local_id
if letter.kit_identifier:
name += " " + letter.kit_identifier
name += "." + (letter.letter_format or "pdf")
diff --git a/sbc_compassion/models/correspondence_s2b_generator.py b/sbc_compassion/models/correspondence_s2b_generator.py
index cca05985b..d3927ed5f 100644
--- a/sbc_compassion/models/correspondence_s2b_generator.py
+++ b/sbc_compassion/models/correspondence_s2b_generator.py
@@ -169,11 +169,11 @@ def generate_letters_job(self, preview_mode=False):
"original_language_id": self.language_id.id,
"original_text": text,
"state": "Draft" if preview_mode else "Received in the system",
- "email_read": fields.Datetime.now(),
- }
- if self.image_ids:
- vals["original_attachment_ids"] = [
- Command.clear()] + [
+ "email_read": fields.Datetime.now(),
+ "generator_id": self.id,
+ }
+ if self.image_ids:
+ vals["original_attachment_ids"] = [Command.clear()] + [
Command.create(
{
"datas": atchmt.datas,
@@ -183,14 +183,14 @@ def generate_letters_job(self, preview_mode=False):
)
for atchmt in self.image_ids
]
- letter = self.letter_ids.filtered(
- lambda c, _sp=sponsorship: c.sponsorship_id == _sp
- )
- if letter:
- letter.write(vals)
- else:
- letter = letters.create(vals)
- letters += letter
+ letter = self.letter_ids.filtered(
+ lambda c, _sp=sponsorship: c.sponsorship_id == _sp
+ )
+ if letter:
+ letter.write(vals)
+ else:
+ letter = letters.create(vals)
+ letters += letter
letters.create_text_boxes()
self.write({"letter_ids": [Command.set(letters.ids)]})
if not preview_mode:
diff --git a/sbc_compassion/static/description/index.html b/sbc_compassion/static/description/index.html
index a639bee35..2e8b13b7e 100644
--- a/sbc_compassion/static/description/index.html
+++ b/sbc_compassion/static/description/index.html
@@ -399,8 +399,8 @@
libzbar-dev
-requires tesseract for extracting text from PDF files (for S2B
-letters scan):
+requires tesseract for extracting text from PDF files (for S2B letters
+scan):
tesseract-ocr
tesseract-ocr-language_code (for any desired language)
@@ -421,8 +421,8 @@
-Change how we send Original Language to GMC. From now on, we map it
-to the translated language in Odoo, in order to avoid unnecessary
+ Change how we send Original Language to GMC. From now on, we map it to
+the translated language in Odoo, in order to avoid unnecessary
translation at the National Office.
From bf2a5f14989afdb61e9947e0a4e25819bb043e17 Mon Sep 17 00:00:00 2001
From: avuff
Date: Thu, 26 Feb 2026 15:27:01 +0100
Subject: [PATCH 11/22] T2840 add category and description code snippet (#2070)
* [FEAT][T2840] add category and description code snippet
* [FEAT][T2840] add category and description code snippet
* T2840 ADD search view
---------
Co-authored-by: Aurelien Vuffray
Co-authored-by: Emanuel Cino
---
.../models/communication_snippet.py | 22 +++++++++++++++
.../security/ir.model.access.csv | 1 +
.../views/communication_snippet_view.xml | 28 +++++++++++++++++++
3 files changed, 51 insertions(+)
diff --git a/partner_communication/models/communication_snippet.py b/partner_communication/models/communication_snippet.py
index 119109745..65f96c2e8 100644
--- a/partner_communication/models/communication_snippet.py
+++ b/partner_communication/models/communication_snippet.py
@@ -1,12 +1,34 @@
from odoo import fields, models
+class CommunicationSnippetCategory(models.Model):
+ _name = "communication.snippet.category"
+ _description = "Communication Snippet Category"
+
+ name = fields.Char(string="Category Name", required=True)
+
+ _sql_constraints = [
+ (
+ "name_unique",
+ "unique(name)",
+ "The name of the category must be unique.",
+ )
+ ]
+
+
class CommunicationSnippet(models.Model):
_name = "communication.snippet"
_description = "Communication Snippet"
name = fields.Char(required=True, index=True)
snippet_text = fields.Html(required=True, translate=True)
+ description = fields.Text(string="Description")
+
+ category_id = fields.Many2one(
+ "communication.snippet.category",
+ string="Category",
+ help="Category of the communication snippet",
+ )
def action_edit_snippet(self):
self.ensure_one()
diff --git a/partner_communication/security/ir.model.access.csv b/partner_communication/security/ir.model.access.csv
index ac4dfc9f3..57d0a57bc 100644
--- a/partner_communication/security/ir.model.access.csv
+++ b/partner_communication/security/ir.model.access.csv
@@ -11,3 +11,4 @@ access_partner_communication_generate_wizard,access_partner_communication_genera
access_partner_communication_download_print_wizard,access_partner_communication_download_print_wizard,model_partner_communication_download_print_job_wizard,base.group_user,1,0,1,0
access_partner_communication_default_config,access_partner_communication_default_config,model_partner_communication_default_config,base.group_user,1,1,1,1
access_communication_snippets,Full access on communication_snippets,model_communication_snippet,base.group_user,1,1,1,1
+access_comm_snippet_category_user,communication.snippet.category,model_communication_snippet_category,base.group_user,1,1,1,1
diff --git a/partner_communication/views/communication_snippet_view.xml b/partner_communication/views/communication_snippet_view.xml
index df1276fb9..03cd62d9c 100644
--- a/partner_communication/views/communication_snippet_view.xml
+++ b/partner_communication/views/communication_snippet_view.xml
@@ -8,6 +8,14 @@
+
+
@@ -20,6 +28,8 @@
+
+
+
+ communication.snippet.search
+ communication.snippet
+
+
+
+
+
+
+
+
+
+
Text Snippets
communication.snippet
From 9e8c435d6557d62a5a30a591416d87d73cf93d82 Mon Sep 17 00:00:00 2001
From: avuff
Date: Thu, 5 Mar 2026 16:03:31 +0100
Subject: [PATCH 12/22] [T1142] New Suspension Communication Rules (#2069)
* [IMP][T1142] New Suspension Communication Rules
* Update partner_communication_compassion/data/ir_cron_data.xml
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* FIX migration script
---------
Co-authored-by: Aurelien Vuffray
Co-authored-by: ecino
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Emanuel Cino
---
.../__manifest__.py | 3 +-
.../data/communication_config.xml | 32 ++---
.../data/ir_cron_data.xml | 19 +++
.../data/project_lifecycle_emails.xml | 128 ------------------
.../migrations/14.0.1.1.1/pre-migration.py | 51 +++++++
.../models/compassion_project.py | 80 ++++++++++-
6 files changed, 159 insertions(+), 154 deletions(-)
create mode 100644 partner_communication_compassion/data/ir_cron_data.xml
create mode 100644 partner_communication_compassion/migrations/14.0.1.1.1/pre-migration.py
diff --git a/partner_communication_compassion/__manifest__.py b/partner_communication_compassion/__manifest__.py
index ff0d5657b..260bbbe6a 100644
--- a/partner_communication_compassion/__manifest__.py
+++ b/partner_communication_compassion/__manifest__.py
@@ -29,7 +29,7 @@
# pylint: disable=C8101
{
"name": "Compassion Partner Communications",
- "version": "17.0.1.0.0",
+ "version": "17.0.1.0.1",
"category": "Other",
"author": "Compassion CH",
"development_status": "Production/Stable",
@@ -49,6 +49,7 @@
"data/depart_communications.xml",
"data/communication_config.xml",
"data/utm_data.xml",
+ "data/ir_cron_data.xml",
"views/communication_job_view.xml",
"views/disaster_alert_view.xml",
"views/partner_compassion_view.xml",
diff --git a/partner_communication_compassion/data/communication_config.xml b/partner_communication_compassion/data/communication_config.xml
index 6ed7e455d..5486d918f 100644
--- a/partner_communication_compassion/data/communication_config.xml
+++ b/partner_communication_compassion/data/communication_config.xml
@@ -256,7 +256,7 @@
- Project Suspension
+ Project Suspension Announcement
True
-
- Project Suspension Extension 1
-
-
- digital
- True
-
-
-
- Project Suspension Extension 2
-
+
+ Project Suspension Follow Up
- digital
- True
-
-
-
- Project Reactivation
-
+
+
+
+ Project: 2-Month Suspension Announcement/Follow-Up
+
+ code
+ model._cron_suspension_communication()
+
+ 1
+ days
+ -1
+
+
+
+
+
diff --git a/partner_communication_compassion/data/project_lifecycle_emails.xml b/partner_communication_compassion/data/project_lifecycle_emails.xml
index b534559ca..ed452294c 100644
--- a/partner_communication_compassion/data/project_lifecycle_emails.xml
+++ b/partner_communication_compassion/data/project_lifecycle_emails.xml
@@ -73,134 +73,6 @@
-
- Project Suspension Extension 1
-
- ${object.partner_id and object.partner_id.email and object.partner_id.id or False }
- Extension of the project suspension
- "${object.user_id.company_id.name}" <${object.user_id.company_id.email}>
-
-
- % set child = object.get_objects()
- % set project = child.mapped('project_id')[0]
- % set suspension = project.lifecycle_ids[0]
- % set reasons = suspension.suspension_reason_ids
- % set details = suspension.suspension_detail
-
-
- ${object.partner_id.salutation},
-
-
- We informed you some time ago about the project suspension of the center ${project.fcp_id}.
-
-
- We received the information that the suspension was extended for 3 months
- % if suspension.extension_1_reason_ids:
- because of ${suspension.get_list('extension_1_reason_ids.value')}.
- % else:
- in order to put back the project on a sustainable process.
- % endif
-
-
- You will receive updated information as soon as we get them.
-
-
- Yours sincerely
-
-
-
-
-
- Project Suspension Extension 2
-
- ${object.partner_id and object.partner_id.email and object.partner_id.id or False }
- Extension of the project suspension
- "${object.user_id.company_id.name}" <${object.user_id.company_id.email}>
-
-
- % set child = object.get_objects()
- % set project = child.mapped('project_id')[0]
- % set suspension = project.lifecycle_ids[0]
- % set reasons = suspension.suspension_reason_ids
- % set details = suspension.suspension_detail
-
-
- ${object.partner_id.salutation},
-
-
- We informed you some time ago about the extension of the project suspension ${project.fcp_id}.
-
-
- We received the information that the suspension was again extended for 3 months
- % if suspension.extension_2_reason_ids:
- because of ${suspension.get_list('extension_2_reason_ids.value')}.
- % else:
- in order to put back the project on a sustainable process.
- % endif
- This is the last chance for the center to correct their processes or the project will be closed.
-
-
- You will receive updated information as soon as we get them.
-
-
- Yours sincerely
-
-
-
-
-
- Project Reactivation
-
- ${object.partner_id and object.partner_id.email and object.partner_id.id or False }
- Project Reactivation
- "${object.user_id.company_id.name}" <${object.user_id.company_id.email}>
-
-
- % set child = object.get_objects()
- % set project = child.mapped('project_id')[0]
- % set reactivation = project.lifecycle_ids[0]
- % set details = reactivation.fcp_improvement_desc
-
-
- ${object.partner_id.salutation},
-
-
- A few time ago the project ${project.fcp_id} where ${child.get('your sponsored child')} ${child.get('is')} registered was on suspension.
- We are happy to inform you that the problem is resolved and that the project is again sane and active.
- The project will do regular tuitions and spiritual activites to keep the situation healthy.
-
-
- % if details:
- ${details}
-
-
- % endif
- Yours sincerely
-
-
-
-
Project Transition
diff --git a/partner_communication_compassion/migrations/14.0.1.1.1/pre-migration.py b/partner_communication_compassion/migrations/14.0.1.1.1/pre-migration.py
new file mode 100644
index 000000000..503000439
--- /dev/null
+++ b/partner_communication_compassion/migrations/14.0.1.1.1/pre-migration.py
@@ -0,0 +1,51 @@
+from openupgradelib import openupgrade
+
+from odoo import SUPERUSER_ID, api
+
+
+def migrate(cr, version):
+ env = api.Environment(cr, SUPERUSER_ID, {})
+
+ # List of XML IDs to be removed
+ obsolete_xml_ids = [
+ "project_suspension_e1",
+ "project_suspension_e2",
+ "project_reactivation",
+ ]
+
+ for xml_id in obsolete_xml_ids:
+ # ref() finds the database record using the XML ID
+ record = env.ref(
+ f"partner_communication_compassion.{xml_id}", raise_if_not_found=False
+ )
+
+ if record:
+ # 1. Find and delete all communication logs linked to this config
+ logs = env["partner.communication.job"].search(
+ [("config_id", "=", record.id)]
+ )
+ if logs:
+ logs.write(
+ {"config_id": 1}
+ ) # Set to Default config (ID=1) to avoid orphaned logs
+
+ # 2. Delete the config record itself
+ record.unlink()
+
+ # Define XML IDs for the communication configs "FCP Suspension Follow up"
+ openupgrade.add_xmlid(
+ cr,
+ "partner_communication_compassion",
+ "email_project_suspension_follow_up",
+ "mail.template",
+ 389,
+ noupdate=False,
+ )
+ openupgrade.add_xmlid(
+ cr,
+ "partner_communication_compassion",
+ "project_suspension_follow_up",
+ "partner.communication.config",
+ 292,
+ noupdate=False,
+ )
diff --git a/partner_communication_compassion/models/compassion_project.py b/partner_communication_compassion/models/compassion_project.py
index 6a99a102a..ef4203a8f 100644
--- a/partner_communication_compassion/models/compassion_project.py
+++ b/partner_communication_compassion/models/compassion_project.py
@@ -1,4 +1,6 @@
-from odoo import fields, models
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models
class CompassionProject(models.Model):
@@ -10,3 +12,79 @@ class CompassionProject(models.Model):
"communication.snippet",
string="Caption to use for pictures, or prayer shared by fcp, or else",
)
+
+ last_suspension_communication_date = fields.Date(
+ string="Date of the last suspension communication",
+ help="Records the date of the last suspension communication.",
+ )
+
+ def reactivate_project(self):
+ """
+ Inherit reactivation to trigger 'FCP Suspension Follow Up'
+ """
+ # 1. Execute original logic
+ res = super(CompassionProject, self).reactivate_project()
+
+ # 2. Trigger the communication
+ self._trigger_communication("project_suspension_follow_up")
+
+ return res
+
+ def _trigger_communication(self, config_xml_id):
+ """
+ Finds all active sponsors for children in the project and
+ sends communication to the sponsor.
+ """
+ # 1. Get the communication configuration record
+ comm_config = self.env.ref(f"partner_communication_compassion.{config_xml_id}")
+
+ for project in self:
+ # 2. Find all active sponsorships for children in this project
+ contracts = self.env["recurring.contract"].search(
+ [("child_id.project_id", "=", project.id), ("state", "=", "active")]
+ )
+
+ # 3. Send communication to each sponsor
+ for contract in contracts:
+ contract.with_context(
+ default_object_ids=contract.child_id.id
+ ).send_communication(communication=comm_config, correspondent=True)
+
+ # 4. Update the last suspension communication date
+ project.last_suspension_communication_date = fields.Date.today()
+
+ @api.model
+ def _cron_suspension_communication(self):
+ """
+ Finds all projects suspended for more than 2 months without follow-up
+ communication and triggers the appropriate communication.
+ """
+ today = fields.Date.today()
+ two_months_ago = today - relativedelta(months=2)
+
+ # Find projects suspended for > 2 months
+ # AND (no follow-up yet OR last follow-up was > 2 months ago)
+ projects = self.search(
+ [
+ ("suspension", "in", ["suspended", "fund-suspended"]),
+ ("last_lifecycle_id.type", "=", "Suspension"),
+ ("last_lifecycle_id.date", "<=", two_months_ago),
+ "|",
+ ("last_suspension_communication_date", "=", False),
+ ("last_suspension_communication_date", "<=", two_months_ago),
+ ]
+ )
+
+ for project in projects:
+ last_lifecycle_date = project.last_lifecycle_id.date
+
+ if (
+ not project.last_suspension_communication_date
+ or project.last_suspension_communication_date < last_lifecycle_date
+ ):
+ # 1. First time for this lifecycle event: Announcement
+ project._trigger_communication("project_suspension")
+
+ else:
+ # 2. We already announced it, but 2 months have passed: Follow-up
+ project._trigger_communication("project_suspension_follow_up")
From 91e12c8c45e69c1bf230e59161240b44ccfacef6 Mon Sep 17 00:00:00 2001
From: Daniel Gergely <72557709+Danielgergely@users.noreply.github.com>
Date: Thu, 12 Mar 2026 08:09:16 +0100
Subject: [PATCH 13/22] [T3035] FIX: language detection now does not overwrite
source/target language in some cases (#2082)
- FIX: language detector now overwrites correct translation (source/target)
- FIX: correspondence created first and then sent to translation pool if applicable
- STYLE: added docstrings comments to compute write letter
---
sbc_compassion/models/correspondence.py | 14 ++++++++++++--
sponsorship_compassion/models/contracts.py | 13 +++++++++++++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/sbc_compassion/models/correspondence.py b/sbc_compassion/models/correspondence.py
index 378d33a9c..3b4cb08be 100644
--- a/sbc_compassion/models/correspondence.py
+++ b/sbc_compassion/models/correspondence.py
@@ -470,6 +470,8 @@ def _check_translation_language(self):
lang_detector = self.env["langdetect"]
for letter in self.with_context(skip_lang_detect=True):
+ # Determine which text is analyzed
+ is_translation = bool(letter.translated_text or letter.english_text)
letter_text = (
letter.translated_text or letter.english_text or letter.original_text
)
@@ -492,8 +494,16 @@ def _check_translation_language(self):
continue
detected_lang = lang_detector.detect_language(clean_text)
- if detected_lang and detected_lang != letter.translation_language_id:
- letter.translation_language_id = detected_lang
+ if detected_lang:
+ # update the target langauge only if analyzing translated text
+ if is_translation and detected_lang != letter.translation_language_id:
+ letter.translation_language_id = detected_lang
+
+ # update the source language if analyzing original text
+ elif (
+ not is_translation and detected_lang != letter.original_language_id
+ ):
+ letter.original_language_id = detected_lang
@api.depends("uuid")
def _compute_read_url(self):
diff --git a/sponsorship_compassion/models/contracts.py b/sponsorship_compassion/models/contracts.py
index a9473f54e..0dc690d6a 100644
--- a/sponsorship_compassion/models/contracts.py
+++ b/sponsorship_compassion/models/contracts.py
@@ -449,6 +449,15 @@ def _compute_can_make_gift(self):
@api.depends_context("allow_during_suspension")
def _compute_can_write_letter(self):
+ """
+ Computes whether a letter can be written for the current sponsorship.
+
+ A letter is permitted if:
+ 1. The project has not suspended S2B letters
+ (or the context bypasses the suspension)
+ 2. THe contract is in an active/pending state, OR it is 'terminated' but still
+ within the configured allowed time (default 90 days) since its end date.
+ """
days_allowed = (
self.env["ir.config_parameter"]
.sudo()
@@ -456,14 +465,18 @@ def _compute_can_write_letter(self):
)
now = fields.Datetime.now()
for sponsorship in self:
+ # Project/center has suspended letters
hold_letters = (
sponsorship.project_id.hold_s2b_letters
and not self.env.context.get("allow_during_suspension")
)
+ # Letter not 'terminated', 'canceled', or a 'draft'. AND not on hold
is_allowed = (
sponsorship.state not in ["terminated", "cancelled", "draft"]
and not hold_letters
)
+ # If 'terminated' but not on hold, check if within allowed
+ # time since end date
if sponsorship.state == "terminated" and not hold_letters:
is_allowed = (now - sponsorship.end_date).days <= int(days_allowed)
sponsorship.can_write_letter = is_allowed
From 1e439a95db907cba99e093d3e52334d066838a04 Mon Sep 17 00:00:00 2001
From: davidwul
Date: Mon, 16 Mar 2026 13:23:26 +0100
Subject: [PATCH 14/22] Update gift_thresholds.xml (#2083)
* Update gift_thresholds.xml
avoid the updates of gift threshold to be reset
* Apply suggestion from @gemini-code-assist[bot]
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---------
Co-authored-by: ecino
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---
gift_compassion/data/gift_thresholds.xml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/gift_compassion/data/gift_thresholds.xml b/gift_compassion/data/gift_thresholds.xml
index 61543e4f8..0ad05c6ac 100644
--- a/gift_compassion/data/gift_thresholds.xml
+++ b/gift_compassion/data/gift_thresholds.xml
@@ -1,4 +1,5 @@
+
2000
+
From 0480c23154b72d7ed048a203b8fc3fb35909834f Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Wed, 18 Mar 2026 11:28:54 +0100
Subject: [PATCH 15/22] T3063 ADD missing xmlid entry
---
.../data/project_lifecycle_emails.xml | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/partner_communication_compassion/data/project_lifecycle_emails.xml b/partner_communication_compassion/data/project_lifecycle_emails.xml
index ed452294c..8468e8c92 100644
--- a/partner_communication_compassion/data/project_lifecycle_emails.xml
+++ b/partner_communication_compassion/data/project_lifecycle_emails.xml
@@ -72,6 +72,20 @@
+
+ FCP Suspension Follow Up
+
+
+ Additional information about the center
+ "${object.user_id.company_id.name}" <${object.user_id.company_id.email}>
+
From fdc186d4314a3245c6edb0c992939e1cf7692cf5 Mon Sep 17 00:00:00 2001
From: Daniel Gergely <72557709+Danielgergely@users.noreply.github.com>
Date: Wed, 18 Mar 2026 14:16:51 +0100
Subject: [PATCH 16/22] T3059 fcp lifecycle events (#2084)
* [T3059] FIX: last lifecycle event now takes date into account
- FIX: take all events, sort by date descending, take first date and calculate state according to this event
* [T3059] FIX: added post-migration script
- FIX: post-migration script should now update the last event date on all projects
- FIX: changed the sorting of the lifecycle events in the projects view
- FIX: updated module version
* [T3059] FIX: GCA and pre-commit
---
child_compassion/__manifest__.py | 2 +-
.../pre-migration.py | 0
child_compassion/models/project_compassion.py | 21 +++++++++++++++----
.../views/project_compassion_view.xml | 4 +++-
4 files changed, 21 insertions(+), 6 deletions(-)
rename child_compassion/migrations/{14.0.1.5.0 => 17.0.1.0.9}/pre-migration.py (100%)
diff --git a/child_compassion/__manifest__.py b/child_compassion/__manifest__.py
index 48a2fb002..e5c07f6bd 100644
--- a/child_compassion/__manifest__.py
+++ b/child_compassion/__manifest__.py
@@ -29,7 +29,7 @@
# pylint: disable=C8101
{
"name": "Compassion Children",
- "version": "17.0.1.0.8",
+ "version": "17.0.1.0.9",
"category": "Compassion",
"author": "Compassion CH",
"license": "AGPL-3",
diff --git a/child_compassion/migrations/14.0.1.5.0/pre-migration.py b/child_compassion/migrations/17.0.1.0.9/pre-migration.py
similarity index 100%
rename from child_compassion/migrations/14.0.1.5.0/pre-migration.py
rename to child_compassion/migrations/17.0.1.0.9/pre-migration.py
diff --git a/child_compassion/models/project_compassion.py b/child_compassion/models/project_compassion.py
index 6f2f998b0..1c825890e 100644
--- a/child_compassion/models/project_compassion.py
+++ b/child_compassion/models/project_compassion.py
@@ -480,13 +480,26 @@ def _get_months(self):
@api.depends("lifecycle_ids", "lifecycle_ids.date")
def _compute_last_lifecycle(self):
for project in self:
- last_info = project.lifecycle_ids[:1]
- reactivation_lifecycle = project.lifecycle_ids.filtered(
+ if not project.lifecycle_ids:
+ project.last_lifecycle_id = False
+ continue
+
+ # Sort lifecycle events by date descending
+ sorted_events = project.lifecycle_ids.sorted(
+ key=lambda r: (str(r.date or ""), r.id), reverse=True
+ )
+ # Take first (newest) event
+ last_info = sorted_events[0]
+
+ reactivation_lifecycle = sorted_events.filtered(
lambda r, _last=last_info: r.date == _last.date
and r.type == "Reactivation"
- )[:1]
+ )
+
# If it exists, lifecycle with type 'Reactivation' is determinant
- project.last_lifecycle_id = reactivation_lifecycle or last_info
+ project.last_lifecycle_id = (
+ reactivation_lifecycle[0] if reactivation_lifecycle else last_info
+ )
def _search_last_lifecycle_id(self, operator, value):
return [("lifecycle_ids", operator, value)]
diff --git a/child_compassion/views/project_compassion_view.xml b/child_compassion/views/project_compassion_view.xml
index 647048f41..47c5925ca 100644
--- a/child_compassion/views/project_compassion_view.xml
+++ b/child_compassion/views/project_compassion_view.xml
@@ -80,7 +80,9 @@
-
+
From 657791000c89143537704761de2f0bec9afe4077 Mon Sep 17 00:00:00 2001
From: davidwul
Date: Mon, 23 Mar 2026 09:55:05 +0100
Subject: [PATCH 17/22] Update account.analytic.group.csv
add full set of fund hierarchy. manually updated the ir.model.data table accordingly
---
.../data/account.analytic.plan.csv | 52 ++++++++++++-------
1 file changed, 33 insertions(+), 19 deletions(-)
diff --git a/intervention_compassion/data/account.analytic.plan.csv b/intervention_compassion/data/account.analytic.plan.csv
index 51d6a5f44..ef65b67db 100644
--- a/intervention_compassion/data/account.analytic.plan.csv
+++ b/intervention_compassion/data/account.analytic.plan.csv
@@ -1,20 +1,34 @@
id,name,parent_id:id
-analytic_group_interventions,Interventions,
-analytic_group_church_plant_initiatives,Church Plant Initiative,analytic_group_interventions
-analytic_group_disaster_response,Disaster Response,analytic_group_interventions
-analytic_group_education,Education,analytic_group_interventions
-analytic_group_formal_education,Formal Education,analytic_group_interventions
-analytic_group_hiv_aids,HIV-AIDS,analytic_group_interventions
-analytic_group_hiv_education,Hiv-Education,analytic_group_interventions
-analytic_group_hvc,HVC,analytic_group_interventions
-analytic_group_health,Health,analytic_group_interventions
-analytic_group_income_generation,Income Generation/Household Security,analytic_group_interventions
-analytic_group_infrastructure,Infrastructure,analytic_group_interventions
-analytic_group_learning_materials,Learning Materials,analytic_group_interventions
-analytic_group_medical,Medical,analytic_group_interventions
-analytic_group_non_formal_education,Non-Formal Education,analytic_group_interventions
-analytic_group_parent_education,Parent Education,analytic_group_interventions
-analytic_group_sponsorship_launch,Sponsorship Launch,analytic_group_interventions
-analytic_group_survival,Survival,analytic_group_interventions
-analytic_group_vector_borne_interventions,Vector Borne Interventions,analytic_group_interventions
-analytic_group_wash,Wash,analytic_group_interventions
+analytic_group_church_plant_initiatives,Church Plant Initiative,analytic_group_bible
+analytic_group_disaster_response,Disaster Response,analytic_group_drf
+analytic_group_education,Education,analytic_group_vocational_fund
+analytic_group_formal_education,Formal Education,analytic_group_vocational_fund
+analytic_group_hiv_aids,HIV-AIDS,analytic_group_aids
+analytic_group_hiv_education,Hiv-Education,analytic_group_aids
+analytic_group_hvc,HVC,analytic_group_hvc_fund
+analytic_group_health,Health,analytic_group_medical_fund
+analytic_group_income_generation,Income Generation/Household Security,analytic_group_vocational_fund
+analytic_group_infrastructure,Infrastructure,analytic_group_drf
+analytic_group_learning_materials,Learning Materials,analytic_group_vocational_fund
+analytic_group_medical,Medical,analytic_group_medical_fund
+analytic_group_non_formal_education,Non-Formal Education,analytic_group_vocational_fund
+analytic_group_parent_education,Parent Education,analytic_group_vocational_fund
+analytic_group_sponsorship_launch,Sponsorship Launch,analytic_group_child_development
+analytic_group_survival,Survival,analytic_group_survival_fund
+analytic_group_vector_borne_interventions,Vector Borne Interventions,analytic_group_medical_fund
+analytic_group_wash,Wash,analytic_group_wash_fund
+analytic_group_unrestricted,unrestricted fund,analytic_group_fund
+analytic_group_drf,drf fund,analytic_group_fund
+analytic_group_bible,bible fund,analytic_group_fund
+analytic_group_christmas,christmas fund,analytic_group_fund
+analytic_group_local,local fund,analytic_group_fund
+analytic_group_aids,aids fund,analytic_group_fund
+analytic_group_wash_fund,wash fund,analytic_group_fund
+analytic_group_ldp,ldp fund,analytic_group_fund
+analytic_group_survival_fund,survival fund,analytic_group_fund
+analytic_group_hvc_fund,hvc fund,analytic_group_fund
+analytic_group_usp,unsponsored fund,analytic_group_fund
+analytic_group_child_development,child development fund,analytic_group_fund
+analytic_group_medical_fund,medical fund,analytic_group_fund
+analytic_group_vocational_fund,vocational fund,analytic_group_fund
+analytic_group_fund,fund,
From 5a53549ae3ccebca9c99b46233f97eaef8680157 Mon Sep 17 00:00:00 2001
From: Daniel Gergely
Date: Mon, 23 Mar 2026 13:11:08 +0100
Subject: [PATCH 18/22] FIX: corrected order of funds in
account.analytic.group.csv
- FIX: this change makes the intervention_compassion module installable again (main groups need to come first)
---
.../data/account.analytic.plan.csv | 22 +++++++++----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/intervention_compassion/data/account.analytic.plan.csv b/intervention_compassion/data/account.analytic.plan.csv
index ef65b67db..2e60925db 100644
--- a/intervention_compassion/data/account.analytic.plan.csv
+++ b/intervention_compassion/data/account.analytic.plan.csv
@@ -1,4 +1,14 @@
id,name,parent_id:id
+analytic_group_fund,fund,
+analytic_group_bible,bible fund,analytic_group_fund
+analytic_group_drf,drf fund,analytic_group_fund
+analytic_group_vocational_fund,vocational fund,analytic_group_fund
+analytic_group_aids,aids fund,analytic_group_fund
+analytic_group_hvc_fund,hvc fund,analytic_group_fund
+analytic_group_medical_fund,medical fund,analytic_group_fund
+analytic_group_child_development,child development fund,analytic_group_fund
+analytic_group_survival_fund,survival fund,analytic_group_fund
+analytic_group_wash_fund,wash fund,analytic_group_fund
analytic_group_church_plant_initiatives,Church Plant Initiative,analytic_group_bible
analytic_group_disaster_response,Disaster Response,analytic_group_drf
analytic_group_education,Education,analytic_group_vocational_fund
@@ -18,17 +28,7 @@ analytic_group_survival,Survival,analytic_group_survival_fund
analytic_group_vector_borne_interventions,Vector Borne Interventions,analytic_group_medical_fund
analytic_group_wash,Wash,analytic_group_wash_fund
analytic_group_unrestricted,unrestricted fund,analytic_group_fund
-analytic_group_drf,drf fund,analytic_group_fund
-analytic_group_bible,bible fund,analytic_group_fund
analytic_group_christmas,christmas fund,analytic_group_fund
analytic_group_local,local fund,analytic_group_fund
-analytic_group_aids,aids fund,analytic_group_fund
-analytic_group_wash_fund,wash fund,analytic_group_fund
analytic_group_ldp,ldp fund,analytic_group_fund
-analytic_group_survival_fund,survival fund,analytic_group_fund
-analytic_group_hvc_fund,hvc fund,analytic_group_fund
-analytic_group_usp,unsponsored fund,analytic_group_fund
-analytic_group_child_development,child development fund,analytic_group_fund
-analytic_group_medical_fund,medical fund,analytic_group_fund
-analytic_group_vocational_fund,vocational fund,analytic_group_fund
-analytic_group_fund,fund,
+analytic_group_usp,unsponsored fund,analytic_group_fund
\ No newline at end of file
From 5e792e3e8fd2e48c004036ef9e46deffa4b41f8b Mon Sep 17 00:00:00 2001
From: ecino
Date: Thu, 26 Mar 2026 11:22:37 +0100
Subject: [PATCH 19/22] [T2747] FIX: moved state update to after payment
configuration (#2086)
* [T2747] FIX: moved state update to after payment configuration
- FIX: changing state triggers the creation of the communication job, but the payment information/pdf is not yet in the db at the time. This should solve that issue.
Testing is still needed!
* Update sponsorship_compassion/models/contracts.py
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---------
Co-authored-by: Daniel Gergely
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---
intervention_compassion/data/account.analytic.plan.csv | 2 +-
sponsorship_compassion/models/contracts.py | 8 +++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/intervention_compassion/data/account.analytic.plan.csv b/intervention_compassion/data/account.analytic.plan.csv
index 2e60925db..75c4b9d2a 100644
--- a/intervention_compassion/data/account.analytic.plan.csv
+++ b/intervention_compassion/data/account.analytic.plan.csv
@@ -31,4 +31,4 @@ analytic_group_unrestricted,unrestricted fund,analytic_group_fund
analytic_group_christmas,christmas fund,analytic_group_fund
analytic_group_local,local fund,analytic_group_fund
analytic_group_ldp,ldp fund,analytic_group_fund
-analytic_group_usp,unsponsored fund,analytic_group_fund
\ No newline at end of file
+analytic_group_usp,unsponsored fund,analytic_group_fund
diff --git a/sponsorship_compassion/models/contracts.py b/sponsorship_compassion/models/contracts.py
index 0dc690d6a..5af12df78 100644
--- a/sponsorship_compassion/models/contracts.py
+++ b/sponsorship_compassion/models/contracts.py
@@ -788,7 +788,6 @@ def contract_active(self):
not_active = self.filtered(lambda c: not c.is_active)
if not_active:
not_active.write({"activation_date": fields.Datetime.now()})
- self.write({"state": "active"})
last_line_id = self.search(
[("sponsorship_line_id", "!=", False)],
order="sponsorship_line_id desc",
@@ -802,6 +801,13 @@ def contract_active(self):
last_line_id += 1
contract.sponsorship_line_id = last_line_id
+ # Flush env so db reflects payment mode
+ self.mapped("partner_id").flush()
+ self.flush()
+
+ # trigger auto comm job after payment info is written to the db
+ self.write({"state": "active"})
+
# Cancel the old invoices if a contract is activated
delay = datetime.now() + relativedelta(seconds=30)
self.with_delay(
From c70614be29304ab766b4fab2fb5db08c6fa36f27 Mon Sep 17 00:00:00 2001
From: Emanuel Cino
Date: Wed, 1 Apr 2026 14:40:43 +0200
Subject: [PATCH 20/22] T2975 UPD German childpack
---
.../1904_dossier_de_DE.jpg | Bin 1571822 -> 1802040 bytes
.../1904_dossier_de_DE.jpg | Bin 261604 -> 573120 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
mode change 100755 => 100644 child_compassion/static/img/child_compassion.childpack_full/1904_dossier_de_DE.jpg
mode change 100755 => 100644 child_compassion/static/img/child_compassion.childpack_small/1904_dossier_de_DE.jpg
diff --git a/child_compassion/static/img/child_compassion.childpack_full/1904_dossier_de_DE.jpg b/child_compassion/static/img/child_compassion.childpack_full/1904_dossier_de_DE.jpg
old mode 100755
new mode 100644
index 95d75a71a75894ebed89024eb833c3b393d4ef2f..3f413c8420af194eb7f2e8167339b95f2a46b79b
GIT binary patch
literal 1802040
zcmeFZ2UL^Wwl5w)P(e_t3W(B85D<`FRH}p~A@sKCH9+W{tx}{5B=oWo0tN)6g$_y!
z9qGOI4xxjqC9{A
zpPmpr0RXP%Z|Nw?$QZwdsL3lT%i#+EfLpJWZ5$j4?*ITW2Ull^g7hODUA;%wdjN!h
zn*b639{^xt=HjHHArA%MlcJo=BNsf;PyDxZGz`GE1ONc$=MYE
zAb5?Z7BIJPF~j3PJhu06b^4jVi^nvkc0V!UwV&7-&mbP(`-!dog7LE9Y5sy={KV!k
z2Xj2lPoAC3Vdg(^GakQpceB7_B4s=dcDJ$cz~ezYX0vyL+2HXB9@D@qOk4nfYqx&p
zyIPo8iL`6j&
zy|VDIw{Ugker;lAXX0%BNX8N7Wa8ij0Q^PfpS1u~KXv;EuVf)UQ6V92ejdE~|C;{Y
z!oO1e`{1W-|3a~^{x3EopzHcu-rwr}Ezj{I03dRR*Ug8&<(Vb{02M(1z`gOm<+1$+
z0Nf4)05H9OClB4v{$lOw>LkX?>*3+SV`E{)^HZUJP5&XmUn&1>@OSUy`T4%T>h6)O
zg{6s`z3Zc&N;Pw|cXV@p+kq@0eM8fDOPd;0SPzpU18fkP}c7+$VTQ
zz)rwLz)v7TAVnZYpiBTE&?WeVz>2_uz>UC{;2l9YK`cQsK_&s3pqQYF;2S|ZK_9^w
z!5qOF0gm8|kcjXWAr0XJLJmS+LJ`83gi3@^LPJ6;LO7u}VIW}?VItv2!q0>l!f%9~
zghPb0gd2p1L;xZ(B03^wB5ooPA{inzB0VBYB4;9hqA;R(qK`y{MAbxCq5+~=qD`XH
zYb4jGuRXfPeNFt@t81Fq%&x(&`Cp5;mVE8gHO#fdsA|WB6BjF?wCV54oOJYmnLlQxfMp8ubm86ekf#mS|
z_3QVqb6uCbu6Etzy6g4e>q*x?UvIeHe|_ot$qlj_4{z|_kiVgK!{Nr;8}T>tZq(oC
zzp--T{N|mT>^H@3s@*id>2)*uX7#SWJ1KXn?u^_yq@n9!kpn__vHWfBswtTj6_M7Y??AGiF>{#|=4o(hjju4Itj#bWk
zoQj;@ocWxSkI5fDe++;8@$n##1SkTu1EvALg9t%_AZt(xsF#b7ONh&cD~+q~3Goxr
zCk{_OJ{jS@#r=}oojadO_^Je_goQ-5#DXM?q={sv
z!~%(odzGrOTy{WyECsWWLH0
z$tuW($@a)m$!W?Z%T3F($Xm(h%kL@(D)=aTeMS6A=~c|D5yc0JW{POVU9d3N58SMD
zOG!g1S!rGwr0lF*twN{*R*6%YRApCnP_0k{s41$&sZG7+d<}nHqfVm!T0KR58Nvtg
zg)Ls&}is{=3`Aa%|@-;S_WEZtz&Ij?O5$u9bO$jolaePT^rp>z3X~f
zdO3QB`f~b6{UrlIgJ6SULrz0a!*(NjBYUGdN0_f!NLs{NtXN7~##*jgNm|8Otyw>}j>lk+Dg(*|U9Rn_+uw
zr)HOHcV(|_Uj(}W`vq3zK;>ZP(Co5!!!QIGFU)R*b;WF@Ze?E;xT>*Qyt=%GrzW?Sxi+Pawl2D!v_7!@s=>SA
z@T=3;&2LuU78;EkCz^Dc2AkEJds>uQ+FIpXo3Jmj4Q-Nbwe4cwa1s0W_j3=P9W)-k
zKAb*+9i1PCo!me9bSiR+J<~p0IrsQ+{YT;j@S^%s>2mT4c6D_%0g(BZea6qd#=n;c
z2?+@BKLmvTJN*q2{%qv$>i#RT|4sfM{=WJOpuBPO3$+Om0VRNtl7NVk;Hnw$5bx3u
z;+JrI^FMu+pXtU;lIx_`h{=cue-eb=0T5gxBm@u<5#697B_jdw;_0sulUygbag&Og
zl7^P<9t-JRW-V=G{Lp^z>JZbo#L`MZ1r1#jx8R&IPII`kYjLZroT8cKTT~m+%EskgXv<@ZH!F(aU&kWHrMIg%t+4uy6gf+FD-Q45K2Si@VsB1u7-v-5&_Vo`v6O=bG
zgS&WqM3rD#hS^1BE#JHg435vrE?#=2V;+;4)4EH_q42G-Nlr23eKU4$o}SafY7Ymr
zUS3GZy&4DHBEmCENkj>F4rn04dSU*e+kcWL+1SX;Z;Y%*%#i_vjgppIcLy`8-na_Ga40jsu$A$I_0i
z2K+b~zMqlxKhysc8W25}@JRXPpGwraG`}-~#^?bydqvJWB*^BqDO-T
ze~{fcOer&l_VKYWe{%f$G;m#NC2HUP_tpJ_
z*1B6-)bK(?VN-_wk~q-2dz=?7HR`wB7eLo47~p;(XfWf-@x!8tmrdZ|A5?%p+4^tS
z08xg^pMmrLcCG%|;2%r_e+JI~UpnLcLopxIEK%;zm98z&gS3?uk>I4R?4FBDXL!I
z!k5{oXFSAlcw4tE=e13drd8F(Y`^!Ono+X(e4ROF+-*nD!8H
zZ_`GqiI$0E!}+=HyEo>2QFddOaz(A)s$0@#a*u7`rxuc39jJ^o%Um(nu-VXao~vVD
z;+9&{E55&sJJ+VkaFyXdQ_!JYmTWoy_EA7}WXVvpWec{ANv91R
zH6Nq>e9sN{R7Z;zVl!IaNbNn8ml2cH9PQfKKPD?E6W%5IbS61mr1zz~qktpND>|t7
zw%KFT$k%>P%7TE3vDrm(=qg5T^)R!_97Oz3^E?+@W&ELqqEn-(F=lh4!!VliuukXK
z#&kCuuv=7`dfqdrKZjSIv`8pqplL3bRw$PW2OWDF@u>UP|7+d!ANb-wr^0`ra{mW4
zeVf9d5?RdNo53UT_)b;>zx`NrIX&Csm}Gq%JNUy{rL5;xNtD(?_)4Hqpfk#)(Q_s4
zEKp?OJ*>=jAicUu9!@SiD?5`Z=7y@pX2b<4V$m8Vy_Gq$^PUo3Olbinw|Rg!8@|Bet@NL7
z=}jkb#(yYljHHn8OWmpqCHaamftY2Ip(PMCV)CKO-ty?><@GZ%Nnat2MNDe_`&^m=
zdk4WivGXd9p@#v`fh0&uAofF-pWxEch5DvvG*>N(>tQBlT;rDV$=7HW#&$Q{eD52O
z?EUZN0{k?ij-qr>QFQ~Qz9qR29kG==n0;$Kx+qUQxdo!hg}GeyfyoGt}b
zwp8brVP3M{%a+79>0sw=#Z(%WaKF9q{!)3_vIU5G)sWk+b~on(j)zmYOX^W8CjCg?
zdaBNnqt3_zruRX6gVRV;&5iVM%yEUQ6jQVs61RW(cDyoGPJn2KX;Z*b#*iWy_n;b;
zRhJ8iBS5VkSWypV?;$c)-8IjAt*D#kQ0tIg{#KksZv(t!+gvFzLRfFp7Yiy$+>d2S
zYMFRi%$5foyX}>&>b=7ifvcUY-l*SPsNL(mq5mo4Ob#4Q1oNSwXRYWAeSlz>)Z+{p
zJ_bS3p(qUA1i*ISG289F?I-B-@QIS4ZWB4ge&+V
zPU|ApC#923;~J?!3q<)nJp6Pi+9x))JdN18+P#ZYsorjI9by0_DJ@YBbCfJ+_gMC#n#&A)!@+LB
z<5?n8sT_tv3K5kN0vp>fwq@I{PUasCDmX_aUSz_Qx)|-n0&Kp
z%(x6BzBhwVgzECqIx%ouZ`Y`MYY7KaymV_BPuty;IojGI7Jx={DdNh%SdW%Uy3Re8Z&Hr<
zEsPZP1`$^P`^F)fzO)5`C1p{DAUWsmbMcJ;0Y{O+PW8Yz}M(?+8
zKB21R5RCTFetBx0>y~jw_qT5tueewP*bckg;_8J}mE*Wwp|TZeP*1i*8twi7`AuyL
zoR?=+7z4i)cp&}EN>`}s_fHdIGwu1b1w
zVBcA{!Q
z6!KeX=Y!>HBn!xG#L&|geAvgU07k}Y#2Q+NvP;PBPB_$Tr(*>?l-=hsixnyb4I6D1
zJ!M#Ap6h@rN0@vvIsuU;hWHGf=x71Y<-cD@-Cml$|KO;x&@iif{iwGjeuVo905cW*
zQktg?*|%{+3HSx|WRM#p(GAa;_Eum9z}rqCRM~Lr+3llowW!cr(|q@(YZC@Pbsp9^
zX12*V1ib5>Rs-rkVAq(ZQ-e5LLB>kXRGyu(^^bhPz26p?Ghq95MswTM!5WZLU;w9oGQ&?4iM
zTW-}~vj$UgkOPDL0`Af=fZ&P{WG=btt2s;u0x25nr9AV6i9=Uq`cvLIRs()cQR(J*
zFE=fsRF|rqUnr-oFb#N07te70Nf9omSgTNyLj~!k7aPiJpl0e9^qDioqMo?8?DfL%
zbZwE%Y^DqkDYy?57SJdhKPtlPlp^xj?ScDu=Ce!hhw}04ItYjdz_``5
zvl56+xGbq8Eq*C1x(`&;UWE_jLDMziOd7C-k5Ckc=D13o_m9dCp^qW3b*)d{rWgKx
z{CjXn_GKt*eoB&r5M&|AJifnh=c8=6G2OF!e2GCM)VG>LC|J3%;S^8Y`#UMKo_0Xq
z@1@w>l)e*1gW{+@yNN3ZkeY5X7ELjQm9C)nCQ
zp*Nv8Cv?tWzw9bPM=LvmHuL+StgM4Jju|Q@Ap?TbF%<#vgYUn86gsGKIKLm!REU1O
zQj(=^J3{<2S(A#W9EfvUmr>zl4=@CeR0j`?^elua!E%$pVAa9`UDS7*ogpsjl-w7Q
zxq4G>hKlFVQ!v~}$)-;gXz&S)aJfBon@M7TTeFpDpu8`0PV6qDRw)0Lk^LO}qF5
z&O6o1a5BX)cpQqv$E3!?Qv43W(gY$^ix)uG9LzUFx2SSQa!aB*swXTYH=!%EL+pxL
zktOr0KDgQnP!Envxk9L&x8z3-4w5su=p|Slw6s))m8`eXq8pBV;BWS0|KeD?qb@^X
zAC(bA@<52|sm<>A8w!57P5kTl6#4WP?kri<^KwPq<(?$<*n{!F3eK*$LM8ap`bM~R
ziAMMkSUs9CD@@rx!8O70*wG66?QqMdTqjNc`=UK8!;C~`w2(-NS(R%TF%O-g8)J(f
ziw*0DH;;No
zGR)^wU|s7?U$_zub??}G(s+7*2!!PGw#(;>DJt3CW75_RwE(rZcof5UL}uLl>^2St
zwnp?+6?T@CduuI@Iv|K#Mo20IQ4pjzT+Y;+
zCI3;K)ybqZCl6A7IO#RzI`DqKV|{>=ab4AL5Cv3%p}0{%)l0r6e6atYG5vXb{?BOD
z|8tq{DAlH&4@@z9Q->!>;xf$5?_}2$xoJWN`F!GPJL+b_$$&=T=vKH;c0Qu5*suKD
zk5ey*$voSqiUl@3uI)jW``Poxrt7D?fpTR%?+G&%KVL{{T&tJj01}Zuif$2#G8LaB
z$7XIFikCs}PJl{c3%kil*WI>U4@)4`$Zr;)9kJ|lHcSZPl1SQ?wo^q0++{={tsTK*
z$Hy2Op+WlTIPAy6>qUr_G|iJC`fSlA5ae}-xw4=06Algm|6|~eViCvJ%}%)`r$EmrWji8jY*xxMo(O9%dxLVoX%Dtu}@Q-`FFL!&F%$BY&f;{?idb!NaiF}!I9dg>KVERtLedj6
z0oR3<9qWU=G?>@=Ny!OGA0G*RXaS`>ERsLju`4o;Ylg?WN>_%hx3_>adPEBMlU(R+
zkFhni@wh&Y>I(V!F6Q9zWnv~`KMsLT*hoB@M>KYMm=||80VgkN!|CA^q*H9jmRj-~
zqWg**Mjh`Op_Pq|jrC*oRU5=rjj8WvFD!XDFYmY=ntg9udr)~hpJOanMs1Bnpn7e|
zE+HazzM&DDQ0?vD>wdm=6fh>Kf-UcT&eZKZ)2CK(k-Iq=P=5aWEa1of&YIIiz~G9{
z#uZ@iA+NIPyw78)!x3E0L-E#uW+8(SRB?H+E#`sO3Z>z7ExU?GUnauND94;TAI7lT
zSM*9jfsO?Mr*?W#K7J2{>Tbx`X4T>@9Nd)ShKt_j}BK^g*(1?w;<4T_ls-e`pDh;{G!9udxi81xHiu&ntPZvq%mc2
zrF#o^-kUISP+LEkJ2oLb#$EL5%Kd!B+>wi9*@}S^;SBwN*)(YP>f~C1(^Peu4gKZE
zW_iIMtWTJGccbEJA3nPRm=sSvM>wYUtkm%Gjxr2Qy32E`mEvmSfVC}dIYQl82>wYe
z4dBRHu0dB_8W4V`P;b5-liA}Xvn|miDDJy~sjc4RvhB@jey5B%sg|g;FY9zv@_IGT
z*}V4AK-m?8uwJgVXwhHW7!qR#my5H@R(<@wY;e~N3_U|O<=a|RIZEKh!iK|!$~~8C
za|X{+A%o*?XY{(;`D{6JZO>9({GZQwf9x9n^?lKu^O}?N(Jt52ur!qx1iHPx2#L^u
zh%I<%SLXBCQ?u09apwnh9_flg_hV9ilpker1)g4nS!^Yr#?^%P&Dd8%643#;hsyYZ4Icqf!g
z<|sF-MQuSC*?|I_kna;~&Jw;7W}|IT?bNWDhz}FCVCNR)x}qOaPJT^+c9VrdJwZMS
zN<#DHU7Ymo`bfI*0*onGWifkLRXblppBc*q86cAZ9sVM9jN0_#GH74!b->D}4Nr4d
zWE2aANzS=J(4~ED+SXi=92vse+47o9VtIFP(XW%pAAbU_k=HQ;EzNa)*e7YgW(^6R
z6ik+EG89TJ$)w3Ny1hVB?R!Ye+TXpA?Mn~#nJY&>sAfHM8pkfYj|J@>m
zwyC*&&T3g#=85!Bmo2}qwcN0}$ue+$;g($EqDa48Ut0Y9+Isi|HByhkwY()b*j2o%VPt(>G?AdyC~uOLOY
z$!sm!wvK|F;0`0@i%)V&2^%-|Lkn~*U&Hn8C8>m~daotQB7?MT5ntrvYKM1S!s*2zB3#}m8CwN!R&ej>Gc-Vc%ZVo
zfCfX|_bgOJa!$g=gJ)!_fy3NMYIQj_kXq*cSwW2tkuFLD;}PTRqRmV5=0{XKx4Z1)7Kf&)X#-o4$pYFE@j%p2wdO372OK|ZkTI+t^=lu*uDn1NT
zG5j6v>gpYH^W~8}kt{y-mZvT~T^xq8N%mZ!cVR-ys7mDEx9FT=^y@u?F>mYi9KDeu
znp|F8wYsp_ey`eGnsf$R*1Fb7dWRYHyJGVEwsHKjB2(UnwaaO`K%KKSi`3X$+RjA`
z63(dD7_~Ba&hSN_>+yuXF)I>bS!F)sQ=EPUSW^Fpg-Idklizb+YHKS|fpkruSoX&!
zSs->ZY-=a;&9p8EW9%U&eb&WgA%s+LY1h;BkrgzSc3LBfD+#RaC11O7xQ^=7O42J(
z95z1<+ZfUGUCeFAJ1me1nEqBuM;yX5(yNVu*PpQ_Zq1?5blokUGhdTz(x6pMmKz>bs#gn3lIz`217D{;3ctE
z)>nvqKGTvah!Ny(%u}{-^FJ
zpk8jllad($`^xM~bhCyhT8)3gMk6%RhqH=`^}C*JVgBrw>L%1mi;7{VNcp>Xh6I~$
zN;gebj_DTQWqONu7HiQ(E;0m8e4{^f&nuc1cbj;VU>x7TO9J|JAlq85u6&_GubZ+r
zyq7NL-W|{lrbCZHs1{LX36!Eh4lb<*n#3LT&2@)(B!SI0Us?+(Q$NJoj658)tZfBT
z!KxZaF(jg7nc4X9A1q#H^zp|s`a6y;L;*OBjU|M{6UMad*njahW65s*97iH8#MErD
zNp|A|x`OERpgq#=!dz+^MTzL8ov`VP-kf7HFYO&=^~rFz7gyxvKp8nG5A&;;zt3)u
zNe+;K=tE*V8q7sH{Q6iX^fmkpxh$Y(WHBZ+VKvHiwDeM>7nC5lmpNgl&1d0V=I;Wuw>S$tIhTH(0P4Ut9{+Qb;#JqV(?5)jshaoK!9i9{qAr`ipOls
z68}J3Ud@|+y4fmy?*tfszC+ZJ;?UGx#7a!}H2i^L6q1uM#ftqnZk#3v$e#J-h-3yc
zX^DbMq{J4^K+2?JA~>`M(>H84ph4`qrVFFF)rCDFRLF#Q?bvU>W7Pk_tNa_j5=qtA
zgq87H^}QsiwuVzt1*vJtTe>r3)s=?@D48!`EP1QH4|jMqJQJ(h*hgoVW3x6PCwkwJ
zDm7$%172dPMzmbF%{H$9QX?>?x0Vdx*b^`=zR)p=
zZ~4tYX4fa>QKnlWTY$`pYH;~>&~-VUxNNuXyU6KSbQ
z;W8>~vvxs}c6zaax!g8l?4n#oI0WLHMK^hcTL;iLAzmV;p)w_n#Yj2yh`X8SrFfRF
zWwjTkYud%K$vSA@@4u~C7|npBg!ep(Z>9V~*yjEC?l
z=|zjWj#1NU{nkIOygX)c%!*0w)=FOt66%VF&S#-oC+68f5X}y0pM-v1ON@Up#hc26
z67KcplW`?msSmaqcRyQ*VPfZNu8G>fK=2Bxbe33@(@+=`kvy?7HT1kX_j2_7;n{Dh
zOxecC_pbmcE0;$)SAY#5Rg^hbZ6Npeu}_}HQV(x30BohX|a
z`#R)xg08Wff$)cc?)-KQN1=&GGziv=QiLc6Hc=e>%TOZuIG!>CU3>n<&!wa&?jf)q
zxT|JCr|7aXbL}Lcxk2UtcQG??^7;1Bj#}@|bEMagaNHPEbQ-0YjO(ZUiB+v3(PHBgmE&u#8Sp3l)~JjRyjn(SCt{LHi1D^-^^GjXGyOtzrQo@#CEJ;ujX0$
zt;9*AZuZq8&m?>7hZzc4kCeTL+$YYeDrk_Ff&8+L*_gb3gvm3U^R4>JTn1Dq_NY5;
zaP@Exg7SB}=`0g^$c8pHA!i*g&tJ_1X^#r{)lH~;ok~f5kb-fy0H0Q`T#%CUbM?<)
zJK)U~Ikj~9JEF`>LY=^6cyn$dcH6FStYj5uH)7$v*^K5B&smxxPttr(S3j{=)@MM!<)c{}h`yiuKKT~?IHZV^u>_3lLhPHp=23h0
zFstt7N>XlbzF{q`*@#NcA+w?0p>tmLp*Y*AE+A5jXabZAQ5r&Y*k
z-w__I;lB?K;QCRl*s}FG_2BgI?&zQ47b%gBm`qFuDYC~CJn6O`h9
zH!BC{npz9eV#1DH`W22#3a;1eNic(RcF~(kA>?ZhJ{E~x(=-G53Y~D*<|13$xzU(O
z4fyu5L;1ThntL8X^V+pL>YN?2B-5LvC@bz(;|~)OB9z&+sYwyI$}kvrZb%q1HWn!u
zH8ye{8*HRjuyd*2_q8HM2ISGWjlN*8{<5*j6uwGkM+Jyo!#n8aoCvlwEn=(Llo_<+vgNN@#Gaeo$;hEUF%7^g@G(4XQ;Ua)D8l>
z^WCJn0~iq(x8JxBmZ9bxyNjRiAFoVcGsDH_JhYk0%Raf&-D)}3qaRZfUJlWg^mls}
zUwPmcW=y6>g|0C17IWlO>}*7tZ2D!ajBjNP809xmH`3%elBPFTI!(ungZ6)u)8fx<
za(p|{;bmYSJDvh-5oX%9+|Ut!`7*@Cf!(L)kjgjv1#G)hOv`!F;*`9!=?%S7dwXIp
z*ZZ9QaZgXQE)b|4Q*abaR>3#z-0kIsd-qT!Ft5<+htPcfxi^D-70YuLV*Y3hj6o@QNn9+fDqG^UyH|${)h+DAYOiF^1pQ_}-#b
zT+;$PE(#0-LY&WG!^@-R#g3=z6K69apCmI!>#|CfLl?%tGz-3>UGhFio{H|K7F}nw
zL94G!uqQyUr)NU!3ZU}6x&27)3eesmdbGD{+H+z!ge`!99t6GP^BWGvXmp=u4)q$R
zsjwGHJ~T~e91hHbjT%LzwD&vjqIG;8TAd!%SRah!?KJNOfl?ZCi+LD@v)#jLS1C0k
z(7O|}7+ktG0~;o108_fb24xAFHj{WFp^KvvB$}7=Pa=ZJL;}Wr~D!cH8
zmxyuJ3eLIA>muFNt2FI$RkPpa;~~X6XUCk;!uF2_u?ZwJX`lnK6xB`{vHBd%S-rHE
z%4p?GRpD`}aRVg>r@=yo#Dx@#{_EBrv6&jEt-1wNlT=j4!`KlMw2a<;y%R;aWIdx1
zi)U)y+@6RRCw_L<&(3G-0015ahTf8m`cb7?)~xfn@<+%N1QKjkGM?(SLfgyKjEV2B
zhZgO6in^XqgGy&1YsCrtD2P|(CV#*8q}NJ9mNNcg{4^X(gFs0^5WeQGEZICzU>|ui
zdFd&*-AKMHGre6N0_6n+Ys9|CMjtB_h^icN@X3_;UGB416lCVSYh})mJMOd#jnp1#
zIYuYu+hY$o6fKxM3}jyIpKFz|205p!czGolieWB$tBY!C%zSU#=sp`8^3HCM81{|o
zR?BH|H(z^@F4%aGTgj&j@44k}5gK=HZ($dGjIbbhG7D%DNDF_v0nUh8snQhU((Oo<
zQJYYe6*VjOBXp(aqIFR1keFEf
zr2I(UhlE_PUJL~pNGl9%l(_$7sk6DQ$uY92_-HzAu5*1Q#9qT0^14dRI!K~yZ8&G4
zG*`c$5t|b7pn?(G&fI+*dfhOO&0BD_7Z?9yy4UAptEoct72w;cvt8bbZ^Py7?khmD
zeaFx~#hLBo(>_oEf7h4k_0CdFy8$LIsTB}AQ~5*Q@(ejSefu28_pc+ZRuV9
z0m5qqzQWk!VMHQk&MV@9$P-)N@gSaw-?sIiUbqQ6Y8~ir$fqp{Fcs5>?T=pOj6-oX
z1tloww5fuDovea(mS?)i>Y(g{41GCGn@$-Ut$L;Cm(D);YhSMLW=saKIgT#uGW>CV
zxJTsV(9D3U0*?$P=S!%CF;K#f79`Q;z+HY$d!V_g-M12LTHpTJuCb$5=x8>>W+uKs
zx~pnUZ-FBX8vNsC1lp+DGiDJp(B3Z54v7nk>q?E)AAjH-;sROFDj09pJ7h9-wuFk3
zD@Lsc6xVhPkJk-@mejYp%(s5MzW5`U<;#yGH39l(?t=%Rw=3gyE#e23;UhC}19nV5
z;uP`oio|JQr4twGXKoQoof6b$M*r!7q^eR00IKN;NTCs83HPeyXY8;BsMvG{x2Qj4yqsj%mYf}*au^^MT-i{POH-IdORi%{s4);_72`G83w
zR0;F7NFt&*lB!%^rej?`ZwY#COXF|B&YcUqxeOOIodzqrsO>8pQJ5nHSfZW#lP>h+
zqzIGM3K7SqL*{j-r_Pu{Xnscv2r-TgSSN4J;A!XqIar}kVuuWud)goP$9>!3E$ZX^
zT?zN4;||hfl&tpi_R(C@$fAoMs}}ucS)gyvd!H3l%qMl)TxJ_L;toc=ECES1d|4Sx`uIE-Y0kN+^K^R<`z_RJ_3`$$o2UWhJHS2P0(_h8
zL_JB1SJ6V^S!FJ5b33pF1o6m(gw_JQBi^3n(`DAQ@1Wp>;f$Y3>Z{UL+mPFC&vvK3
zd_iu18H2Aer9R%_Z5vR6`>UDWDc{F3F2=*M;10xdwxe1R4{sTcl!M7x5~w4Z{Rh<1
zN)C+oEqkhXeI_<_u4Ek9gkKZ1L@-D$n&e#VBLNi$JAHZ;yF}mYQgqS$aHDYhkGzbj**ux2
zCovnw>MgLHt&k+O7_y}RwTY!8&U7WphO`@JYOcRjSRY%S!lF~{yysG8SDhsU9HEs1
zBDWQ1cdZX?!@ExscSM`vn6V{nDBb~;tFh{5usRMyONCbmhopm$py#$9Mt(szH9n`k
zwa1@9!fLx04u-?P+Cn-DUH%hFUy|P`si2F-ygb^`2{Go%`Bt-{a@ab#uzmYBm)_|9
z4kamVMg=CUmjdYMG_Elg?oN~$py+^rrUcg&`@mL~k+$u&PmX>09Q)73cLejhE1EuQ
z+VqIVd0WH*;bq5A{567e2Y38UTb^!Zl*Td3)_w&)W+GZ%;g>w+`Lh205L(0y=h$fw
zL?b*5j9f&?e?C2SQ`<&g0Web7%TIJfgW>x!&-Z<=0MnfhFDzKD0BW3aMI|98vGbSK
z52f(V_0aPp?C2F>h+tjrG&AG0K48Zp`m!YYA4bL=ct7T|iR_o)l>!Q1oqZO`C3u70
zlN`tae)|%O6kdikyKF){m!79VG};T-TR5^_pM72O2@_7YS?1g(2C34%0T$~ow?rN`e&kB%*!KTW!<@VkeJU}2(&2vx)=xy%>c4l
zwuxsAr|O;U+^Zjxn)8a%AA3FdZRJic$|tQ{0&BO)ay}@b*=p|X!YUChuF8!%mHedF
z*WsnPRqESWn5O^6YP@19tGNDNS&^+heI1W+x}DT>o7};V<@~pzdO7ASH6*NygjPso
zp43k3)J{0CE2`KR9ki{^*o|z&x46K4h#jUAIIgw&-Zt`h$HUqg&798q413=tcpt1r
znZO9sSsX{CLcOCiJfN5B8Rur30qbvKy<_~Xtu7ri&d1EI0H1R;))rUGk6vE^s0@s|
ziT*y|Bl)V~nZOl5xc6eS_zEzr{<{dTeR;<(81Xp%&g5ZcZ#a{=LT#b&h8&{9C~D>B
z^|~M3l~I0SYK*!2d0;QWDf|>?O>0{~Qov9=WF2c9&i?s(J;Pp_KCf`IjS{Sf;XT9|
z2F8np1WL4^gLovR8AW$TT0@9b!Q84r6voRVR74$av>3jMQsG;R-&F?=*S843Z@$55#_1p^9^{OrQ
z!c2l=ld;A>eb14i5$>?%`6JS)Iv(Yl5qRHohr~c3fk{R}-X@BFg?t&2&dMV)Uff;|
z6!~=cuZ9m1+ab%3@4Y`}o*$QBuK>ELxdZKecAJ@(Y?Tekw|VY*R+maivnq`5F~9>7
z(Upa6`VX%Fxd|5GWdi{h`~#;UBw5RlNHzW3Xe=+<$D1W;jJ{3-Rj7bIC?`@&KVqdF|*Ww=Gvmsp*m*Es&mCDYG0w8BKfW9P-gWe`Td*dJ^uY);HySw1Qi8~p6ItkIvWV9Q
zr{Wz?`K`sLvzs~ISc>EEyhNzTv^!#<4qv^F_HWIqfCnSfO;gh3$VP!u~y
zcvDTli1Indr>0`bh^cfrKlaz_c9Sjpw)GrfC7xFY8e$U+rs6z6jP~N8kwTh36dxPQ
z3eq?1*nf5ggOP_jJ7~>rzFm#C$aq)|&0%S)pw%;TEa_nT5iXz^SuXm*8nN
z(QsI0b|YPgl7FDE0xv7@o>Ar8{K}P!`<0nUg9j9ugU4>M!4Ler=>C4!u
zyEa0HK7K+IJ%XV1*i9XZ6VsVI_mD9=g;d87g}gxnN4mpK&e#dtZ4_7=_!t)TbH&AV
zi5%{8L5M
z^nX`4EvNCoby_tpAqd=r57PIRPblQnY5Q{q0-@8ilA%s>b*yEYD=)%6Tc`!k5LX~@
zm1FGq&uPM7RVf9(Y!Q<@=&nTWhz}~_VhAc~o~-G1!V?ySdMU2i@N#mPNfffADA~--
zqs;L;v;?i4ZpG@!N;BQ%TjtTUtu{;lA1m^`jZ#|pMRXb}Ax(t#=;<7|Rwzv|{jbN7Z*Vi_RG5aA6O%mI%eJGcxn-x`anWsmZi&26o7VEFdB>f)D8ewM3Zaw_(v`M^}LKg0BT9B=5%Q!^g#+wfjph7N}G-y=_jYiXBLu
zl+cLgkL&O}!{Q^Q?J~Ta!^c;E$E&mYZJ9`Xq!fA?S*GK5bX)FNe|@w_bScD!z~8kj
zr|PgS)R;@UKV9p>6>r-Jk07C@8M5a+Dib<6rP`)=+iLP~OP;zgm$H^YIMu>ZQ7;l_
zh_SIaPf>gXZ^71O0pnBf%k~9{MR$eUj>NN9R0#ywnkTE3O0ak~kzNX4>s~H8^O8aq
zeGS`rQ=~caf3f$TQE8@ayRb9QlOE&5XcGHqq6TcScb(CR1q%^WVxL%JLBtNWnG}sZ
zD%eXbsMssmoy3A-i(SDId)Ekx-E5xs&z||#_x*VHT6=x_$NtUD0>}ZvL)a&tqhLoEUO^?%_gpX3HB|#~|V=9|g22YoIKj6Hkksyc_
zlZ(LM9@FHz`#uu}zMq2OQR~!HI41_g>n&9?TRWi}>D#89UNC~`67AZ+k
z0#C$HtWa3xBkDj;ZGidgv+0-Pe&y6Y)YN)XnZ=g_tFlAkPQnb64~IZ-4xI*Wh{wz)
z!3Yl+KUwoQy(pvgSwB)7y1bDz5)|LLr2$%H8DhTdp=FvBD{!Mu3x37%Ux!dLX3;wD7WEax2B2B)*#{ttm
zT`gtaT`wB2!b%ZC%_U)e;EQU8=HV}iA^$|jQ1%0wujSd3ut-U%)i(@>RzCAYx`$%D
z1!x9_1%|Or-L(L(28HOeSIa4o!|2IvN*e6JyhH`V`@7^MS^N@O}QS`~}XS0G6)1lj)BMA7zjs5QGPh+ZG(tSNXd|n>;qC
zDVXLkN`01~!fsjt!5WqyDkZS0RZ>@0x)VOPx0nu4*4NsocLh_=I_f$5ez?c^Mh5s3
zzuWD1OOqY(&p|Mz@Y*(=)LvOFDyR-C;>jD2NTKi_ZV;B;F2sEf{)S5lY?$*+EwiYCxw~+U~4iW
zBEu(+&(+=4_4Jk96NuShN3pGwD3}@*t=j-l{gH?_J5E^Du_8)jagCFb$^1^nx=CKO
zLMj-_2u@Zoc@AzXu}Vb(L2k3)!W5`Ew4pT2G=SERDEGhD+(9>cierrjfk+Ocu4~
zkMRw8Agd)#yG+|gqgpp)J#i{v!dor1qC6$dXI5d6gVH);pm@j8@~zVNL$HY9e|kb|
zT^U~2u~&o{a3jPN`5m#;A4yx)N{V^E)7UpF_HK4$K7TgS+gyUDsuLMuD58EC1g9Wt{$_{VP=d-;2hs8bmPbdqpF|2pq8(#I`uicfcglDo#YRem!E+
zBJp1HZ59sV)dDoagQ0qo3F!+1)!No^eJ1`t>oNR-D6-;tzYjHA<8e$*f&6DZu+#bL
zb%MtJf$|$N*{hb&n801-fms<aXL7D1JrWw~P=m!tRyA?>-KTi4;C
zrsVUs%B;{%VRs{IibURw#LS2dHWpxQ$%ev99NG{WP&nMOd;@J3e9L24Nxcw!)iC>kYhu57u%V8lo=>EZw!|^P
zEY3pg{s>M)`TVS@=*aXt3sr#GoSWXN{|AeLUHe-Tcq0q|V*QE6GItbp!>?(kvoCjEk=bmOiF!nh20rF|q`+_Sv(?<`;13yMHMqYmq-tfps&
zM)i(FcJ#R-0t(|gVRfSepz=|z8d`}4Jyn&2Kx!2iSFZ^_O4RJZLJwq|m^p-4#
zH_8(-(L%ujrfK;Da&@^~!aYAZ5tw#DV|_^Cnv7W-5EL63>6E(b7dz^7j7yZ*ryjfJ
zKpjWf^9oI290jMD&$9T6@*6v1E90JTz4E)M)nLh9aH0qECQulZTf56to9>Sl)Yh`K
zGhv;Zb1|p+t*`k=b=qj=iMxff@a~y7dVd2Yv2X@rs;7`OiI~5?!@phcW@!fBq^oE$
zB|%%k=GcTwCCnX?deEh2I3rBPmQX}C$yjn^q$UT9nwVW|ph|t-LhBKRSv^lAKS3bx-^G{c+
z1L79+G3sl*Eh^pjMRb=NoINI8CK0!>L|wFWZH*Qh?e38i9Ns$!KU7du2KL#ACH@*G2Ev
zDYpJh+e7kOn>!qYmgDGsbM0CE9od=!rR9>CR4)qykDA4r1i`jPsWo$8C8}G;Uf=03
zRm?eLCD>dp*UEQXCZfQtk0xy$@u34?AkCE^*aaX#a_*C>jg9~Fe-z~%ZzfuJrV{A&
zg*vPHcfx;rk({WU+Y7LW6>>nR^CgdefOalIGYRAqyW6L2iRSUJ-c7}|fu>)4q4O2d
zK08sKXHz}ZMYG$z3C1pAA2b9qrVu)m
zJ#ovj9b$u-w|1Tq)!Sy9^T{hXsm_uL2j<)n<$93|f?bR3Fjg}Rj9ppUG1@Ef&H1aX
zaT?YekD2E<7OjbX+<3J2I#_ejF834_y0>v|e(fxvXzeJ6+;aKs1QjBnBIFysVX{X2
z@&KWBiR#$q=lss%RE%lsTQHuT3M-NahVjIH-N^ZJ?kRAMr9k5k2Qr1?=j_EC<^Pjz8$cIYAO<$FiZ
zW)IezUwovVZ8)I1%dGda(tgOfX|kD>CoB2Q+9y)C*whN~KpBbZo`InN5L9G_2Qk7k
zATA413UBRLOT5Cj^GH9SdMKg;^=f#mh-*Jjsq#UEg#vT-*Z1hte_L|K_+Pn2R{wwB
zqN^jHn>q6d;@x6i7g6gnM!k>Qq_}3PcJ{=QPaGfIBvK%>9B>F6Fo}rr!uSWqNZz&dt^zPp7#uMUJ
zMoQ`dnp*GieCf~W|O`Pk#bo>(H0-T
z(jrF5gK>B>&)CDr_gWB~2o@M`9WXhJrq%w2H?@T{a*~tB3TQa%K~eG7kt1jMHh(Sh
zylFONn71NN>hWW(%IKC7%!^2HPz%n!0%2d~XyjCGGbZA(QTDqP45W*{|GCBy^~F)~
zJ4^W^a?~OfrFqi3@=T-w-W)YjYWQ*1lxw2P|7t7vb8%O~RVa`lrJER@4Yyq}DyYIx
za0<1o=~(_E{!*i)A}eq=s_}MXQ4M?*Lm11cH(AR946@wy`FS_q66wCxVt?j%_HI=f
z;iTI#w{E$k!
z3Mm3qJ3+VR?IT{YHd#!cYaq}`h(A~Q%ok!n;sODmz|H_W!6b6DZ
ziE?%Us^u>RwSA)IJnH^xB~^GxpS?He^dTkPp%exk67HJGXh;(H4gNE6GAp`IZprqQ
z(4!T%nn$Dsjh0;0!ejrcW5}CDgXp+VWl-V5
z^}d(F+6`GWrMUYA6iVsxcz!LjJRImTyg7T-@%=q6Gm)mcTIR?pRlaC#wyweBUf34bvy{s3lUm
zApcqJt8p={FLldUVf`)U%Ug-eM487I#?pr@cXz>VzT!r&vn(E|9nia0?s|<42dDHi
zWfZ8}EX}4=GrAl)4E@v!2*1dvn0QzlobcEQoqRsAF)2}b
z87Ns@dG`3=t&XRro00nSlWa??CI7g=%o=EhOtR`>Feo
zsbwI9+n)_1ZBXx*l`FIk%)cCTjycH7REYDu;quIngidmEf9cQ&RYtAkRwy${-(>0I
z`pQi=#sZ%V`?w`?$4x{XCS~*u-{`e%1N2&xY0!SZaZ8M)x8ScHg2x
zgEB@JEBWIc`L`4KyYEg$ZcY=q!UyW=Z0;>@<)xGwY&xp~?3l3~(zambs0Ilf&{(Nu
zEqVdBAxWAtNNhPMs*sbU{K=`VH$3Ld{N8bOIEmFv3&i97%wAxhh}G&MGiaMKRGuaG
zt!Nk(H^0anKeKf=CS<~?$5ng&p)a=ackR2n*98KG-O`%HNNx)q#eeoc1nXHp8$wQI
z_#8R0|bQIKq;ier(I#6B-_Eig`4&6qzD40Xa5P$ndY
ztZKI`Wg{G1Dt?=kGf154vyn4+0s}(3e8Q<7#11%UVP6IoqqM)P>7@|wt8h^2qS$nr?H%{}j2=A3R1U^7;fW{sP4jb||)a~^=b
z*u6b(y#d^il#q41Cwzg;oWR|royM6tNXhC8ONwsikMv+Fr38$g!1xE%#4@_o#I6C9nscKj~@J`+ZUgLR_!tCf5Dwd1^-Eu!!AGLAn(WMIFgf#b@p446#
zd}SRAR*h<;>Pk|A;wFF%W|`N@7k+_kQwV3(~m-20RH
zsev8m9a-N%uXS;$hVq~AGIzhTJY=+H*&Yg)i0a+~Ub{kW>BUYa%!4vVcOG|
zLn+g%FoICUd`ebd_ei6+VX@2+D$5q~h#4~=inzXUQ5tsfUB`Nvwyn{9`uM$MtC;N#N5l=ApOt00Ci
zI7Y!QIV^Kyvx>z>bb2=JaC%OeVci+$Xc}xoHbhzjfG*1yYy!8+QSnk!2HyAhyib-k
zLX@{obz62{t8!$=wQ?}RJaF2Es_)Y6fo655C&zA;B_*6!XUrS$ps0hm&y;F#WE2Hy
zESf%-NKGi*LO7lI%Zk>GG}~6Wo*ovN`d=52)rE%G8osT=gD!gob>2t}|2yT+1$?c>
z^R3(QmV*gvRg*`y7p5baO3mJuT!@G;;helSwo=OGIW^&ke
zvO0*e1xV2;AEo_!6&8UC#kkfeG_CKA@;#2SAp8e1l7@A<8Z{96$A3LG#qFE|7bcpt
zoXdDNy`1yP_)C~3{n~eySXQHx;;{3j_BCdYz?Qg`r-=ufeP`K0p69P#B?eD|867IW
zerFlbr1MiGQhsgkudn~k(j2zNX+6gi;OdZ$uv_N2CTfZOFJNySiJK-<7uD9H;h-mIm4Fm9VJ~mH(&V-vxH5%PFjLWHsiJk|yc~1VQXz%Oy|JJs
z>3Ea@7PI{Dt~|#!>A|pKf6DqiCI7E&kJgIVR~X@xil9MazU9^uzb&t!H#7=@nN>*Q
z1R1y@M5sYJ9-=`_Uc00#y~??9^`(-)CyWbq1DX}sPNup`eFK^emZ^pt%Q{VoMu@y6
z{r)uOlk%O8dYWijqRWgi$(`c}3xG9DEP3a*-q%c1!voNc*faA=_b6~RU|3}Lgcu@O
zX<63=k9v|Jjc_WlujS6+CO+3jxfL+*;{+$|4-B;uQ?#|hJ_zX|jw$~zb?Fk4K*+}VOz(BbL$eb*Zhd-1M|0Nw-x?*p)c))nJ%7cl(-Cnp9vm@?bVqr
zfjuZ+$6E3!WS3iR8b`s??jN94(qI^BoZ_Pg8t+F3j+2N@Ekkp0^;2T8+Iip_=a)U_
z+?ZaaO36BW_htncu1_k^5%U%Nct$QuDG
z;bYlOA;~y{ObVoe8l}Z`LsQ9S#}?4EM^f@3=Bf@fTP`TAndA^ZG0kz68m*~cMYN#;R$d3D?k7B06a%PKpcDD0W^*`
zF|8~SD!p_mY
z;t%`?#nm=y{2pBQJB#w(536n$TD$FS)8APl*M+0g4HfRQFy&uM2k$!D;S_;I&tT7?
zey;OLYW&4cslb|gw)^M+@bn!eC!|XA-ei2xLhET()^?bZqcLU<(BRLeesL%wcCM4jG`I3k
z0uw%CSLn#0T;ptYex42WVT2E%TTcD)tX}kjRghWm0Ss^B{X2ou8XV*eIh0tjFLM|~
z=^MXDZ(bj2ikjY8t=-*VbL+Z`@V{AEZKi;L%5YTra9S((8teD=lrw#eDlW`c@mq!R
zf*y?D5ig(*1huOal%8#@C4HjCDvd_NJKa)}D)11qLg1+BDH)Vh>8DRiM1z^{+AN^w
z22{
zYm5sA4EU@tP?)T$lejECXls@@fLQN#&7)S~j*28er5rF`KOygDNUa{0}IlmP3ew`!=c0ssCjZg<~N@Ppa>7$Eh8c)aLUX=I*w?SMD
zD(8zP5-*5;#Chd;rdhl^w_&l%y;{F0&-!3tB@wkTkA-*ru=@#+g`srgE
zbs5Fa@dV$Ltb9t<-Gy6;RpGTG8G25yv@{+&v@>1Ui>sFbPZ4@X
zyLsD^vqR0B*9}iQ$lI7=kezw0Xk#9RVm6SM#D~FwK}fY;rxxf^rW3Hx=p~*g6-eNl
zu)#WdTNJz#F5IKvx@wIk;3NT3^3jXF8%Wj?Er-Un-<&a2@!Zh5ln~v7J^oz9y#hNO
z0htshcx-dkcCu}wD9N_Y!17=3o#FbghK-mB>88mM*#?qoaXjNUZX^Jq)4Jh(v814y
z4XOvDG*HET_lo^?ljj4A{0<}_2NrVE`c=An6t!?#PogwdaPZLp
zBU-MzMZIZM|A*AchvT~r60E{f)3#12Uu;pkY9-Lf_~@ZZr);&kdHdifTG2WUM?V-~
zoo|C*Gj^{i2RfCbO&HzjM9$LZ8|H^X_T281AS>kNxm(Ae7%#K0F7i6&>ClTPe9e_m#51uz1AzO%d-bh2~Esj1BWB)Cn=cr#MbSNaPg;AazJ
z`qaRUw9M-VpmsK?hsEA_327sEzxPUlKB^u707tKyM99kOxcv>f(5nCie=ZF1^XJf(T(JTOPaJ}2C|Iy*l{mWE8Lj|ZdH}g
zNL|*!1;T}#{=#+a-A*)E(CB2^$A6q^kSCQsJ-qNhSpEh&*io6A5B!ENx^TEOm%Fl>
zOoEwx>UBk}ODY{|7nN1{`)Z_BuWo@FwMb1cDi%wioFVTgUXhyDNr!U
z+m8(4tF}w;0Q~;Sko$E2G1v#2lWDQF{E8jhAk~KFquk52!T@Z;9J)J=%hlk^=1*gF
zxyH0ON
zn4UPAwbL>V#PnM0Loy(yWrK#rU-I=bq#5>|?>k0tpbv`{F`a=s__YExdenl1O!!E>
z1ZZt4`z{&tj2XnGRsH-={eli}oLNcB*sI|*oeFiqlUoLcHGQu@n58(SIs(;|Dg0sH
zJLyzV5#lXe21pWT1v3jJivtI+#)GAQ%}Ur#4w*hbEO#kS
zulM;kdZVe#>S3ut%;12C!kR>_UtmstUrc%Tq>w5b>d|MX8>n3+)SZ?b`;co*tjx@Y
zU*NexK}7s!kZLnGrtyfgL(^1JqMlQ490Az?n!CEZri|Wq>^T9If_e$2#k;yuuObRy
zdeozWfrCNnPM=JQgSxad-gl}O!e6GIS8dokJClfeRg~tmZ4o{wr5@djT<*(ywov-k
z-2AudnSf-J#Mw48A2x_DwItJ@n8HrMa#F8SkNRAgmN#|h+3@+5D3FC+^_}#Y4dK;|
zT|fJ;_~)lG7T?6rw0KIj<(rlf*C#}AHz82L2B4qZsk>xA62G>eXrmP*+X>{Y0#6=A
zWt!V4WN_y;kM}AHqn2GuF{eJ1&LW*jTO6QXZ`61i(0LR%(8$^5B>K7xvd|`uzBS%h
z%^Sv0h4D@uZwW1zfi22WhbHELFuEQVOC)D?-Il@3aGcpM5@@
zV$H>9ts8shS89a98sMOX-b+!))NC^`acoqQvMKu7fkOr-a%svN0G7HK=C6J+zI;*Q
zG>{~4)L&e_OFmc<-->VE-a#f<%`EuUE>teIDDR^DA1IR&XSjR{%m^cowN2m2yfuD#
z_e6WhYcxi2RXYwL@Ub!-P7G1JC+iT9-d{v%#=nRVRvGovbt6g!qUFk+Wv`_5g{(5g
zjCV;YVO7O@KUX(`Rt6$*8LC#ZQu^d%WVvG(-P7bugs&9
zfy63DS*7ubFVYgJF~lTKW&04(?YFI4uZ{5J0>W;`r<3UWyWkt}dPh!~#6@=*wr7Md
z;VXb{TW3q|rQVKy;XQk$5Y~K4wb-FKsM=0&=hz-q&Bt3Bs=
z>&Dp#v%kI950vTCkI*>bqE+1NvVmHS;&w|9k
zegGEM+56>c-ZtCDt>!Q{iKKI*Ch>S}#6ZX}^lW)*eob9Gl1Sft(5i`s2`r-CnFiWj
zrf1w^v?Gp55VQb2SW`B6;NnblpVNB0JuTz#`HVorjdKT%s@>0i+PAiCDwN@vWefF3
zQ{%y#>#<9lcmr>qEWtDbZ{5yPyS1?e!(0Fj0H9sEq2%hnv=2O(8GJi2u;cN9Ab)cw
zHfShT{Rnu`{=Tm|bwb6;rJ5X*&7D*MS`-HLHRb6vQngEtwfS;bxZ74e4PGz*k~|PiM^H<+n*MaXxhlv9`X4l|5k@w
zHI|gdTRBKOCo_WXb#JK+@~6O3j9BBFh@fKvz`xw`jh_*b8VlM9NkisAp7{N{WzFNm
zS*DY+8LHlX(Q1J(2j~+Pvz-<9SD2e(?as3xbeY5LuYe-C3yCi7eBf8~(M=N$O5p99
zc~*%IxPGs)BhJSm3aWUR5@B3Ea7bty5SR71e0<)1t&Vg@v)&caxKe4M5-p=$Vk4BbKw
zlG0lk`)QtQbxD}i0LQfnF_UAmA)7muXq2ltDIMYda6Eh3Q=NZ5BrenYUhP{+AWP>#IJv9ymCGi&l-1{q~ctr?=ppl1|#e_Aj;Wb@;M_Nu*&^t=sX>PrSbM~w!mY+u+SV8r0;%{e{%RG~dlneS%
z{nuniujB|NDP=B+)()hk*I1b;)`#CuO3ayWYh-h)7RaW`eTCXUcSWcS@;ayG_%t)+
z%>!bH_sKJmj9#FzK2x}ZGI;WjCsod8^Vm21?6yTtTg7)46&~(GSw;qRrR!`H(Q|G2
zrJDe8C*eCwZgu?Tx5Ho+?T~Qsp?O$X)-`-i-Q2vS)I2ow7tKevo?oI
z{@|+{UKBD;kfEm;v>!=8_w?eDGW<(Vl>wVzl~wD2zD=c>hdZ524>^7*9*U`7g{8#Z
zTRrbg|D{QcCRv)k&?GGLe#BFs8DuzW6Ra?sCPH8Kn%J80^Jv2%;>y~a7FDi)~`e`@XU1~FY>?A$NugNsfW2~eZ
zUX4MY>y7wqk31gUzJ7SsBH^S`%Z4X89It>`aS+kW-H
zb7=tAvZaJfcMcic*5yUWmA465Awf*dud*=HM7JWIPkUO=MrHIcC0kRZ!@%L8zb~MN
z``8c#fk=6u(LN7Ej8f6R~1KTX@6$?EZ&L>EIM$>#`fqt
zOV|ay8h6r0UG87yE%z|PYh=a-yGuJw2)4AU9Gvn-6d1wl9a3cS8n>%yW?gBk&hYf5
za=DAH3Z0bk9%8}|jJnBLh4=fIN=i!(;b+^C(X%2PYMfu!D6wtKHNKtZqC!%C^=-Q`
zx(@*=YAH?F6ijJ^>p`m=PxlLmt29YnR<&ftQ5BysTJoegNY{TlfHiTf_bIo#!RwKV
z_0f@!`^UxckitQi@TFK>CqUZmOAzn6H+%LYuQ_i`_UK*D5rn9=)nX*lWcOJuxBcW-
z%B-qFTGHoFo=l86GlB)E;EaDwpgih9NOBhl6B`0tCRrzMg={uiuM~2>^GLD9k;S+m
zrn8~?meiY>)F+4c3-em~-;XSPYYRTt&7Qw?rr`+&UMQo*O`Cr9ecQ;u^~R0EBPED1
zVqs%m;&RjDm6p^Nr{9?sOl)}hS4`n(hxczVUIYgoV7#uPig>JkKsi<49(@vFrZst|
zh>LrpB4P7xVw{ZCs%2tdFEdATWU(RAX_dCB*a+_JDcfV;`Iye<7wfjpuKXu;J_$`v(jF_(mx4#8}&DuTN9bCl!#J
zvkI<_*EuOE=!wuQ${o#cdR0k7uf5VjJhgM-(Xg-mW30K^
zc6KP_-5$@?#T~w`3neP0j$%347ZaWuWJL0&_mq}B_}I;>Y2wpu1Ap{_Y&4RvPX>%zs>mbhR?%^PtBti@J2YM
z>C#+%oa>5t=B#B31lO|oVL(43)iPl`ITBT`fD^5Jyo@PL5n^JfzZcEe`O`K&!M2Y3
zE_-uyXp9=B%1ofI+*t`?)Fqi2tkTfkdc{tVHz0`?=26jXE^Gl
z=vA0<&_m+1?;sOb0Li0CQHb!RG*NNWbhBYq2RKt>KI1l<;WO?${1y5t(e0K0o$3)r
zrL0EAU5V1TzJYIJGbD~OXtF+7L0Q;b;vaay6+HfJgO%~HRx`xr(pTZ$rpt~Zu`l{)
zZ2ki~Pi4sS&!-#i2~_*(`(S^Df!)<6E7XrArZfIud(aTx_-~X6WUxtsQXNltAQGm;QQIeOSJNhH~|0dgAs~VRabl
z#tkU4=61-6w%H-j8diNXr87XVWj+IomNDU6+1~~Q!t&>mL-@+(l6f8ld1UpRiH{Xk
zMULSu>8-kD^7$JD<4UgkkuEWjcjrj_%_ZT=2mM;sG?K$alS{8OaGeaLY
zV0{#r3ga$)lfB!&?DpJR)IQBhzo?SVx%k|o$g|3G2?wUk83injK_X7_=F>I=0`TpB
z4X8f|*W9?3d`TtFch3B~w`Gpm`Va-?DDjs*bJz6$UkGc!qfQ5V!$E~rKoN4!-23VA
zaA3k!&6EK}xqkKWo^K;Li0T!haY-mQ6Lw2d+TvaKZG-2^gFDNUigv&{)V+dtGjAaU
zyD=#f{V6pd2dn$@u5buv%9oKtgU@m5QNfOZUUR*j-}Xo5)43XCrEI3^{a?SCl)j&2
zgtS2LW|uKTnBkehI7PM>u5b(QM!@PmSiyX@=x|#CTK2R&I$_mUI=3%XueRK(1nRl|LGf?z5BR=R78=-(RKgD!hy4v~pvflfVu~swgUt))ZB`r(2@aWCPSSj4H=Q$eBRT}XgSpg8yuo9uE^PqCeb0g5xb%%&3fXu
z{)w+fEB}tK>=1wJ%+BY&eHz?kY@sxsRKB>6JwcKvEYWB^RaTxGx{FS
z0DXR0-wCQz
zUkp=xaW15%*``umhc416{oTRhw^D0(v<_FMyd65@o3}h=wo_MQ4
z9jw~?&LS2tY*k*fI*ArUeGK~7>f2#YzTB2F1^5=l@S07rrC-|stkC>t*Vm8LjXrF#
z5|zdAuFzpe?RaU-@hTOSZ2MsrIIj_-nl;||I=rYgWkEim!fc~rxvn?Y^
zV^r#O7loCGg2c=?T8lxZA}^dM0WG|UNND%#*y=GI;@W+9t`bviSg7W|a}SWhi|@&J
zClGg!Q-&HX8}SoHZp87guwgAOnxF>ye02BSb2R^+Bb)LQKb~Kk#Cwaa){zLcrXZ&7
zg%b!YP){rnxtSBU4C6(uVegpw_8@z2AV~_*OnX}aN9-|`Xx(r>UQ+=*9c>1YgWpI@
z`Ki@@jJ+=q*EW`%Z4hYyC#2nO{RCn<`clH{`d+;X?e|#Tln~8Yl~C`vzh3N}!$Uj4
ztdYfr;BbRpP)Ii7*Aop|dqEEQs}#9X5z}DvBjN5~!iAVZ3VgX^Cz%3#Qab5PV*Al#
zKTDaYLc5GHfR9pFU~#E)`XphI+Z)1-t`vA`o9F7>f|*rhnMwf6*7j}&UCvCDH}o}*
zf%6gVs;PXk_PWy4>48d)#0+wHtsBW(DbOv>QGhpAyI4jU>!qf&%yrgtLsRLJMcK-b
z$wXPQ*|ye2+vwKp&t11;K8Nd{
zaz}Tp+kRQHe+2}kc`Kvo);+ddFF&8p<&_E%(jLydJ;4sGs6kq}6^R1}DW-eFppXa*
zn*!VK-2@+>gS`mAq~YjexkMf%^ESd^u-^
zeq)WuA6eBO-<+FkC{c@PqM7<9<=0KBhql>v6PAwJA~^?5i`d<`%Ox%TML_%_UpO*U
z1OL+}&Bcsi@hqa#S-Z?f!0_SLk-x(!5(>nU)HTI@#WpIlL)s7po^1AN)9Tw(>bX@4
z{@F~I^WYrS^wQLXdC$2pCcR+pn2=$vCs(JA#G&>Gen%%<7s!Jj{$>>L2;
z7hk`#2z=eUj`~9Hn7WLnGz++$Wlz
zFLu0V!R>mH#QA}wxq)*E&vzCVPl?j{R~UoKt5uK5uS?q9oXV}?bC1;Xf@1b%;F`a|
z^+~<5S@r7=2xoR7Rso0n-^z#ZR_sdKwW2S0ulX&Mw^%Q9xb`D0n=3?92hL_sF^r;1
z=AWCa!LL2%Xm|E9OF(nY~|y@XWC(MIs1YR31pFJl-vdgTGPhMuAGf1~GojT@Sh
zk1cxenV(}3*=!ha88KzGuoRE#uUY9v{A0bji~ml4+`|72GP3o29@9innT@x$gTVO0
zKll{3zwIwGDylec=0$5pYYlT|sWTRe(3d8isziX?quu3r1kv1gY$Nm
z95++*iewG9ie29Z3Rkl-3f|i6VIl&4XEI?XYnkI_@Zo+vff8iBar@hNj$(A*6#j8@
zjm>Qj^_aH1Ayz~)+iJ*fx{F>eK>o4?(c9QXA(>VEPfB!$?L@;`*p&_z&h|ySH^GSK
zizju?O5V1&l10>r!EIf#x>(&KF3^IlZJ5I5Rh4+DVelxVWzJIxtlC4re&jGn)Enrc
zpb`V0D%#KONDrqB0}0DQ4mzpClC_CGy~XVyK*Kil;a3ef!k{$y(PG!
z2it;XmS0=S+MT7r#_Dq(H7i}VXB}bkC)&9<`#lvL=&u^8+e8NQ(=0QFz(0pChO}pa
z%0#Un^?heyVy3;bd+$#gnl088arI(ec{;;#7qi6QLCCRE+>
zwe306%4SiA!ZsYaL$(WLd9IJE
zY_?IG;IO~3%j+b05)w;x%|K5kkTeZ2l~`f56VB};eMzFr3};`2`Ou
z?3siwx_KPvg8*dKn4;LAYr2pmGFCCFdQntL$pk-nMI-~%npd^`ivK5nIg4UY^)sD+
zd94EKN=rFfsNPF0nawj~u%E68Wk@!@+HaLJvvY|&0gV}*EwB8RN6xyEQm73}p_1;%
zN`qx8fsNoaED8k)ZpmgjI&&}d$UgFH8yOt6-oANgoH}wiSsBYNSL7Q305W898K@h5
zoc1)PE~N$(q71KJ67cfB>~CG9$@+}G9E7O0h}t^cLSX|M(}LcUt075=W>J`I2PL6L
z3c#~Yx}urqmCCB?G>!;wk2wEl>V;U+3U;cWqbsgI9(Osi@{TT<|1K2e*M|7UdWm|?
z%y?+qLKxEwBQg|>?(^NeRSK3&-17EI5j6bH;_NITDA7=GWRVr`w`7s+>bLdv?EYU>
zOTFW4*4PInGC$=2qTB)Sy2gvx-g}9Q&=q9?sV@V43ny=aKWyRn^0&SF&l#Irl1ZOO
zPXd}sv|eq7F#X6AVx_oP!5d54L87HO`Q&7C0Rv%O*3Nf;ntC2((39!kA%6VmT*om{y~Ao^)oa)d?wV5OFCW
z9oKN6Ywc+x9lo8h-KCAYr?$U%%WNk;5Hwd{&cEdEx?Q_CSKL4iRv2BR
zBE+$Y*cjh{bwy%xM=c?A2_{JyS19#5){f=}eq{LitCX#?emnj$>yy^d3#mccN`puo
zi%9{Of8XFZ|Iwq1wEwM;{-ZFn!8!^Qr|kPL4g*fU{B7I*ciGmSO?7Cq$^4ha$&@2x
z%`Ip6a%*VGp}w>B(@|Cl(sA(pd+W5((0LpQ$TVn&O}P&hMi@nJ6?P3f+rY+g`gMgC
zPX&rdZb?)nu-tj}ND==|;^WfySnncEVWku0`zgOSX;9Vq*Zns6YOQjtVr`QnJtfhp
zENS}
zdbfV6?-Cf~33t9>!GQEd=J2x^}foJ_x
zG$CX>;df;NVjjLk%1o1x6-rLYw6yZn%1nD8EDXtxnlt8{4{8|-O8oqBOme5bk+1cm
z3B`)$N_%J^|5%1>O5~3!G%JcuNRWa!jxjB(5~c8iYjtUNjNA_srjltDt3E%R
zG_dYuzHN0bbXzKU7A`9T9YhoO^~766geEteMv;$YaHmgRvQBC$D1N+>;zV`du&H5C
z@0Te!>)P+*v|P+z0(|BT?z#^<)Wr?4l0;PcRg&P}EIu5(rzOt2nUWrZX8)yPJo7*p
z`UU0%te9ApRIPmO+-nIF){B{_=qYTW9WLs1VU&e{*#AT*ejsOlEmW~0{A=*f`bVjr
z4emEX1{%N3!b3F36-AGk&xTJ4C#S;ga{IN@d>)ECq8m
zyFqMEd7yKL*#NegXR&j3*jBgP`YXa@hc9;ThP7Oj>WpXq7E@^C#ytO&wez@}+V^-F
zi^^T!Blu=5%!z4wx-&TwR~Xydz#1X1W-V1dpaD?S}8i&vzb+ZS=E#t)w+K=R82o0^2p9dAhF+Ct$&ZXf%|;7vDg73^0Nh!CELa!8>vUv&w2nzB_C8NTnmDF+M1~V&itv1OuFR(gGU=9Lt-t
zTbrVuE`tb@%C!eYpzM@?6u$tqoS<4&$%ki
z0fxC!But;&*2FlfbF*;9Y1xe)8Q*DHjTRd%uH`p~X{7MNSFMVCHd-I4{4|%4ZHVnC
z7z(hlLSh?%b7i^e779yl3q`R}_Y!SA)wNUu8|EbNlECe{``@~ccH92Uc%Gjs`_pEr
zH|UzJ!ASL4&kh0q(+u*)(wtB^kqa$5*LgZTrwi0Z2v1ni@S~6N;QL>;P$kWF{^|=+
zY8Vmt)w=L8DrXe5bey#ZW
z@8KDS&m`?lKZ#}NE4UIQ9%R4o45dr!`0;KKT~$OY;$|dQzfvx#bX(YmH}>2Oj-N8(
zx!Lq8VaMq3N-9_=doA|)?6vzyJ<3HNY+1%cOj9;*wCd$(Rpl*l{PCOd%Y&A5F3Oht
z&XPyY`UnN-#jw7$y%(Fw8p+hn7{0i8zC`40smd2@TRUd;TB!RwvQ;KEaVs2adS}fd
z0cB2nj2-?aHQt&G#SXrlk?%T89gb3-us8L8P(F>H(1pAGt8;Cv^KbLYjf}Lv*Qep3
z|8!*e)4x?a^}ijr?)`1|e^~`#M%PB7p`5OR4og!*vNQFTPg=gWI*T}~%)zevrjQF|
zYinPoDKT%-e(AG}^)wse>I2~);@n_F^}(d2sq*D^ZjBiXGauOqNr5Bc@IY3uq6j2g
zNtfJj?^H=H(SIKQ8+jX@Ym5PaIE&3HAP}>ODIQSFPW{1AEz)W~G^<%zE_eP;r-Lht
z|_(7zXoAy^yIB`i=FmivqhL|CC{GQ@vD>f6G2A))Bt#
z3c#A<0FhK51dh)GbU%VGcIgS3E`uAbQC~^erTVG+zrCe6nhY5y0v7>$S$w`L1kpvl
zTr@Q`EaiS)e_RIFy*2Ce;AVSMTFkVMTR#^@zhr&zsB@e7j*nCjy+8#@)X
zU2K{9`ThzN+ZjK|CGpDE8BhA9tMiu8Z&KRxWm%bdh;Y}X$aDzSjIy2~d)*b{_Mt;R
zb3e`RkX23hvvam5jwwP_Xz{DnXt5}Qr~pAlLR3ZHh=Ktf+s**4qp0a{DR~X2_Z;ry
zu|Xc(nyabJKRBYde=X&N9%t}o(d4&(cc5^N
z3{8HxF0vyW8T5~@>b5Ia2GX1~c3(7vTk|*61SS=@R9^~|ol1zi8vQ>!2><@q|407z
z(_+CAe|2t}(W2E>({O=2jd?H9o{y-}t7dHQXCldj*eDC{tW{+7!HF|l8m;2AySdMq
z6a9ra%bp=a33Ii~xolZCm{fJzugNpA<@;Fn5qrK)9u=2|?8rlQFCA^l+OOg~OCG_R
zi}iHOki$-D##h~sFiwSUZA|5a+vG+bi!q5&NIcXfc$|5e=a2n>V+^_NVxAp}?)r~v
z|F&o}edTkFvlvr56=^CzlEQWOng&<|^RQ1hS|A?5R$d`nYIRbYMJoiS)fmp=d>@D7
z>wapBONW1(gD71!FIrJ99`}Nj8irm_EBvT2jbrO0aQ2AEl16mvHN#JL`eju9u`#^L
zzY{-8U1VNEHzr<=iBHy>YKsRaNwJB
z+SBthR$0;ad^b~i55-?Dymi7YmHooG=6hg&%scHvf*W?a4v;p(^lAKiNR#sJv|rW|
zZ-ILZR5xp6UaX!3u_YW@+nZYjAvKg+cZ!=|%5|IP$<_6Jay2*2E2WmV}&ocs*o-^xcHi10ve 8t1SlyK9d8Yx;|rgwl_*IqON3u{j&Ozn^H8$|u^5j`LlLE)MzloUp38
z`A2d6Zx#5Nl1yQqo1m<+FICC0@G;0JQ+YP>LbX+EREy^a;t&S)Y0Q*F__$=3dLiteB3P?)rWkGwHF3UPum$EL?M%{&XI;|K)
zR$MvZ1zF*HHGi!1>s@%@8&&V;S=5^2>m-}quq9fFTL7n*)PA83ZiLDwrp9LgH%tZc
zyG3K67IJevf
zzLwn`^{u~FQFug}qS$|}fiK!jqm&nE?--b~@Dw1xBa;lMfPo()5KJ~&Ij@)8}W
zBJt5M#u6lcE_l<&5^SjvdG`^VK0EdB!%%zjjW%{*CQi7OTubK)F*;-`j8&En3)C+%9^6`Dl`lsP9-R9PshruzB@
z1%mRd7neoE_JvO0VaxyP+55-GBg3HW2S7tO=s->VM$l%x=DyhvjxM1Sc?BhA`VWpR
zz$BS6d87d?cz;4x2c*Jft((z_{Nr2ZnvC-cfVEE^xZ3YUx%ufI9I}H$Cx8$j1?k4S
zM_Lx2wNc$Q0)p=D!?R^a6aEtxiWKHq
zrzX{akXpZERaq3W3aoF!-t}x1``&LH3D0@C?*?@j)q9;FYXn9rs8L!)5z_Ksfs?8B
zmuD*x-qq>-)>0Lc{OEy-+5GvJo6J@*<7f#%3&V~z2`S?WS}KAQHSe!G_dv_|viE5z
zOe|m-R01`d%MuMgSwILK$$BPA>17M<9sY$X!hsJYn=|P^WEoA2+K?)(bdJ+gRJYhG
z&~zvNvMOq@Lm{i?a~{Nn0CH`o+mcmUAjqb$F-6);WHBSGTK#-^vEazEdG2P0X!5
zbS_<+E`G&`@_xDzZSG6a)q5&|uIH~Q^a_!|7=Uh;DO8($|4GpAZbocFnbWeA1f9Nr
z-cPkA!gjik8!T!5)>ywn1_oC17GPVDecK75*8@arN2?BQNj3aw5%27wyzrC$*dpGZ
z9xmvAmff+fcsgfA&Z;e{LU`RY02oyFIYfMkZNm0EU5JU_PXS~*x|leZK(7{bvHFvdOXrVN)#u*&cn%_TKT7Dp@h`eqZd%klAK?ZC#2d{nn_DWy
zJa8zkH&k?Bs+eA`Z`UYoKgUFIXPv(wJ*STi7=f^Yu_sYjW+c0VagtOMYwi3?LIslZ
zGMf6xHyX4Ukw_CvyLu^w_-k{^LzzQWa#yD~sk2lR)Ea_IoYdBTTcxUDqQsSNR-IuM
zF({tp2a0Iy`Y0D3!Qi=s>x8F3L!*U+E>EZ_fQ-?dnMZ$f`!;{rIvu32GxLMP&!Kg{
z*Dj_t3AxQ#rg8WzP`vQM`5@XA$>R!_hS170fHqoTXDrCiL36*?=Ykw+@rvj1PVW)y
z-fc75^G~0CG8YsV%9Ij4bOxp*m)vK(0{=~!v1LKBM-4~~9Im|DBh~s%a;*(4udTeo
z1+DU3jo7aeN`@rw;_mNlzgRu$N$X-a)X=5BKfg5JAM4NYpH%;+7dL@xVFK
zv;Bx)V|FDNT=(EUz0inIjc)Y*m@a^yi{?q!xo@MKhs9}QRKyA3K@SXdeMmc@!a4bx
z%1*$XV%ifEM3zavEiK2l)wS8vCbK!UkgIgAbLv;VXnb<=g5b!(;tPN8P+EXL4tV4%
zlTUcbFAvksqSIatt8~_GW~=*N`2#z42r^5g1@@MKVS>+U=_gU7gp&l++iHEyqG86D
zj|I68RmC61Ebkg6HObF(ka~?CWM4yrV5hI=*th`XV8|o^M7qFgXDe-8zsbx|?3AUx-FF0=bmF(^WB(LNfeQLSsTPB}yXS?q1
z3P?%^J%|P^GlWgBJ1@(JW0IvcLGa_J1Co+L(6r}EYag_UTJu6o_rcwcqmVquceCV<
z`o-mZuvVv5UtG9z6sg{(>W1`lzzHR}?!c$ZRn?IadDSDa(6AcfQ9#C|R*6SLGP-QX
z-jzydr=QcR8q5_m&_y@3bpqZ5K~4w2q^poCbC3tCeae*4xq4@zXtn7Xn;sj3&+dC;
zn*5|Wir{MxI|nQUg3bY)8I@!L{c&Z6?TRT*>J`xUQOh+9bquA}M7QA1d{o7ORs{yA39FMma{wFnkpt
zZiabSJCOO9{_oiIE6be?{uxi#2djR&ea7{pFy5wiQGr)MRx1?Z*8@uUqZMe!>a^Cy
zx+dK<{yd;s!u9!CalZ=!(aM}-9yKsVcw73x2kyBr@V2sB^8#3hhKen`p^S>XE@*RL
z>e6kRS@;OkGrov#Zh!M~fTRs7o6AOj)V3&Ekb$Rq^oKOQerL!6yT#1(g4A?)FQ9#UVWDQ^u>F
zo*{cp(Ta@KsEL%2O~=Ov=vpjU^ybGJiR!{65VD{VY+!*y_?gCP`8@76Y#AfFpp3+cwCehsIB{|FQSek~G1(QJ=AcW9pH+G$mol?4
z=4$aY&Z;dG7OU7xwCJ^NPkqFS)#yEJZ{A0)nBa;vl?tsvtBe{=nry;Px9P&&Uj2D$
zv`hH+w5Ne&9oIQ=y`r#LNCwE&SRB+<5(hLqa#6&L%FR-WWimq5fckFhO#WvVq{QX;
z{`|%q(b_71H;dOSF6HB2T2-p>MAT&6+Y`>Ag3qO17dbyS0vPWnfu
zq)z8?_!M))BQ*D6Y`OaHFBBxL5q3>mbk}m)4~~x>gV1mDG8V0{^kTN^Th>)L0T-6t
zhOqx$JVT&%4USeiSglW-!`sx!T=2OZUzRsPNOFG)uAns;3llh<#QH(x*IXW^TeR0-!E8ijKaU
zDZ8e4GM}N))=tzZeCT^Ue%m04+4XLqKTTaV`?hC0xRvmf+Wv>Qk*{U)_74sl^^_6T
z@NvpjL!;rNMM%=2sEX`)R(e+$*&s0s-Wb_a_>QHCF9gzh@f3|9rEAe!_tXY3X$#>+
zFGfwhUr_OoF4cU+B5tZ7&fvaq=X>JCS?kNPbCuH;Z)6QUj=oKR{oWU*PtS4BfB81e
z9@cO2-Jw{3rusvuW#GIH0lAD4rY*JKUT5Cn;8K!lmm?
zh0vr}^of(jX&}SJl1d)hC2MXp|6F&e{YlNYpK@wW9o%1?91XVtR(0oak#CGGOAo`7
zeMP1HUg!WN=VcH%W
zD*d|pkD%Y1rM_*FoZoUh@eXZW*bWUGFw|_ly|+zeoXg%3ih~Bd5l@A7#oaU0S
zx?4g~63x|~hwNaQW!dHO6EPae`M~DHag`7>DYg%s;uhbHC|+2+QatHv#G3Z89hY#u
z{ZDR>ph?yV%5nj}(+vchy#2wk>I|@zpJ5k%aCBw^^08h3J0oyKPz-ke^S^fUDt*A@
zEN$OBC=0;=KpR$%6Qu+-{e9ik?*jSPh0JSk0+DWA)GTyv_wqD9D-S?BKax`0|b8+mVN;{>@x;san$Q*^K!^
zwJ|y9DF(Ztab~Mw%KQh%$y5GlnAPlj%}b>M5?}7un&))~0i;tqTO0lbfUj3V&=Nhd
z=~zJweu7`Q;sXNTulf0`p|Pan>;}06Zok&EiQv{G%!%&|)?zL?R+`1V!j6|yz?vH%}r`^RTOwNx5aNV`}=I2`)=+z<|rXY
zrLdYD$p?bfOs~&Wz_1pR#OwRQWd>Pj>9>^YfQ9qcq1wKGI8BpyiDp}5>oJVeuce0L
zI5T@O*#nb)7N~+NnRk)oE_bTo+zoB5G6cg&%H4>sBc(EOSt(np?{npW`cCfopG(B;
z{nXkpO7tw=auYq3*#0==v}t%FK65s0{_;K{3Oq#Ozor@9jm0gt)0C0#E;vwg9}@O+
zTZ(m3d=acjuB)a@i+`vfZ%H3ukpgf`vSu`3M%QhQi>E9uGui
zEU?CCe23~xD_VK?#j1pqO=k2__jsqiqsyv(VXC;w&VxEzt^4&A0|~ifkf6!|o~F7ql%LkXkxiN!ug6
z{yR;h@!yaaf5#Gq@r(RfQde!4QiS5;?3EFyz*{_zQ@$TyA9v}^(zda+gDV6k82Q%g
z@moLa%v-3fTo|h@cs)OYU9u1<@=+(ryNufmDQP@%+{sA#1Bt>;|WnQj)`Pd
zYN#%j4qAqjRbamE_7D;R>`YzuYLu&2=U%h5ca5uI(yAA6IZF^kawjeH-U{zg8C^rl
z{RPw>$f!pv2{cRaQozH40)EG%$ttOVU1-%#xtn@LpUqMV^&exBw*~8)QA;YVw+~L@
zW?LLP(r)9S_iKCFFh8p>hdh*`-5D{eR+xMR9=pD)k=$z!9Fw04DT-2#VW+?Nqrys7QvtOZyOjQuoo$&-4dTkiU
zUIMB0Ji>@J3Zf&cW3DuXY~NKld}ghA80_P$)TMMZij=NRT5HWAU)a)akfUj=A%b2d
z`AYxoJa`s|t({Cdbk?jZ6FOqma^t$_2f^b(0VTjX@eO)KKGEqm`>K&H^4*NmK6+*$
z5*FD%Y(7#?7GKuN51VbRf+cVDx-m4GT=%Ia{a*ueS#RVS$=u(^B@Vh6enzrcW(nN}
zT;NOg{Yanv-j8=3+y$2;DgHVstK}VLt`MNfCBWC`N?Sg3Ztyfpr6~xGhum-?EbVu-
zV4SH!He}J?$?9_;T?iKcWX(XP#(aM?S)GhiSi88gGFxSvsLfu8QVJg|o~}!&
zn1A}{LA*wEk>pH=PT%2Kb*ufX-SLLLU%U3nPU>O1&xn5avY&cnitws@f4^~Ysy#})
zLodvc`yM_IPkxlAI9<$ql6ms}@(LoL`iWtM>a5O-NS8+mZhCaH`IR-b%zkUK1?;p|
z-A7F+kaJqJG#EOi_U2l*O5d9IV%})lA)uZR{~f!M+!g+V!?8Dmbp&|uHKY)|FauaO
z^e=58bLEfu$_-iH%N+c2C7!=Y9c))k87nekhlj2rYwSHiCWzCN%&pfI`Ay@sLTFRILg4F>H
zU8R(Pq}*ojtBcy-aa0%DjS{%WFD0kA0yhdZLFD>9I1^d
z?8VKA*+fgUqgI^PHzS-gv(_#}rZp`s3qAQWmT48Hx}_I-_CR-!jDw-9H^yd;uAWC8
zAt!>=SF{;H`{LPYcO0M59~OHfGCgetFG;JMDSr_@q_28(&A>zyNy3;rv=a%UTG8E6
z(oe?LM2-0aw;&aga@2T({x7&>dByEKLmtwaBktqy>ro)Rta-)2FN>+DFQ7XVwx_Ne
zo>ed-cJrv8D^=;H>p*#S`ke8DpwJu8FsK?CP89{0#S>;NOTI?}I}faX2YpwUJ83&C
zI!RY9lU^v}KA-%=UHg@`7Q~1Lv&cF6Ii^$HdA^|6!p;OAa;eGXCOzeV`)P%nVs^%g
z#ue>b3{8`W#Qrr^wUAu!5LMBEAn%0-a=S7&Km}k44E2i4GUoWwb%L4s&pp`=JzvHg
z)uMaN1|7PV@Arswz;;OJ@Q%c7h=oZ&EvV-yX5YhyS#SUSfiL35rbM3~d$@q5?_
z6NuqD{VOT$s5T{j8Vc+JsA??=yCk_1I7!}&rY3z>0#s;mt^8nH+Q`4C0
z9flJrX+%d4O;^nx@V$%v5)IpaLG2+2T8cn`c;~M{v%rnkY}mU^sYkPbcS8F>O=|k3
zTF|+>_^;jGPZXt|3)^k|rXrkBGj;G1Z>heuMH;oEfI7NIzRySa*ja>aQ9X^4&$qewp-+pJDnW
zd&xZMsNAf>gm!I@pe46Xt|%y7aopKBIq%Yi+S3R<8egFzd;5kkyC%FCL1LNr6?9B}
zf$c)VdFP(Z;vEg1SGq2ISQt7%3QV^n7Gbk+)mMV!wua?=;H3d|vfBw#_#Jx#jn3lE
zM5ej1==r(e@~#H9<}QVkw&UJU!WTwQs*-6*q|m$|Uy-}}?`Gb>fgaqLiMW&D=A7C_Gf
zb@KNf06TSnb*F|@`xDjSWDXFd?asmCP{%YivYC!w_Z&NbakbiR@P5PB^qKCj@%WsW
z@}MlucSoZF%~839fZE2p2j?{?ZbbPm>T!BAyA6i2yi|^&lw9JQ-B$><4hKJpw5;I-
zwCr*x!v-;QR@^X6VRYBT)%!TkgdkJqzwD>3=;;5DK6lT+LPl(MozY8(vzJg)gpNr$
z*S60+Ko=sqW;|5HlNRfmMIl?_Bn%-YT~nuXE+P$FAFU>qw_kNvBUywjT2cMj`lWqM
z|2;G-9&be$yam>lwNp&8%CoQTGb})>;KJHLkYsq4kX+UwvbA_yLPKl6>l4_Z^zHUG
z~6t6u8AD!%61yCw+Rd_Pr^XUwL7cPE+0O%G|^T6qoumQ|tSSQbb
zLXuAX!Jzp+N@bSU?@j3Rg%P^$GJd
z0U3Zl(EP?a+}i=DvHE2M#<)%qWXK4>e-xE)waB{jRup6qGi2_Sk_V5Jfgt#ry@4tB
zK1fwsO-C@e$HQ0TfU015G9=XA^32Z`m{E;x{m&UyZ#V$h_~x<&UkO^B+^<2YN~!6Q
zg8z9seWE%m!+mj?`g2J{W1N%3WNdVorx|KzV-ILnCKb5;mm^~5|(gc
zIK77?&cC6FP0v@*PPuqHgsaaF2^``ubZ^tnMQ<%r?J
zr5i-d18DtSW8De$qN-(Iyp6h;AE(!;&b0>=*+?Mi%3%)f>c?9bhHHwN>7q7QX5#m!
zMm}XvB@Y@kByDvem-&;=Rq?H2;}}>m#U^T4JGXe}zG+*C;HuJ|#)REI_7HS$!MmF>
z;$SfEp%YnyAMVzz^fF23CJS2Kfe$^%S8Y~I7bwH(Rc^7XUl(;A`~rr7@eWE|`wc8(
z#+2BX#Lbbc$qk!_UaG~5+K`kGbgQfGrWsVyAbN);gYpzzC*9X)UI&tF8hVck8u~#i
z$v|;E3z&Y#e{g*Nyw(4MBLN0vN~WFM`JXoySf6@c#}T|+@zf~ZU@uljX5j*mQapR0
z3lC_}y-pf6^=zqa^H3h$)&k;#v#LShW)sJ(;lJSNs}v1Lv^p4q>`(s1J>9P)s@ic2
zpQds8^KyMzn{Vtezdo*jr+V3WqOXg}<#`s>NM$Orj{Baw^Dt7}=7O?8{-TBHtb#Hv
zHMg?T&Am|Hb8F-TW)xegY6s%Fi$7IwEWX=g)ah=-S
z0By!~7?KsI!*d4?<%AeO>Aybwdw<&Km2YuN-v(!#A(Ub?)V3qbJFCD)FJ}t~$O(E~
znl6e%Iu^#gGVHZ|>|Dq^x1}oSw3xZLtb5Cd=SE#rZgbn(i!AywEF(oy
zwUYkpr7kt#;HR&eR=*Fe-xe8k?hDY}X59hsfm6}Yfnkg7y{d2_{|d8o90?FvZL
z(m2FOCI1YHtF{goWi=W=E7fqr8t4Zl&5m3~6HK5r?VAjSf3ipwX_}OV2?%(8gEm34
z?l_c!1b#J4FhlJQ?y4mtg1JRCt~>ZEdPH)cdW6oj@4zdL%4^xfsvsT^xWkT372nx7
zJ3TDiR?pK#wG7zgQQ>3oIvSpQi*4q*a(LZ!zri|6Sw;N!6}hjRjf3JSPk#)(6m&W2
z^NNG5rPnVh4-pbZ-{S^|o{4xvDnaF%2&u!WtHxv>(~_`CH~U2UpzDj_m{jjY&O9|g
z9WDNYgXnu>8{&DtY>_CcmK$KH0=BR7Wkiu|mb!KT4wU4iB#!Z5gzbR>_f;48epRJ^
zWHUpBENnidSxxVo#V(0co|Z(1(+$jpPhI--zwI}VHMTK<`R9NCc>mGx8g3zdAl4eR
zEhRLP(fnHc4|JhPSHA3#FxTwJ`?b!|B9Crr;g`yKT@{nFY<
zP6dV2LWow4G7NjuJ(H#DjMin&RK?YY>ds+6%?9?9-Qcn4GiHMp^e=wOgKSS^R<=RI
zJcTI7RpysvmCjN@j3<)N-iXV-<^?_@>LFjIbe~HPO!ro$nu`Xa#m8LY$aq488%0D^y}#`6MmB>qjUGIPdLHcG@c4ETPN8q%{9Y!Fx-G!WYZ-5DbI~
zja|4!(ZlGI4Mf`(;66bQoIkNu7)`56k2r5!kN5B*I7uR_k|YYvl?~~_z!iuIDB+hz
zv@Qx9H(lI0?@(>=eJM)O#nOH8{l@Y1L{!6E>XoxDbie7R4Wuv3r!Z#jgE0JPlTOL<
zem2SUs4IVkeRd(W6uFPPD^P*$92}%NkgbBX3LW0Zj$tjJG7coJlxYB1-)v;jHkJlW
ztr>DF=RP9qSVtm1>Z~^jX3p04>$d}vyA#R{Fj^b7Yn^Ol;VakuC~7J1(euHH=R0Ny
zAhiSnjjZjAqy{Tan?ZO9q8844J3i`7ZP9{e-XA;AJl4AR8LkzN3FR}6khmG=zgP;8
zII^fN+!c;B#P*;
zRz4(l@J?FktmEjrkv54VdezS!*<0{YDdDauL6>eFTw2f8m+zY7oi_Ep{!G%k(*ePNq;4|5cOEuUVC1th3wx?nM~*l615uP5Pu(PlU2?hlR^b0II}e8Q*9#G7
zRnuQ`JLdU{fEI#8y7ued9~{`Q&L@l?9EaEL%_vUiL#m|CZ8yusp?z(Lz2XLImrXlk
zSVf!h8G!?PxBEfsprVsEFm%?%orsJF;zztB`~H;Az`a8008=Z@&_G71X4BZ-cv_;|
zeqn{sA;U