From 65fd86f83327316a46969dd1935bbc8385c84891 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos <1697880+AngelFQC@users.noreply.github.com>
Date: Wed, 5 Nov 2025 16:26:27 -0500
Subject: [PATCH] Plugin: update BuyCourses from 1.11.x #2562
---
public/plugin/BuyCourses/CHANGELOG.md | 50 +-
public/plugin/BuyCourses/README.md | 38 +-
public/plugin/BuyCourses/admin.php | 2 +
public/plugin/BuyCourses/config.php | 2 +
public/plugin/BuyCourses/database.php | 454 +-
public/plugin/BuyCourses/index.php | 4 +
public/plugin/BuyCourses/install.php | 5 +-
public/plugin/BuyCourses/lang/brazilian.php | 196 +-
public/plugin/BuyCourses/lang/dutch.php | 268 +-
public/plugin/BuyCourses/lang/english.php | 498 +-
public/plugin/BuyCourses/lang/french.php | 335 +-
public/plugin/BuyCourses/lang/spanish.php | 529 +-
public/plugin/BuyCourses/plugin.php | 3 +
.../plugin/BuyCourses/resources/css/style.css | 34 +-
.../resources/img/128/buysubscriptions.png | Bin 0 -> 3816 bytes
.../BuyCourses/resources/img/128/discount.png | Bin 0 -> 15680 bytes
.../img/128/subscriptionssettings.png | Bin 0 -> 6629 bytes
.../resources/img/32/buysubscription.png | Bin 0 -> 1263 bytes
.../resources/img/32/buysubscriptions.png | Bin 0 -> 1263 bytes
.../BuyCourses/resources/img/32/discount.png | Bin 0 -> 4181 bytes
.../resources/img/32/subscriptionsettings.png | Bin 0 -> 1680 bytes
.../img/32/subscriptionssettings.png | Bin 0 -> 1680 bytes
.../resources/img/42/buysubscriptions.png | Bin 0 -> 1263 bytes
.../BuyCourses/resources/img/42/discount.png | Bin 0 -> 5070 bytes
.../img/42/subscriptionssettings.png | Bin 0 -> 1680 bytes
.../resources/img/64/buysubscriptions.png | Bin 0 -> 2148 bytes
.../BuyCourses/resources/img/64/discount.png | Bin 0 -> 6449 bytes
.../img/64/subscriptionssettings.png | Bin 0 -> 3455 bytes
.../plugin/BuyCourses/resources/js/modals.js | 2 +-
.../src/buy_course_plugin.class.php | 4304 ++++++++++++++---
.../plugin/BuyCourses/src/buycourses.ajax.php | 169 +-
.../plugin/BuyCourses/src/cecabank_cancel.php | 31 +
.../BuyCourses/src/cecabank_response.php | 56 +
.../BuyCourses/src/cecabank_success.php | 31 +
.../BuyCourses/src/configure_coupon.php | 200 +
.../BuyCourses/src/configure_course.php | 37 +-
.../BuyCourses/src/configure_frequency.php | 120 +
.../BuyCourses/src/configure_subscription.php | 253 +
public/plugin/BuyCourses/src/coupon_add.php | 165 +
public/plugin/BuyCourses/src/coupons.php | 111 +
.../plugin/BuyCourses/src/course_catalog.php | 7 +-
public/plugin/BuyCourses/src/course_panel.php | 6 +-
public/plugin/BuyCourses/src/error.php | 9 +-
.../plugin/BuyCourses/src/export_report.php | 15 +-
.../src/export_subscription_report.php | 65 +
.../plugin/BuyCourses/src/expresscheckout.php | 34 +-
.../BuyCourses/src/index.buycourses.php | 37 +-
public/plugin/BuyCourses/src/index.php | 2 +
public/plugin/BuyCourses/src/invoice.php | 31 +-
public/plugin/BuyCourses/src/list.php | 19 +-
public/plugin/BuyCourses/src/list_coupon.php | 98 +
public/plugin/BuyCourses/src/list_service.php | 16 +-
public/plugin/BuyCourses/src/list_session.php | 25 +-
public/plugin/BuyCourses/src/panel.ajax.php | 44 +-
public/plugin/BuyCourses/src/paymentsetup.php | 220 +-
public/plugin/BuyCourses/src/payout_panel.php | 8 +-
.../plugin/BuyCourses/src/payout_report.php | 10 +-
.../plugin/BuyCourses/src/paypal_payout.php | 8 +-
.../plugin/BuyCourses/src/paypalfunctions.php | 282 +-
public/plugin/BuyCourses/src/process.php | 115 +-
.../plugin/BuyCourses/src/process_confirm.php | 334 +-
.../src/process_subscription_confirm.php | 388 ++
public/plugin/BuyCourses/src/sales_report.php | 36 +-
.../plugin/BuyCourses/src/service_catalog.php | 21 +-
.../plugin/BuyCourses/src/service_error.php | 10 +-
.../BuyCourses/src/service_information.php | 8 +-
.../plugin/BuyCourses/src/service_panel.php | 7 +
.../plugin/BuyCourses/src/service_process.php | 145 +-
.../src/service_process_confirm.php | 120 +-
.../BuyCourses/src/service_sales_report.php | 36 +-
.../plugin/BuyCourses/src/service_success.php | 49 +-
public/plugin/BuyCourses/src/services_add.php | 23 +-
.../plugin/BuyCourses/src/services_edit.php | 31 +-
.../plugin/BuyCourses/src/session_catalog.php | 48 +-
.../plugin/BuyCourses/src/session_panel.php | 6 +-
.../plugin/BuyCourses/src/stripe_cancel.php | 31 +
.../plugin/BuyCourses/src/stripe_response.php | 77 +
.../plugin/BuyCourses/src/stripe_success.php | 79 +
.../BuyCourses/src/subscription_add.php | 238 +
.../src/subscription_course_catalog.php | 88 +
.../BuyCourses/src/subscription_process.php | 272 ++
.../src/subscription_sales_report.php | 212 +
.../src/subscription_session_catalog.php | 114 +
.../BuyCourses/src/subscriptions_courses.php | 97 +
.../BuyCourses/src/subscriptions_sessions.php | 101 +
public/plugin/BuyCourses/src/success.php | 46 +-
public/plugin/BuyCourses/src/tpv_error.php | 31 +
public/plugin/BuyCourses/src/tpv_response.php | 71 +
public/plugin/BuyCourses/src/tpv_success.php | 32 +
public/plugin/BuyCourses/uninstall.php | 2 +
public/plugin/BuyCourses/update.php | 3 +
public/plugin/BuyCourses/view/catalog.tpl | 66 +-
.../BuyCourses/view/configure_frequency.tpl | 34 +
.../view/configure_subscription.tpl | 46 +
public/plugin/BuyCourses/view/coupons.tpl | 41 +
.../plugin/BuyCourses/view/course_panel.tpl | 2 -
public/plugin/BuyCourses/view/index.tpl | 58 +-
public/plugin/BuyCourses/view/list.tpl | 40 +-
public/plugin/BuyCourses/view/list_coupon.tpl | 51 +
.../BuyCourses/view/list_subscription.tpl | 0
.../BuyCourses/view/message_confirm.tpl | 4 +-
.../BuyCourses/view/message_confirm_buyer.tpl | 18 +
.../BuyCourses/view/message_transfer.tpl | 5 +-
.../plugin/BuyCourses/view/paymentsetup.tpl | 57 +-
.../plugin/BuyCourses/view/payout_panel.tpl | 4 +-
.../plugin/BuyCourses/view/payout_report.tpl | 10 +-
.../plugin/BuyCourses/view/paypal_payout.tpl | 14 +-
public/plugin/BuyCourses/view/process.tpl | 42 +-
.../BuyCourses/view/process_confirm.tpl | 14 +-
.../plugin/BuyCourses/view/sales_report.tpl | 74 +-
.../BuyCourses/view/service_information.tpl | 2 +-
.../view/service_message_transfer.tpl | 8 +-
.../plugin/BuyCourses/view/service_panel.tpl | 4 +-
.../BuyCourses/view/service_process.tpl | 24 +
.../BuyCourses/view/service_sales_report.tpl | 12 +-
.../BuyCourses/view/subscription_add.tpl | 38 +
.../BuyCourses/view/subscription_catalog.tpl | 124 +
.../BuyCourses/view/subscription_process.tpl | 189 +
.../view/subscription_process_confirm.tpl | 285 ++
.../view/subscription_sales_report.tpl | 124 +
.../plugin/BuyCourses/view/subscriptions.tpl | 154 +
public/plugin/BuyCourses/view/success.tpl | 2 +-
122 files changed, 10997 insertions(+), 2253 deletions(-)
create mode 100644 public/plugin/BuyCourses/resources/img/128/buysubscriptions.png
create mode 100644 public/plugin/BuyCourses/resources/img/128/discount.png
create mode 100644 public/plugin/BuyCourses/resources/img/128/subscriptionssettings.png
create mode 100644 public/plugin/BuyCourses/resources/img/32/buysubscription.png
create mode 100644 public/plugin/BuyCourses/resources/img/32/buysubscriptions.png
create mode 100644 public/plugin/BuyCourses/resources/img/32/discount.png
create mode 100644 public/plugin/BuyCourses/resources/img/32/subscriptionsettings.png
create mode 100644 public/plugin/BuyCourses/resources/img/32/subscriptionssettings.png
create mode 100644 public/plugin/BuyCourses/resources/img/42/buysubscriptions.png
create mode 100644 public/plugin/BuyCourses/resources/img/42/discount.png
create mode 100644 public/plugin/BuyCourses/resources/img/42/subscriptionssettings.png
create mode 100644 public/plugin/BuyCourses/resources/img/64/buysubscriptions.png
create mode 100644 public/plugin/BuyCourses/resources/img/64/discount.png
create mode 100644 public/plugin/BuyCourses/resources/img/64/subscriptionssettings.png
create mode 100644 public/plugin/BuyCourses/src/cecabank_cancel.php
create mode 100644 public/plugin/BuyCourses/src/cecabank_response.php
create mode 100644 public/plugin/BuyCourses/src/cecabank_success.php
create mode 100644 public/plugin/BuyCourses/src/configure_coupon.php
create mode 100644 public/plugin/BuyCourses/src/configure_frequency.php
create mode 100644 public/plugin/BuyCourses/src/configure_subscription.php
create mode 100644 public/plugin/BuyCourses/src/coupon_add.php
create mode 100644 public/plugin/BuyCourses/src/coupons.php
create mode 100644 public/plugin/BuyCourses/src/export_subscription_report.php
create mode 100644 public/plugin/BuyCourses/src/list_coupon.php
create mode 100644 public/plugin/BuyCourses/src/process_subscription_confirm.php
create mode 100644 public/plugin/BuyCourses/src/stripe_cancel.php
create mode 100644 public/plugin/BuyCourses/src/stripe_response.php
create mode 100644 public/plugin/BuyCourses/src/stripe_success.php
create mode 100644 public/plugin/BuyCourses/src/subscription_add.php
create mode 100644 public/plugin/BuyCourses/src/subscription_course_catalog.php
create mode 100644 public/plugin/BuyCourses/src/subscription_process.php
create mode 100644 public/plugin/BuyCourses/src/subscription_sales_report.php
create mode 100644 public/plugin/BuyCourses/src/subscription_session_catalog.php
create mode 100644 public/plugin/BuyCourses/src/subscriptions_courses.php
create mode 100644 public/plugin/BuyCourses/src/subscriptions_sessions.php
create mode 100644 public/plugin/BuyCourses/src/tpv_error.php
create mode 100644 public/plugin/BuyCourses/src/tpv_response.php
create mode 100644 public/plugin/BuyCourses/src/tpv_success.php
create mode 100644 public/plugin/BuyCourses/view/configure_frequency.tpl
create mode 100644 public/plugin/BuyCourses/view/configure_subscription.tpl
create mode 100644 public/plugin/BuyCourses/view/coupons.tpl
create mode 100644 public/plugin/BuyCourses/view/list_coupon.tpl
create mode 100644 public/plugin/BuyCourses/view/list_subscription.tpl
create mode 100644 public/plugin/BuyCourses/view/message_confirm_buyer.tpl
create mode 100644 public/plugin/BuyCourses/view/subscription_add.tpl
create mode 100644 public/plugin/BuyCourses/view/subscription_catalog.tpl
create mode 100644 public/plugin/BuyCourses/view/subscription_process.tpl
create mode 100644 public/plugin/BuyCourses/view/subscription_process_confirm.tpl
create mode 100644 public/plugin/BuyCourses/view/subscription_sales_report.tpl
create mode 100644 public/plugin/BuyCourses/view/subscriptions.tpl
diff --git a/public/plugin/BuyCourses/CHANGELOG.md b/public/plugin/BuyCourses/CHANGELOG.md
index ed1ef9f9f75..1938e12eace 100644
--- a/public/plugin/BuyCourses/CHANGELOG.md
+++ b/public/plugin/BuyCourses/CHANGELOG.md
@@ -1,3 +1,45 @@
+v7.4 - 2022-04-28
+====
+Add subscriptions support.
+
+If the plugin has already been installed, the update.php script must be executed (load plugin/BuyCourses/update.php in your browser) to update the database structure by adding the plugin_buycourses_subscription, plugin_buycourses_subscription_rel_sale, plugin_buycourses_subscription_period and plugin_buycourses_coupon_rel_subscription_sale.
+
+v7.3 - 2022-04-28
+====
+Add Cecabank payments support.
+
+If the plugin has already been installed, the update.php script must be executed (load plugin/BuyCourses/update.php in your browser) to update the structure of the tables in the database.
+
+v7.2 - 2021-11-22
+====
+Add Stripe payments support.
+
+If the plugin has already been installed, the update.php script must be executed (load plugin/BuyCourses/update.php in your browser) to update the structure of the tables in the database.
+
+v7.1 - 2021-10-26
+====
+Fix install issue with DB field type.
+
+v7.0 - 2021-08-12
+====
+Added support for discount coupons.
+Added a better table view for the sales report.
+Multiple fixes to navigation-related issues.
+
+WARNING: Updating this plugin (or Chamilo) without going through the specific update procedure for this plugin will break your sales pages.
+
+The file [your-host]/plugin/BuyCourses/update.php *MUST* be executed to update the structure of the tables
+in the database.
+
+v6.0 - 2020-11-29
+====
+Added support for purchase instructions e-mail customization (although this
+does not support multiple languages at the moment).
+This requires changes to the DB tables:
+```sql
+ALTER TABLE plugin_buycourses_global_config ADD COLUMN info_email_extra TEXT;
+```
+
v5.0 - 2019-02-06
====
@@ -11,12 +53,12 @@ The file update.php must be executed to update the structure of the tables
v4.0 - 2017-04-25
====
-This version includes the Culqi payment gateway and introduces an additional
-option to show the Buy Courses tab to anonymous users.
+This version includes the Culqi payment gateway v1.0 (now expired) and introduces
+an additional option to show the Buy Courses tab to anonymous users.
To enable these features, if you have already installed this plugin on your
-portal prior to this version, you will need to add the corresponding configuration
-to your access_url_rel_plugin table. No documentation is available at this time on
+portal prior to this version, you will need to add the corresponding settings
+to your settings_current table. No documentation is available at this time on
how to do that, so please check up the code. Sorry about that.
diff --git a/public/plugin/BuyCourses/README.md b/public/plugin/BuyCourses/README.md
index 1f3157daa4e..6e927e3cc6e 100644
--- a/public/plugin/BuyCourses/README.md
+++ b/public/plugin/BuyCourses/README.md
@@ -1,13 +1,37 @@
-Buy Courses plugin for Chamilo LMS
-=======================================
-Users can access the purchases catalog to buy courses or sessions (since v2 of this plugin)
-enabled for sale.
+Buy Courses (course sales) plugin
+=================================
+This plugin transforms your Chamilo installation in an online shop by adding a catalogue
+ of courses and sessions that you have previously configured for sales.
If the user is not registered or logged in, he/she will be requested to register/login
before he/she can resume buying items.
-Once the course or session is chosen, shows available payment types (currently only PayPal works)
+Do not enable this plugin in any "Region". This is a known issue, but it works without
+region assignation.
+
+Once the course or session is chosen, the plugin displays the available payment methods
and lets the user proceed with the purchase.
+Currently, the plugin allows users to pay through:
+ - PayPal (requires a merchant account on PayPal at configuration time)
+ - Bank payments (requires manual confirmation of payments' reception)
+ - RedSys payments (Spanish payment gateway) (requires the download of an external file)
+ - Stripe payments (requieres a merchant account oin Stripe at configuration time)
+ - Cecabank payments (Spanish payment gateway)
+
+The user receives an e-mail confirming the purchase and she/he can immediately
+access to the course or session.
+
+We recommend using sessions as this gives you more time-related availability options
+(in the session configuration).
+
+Updates
+=========
+
+You must load the update.php script for installations that were in
+production before updating the code, as it will update the database structure to
+enable new features.
+
+Please note that updating Chamilo does *NOT* automatically update the plugins
+structure.
-Finally, the user receives an e-mail confirming the purchase and him/her is can access to the
-course/session.
+You can find a history of changes in the [CHANGELOG.md file](../../plugin/BuyCourses/CHANGELOG.md)
diff --git a/public/plugin/BuyCourses/admin.php b/public/plugin/BuyCourses/admin.php
index 13d165b2b84..a148dda8ac6 100644
--- a/public/plugin/BuyCourses/admin.php
+++ b/public/plugin/BuyCourses/admin.php
@@ -1,3 +1,5 @@
createTable(BuyCoursesPlugin::TABLE_PAYPAL);
$paypalTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $paypalTable->addColumn('username', 'string');
- $paypalTable->addColumn('password', 'string');
- $paypalTable->addColumn('signature', 'string');
- $paypalTable->addColumn('sandbox', 'boolean');
+ $paypalTable->addColumn('username', Types::STRING);
+ $paypalTable->addColumn('password', Types::STRING);
+ $paypalTable->addColumn('signature', Types::STRING);
+ $paypalTable->addColumn('sandbox', Types::BOOLEAN);
$paypalTable->setPrimaryKey(['id']);
}
@@ -39,38 +42,55 @@
$transferTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_TRANSFER);
$transferTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $transferTable->addColumn('title', 'string');
- $transferTable->addColumn('account', 'string');
- $transferTable->addColumn('swift', 'string');
+ $transferTable->addColumn('name', Types::STRING);
+ $transferTable->addColumn('account', Types::STRING);
+ $transferTable->addColumn('swift', Types::STRING);
$transferTable->setPrimaryKey(['id']);
}
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_TPV_REDSYS)) {
+ $tpvRedsysTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_TPV_REDSYS);
+ $tpvRedsysTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $tpvRedsysTable->addColumn('merchantcode', Types::STRING);
+ $tpvRedsysTable->addColumn('terminal', Types::STRING);
+ $tpvRedsysTable->addColumn('currency', Types::STRING);
+ $tpvRedsysTable->addColumn('kc', Types::STRING);
+ $tpvRedsysTable->addColumn('url_redsys', Types::STRING);
+ $tpvRedsysTable->addColumn('url_redsys_sandbox', Types::STRING);
+ $tpvRedsysTable->addColumn('sandbox', Types::BOOLEAN);
+ $tpvRedsysTable->setPrimaryKey(['id']);
+}
+
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_CURRENCY)) {
$currencyTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_CURRENCY);
$currencyTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$currencyTable->addColumn(
'country_code',
- 'string',
+ Types::STRING,
['length' => 2]
);
$currencyTable->addColumn(
'country_name',
- 'string',
+ Types::STRING,
['length' => 255]
);
$currencyTable->addColumn(
'iso_code',
- 'string',
- ['length' => 4]
+ Types::STRING,
+ ['length' => 3]
);
- $currencyTable->addColumn('status', 'boolean');
+ $currencyTable->addColumn('status', Types::BOOLEAN);
$currencyTable->addUniqueIndex(['country_code']);
$currencyTable->addIndex(['iso_code']);
$currencyTable->setPrimaryKey(['id']);
@@ -80,28 +100,28 @@
$itemTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_ITEM);
$itemTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $itemTable->addColumn('product_type', 'integer');
+ $itemTable->addColumn('product_type', Types::INTEGER);
$itemTable->addColumn(
'product_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$itemTable->addColumn(
'price',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2]
);
$itemTable->addColumn(
'currency_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$itemTable->addColumn(
'tax_perc',
- 'integer',
+ Types::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$itemTable->setPrimaryKey(['id']);
@@ -117,22 +137,22 @@
$itemBeneficiary = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_ITEM_BENEFICIARY);
$itemBeneficiary->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$itemBeneficiary->addColumn(
'item_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$itemBeneficiary->addColumn(
'user_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$itemBeneficiary->addColumn(
'commissions',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$itemBeneficiary->setPrimaryKey(['id']);
@@ -147,12 +167,12 @@
$commissions = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COMMISSION);
$commissions->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$commissions->addColumn(
'commission',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$commissions->setPrimaryKey(['id']);
@@ -162,29 +182,29 @@
$saleCommissions = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_PAYPAL_PAYOUTS);
$saleCommissions->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $saleCommissions->addColumn('date', 'datetime');
- $saleCommissions->addColumn('payout_date', 'datetime');
+ $saleCommissions->addColumn('date', Types::DATETIME_MUTABLE);
+ $saleCommissions->addColumn('payout_date', Types::DATETIME_MUTABLE);
$saleCommissions->addColumn(
'sale_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$saleCommissions->addColumn(
'user_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$saleCommissions->addColumn(
'commission',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2]
);
$saleCommissions->addColumn(
'status',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$saleCommissions->setPrimaryKey(['id']);
@@ -194,51 +214,61 @@
$saleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SALE);
$saleTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $saleTable->addColumn('reference', 'string');
- $saleTable->addColumn('date', 'datetime');
+ $saleTable->addColumn('reference', Types::STRING);
+ $saleTable->addColumn('date', Types::DATETIME_MUTABLE);
$saleTable->addColumn(
'user_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
- $saleTable->addColumn('product_type', 'integer');
- $saleTable->addColumn('product_name', 'string');
+ $saleTable->addColumn('product_type', Types::INTEGER);
+ $saleTable->addColumn('product_name', Types::STRING);
$saleTable->addColumn(
'product_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
$saleTable->addColumn(
'price',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2]
);
$saleTable->addColumn(
'price_without_tax',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->addColumn(
'tax_perc',
- 'integer',
+ Types::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$saleTable->addColumn(
'tax_amount',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$saleTable->addColumn(
'currency_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
- $saleTable->addColumn('status', 'integer');
- $saleTable->addColumn('payment_type', 'integer');
- $saleTable->addColumn('invoice', 'integer');
+ $saleTable->addColumn('status', Types::INTEGER);
+ $saleTable->addColumn('payment_type', Types::INTEGER);
+ $saleTable->addColumn('invoice', Types::INTEGER);
+ $saleTable->addColumn(
+ 'price_without_discount',
+ Types::DECIMAL,
+ ['scale' => 2, 'notnull' => false]
+ );
+ $saleTable->addColumn(
+ 'discount_amount',
+ Types::DECIMAL,
+ ['scale' => 2, 'notnull' => false]
+ );
$saleTable->setPrimaryKey(['id']);
$saleTable->addForeignKeyConstraint(
$currencyTable,
@@ -252,23 +282,24 @@
$servicesTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SERVICES);
$servicesTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $servicesTable->addColumn('title', 'string');
- $servicesTable->addColumn('description', 'text');
+ $servicesTable->addColumn('name', Types::STRING);
+ $servicesTable->addColumn('description', Types::TEXT);
$servicesTable->addColumn(
'price',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2]
);
- $servicesTable->addColumn('duration_days', 'integer');
- $servicesTable->addColumn('applies_to', 'integer');
- $servicesTable->addColumn('owner_id', 'integer');
- $servicesTable->addColumn('visibility', 'integer');
- $servicesTable->addColumn('video_url', 'string');
- $servicesTable->addColumn('image', 'string');
- $servicesTable->addColumn('service_information', 'text');
+ $servicesTable->addColumn('duration_days', Types::INTEGER);
+ $servicesTable->addColumn('applies_to', Types::INTEGER);
+ $servicesTable->addColumn('owner_id', Types::INTEGER);
+ $servicesTable->addColumn('visibility', Types::INTEGER);
+ $servicesTable->addColumn('video_url', Types::STRING);
+ $servicesTable->addColumn('image', Types::STRING);
+ $servicesTable->addColumn('service_information', Types::TEXT);
+ $servicesTable->addColumn('tax_perc', Types::INTEGER);
$servicesTable->setPrimaryKey(['id']);
}
@@ -276,52 +307,62 @@
$servicesNodeTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SERVICES_SALE);
$servicesNodeTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
$servicesNodeTable->addColumn(
'service_id',
- 'integer',
+ Types::INTEGER,
['unsigned' => true]
);
- $servicesNodeTable->addColumn('reference', 'string');
- $servicesNodeTable->addColumn('currency_id', 'integer');
+ $servicesNodeTable->addColumn('reference', Types::STRING);
+ $servicesNodeTable->addColumn('currency_id', Types::INTEGER);
$servicesNodeTable->addColumn(
'price',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2]
);
$servicesNodeTable->addColumn(
'price_without_tax',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
$servicesNodeTable->addColumn(
'tax_perc',
- 'integer',
+ Types::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$servicesNodeTable->addColumn(
'tax_amount',
- 'decimal',
+ Types::DECIMAL,
['scale' => 2, 'notnull' => false]
);
- $servicesNodeTable->addColumn('node_type', 'integer');
- $servicesNodeTable->addColumn('node_id', 'integer');
- $servicesNodeTable->addColumn('buyer_id', 'integer');
- $servicesNodeTable->addColumn('buy_date', 'datetime');
+ $servicesNodeTable->addColumn('node_type', Types::INTEGER);
+ $servicesNodeTable->addColumn('node_id', Types::INTEGER);
+ $servicesNodeTable->addColumn('buyer_id', Types::INTEGER);
+ $servicesNodeTable->addColumn('buy_date', Types::DATETIME_MUTABLE);
$servicesNodeTable->addColumn(
'date_start',
- 'datetime',
+ Types::DATETIME_MUTABLE,
['notnull' => false]
);
$servicesNodeTable->addColumn(
'date_end',
- 'datetime'
+ Types::DATETIME_MUTABLE
+ );
+ $servicesNodeTable->addColumn('status', Types::INTEGER);
+ $servicesNodeTable->addColumn('payment_type', Types::INTEGER);
+ $servicesNodeTable->addColumn('invoice', Types::INTEGER);
+ $servicesNodeTable->addColumn(
+ 'price_without_discount',
+ Types::DECIMAL,
+ ['scale' => 2, 'notnull' => false]
+ );
+ $servicesNodeTable->addColumn(
+ 'discount_amount',
+ Types::DECIMAL,
+ ['scale' => 2, 'notnull' => false]
);
- $servicesNodeTable->addColumn('status', 'integer');
- $servicesNodeTable->addColumn('payment_type', 'integer');
- $servicesNodeTable->addColumn('invoice', 'integer');
$servicesNodeTable->setPrimaryKey(['id']);
$servicesNodeTable->addForeignKeyConstraint(
$servicesTable,
@@ -335,12 +376,12 @@
$culqiTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_CULQI);
$culqiTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $culqiTable->addColumn('commerce_code', 'string');
- $culqiTable->addColumn('api_key', 'string');
- $culqiTable->addColumn('integration', 'integer');
+ $culqiTable->addColumn('commerce_code', Types::STRING);
+ $culqiTable->addColumn('api_key', Types::STRING);
+ $culqiTable->addColumn('integration', Types::INTEGER);
$culqiTable->setPrimaryKey(['id']);
}
@@ -348,47 +389,225 @@
$globalTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_GLOBAL_CONFIG);
$globalTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $globalTable->addColumn('terms_and_conditions', 'text');
- $globalTable->addColumn('global_tax_perc', 'integer');
- $globalTable->addColumn('tax_applies_to', 'integer');
- $globalTable->addColumn('tax_name', 'string');
- $globalTable->addColumn('seller_name', 'string');
- $globalTable->addColumn('seller_id', 'string');
- $globalTable->addColumn('seller_address', 'string');
- $globalTable->addColumn('seller_email', 'string');
- $globalTable->addColumn('next_number_invoice', 'integer');
- $globalTable->addColumn('invoice_series', 'string');
- $globalTable->addColumn('sale_email', 'string');
+ $globalTable->addColumn('terms_and_conditions', Types::TEXT);
+ $globalTable->addColumn('global_tax_perc', Types::INTEGER);
+ $globalTable->addColumn('tax_applies_to', Types::INTEGER);
+ $globalTable->addColumn('tax_name', Types::STRING);
+ $globalTable->addColumn('seller_name', Types::STRING);
+ $globalTable->addColumn('seller_id', Types::STRING);
+ $globalTable->addColumn('seller_address', Types::STRING);
+ $globalTable->addColumn('seller_email', Types::STRING);
+ $globalTable->addColumn('next_number_invoice', Types::INTEGER);
+ $globalTable->addColumn('invoice_series', Types::STRING);
+ $globalTable->addColumn('sale_email', Types::STRING);
+ $globalTable->addColumn('info_email_extra', Types::TEXT);
$globalTable->setPrimaryKey(['id']);
+} else {
+ $globalTable = $pluginSchema->getTable(BuyCoursesPlugin::TABLE_GLOBAL_CONFIG);
+
+ if (!$globalTable->hasColumn('info_email_extra')) {
+ $globalTable->addColumn('info_email_extra', Types::TEXT);
+ }
}
if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_INVOICE)) {
$invoiceTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_INVOICE);
$invoiceTable->addColumn(
'id',
- 'integer',
+ Types::INTEGER,
['autoincrement' => true, 'unsigned' => true]
);
- $invoiceTable->addColumn('sale_id', 'integer');
- $invoiceTable->addColumn('is_service', 'integer');
+ $invoiceTable->addColumn('sale_id', Types::INTEGER);
+ $invoiceTable->addColumn('is_service', Types::INTEGER);
$invoiceTable->addColumn(
'num_invoice',
- 'integer',
+ Types::INTEGER,
['unsigned' => true, 'notnull' => false]
);
$invoiceTable->addColumn(
'year',
- 'integer',
+ Types::INTEGER,
['unsigned' => true, 'notnull' => false]
);
- $invoiceTable->addColumn('serie', 'string');
- $invoiceTable->addColumn('date_invoice', 'datetime');
+ $invoiceTable->addColumn('serie', Types::STRING);
+ $invoiceTable->addColumn('date_invoice', Types::DATETIME_MUTABLE);
$invoiceTable->setPrimaryKey(['id']);
}
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON)) {
+ $couponTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON);
+ $couponTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponTable->addColumn('code', Types::STRING);
+ $couponTable->addColumn('discount_type', Types::INTEGER);
+ $couponTable->addColumn('discount_amount', Types::INTEGER);
+ $couponTable->addColumn('valid_start', Types::DATETIME_MUTABLE);
+ $couponTable->addColumn('valid_end', Types::DATETIME_MUTABLE);
+ $couponTable->addColumn('delivered', Types::INTEGER);
+ $couponTable->addColumn('active', Types::BOOLEAN);
+ $couponTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_ITEM)) {
+ $couponItemTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_ITEM);
+ $couponItemTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponItemTable->addColumn('coupon_id', Types::INTEGER);
+ $couponItemTable->addColumn('product_type', Types::INTEGER);
+ $couponItemTable->addColumn('product_id', Types::INTEGER);
+ $couponItemTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SERVICE)) {
+ $couponService = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SERVICE);
+ $couponService->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponService->addColumn('coupon_id', Types::INTEGER);
+ $couponService->addColumn('service_id', Types::INTEGER);
+ $couponService->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_SUBSCRIPTION)) {
+ $subscriptionTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SUBSCRIPTION);
+ $subscriptionTable->addColumn(
+ 'product_type',
+ Types::INTEGER,
+ ['unsigned' => true]
+ );
+ $subscriptionTable->addColumn(
+ 'product_id',
+ Types::INTEGER,
+ ['unsigned' => true]
+ );
+ $subscriptionTable->addColumn(
+ 'duration',
+ Types::INTEGER,
+ ['unsigned' => true]
+ );
+ $subscriptionTable->addColumn('currency_id', Types::INTEGER);
+ $subscriptionTable->addColumn('price', Types::DECIMAL);
+ $subscriptionTable->addColumn('tax_perc', Types::INTEGER);
+ $subscriptionTable->setPrimaryKey(['product_type', 'product_id', 'duration']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_SUBSCRIPTION_SALE)) {
+ $subscriptionSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SUBSCRIPTION_SALE);
+ $subscriptionSaleTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $subscriptionSaleTable->addColumn('currency_id', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('reference', Types::STRING);
+ $subscriptionSaleTable->addColumn('date', Types::DATETIME_MUTABLE);
+ $subscriptionSaleTable->addColumn('user_id', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('product_type', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('product_name', Types::STRING);
+ $subscriptionSaleTable->addColumn('product_id', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('price', Types::DECIMAL);
+ $subscriptionSaleTable->addColumn('price_without_tax', Types::DECIMAL, ['notnull' => false]);
+ $subscriptionSaleTable->addColumn('tax_perc', Types::INTEGER, ['notnull' => false]);
+ $subscriptionSaleTable->addColumn('tax_amount', Types::DECIMAL, ['notnull' => false]);
+ $subscriptionSaleTable->addColumn('status', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('payment_type', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('invoice', Types::INTEGER);
+ $subscriptionSaleTable->addColumn('price_without_discount', Types::DECIMAL);
+ $subscriptionSaleTable->addColumn('discount_amount', Types::DECIMAL);
+ $subscriptionSaleTable->addColumn('subscription_end', Types::DATETIME_MUTABLE);
+ $subscriptionSaleTable->addColumn('expired', Types::BOOLEAN);
+ $subscriptionSaleTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_SUBSCRIPTION_PERIOD)) {
+ $subscriptionPeriodTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_SUBSCRIPTION_PERIOD);
+ $subscriptionPeriodTable->addColumn(
+ 'duration',
+ Types::INTEGER,
+ ['unsigned' => true]
+ );
+ $subscriptionPeriodTable->addColumn('name', Types::STRING);
+ $subscriptionPeriodTable->setPrimaryKey(['duration']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SALE)) {
+ $couponSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SALE);
+ $couponSaleTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponSaleTable->addColumn('coupon_id', Types::INTEGER);
+ $couponSaleTable->addColumn('sale_id', Types::INTEGER);
+ $couponSaleTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SERVICE_SALE)) {
+ $couponSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SERVICE_SALE);
+ $couponSaleTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponSaleTable->addColumn('coupon_id', Types::INTEGER);
+ $couponSaleTable->addColumn('service_sale_id', Types::INTEGER);
+ $couponSaleTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_STRIPE)) {
+ $stripeTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_STRIPE);
+ $stripeTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $stripeTable->addColumn('account_id', Types::STRING);
+ $stripeTable->addColumn('secret_key', Types::STRING);
+ $stripeTable->addColumn('endpoint_secret', Types::STRING);
+ $stripeTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_TPV_CECABANK)) {
+ $tpvCecabankTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_TPV_CECABANK);
+ $tpvCecabankTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $tpvCecabankTable->addColumn('crypto_key', Types::STRING);
+ $tpvCecabankTable->addColumn('merchant_id', Types::STRING);
+ $tpvCecabankTable->addColumn('acquirer_bin', Types::STRING);
+ $tpvCecabankTable->addColumn('terminal_id', Types::STRING);
+ $tpvCecabankTable->addColumn('cypher', Types::STRING);
+ $tpvCecabankTable->addColumn('exponent', Types::STRING);
+ $tpvCecabankTable->addColumn('supported_payment', Types::STRING);
+ $tpvCecabankTable->addColumn('url', Types::STRING);
+ $tpvCecabankTable->setPrimaryKey(['id']);
+}
+
+if (false === $sm->tablesExist(BuyCoursesPlugin::TABLE_COUPON_SUBSCRIPTION_SALE)) {
+ $couponSubscriptionSaleTable = $pluginSchema->createTable(BuyCoursesPlugin::TABLE_COUPON_SUBSCRIPTION_SALE);
+ $couponSubscriptionSaleTable->addColumn(
+ 'id',
+ Types::INTEGER,
+ ['autoincrement' => true, 'unsigned' => true]
+ );
+ $couponSubscriptionSaleTable->addColumn('coupon_id', Types::INTEGER);
+ $couponSubscriptionSaleTable->addColumn('sale_id', Types::INTEGER);
+ $couponSubscriptionSaleTable->setPrimaryKey(['id']);
+}
+
$queries = $pluginSchema->toSql($platform);
foreach ($queries as $query) {
@@ -404,9 +623,11 @@
$extraFieldTable = Database::get_main_table(TABLE_EXTRA_FIELD);
$culqiTable = Database::get_main_table(BuyCoursesPlugin::TABLE_CULQI);
$globalTable = Database::get_main_table(BuyCoursesPlugin::TABLE_GLOBAL_CONFIG);
+$tpvRedsysTable = Database::get_main_table(BuyCoursesPlugin::TABLE_TPV_REDSYS);
+$stripeTable = Database::get_main_table(BuyCoursesPlugin::TABLE_STRIPE);
$paypalExtraField = Database::select(
- "*",
+ '*',
$extraFieldTable,
[
'where' => ['variable = ?' => 'paypal'],
@@ -442,6 +663,14 @@
]
);
+Database::insert(
+ $tpvRedsysTable,
+ [
+ 'url_redsys' => 'https://sis.redsys.es/sis/realizarPago',
+ 'url_redsys_sandbox' => 'https://sis-t.redsys.es:25443/sis/realizarPago',
+ ]
+);
+
Database::insert(
$culqiTable,
[
@@ -455,16 +684,6 @@
$globalTable,
[
'terms_and_conditions' => '',
- 'global_tax_perc' => 0,
- 'tax_applies_to' => 0,
- 'tax_name' => '',
- 'seller_name' => '',
- 'seller_id' => '',
- 'seller_address' => '',
- 'seller_email' => '',
- 'next_number_invoice' => 1,
- 'invoice_series' => '',
- 'sale_email' => '',
]
);
@@ -475,6 +694,15 @@
]
);
+Database::insert(
+ $stripeTable,
+ [
+ 'account_id' => '',
+ 'secret_key' => '',
+ 'endpoint_secret' => '',
+ ]
+);
+
$currencies = [
['AD', 'Andorra', 'EUR', 'AND', 0],
['AE', 'United Arab Emirates', 'AED', 'ARE', 0],
@@ -731,7 +959,7 @@
foreach ($currencies as $currency) {
$value = Database::select(
- "*",
+ '*',
$currencyTable,
[
'where' => ['country_code = ?' => $currency[0]],
diff --git a/public/plugin/BuyCourses/index.php b/public/plugin/BuyCourses/index.php
index fefacd452bd..45974575ad6 100644
--- a/public/plugin/BuyCourses/index.php
+++ b/public/plugin/BuyCourses/index.php
@@ -1,7 +1,11 @@
configurar pagamento - Defina a moeda com a qual você gostaria de vender seus cursos ou sessões";
-$strings['InstructionsStepThree'] = "Para configurar cursos para vender. Vá em: configurar cursos e preços.";
-$strings['BuyCourses'] = "Comprar cursos";
-$strings['ConfigurationOfCoursesAndPrices'] = "Configurar cursos e preços ";
-$strings['SalesReport'] = "Relatório de vendas";
-$strings['UserInformation'] = "Detalhes do comprador";
-$strings['PaymentMethods'] = "Métodos de pagamento";
-$strings['ConfirmOrder'] = "Confirmar pedido";
-$strings['PurchaseData'] = "Dados de Compra";
-$strings['bc_subject'] = "Confirmação de ordem do curso";
-$strings['PurchaseStatusX'] = "Estado de compra: %s";
-$strings['PendingReasonByTransfer'] = " Pendente Aguardando confirmação da transferência.";
-$strings['CancelOrder'] = "Anular ordem";
-$strings['BankAccountInformation'] = "Detalhes da conta bancária";
-$strings['BankAccount'] = "Contas bancárias";
-$strings['OnceItIsConfirmedYouWillReceiveAnEmailWithTheBankInformationAndAnOrderReference'] = "Uma vez confirmada, você receberá um e-mail com os dados bancários e uma referência de ordem.";
-$strings['SubscriptionToCourseXSuccessful'] = "Sua inscrição para \"%s\" foi concluída com sucesso.";
-$strings['OrderCanceled'] = "Ordem cancelada";
-$strings['OrderStatus'] = "Status do pedido";
-$strings['SearchByStatus'] = "Pesquisar por estado";
-$strings['OrderReference'] = "Código de encomenda";
-$strings['OrderDate'] = "Data do pedido";
-$strings['ProductType'] = "Tipo de produto";
-$strings['SubscribeUser'] = "Inscrever utilizador";
-$strings['DeleteOrder'] = "Excluir a ordem";
-$strings['ErrorContactPlatformAdmin'] = "Por favor entre em contato com o administrador da plataforma de erro desconhecido..";
-$strings['PendingReasonByAddress'] = ". Pendente Você não digitou um endereço de entrega confirmado.";
-$strings['PendingReasonByAuthorization'] = " Pendentes fundos Nós ainda não capturados..";
-$strings['PendingReasonByEcheck'] = " Pendente O pagamento foi feito por um eCheck que ainda não foi eliminada.";
-$strings['PendingReasonByIntl'] = " Pendente Nós não temos um mecanismo de retirada de fundos..";
-$strings['PendingReasonByMulticurrency'] = " Pendente Nós não equilibrar na moeda enviado.";
-$strings['PendingReasonByOrder'] = " Pendente Ordem feita Nós ainda não capturado fundos...";
-$strings['PendingReasonByPaymentReview'] = " Pendente O pagamento está sendo revisto pelo PayPal para o risco.";
-$strings['PendingReasonByRegulatoryReview'] = " Pendente O pagamento está sendo revisado para conformidade com regulamentações governamentais..";
-$strings['PendingReasonByUnilateral'] = " Pendente O e-mail ainda não está registrado o confirmou..";
-$strings['PendingReasonByUpgrade'] = " Pendente O pagamento foi feito por cartão de crédito..";
-$strings['PendingReasonByVerify'] = " Pendente Desculpe Nós ainda não são verificados no PayPal...";
-$strings['PendingReasonByOther'] = " Pendente Por favor, entre em contato com o administrador da plataforma..";
+
+declare(strict_types=1);
+$strings['plugin_title'] = 'Vender cursos';
+$strings['plugin_comment'] = 'Venda cursos diretamente através de seu portal Chamilo, usando uma conta do PayPal para receber fundos Nem a associação Chamilo nem os desenvolvedores envolvidos poderia ser considerado responsável de qualquer problema que você pode sofrer de usar este plugin..';
+$strings['show_main_menu_tab'] = 'Mostrar guia no menu principal';
+$strings['show_main_menu_tab_help'] = 'No caso de não querer mostrar a guia, você pode criar esse link em sua página Chamilo: %s';
+$strings['include_sessions'] = 'Incluir sessões';
+$strings['paypal_enable'] = 'Ativar PayPal';
+$strings['transfer_enable'] = 'Permitir transferência bancária';
+$strings['unregistered_users_enable'] = 'Permitir que usuários anônimos';
+$strings['Free'] = 'GRÁTIS';
+$strings['banktransfer'] = 'Transferência Bancária';
+$strings['SaleStatusPending'] = 'Venda pendente';
+$strings['SaleStatusCanceled'] = 'Venda cancelada';
+$strings['SaleStatusCompleted'] = 'Venda concluída';
+$strings['CourseListOnSale'] = 'Lista de cursos à venda';
+$strings['AvailableCourses'] = 'Campos disponíveis';
+$strings['Price'] = 'Preço';
+$strings['SearchFilter'] = 'Filtrar Pesquisa';
+$strings['MinimumPrice'] = 'Preço mínimo';
+$strings['MaximumPrice'] = 'Preço máximo';
+$strings['AvailableCoursesConfiguration'] = 'Configuração cursos disponíveis';
+$strings['PaymentsConfiguration'] = 'Configurar pagamentos';
+$strings['TheUserIsAlreadyRegisteredInTheCourse'] = 'Você está registrado no curso.';
+$strings['SeeDescription'] = 'Descriçao';
+$strings['Buy'] = 'Comprar';
+$strings['WaitingToReceiveThePayment'] = 'Atualmente pendente de pagamento';
+$strings['TheUserIsAlreadyRegisteredInTheSession'] = 'Você já está registrado na sessão';
+$strings['ItemNotSaved'] = 'Item não salvo';
+$strings['TitlePlugin'] = 'Tudo o que você precisa para ensinar e vender cursos on-line';
+$strings['PluginPresentation'] = 'O BuyCourses Plugin dá-lhe os meios para vender seus cursos ou sessões e ensinar on-line, através de apenas alguns passos e configurações simples. O que você está esperando para começar a vender cursos através Chamilo LMS?';
+$strings['Instructions'] = 'Instruções';
+$strings['InstructionsStepOne'] = 'Criar um curso ou sessão na plataforma.';
+$strings['InstructionsStepTwo'] = 'Em - configurar pagamento - Defina a moeda com a qual você gostaria de vender seus cursos ou sessões';
+$strings['InstructionsStepThree'] = 'Para configurar cursos para vender. Vá em: configurar cursos e preços.';
+$strings['BuyCourses'] = 'Comprar cursos';
+$strings['ConfigurationOfCoursesAndPrices'] = 'Configurar cursos e preços ';
+$strings['SalesReport'] = 'Relatório de vendas';
+$strings['UserInformation'] = 'Detalhes do comprador';
+$strings['PaymentMethods'] = 'Métodos de pagamento';
+$strings['ConfirmOrder'] = 'Confirmar pedido';
+$strings['PurchaseData'] = 'Dados de Compra';
+$strings['bc_subject'] = 'Confirmação de ordem do curso';
+$strings['PurchaseStatusX'] = 'Estado de compra: %s';
+$strings['PendingReasonByTransfer'] = ' Pendente Aguardando confirmação da transferência.';
+$strings['CancelOrder'] = 'Anular ordem';
+$strings['BankAccountInformation'] = 'Detalhes da conta bancária';
+$strings['BankAccount'] = 'Contas bancárias';
+$strings['OnceItIsConfirmedYouWillReceiveAnEmailWithTheBankInformationAndAnOrderReference'] = 'Uma vez confirmada, você receberá um e-mail com os dados bancários e uma referência de ordem.';
+$strings['SubscriptionToCourseXSuccessful'] = 'Sua inscrição para "%s" foi concluída com sucesso.';
+$strings['OrderCanceled'] = 'Ordem cancelada';
+$strings['OrderStatus'] = 'Status do pedido';
+$strings['SearchByStatus'] = 'Pesquisar por estado';
+$strings['OrderReference'] = 'Código de encomenda';
+$strings['OrderDate'] = 'Data do pedido';
+$strings['ProductType'] = 'Tipo de produto';
+$strings['SubscribeUser'] = 'Inscrever utilizador';
+$strings['DeleteOrder'] = 'Excluir a ordem';
+$strings['ErrorContactPlatformAdmin'] = 'Por favor entre em contato com o administrador da plataforma de erro desconhecido..';
+$strings['PendingReasonByAddress'] = '. Pendente Você não digitou um endereço de entrega confirmado.';
+$strings['PendingReasonByAuthorization'] = ' Pendentes fundos Nós ainda não capturados..';
+$strings['PendingReasonByEcheck'] = ' Pendente O pagamento foi feito por um eCheck que ainda não foi eliminada.';
+$strings['PendingReasonByIntl'] = ' Pendente Nós não temos um mecanismo de retirada de fundos..';
+$strings['PendingReasonByMulticurrency'] = ' Pendente Nós não equilibrar na moeda enviado.';
+$strings['PendingReasonByOrder'] = ' Pendente Ordem feita Nós ainda não capturado fundos...';
+$strings['PendingReasonByPaymentReview'] = ' Pendente O pagamento está sendo revisto pelo PayPal para o risco.';
+$strings['PendingReasonByRegulatoryReview'] = ' Pendente O pagamento está sendo revisado para conformidade com regulamentações governamentais..';
+$strings['PendingReasonByUnilateral'] = ' Pendente O e-mail ainda não está registrado o confirmou..';
+$strings['PendingReasonByUpgrade'] = ' Pendente O pagamento foi feito por cartão de crédito..';
+$strings['PendingReasonByVerify'] = ' Pendente Desculpe Nós ainda não são verificados no PayPal...';
+$strings['PendingReasonByOther'] = ' Pendente Por favor, entre em contato com o administrador da plataforma..';
$strings['PayPalPaymentOKPleaseConfirm'] = "PayPal relata a transação está pronto para ser executado. Para confirmar que você está OK para prosseguir, clique no botão de confirmação abaixo. Uma vez clicado, você será registrado para o curso e os fundos serão transferido da sua conta PayPal para a nossa loja. Você sempre pode acessar seus cursos através da aba 'Meus cursos' Obrigado por seu costume.!";
-$strings['Sandbox'] = "Ambiente de teste";
-$strings['PayPalConfig'] = "Configuração PayPal:";
-$strings['TransfersConfig'] = "Configurar transferências bancárias:";
-$strings['PluginInstruction'] = "Você pode ativar ou desativar a opção de pagar via PayPal ou transferência bancária na seção de configuração do plugin.";
-$strings['ClickHere'] = " Clique aqui para obter mais detalhes";
-$strings['CurrencyType'] = "Tipo de moeda";
-$strings['InfoCurrency'] = "Define a moeda para o pagamento de seus cursos.";
-$strings['ApiUsername'] = "Nome de usuário API";
-$strings['ApiPassword'] = "Senha API";
-$strings['ApiSignature'] = "Assinatura API";
-$strings['InfoApiCredentials'] = "Para gerar as suas credenciais de API para integrar Chamilo com a sua conta PayPal, você deve seguir os seguintes passos";
-$strings['InfoApiStepOne'] = "Vá para a sua conta do PayPal, Resumo , então
Tu subscripción a \"%s\" se realizó correctamente.
"; -$strings['OrderCanceled'] = "Pedido cancelado"; -$strings['OrderStatus'] = "Estado del pedido"; -$strings['PayoutStatus'] = "Estado del pago"; -$strings['SearchByStatus'] = "Buscar por estado"; -$strings['OrderReference'] = "Referencia del pedido"; -$strings['OrderDate'] = "Fecha del pedido"; -$strings['OrderPrice'] = "Precio del pedido"; -$strings['ProductType'] = "Tipo de producto"; -$strings['SubscribeUser'] = "Inscribir usuario"; -$strings['DeleteOrder'] = "Eliminar pedido"; -$strings['ErrorContactPlatformAdmin'] = "Se ha producido un error desconocido. Por favor, póngase en contacto con el administrador de la plataforma."; -$strings['PendingReasonByAddress'] = "Pendiente. No has ingresado una dirección de correo confirmada."; -$strings['PendingReasonByAuthorization'] = "Pendiente. No hemos recibido los fondos."; -$strings['PendingReasonByEcheck'] = "Pendiente. El pago fue hecho a través de un eCheck que aún no está declarado"; -$strings['PendingReasonByIntl'] = "Pendiente. No tenemos un mecanismo de retiro de fondos."; -$strings['PendingReasonByMulticurrency'] = "Pending. No podemos realizar el cambio de moneda."; -$strings['PendingReasonByOrder'] = "Pendiente. Pedido realizado. No hemos recibido los fondos."; -$strings['PendingReasonByPaymentReview'] = "Pendiente. El pago está siendo revisado por PayPal por riesgo."; -$strings['PendingReasonByRegulatoryReview'] = "Pendiente. El pago está siendo revisado por cumplimiento con regulaciones gubernamentales."; -$strings['PendingReasonByUnilateral'] = "Pendiente. La dirección de correo electrónico aún no está registrada o confirmada."; -$strings['PendingReasonByUpgrade'] = "Pendiente. El pago fue realizado a través de una tarjeta de crédito."; -$strings['PendingReasonByVerify'] = "Pendiente. Lo sentimos. Todavía no estamos verificados en PayPal."; -$strings['PendingReasonByOther'] = "Pendiente. Por favor contacta al administrador de la plataforma."; + +declare(strict_types=1); +$strings['plugin_title'] = 'Venta de cursos'; +$strings['plugin_comment'] = 'Vender cursos a través de PayPal directamente desde su portal Chamilo. La asociación Chamilo y los desarrolladores involucrados no pueden ser considerados responsables de cualquier inconveniente que se presente.'; +$strings['show_main_menu_tab'] = 'Mostrar pestaña en el menu principal'; +$strings['show_main_menu_tab_help'] = 'En caso de no querer mostrar la pestaña, puede agregar el siguiente enlace a su portal Chamilo: %s'; +$strings['public_main_menu_tab'] = 'Mostrar pestaña a usuarios sin login'; +$strings['include_sessions'] = 'Incluir sesiones'; +$strings['paypal_enable'] = 'Habilitar PayPal'; +$strings['commissions_enable'] = 'Habilitar Comisiones'; +$strings['transfer_enable'] = 'Habilitar transferencia'; +$strings['unregistered_users_enable'] = 'Permitir usuarios sin registro en la plataforma'; +$strings['invoicing_enable'] = 'Habilitar Facturación'; +$strings['tax_enable'] = 'Habilitar Impuestos'; +$strings['Free'] = 'GRATIS'; +$strings['PaypalPayoutCommissions'] = 'Pagar comisiones por Paypal'; +$strings['MyPayouts'] = 'Mis Pagos'; +$strings['Commission'] = 'Comisión'; +$strings['Commissions'] = 'Comisiones'; +$strings['SetCommissions'] = 'Aplicar comisiones'; +$strings['CommissionsConfig'] = 'Configurar Comisiones'; +$strings['PayoutReport'] = 'Reporte de Pagos'; +$strings['Stats'] = 'Estadísticas'; +$strings['InfoCommissions'] = 'Ingrese aquí la comisión de ventas, en porcentaje (%), para la organización que controla la plataforma. Este porcentaje se deducirá del monto percibido por los docentes por cada curso o sesión vendido en la plataforma.'; +$strings['NeedToSelectPaymentType'] = 'Necesita seleccionar el tipo de pago'; +$strings['IndividualPayout'] = 'Pago individual'; +$strings['CancelPayout'] = 'Cancelar Payout'; +$strings['ContinuePayout'] = 'Continuar con el Pago'; +$strings['ProceedPayout'] = 'Proceder con el Pago'; +$strings['TheActualPlatformCommissionIsX'] = 'La actual comisión de la plataforma es de %s , este porcentaje será descontado del total del precio del producto cuya diferencia será el monto base para aplicar estas comisiones.'; +$strings['CoursesInSessionsDoesntDisplayHere'] = 'Los cursos que se encuentren dentro de una sesión de formación no aparecerán en la lista de cursos a configurar como productos individuales.'; +$strings['WantToSellCourses'] = '¿Quieres enseñar y ganar dinero con tus propios cursos?, Esta lista puede estar llena de tus ganancias vendiendo cursos a través de esta plataforma!. Informate con nosotros! '; +$strings['SelectOptionToProceed'] = 'Selecciona una opción para proceder'; +$strings['VerifyTotalAmountToProceedPayout'] = 'Por favor verificar el monto total para proceder con el pago de comisiones, este monto no considera cargos extras por paypal, las ventas de cursos que no cuenten con una cuenta de Paypal para el o los beneficiarios no serán consideradas.'; +$strings['TotalAcounts'] = 'Total de cuentas:'; +$strings['TotalPayout'] = 'Total a pagar:'; +$strings['PayoutDate'] = 'Fecha del Pago:'; +$strings['CautionThisProcessCantBeCanceled'] = 'Precaución: este proceso puede tomar unos minutos y no puede ser cancelado.'; +$strings['ProcessingPayoutsDontCloseThisWindow'] = 'Procesando los pagos, no cierre esta ventana hasta que haya finalizado'; +$strings['PayoutSuccess'] = 'Los pagos se han realizado con éxito'; +$strings['Buyer'] = 'Comprador'; +$strings['BankTransfer'] = 'Transferencia Bancaria'; +$strings['SaleInfo'] = 'Información de la venta'; +$strings['SaleStatusPending'] = 'Venta pendiente'; +$strings['SaleStatusCanceled'] = 'Venta cancelada'; +$strings['SaleStatusCompleted'] = 'Venta completada'; +$strings['PayoutStatusPending'] = 'Pago pendiente'; +$strings['PayoutStatusCanceled'] = 'Pago cancelado'; +$strings['PayoutStatusCompleted'] = 'Pago completado'; +$strings['PayoutsTotalPending'] = 'Pagos pendientes:'; +$strings['PayoutsTotalCanceled'] = 'Pagos cancelados:'; +$strings['PayoutsTotalCompleted'] = 'Pagos completados:'; +$strings['Total'] = 'Total'; +$strings['TotalAmount'] = 'Monto total:'; +$strings['CourseListOnSale'] = 'Lista de cursos a la venta'; +$strings['AvailableCourses'] = 'Cursos disponibles'; +$strings['Price'] = 'Precio'; +$strings['SearchFilter'] = 'Filtro de búsqueda'; +$strings['MinimumPrice'] = 'Precio mínimo'; +$strings['MaximumPrice'] = 'Precio máximo'; +$strings['AvailableCoursesConfiguration'] = 'Configuración de cursos disponibles'; +$strings['PaymentsConfiguration'] = 'Configuración de Pagos'; +$strings['TheUserIsAlreadyRegisteredInTheCourse'] = 'Usted ya está registrado en el curso.'; +$strings['SeeDescription'] = 'Ver descripción'; +$strings['Buy'] = 'Comprar'; +$strings['WaitingToReceiveThePayment'] = 'Se encuentra a la espera de recibir el pago'; +$strings['TheUserIsAlreadyRegisteredInTheSession'] = 'Usted ya está registrado en la sesión'; +$strings['ItemNotSaved'] = 'Elemento no guardado'; +$strings['TitlePlugin'] = 'Todo lo que necesita para enseñar y vender cursos en línea'; +$strings['PluginPresentation'] = 'El Plugin BuyCourses le da los recursos para vender sus cursos o sus sesiones ya creados y enseñar en línea, todo en unos simples pasos y configuraciones. ¿Qué espera? Empiece a vender cursos a través de Chamilo ahora!'; +$strings['Instructions'] = 'Instrucciones de uso'; +$strings['InstructionsStepOne'] = 'Crea un curso o una sesión de formación en la plataforma.'; +$strings['InstructionsStepTwo'] = 'En la sección configuración de pagos, configure el tipo de moneda con el que venderá sus cursos o sesiones.'; +$strings['InstructionsStepThree'] = 'Configure los cursos a vender en la sección Configuración de cursos y precios'; +$strings['BuyCourses'] = 'Comprar cursos'; +$strings['ConfigurationOfCoursesAndPrices'] = 'Configuración de cursos y precios'; +$strings['SalesReport'] = 'Reporte de ventas'; +$strings['UserInformation'] = 'Ficha del comprador'; +$strings['PaymentMethods'] = 'Métodos de pago'; +$strings['ConfirmOrder'] = 'Confirmar Orden'; +$strings['PurchaseData'] = 'Datos de la compra'; +$strings['bc_subject'] = 'Confirmación pedido de cursos'; +$strings['PurchaseStatusX'] = 'Estado de la compra: %s'; +$strings['PendingReasonByTransfer'] = 'Pendiente. Esperando la confirmación de la transferencia'; +$strings['CancelOrder'] = 'Cancelar Orden'; +$strings['BankAccountInformation'] = 'Información de la Cuenta Bancaria'; +$strings['BankAccount'] = 'Cuenta Bancaria'; +$strings['OnceItIsConfirmedYouWillReceiveAnEmailWithTheBankInformationAndAnOrderReference'] = 'Una vez confirmado, recibira un e-mail con los datos bancarios y una referencia del pedido.'; +$strings['SubscriptionToCourseXSuccessful'] = 'Proceso completado. Tu subscripción a "%s" se realizó correctamente.
'; +$strings['OrderCanceled'] = 'Pedido cancelado'; +$strings['OrderStatus'] = 'Estado del pedido'; +$strings['PayoutStatus'] = 'Estado del pago'; +$strings['SearchByStatus'] = 'Buscar por estado'; +$strings['OrderReference'] = 'Referencia del pedido'; +$strings['OrderDate'] = 'Fecha del pedido'; +$strings['OrderPrice'] = 'Precio del pedido'; +$strings['ProductType'] = 'Tipo de producto'; +$strings['SubscribeUser'] = 'Inscribir usuario'; +$strings['DeleteOrder'] = 'Eliminar pedido'; +$strings['ErrorContactPlatformAdmin'] = 'Se ha producido un error desconocido. Por favor, póngase en contacto con el administrador de la plataforma.'; +$strings['PendingReasonByAddress'] = 'Pendiente. No has ingresado una dirección de correo confirmada.'; +$strings['PendingReasonByAuthorization'] = 'Pendiente. No hemos recibido los fondos.'; +$strings['PendingReasonByEcheck'] = 'Pendiente. El pago fue hecho a través de un eCheck que aún no está declarado'; +$strings['PendingReasonByIntl'] = 'Pendiente. No tenemos un mecanismo de retiro de fondos.'; +$strings['PendingReasonByMulticurrency'] = 'Pending. No podemos realizar el cambio de moneda.'; +$strings['PendingReasonByOrder'] = 'Pendiente. Pedido realizado. No hemos recibido los fondos.'; +$strings['PendingReasonByPaymentReview'] = 'Pendiente. El pago está siendo revisado por PayPal por riesgo.'; +$strings['PendingReasonByRegulatoryReview'] = 'Pendiente. El pago está siendo revisado por cumplimiento con regulaciones gubernamentales.'; +$strings['PendingReasonByUnilateral'] = 'Pendiente. La dirección de correo electrónico aún no está registrada o confirmada.'; +$strings['PendingReasonByUpgrade'] = 'Pendiente. El pago fue realizado a través de una tarjeta de crédito.'; +$strings['PendingReasonByVerify'] = 'Pendiente. Lo sentimos. Todavía no estamos verificados en PayPal.'; +$strings['PendingReasonByOther'] = 'Pendiente. Por favor contacta al administrador de la plataforma.'; $strings['PayPalPaymentOKPleaseConfirm'] = "PayPal nos indicó que todo estaba listo para ejecutar el pago. Por seguridad, le pedimos confirme una última vez su pedido dando clic en el botón de confirmación a bajo. Una vez le haya dado clic, será registrado al curso y el monto correspondiente será retirado de su cuenta PayPal. Siempre puede acceder a sus cursos a partir de la pestaña 'Mis cursos'. Gracias por su compra!"; -$strings['Sandbox'] = "Entorno de Pruebas"; -$strings['PayPalAccount'] = "Cuenta de Paypal"; -$strings['NoPayPalAccountDetected'] = "No se ingresó una cuenta de Paypal"; -$strings['PayPalConfig'] = "Configuración PayPal:"; -$strings['TransfersConfig'] = "Configuración de transferencias:"; -$strings['PluginInstruction'] = "Puede activar o desactivar la opción de pagos vía PayPal, Culqi o configuración de transferencias bancarias, en la sección del configuración del plugin."; -$strings['ClickHere'] = "Clic aquí para más detalles"; -$strings['CurrencyType'] = "Tipo de moneda"; -$strings['InfoCurrency'] = "Permite configurar el tipo de moneda (de pago) para sus cursos."; -$strings['ApiUsername'] = "Nombre de usuario de API"; -$strings['ApiPassword'] = "Contraseña de API"; -$strings['ApiSignature'] = "Firma"; -$strings['InfoApiCredentials'] = "Para generar tu credenciales API para integrar su cuenta PayPal con Chamilo LMS, deberá seguir los siguientes pasos"; -$strings['InfoApiStepOne'] = "Ir a la opción de Perfil de PayPal, luego en Mis herramientas de venta"; -$strings['InfoApiStepTwo'] = "En el apartado Acceso API, dar clic en la opción Actualizar"; -$strings['InfoApiStepThree'] = "En la opción 2, de Configuración de credenciales y permisos de API, dar clic en Ver firma de API. Copiar los datos de las credenciales en el formulario de configuración de este plugin"; -$strings['ErrorOccurred'] = "Ocurrio un error. Codigo: %s. Mensaje: %s. Por favor, contacta al administrador de la plataforma."; -$strings['VisibleInCatalog'] = "Visible en el catálogo"; -$strings['Beneficiaries'] = "Beneficiarios"; -$strings['AvailableCourse'] = "Curso disponible"; -$strings['ShowOnCourseCatalog'] = "Mostrar en el catálogo de cursos"; -$strings['ByStatus'] = "Por estado"; -$strings['ByUser'] = "Por usuario"; -$strings['ByEmail'] = "Por email"; -$strings['PaymentMethod'] = "Método de pago"; -$strings['SWIFT'] = "Código SWIFT"; -$strings['SWIFT_help'] = "Formato estándar de los Códigos de Identificación Bancaria (BIC) que sirve como identificador único para un banco o institución financiera."; -$strings['include_services'] = "Incluir Servicios"; -$strings['Services'] = "Servicios"; -$strings['Service'] = "Servicio"; -$strings['NewService'] = "Nuevo servicio"; -$strings['ServiceName'] = "Nombre de servicio"; -$strings['AppliesTo'] = "Aplicado a"; -$strings['ServiceInformation'] = "Información del servicio"; -$strings['EditService'] = "Editar servicio"; -$strings['ServiceAdded'] = "Servicio agregado"; -$strings['ServiceEdited'] = "Servicio editado"; -$strings['ServiceSaleInfo'] = "Información del servicio"; -$strings['ListOfServicesOnSale'] = "Lista de servicios a la venta"; -$strings['AdditionalInfo'] = "Información adicional"; -$strings['PleaseSelectTheCorrectInfoToApplyTheService'] = "Porfavor Seleccione la información correcta para aplicar el servicio"; -$strings['SubscriptionToServiceXSuccessful'] = "La subscripción al servicio %s ha sido satisfactoria"; -$strings['culqi_enable'] = "Habilitar Culqi"; -$strings['CulqiConfig'] = "Configuración de CULQI:"; -$strings['InfoCulqiCredentials'] = "Para obtener las credenciales es necesario crearse una cuenta en Culqi e ingresar en modo desarrollo, copiar el código de comercio que se encuentra en su panel de control, luego ingresar al apartado de API Keys y generar la Key correspondiente para copiarla aquí"; -$strings['CommerceCode'] = "Codigo de comercio"; -$strings['IConfirmIReadAndAcceptTermsAndCondition'] = "He leído y aceptado los terminos y condiciones del servicio"; -$strings['NoTermsAndConditionsProvided'] = "Terminos y condiciones no establecidos"; -$strings['GlobalConfig'] = "Configuración global:"; -$strings['WriteHereTheTermsAndConditionsOfYourECommerce'] = "Escriba aquí los terminos y condiciones para su tienda virtual"; -$strings['PleaseSelectThePaymentMethodBeforeConfirmYourOrder'] = "Por favor seleccione el método de pago de su preferencia antes de confirmar su orden"; -$strings['MyServices'] = "Mis servicios"; -$strings['ServiceId'] = "Id de servicio"; -$strings['BoughtBy'] = "Comprado por"; -$strings['PurchaserUser'] = "Usuario comprador"; -$strings['SalePrice'] = "Precio de venta"; -$strings['Pending'] = "Pendiente"; -$strings['YouNeedToBeRegisteredInAtLeastOneCourse'] = "Necesitas estar registrado en al menos un curso"; -$strings['YouNeedToBeRegisteredInAtLeastOneSession'] = "Necesitas estar registrado en al menos una sesión"; -$strings['IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere'] = "Si quieres obtener el certificado y/o las competencias asociadas a este curso, necesitas comprar el servicio de Certificado , puedes ir al catálogo de servicios para comprarlo haciendo click AQUÍ"; +$strings['Sandbox'] = 'Entorno de Pruebas'; +$strings['PayPalAccount'] = 'Cuenta de Paypal'; +$strings['NoPayPalAccountDetected'] = 'No se ingresó una cuenta de Paypal'; +$strings['PayPalConfig'] = 'Configuración PayPal:'; +$strings['TransfersConfig'] = 'Configuración de transferencias:'; +$strings['PluginInstruction'] = 'Puede activar o desactivar la opción de pagos vía PayPal, Culqi o configuración de transferencias bancarias, en la sección del configuración del plugin.'; +$strings['ClickHere'] = 'Clic aquí para más detalles'; +$strings['CurrencyType'] = 'Tipo de moneda'; +$strings['InfoCurrency'] = 'Permite configurar el tipo de moneda (de pago) para sus cursos.'; +$strings['ApiUsername'] = 'Nombre de usuario de API'; +$strings['ApiPassword'] = 'Contraseña de API'; +$strings['ApiSignature'] = 'Firma'; +$strings['InfoApiCredentials'] = 'Para generar tu credenciales API para integrar su cuenta PayPal con Chamilo LMS, deberá seguir los siguientes pasos'; +$strings['InfoApiStepOne'] = 'Ir a la opción de Perfil de PayPal, luego en Mis herramientas de venta'; +$strings['InfoApiStepTwo'] = 'En el apartado Acceso API, dar clic en la opción Actualizar'; +$strings['InfoApiStepThree'] = 'En la opción 2, de Configuración de credenciales y permisos de API, dar clic en Ver firma de API. Copiar los datos de las credenciales en el formulario de configuración de este plugin'; +$strings['ErrorOccurred'] = 'Ocurrio un error. Codigo: %s. Mensaje: %s. Por favor, contacta al administrador de la plataforma.'; +$strings['VisibleInCatalog'] = 'Visible en el catálogo'; +$strings['Beneficiaries'] = 'Beneficiarios'; +$strings['AvailableCourse'] = 'Curso disponible'; +$strings['ShowOnCourseCatalog'] = 'Mostrar en el catálogo de cursos'; +$strings['ByStatus'] = 'Por estado'; +$strings['ByUser'] = 'Por usuario'; +$strings['ByEmail'] = 'Por email'; +$strings['PaymentMethod'] = 'Método de pago'; +$strings['SWIFT'] = 'Código SWIFT'; +$strings['SWIFT_help'] = 'Formato estándar de los Códigos de Identificación Bancaria (BIC) que sirve como identificador único para un banco o institución financiera.'; +$strings['PleaseSelectThePaymentMethodBeforeConfirmYourOrder'] = 'Seleccione su método de pago preferido antes de confirmar su pedido'; +$strings['NoPaymentOptionAvailable'] = 'No hay opción de pago disponible. Por favor reporte este problema al administrador.'; +$strings['XIsOnlyPaymentMethodAvailable'] = '%s es la única opción de pago disponible para esta compra.'; +$strings['hide_free_text'] = "Esconder texto 'Gratis'"; +$strings['culqi_enable'] = 'Activar culqi'; +$strings['include_services'] = 'Incluir Servicios'; +$strings['CurrencyIsNotConfigured'] = 'Configure una moneda antes de seguir.'; +$strings['Services'] = 'Servicios'; +$strings['Service'] = 'Servicio'; +$strings['NewService'] = 'Nuevo servicio'; +$strings['ServiceName'] = 'Nombre de servicio'; +$strings['AppliesTo'] = 'Aplicado a'; +$strings['ServiceInformation'] = 'Información del servicio'; +$strings['ListOfServicesOnSale'] = 'Lista de servicios en venta'; +$strings['GlobalConfig'] = 'Configuración global'; +$strings['WriteHereTheTermsAndConditionsOfYourECommerce'] = 'Escriba aquí los términos y condiciones de su portal e-commerce'; +$strings['EditService'] = 'Editar servicio'; +$strings['DeleteThisService'] = 'Borrar servicio'; +$strings['IConfirmIReadAndAcceptTermsAndCondition'] = 'He leído y acepto los términos y condiciones'; +$strings['PleaseSelectTheCorrectInfoToApplyTheService'] = 'Porfavor Seleccione la información correcta para aplicar el servicio'; +$strings['SaleStatusCancelled'] = 'Venta anulada'; +$strings['ServiceSaleInfo'] = 'Información del servicio'; +$strings['ServiceId'] = 'Id de servicio'; +$strings['BoughtBy'] = 'Comprado por'; +$strings['PurchaserUser'] = 'Usuario comprador'; +$strings['Pending'] = 'Pendiente'; +$strings['Names'] = 'Nombres'; +$strings['SellerName'] = 'Nombre vendedor'; +$strings['SellerId'] = 'Identificador vendedor'; +$strings['SellerAddress'] = 'Dirección vendedor'; +$strings['SellerEmail'] = 'E-mail vendedor'; +$strings['NextNumberInvoice'] = 'Número siguiente factura'; +$strings['NextNumberInvoiceDescription'] = 'Número de la siguiente factura asignado de forma manual'; +$strings['InvoiceSeries'] = 'Serie factura'; +$strings['InvoiceSeriesDescription'] = 'Parámetro opcional: Ejemplo de numeración factura <serie><año>/<número>'; +$strings['InvoiceView'] = 'Ver factura'; +$strings['NoInvoiceEnable'] = 'No está habilitado el bloque de facturación'; +$strings['Company'] = 'Empresa'; +$strings['VAT'] = 'CIF'; +$strings['Address'] = 'Dirección'; +$strings['InvoiceNumber'] = 'Num. factura'; +$strings['InvoiceDate'] = 'Fecha de emisión'; +$strings['Invoice'] = 'Factura'; +$strings['SaleEmail'] = 'E-mail de ventas'; +$strings['PurchaseDetailsIntro'] = 'Detalles de la comprar'; +$strings['PurchaseDetailsEnd'] = 'Atentamente'; +$strings['ProductName'] = 'Nombre producto'; +$strings['BankAccountIntro'] = 'Información cuentas bancarias'; $strings['AdditionalInfoRequired'] = 'Se requiere que se elija la información adicional antes de proceder'; +$strings['SubscriptionToServiceXSuccessful'] = 'La subscripción al servicio %s ha sido satisfactoria'; +$strings['ClickHereToFinish'] = 'De clic aquí para terminar'; +$strings['OrderCancelled'] = 'Pedido anulado'; +$strings['use_currency_symbol'] = 'Usar símbolo de la moneda'; +$strings['ExportReport'] = 'Exportar reporte de ventas'; +$strings['OrderTime'] = 'Fecha del pedido'; +$strings['SelectDateRange'] = 'Seleccione una fecha de inicio y una fecha de fin para el reporte'; +$strings['ServiceAdded'] = 'Servicio agregado'; +$strings['ServiceEdited'] = 'Servicio editado'; +$strings['ListOfServicesOnSale'] = 'Lista de servicios a la venta'; +$strings['AdditionalInfo'] = 'Información adicional'; +$strings['culqi_enable'] = 'Habilitar Culqi'; +$strings['CulqiConfig'] = 'Configuración de CULQI:'; +$strings['InfoCulqiCredentials'] = 'Para obtener las credenciales es necesario crearse una cuenta en Culqi e ingresar en modo desarrollo, copiar el código de comercio que se encuentra en su panel de control, luego ingresar al apartado de API Keys y generar la Key correspondiente para copiarla aquí'; +$strings['CommerceCode'] = 'Codigo de comercio'; +$strings['NoTermsAndConditionsProvided'] = 'Terminos y condiciones no establecidos'; +$strings['GlobalConfig'] = 'Configuración global:'; +$strings['MyServices'] = 'Mis servicios'; +$strings['SalePrice'] = 'Precio de venta'; +$strings['YouNeedToBeRegisteredInAtLeastOneCourse'] = 'Necesitas estar registrado en al menos un curso'; +$strings['YouNeedToBeRegisteredInAtLeastOneSession'] = 'Necesitas estar registrado en al menos una sesión'; +$strings['IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere'] = "Si quieres obtener el certificado y/o las competencias asociadas a este curso, necesitas comprar el servicio de Certificado , puedes ir al catálogo de servicios para comprarlo haciendo click AQUÍ"; $strings['ServiceDeleted'] = 'Servicio eliminado'; -$strings['DeleteThisService'] = 'Eliminar este servicio'; $strings['YourCoursesNeedAtLeastOneLearningPath'] = 'Los cursos en los que estás registrado necesitan tener al menos una lección que contenga un item de cerficado final'; -$strings['NoPaymentOptionAvailable'] = 'No existen opciones de pago. Por favor reporte este problema al administrador.'; -$strings['XIsOnlyPaymentMethodAvailable'] = '%s es el único método de pago disponible para esta compra.'; -$strings['GlobalTaxPerc'] = "Porcentaje del impuesto global"; -$strings['GlobalTaxPercDescription'] = "Porcentaje por defecto que se usará, excepto si existe un impuesto específico en el curso, sesión o servicio."; -$strings['TaxPerc'] = "Porcentaje del impuesto"; -$strings['TaxPercDescription'] = "Si se deja vacío se usará valor global por defecto."; -$strings['ByDefault'] = "por defecto (valor global)"; -$strings['OnlyCourses'] = "Solo Cursos"; -$strings['OnlySessions'] = "Solo Sesiones"; -$strings['OnlyServices'] = "Solo Servicios"; -$strings['TaxAppliesTo'] = "Impuestos aplicados a"; -$strings['AllCoursesSessionsAndServices'] = "Todos (Cursos, sesiones y servicios)"; -$strings['TaxNameCustom'] = "Nombre del impuesto"; -$strings['TaxNameExamples'] = "VAT, IVA, IGV, TVA, IV ..."; -$strings['ErrorUpdateFieldDB'] = "Error al actualizar los campos de la base de datos"; -$strings['SellerName'] = "Nombre vendedor"; -$strings['SellerId'] = "Identificador vendedor"; -$strings['SellerAddress'] = "Dirección vendedor"; -$strings['SellerEmail'] = "E-mail vendedor"; -$strings['NextNumberInvoice'] = "Número siguiente factura"; -$strings['NextNumberInvoiceDescription'] = "Número de la siguiente factura asignado de forma manual"; -$strings['InvoiceSeries'] = "Serie factura"; -$strings['InvoiceSeriesDescription'] = "Parámetro opcional: Ejemplo de numeración factura <serie><año>/<número>"; -$strings['InvoiceView'] = "Ver factura"; -$strings['NoInvoiceEnable'] = "No está habilitado el bloque de facturación"; -$strings['Company'] = "Empresa"; -$strings['VAT'] = "CIF"; -$strings['Address'] = "Dirección"; -$strings['InvoiceNumber'] = "Num. factura"; -$strings['InvoiceDate'] = "Fecha de emisión"; -$strings['Invoice'] = "Factura"; -$strings['SaleEmail'] = "E-mail de ventas"; -$strings['PurchaseDetailsIntro'] = "Detalles de la comprar"; -$strings['PurchaseDetailsEnd'] = "Atentamente"; -$strings['ProductName'] = "Nombre producto"; -$strings['BankAccountIntro'] = "Información cuentas bancarias"; -$strings['CurrencyIsNotConfigured'] = "Por favor, confogure una moneda antes de continuar."; -$strings['ExportReport'] = "Exportar reporte de ventas"; -$strings['OrderTime'] = "Hora de pedido"; -$strings['SelectDateRange'] = "Seleccione una fecha de inicio y fecha de fin para el reporte"; +$strings['GlobalTaxPerc'] = 'Porcentaje del impuesto global'; +$strings['GlobalTaxPercDescription'] = 'Porcentaje por defecto que se usará, excepto si existe un impuesto específico en el curso, sesión o servicio.'; +$strings['TaxPerc'] = 'Porcentaje del impuesto'; +$strings['TaxPercDescription'] = 'Si se deja vacío se usará valor global por defecto.'; +$strings['ByDefault'] = 'por defecto (valor global)'; +$strings['OnlyCourses'] = 'Solo Cursos'; +$strings['OnlySessions'] = 'Solo Sesiones'; +$strings['OnlyServices'] = 'Solo Servicios'; +$strings['TaxAppliesTo'] = 'Impuestos aplicados a'; +$strings['AllCoursesSessionsAndServices'] = 'Todos (Cursos, sesiones y servicios)'; +$strings['TaxNameCustom'] = 'Nombre del impuesto'; +$strings['TaxNameExamples'] = 'VAT, IVA, IGV, TVA, IV ...'; +$strings['ErrorUpdateFieldDB'] = 'Error al actualizar los campos de la base de datos'; +$strings['tpv_redsys_enable'] = 'Habilitar TPV RedSys'; +$strings['tpv_redsys_enable_help'] = "Para poder utilizar la modalidad de pago del TPV de RedSys es necesario descargar los ficheros de \"INTEGRACIÓN REST - API PHP\" en el siguiente enlace web de RedSys y ubicar el fichero el fichero apiRedSys.php en el directorio plugin/BuyCourses/resources."; +$strings['NotFindRedsysFile'] = 'No se encuentra en el directorio plugin/BuyCourses/resources el fichero apiRedsys.php'; +$strings['TpvPayment'] = 'Pago con tarjeta'; +$strings['TpvRedsysConfig'] = 'Configuración TPV Redsys'; +$strings['DS_MERCHANT_MERCHANTCODE'] = 'Número de comercio (FUC)'; +$strings['DS_MERCHANT_TERMINAL'] = 'Número de terminal'; +$strings['DS_MERCHANT_CURRENCY'] = 'Moneda del terminal'; +$strings['kc'] = 'Clave secreta de encriptación'; +$strings['url_redsys'] = 'URL conexión Redsys'; +$strings['url_redsys_sandbox'] = 'URL conexión Redsys (Pruebas)'; +$strings['InfoTpvRedsysApiCredentials'] = 'Deberá completar los siguientes campos del formulario con la información que les facilite el Soporte Técnico del TPV Redsys:'; +$strings['InfoEmailExtra'] = 'Información extra en e-mail'; +$strings['Coupon'] = 'Cupón'; +$strings['DiscountAmount'] = 'Descuento total'; +$strings['RedeemCoupon'] = 'Canjear'; +$strings['NeedToAddCouponCode'] = 'No se ha introducido un código de cupón'; +$strings['CouponNotValid'] = 'El cupón no es valido'; +$strings['CouponRedeemed'] = 'Cupón canjeado'; +$strings['CouponDiscount'] = 'Descuento'; +$strings['CouponStatus'] = 'Estado cupón'; +$strings['CouponPercentage'] = 'Porcentaje'; +$strings['CouponAmount'] = 'Valor'; +$strings['CouponList'] = 'Lista de cupones'; +$strings['CouponCode'] = 'Código del cupón'; +$strings['CouponDiscountType'] = 'Tipo de descuento'; +$strings['CouponDateStart'] = 'Valido desde'; +$strings['CouponDateEnd'] = 'Caduca el'; +$strings['CouponDelivered'] = 'Canjeados'; +$strings['CouponDisable'] = 'Desactivar'; +$strings['CouponEnable'] = 'Activar'; +$strings['CouponCodeUsed'] = 'Código de cupón ya usado'; +$strings['CouponNoExists'] = 'El cupón no existe'; +$strings['CouponErrorInsert'] = 'Error añadiendo nuevo cupón'; +$strings['CouponActive'] = 'Activo'; +$strings['CouponDisabled'] = 'Desactivado'; +$strings['CouponUpdate'] = 'Cupón actualizado'; +$strings['CouponsConfiguration'] = 'Configuración de cupones'; +$strings['CouponAdd'] = 'Nuevo cupón'; +$strings['ConfigureCoupon'] = 'Configurar cupón'; +$strings['DiscountCoupons'] = 'Cupones descuento'; +$strings['CouponsCode'] = 'Código'; +$strings['DoYouHaveACoupon'] = '¿Tienes un cupón?'; +$strings['stripe_enable'] = 'Activar Stripe'; +$strings['StripeConfig'] = 'Configuración de Stripe:'; +$strings['InfoStripeCredentials'] = 'Para obtener las credenciales debes crear una cuenta en Stripe, copiar el id de cuenta de tu perfil, ir a la sección de configuración de las claves API y copiar la secret key, por último deberá registrar un nuevo Endpoint en la sección de webhooks a https://{site}/plugin/BuyCourses/src/stripe_response.php para el tipo de evento checkout.session.completed y copiar el secret del Endpoint.'; +$strings['StripeAccountId'] = 'Id de la cuenta:'; +$strings['StripeSecret'] = 'Secret key:'; +$strings['StripeEndpointSecret'] = 'Endpoint secret:'; +$strings['PendingReasonByStripe'] = 'Pendiente. Esperando confirmación del pago ...'; +$strings['cecabank_enable'] = 'Habilitar TPV Cecabank'; +$strings['TpvCecabank'] = 'Pago con tarjeta (Cecabank)'; +$strings['CecaSecret'] = 'Secret'; +$strings['CecaUrl'] = 'Url'; +$strings['CecaMerchanId'] = 'Merchant'; +$strings['CecaAcquirerId'] = 'Adquirer'; +$strings['CecaTerminalId'] = 'Terminal'; +$strings['CecaCypher'] = 'Cypher'; +$strings['CecaCurrency'] = 'Moneda'; +$strings['CecaExponent'] = 'Exponent'; +$strings['CecaSupportedPayment'] = 'Pago soportado'; +$strings['CecabankConfig'] = 'Configuración Cecabank'; +$strings['Country'] = 'País'; +$strings['PaymentType'] = 'Tipo de pago'; +$strings['CountryRelPaymentConfig'] = 'Configuración del tipo de pago por país'; +$strings['CountryRelPaymentMessage'] = 'Para realizar un pedido es necesario definir el tipo de pago por país, en caso contrario no se permite la realización del pedido'; +$strings['CountryEmpty'] = 'Para realizar un pedido es necesario definir en el perfil del usuario el campo país'; +$strings['Duration'] = 'Duración'; +$strings['SubscriptionAdd'] = 'Añadir suscripción'; +$strings['SubscriptionList'] = 'Lista de suscripciones'; +$strings['SubscriptionListOnSale'] = 'Lista de suscripciones a la venta'; +$strings['SelectSubscription'] = 'Seleciona duración'; +$strings['SubscriptionNotValid'] = 'Suscripción no valida'; +$strings['SubscriptionSalesReport'] = 'Reporte de ventas'; +$strings['BuySubscriptions'] = 'Compra suscripciones'; +$strings['ConfigurationOfSubscriptionsAndPrices'] = 'Configuración de suscripciones y precios'; +$strings['FrequencyConfig'] = 'Configuración periodos'; +$strings['Subscriptions'] = 'Suscripciones'; +$strings['HasSubscriptions'] = 'Tiene suscripciones'; +$strings['FrequencyRemoved'] = 'Periodo eliminado'; +$strings['SubscriptionPeriodOnUse'] = 'Periodo de suscription en uso'; +$strings['FrequencyNotExits'] = 'El periodo no existe'; +$strings['FrequencyIncorrect'] = 'Periodo incorrecto'; +$strings['SubscriptionFrequencyValueDays'] = 'Valor de la suscripción en días'; +$strings['FrequencyNotUpdated'] = 'Periodo no actualizado'; +$strings['FrequencyNotSaved'] = 'Periodo no guardado'; +$strings['NeedToAddDuration'] = 'Hay que especificar una duración'; +$strings['SubscriptionNotValid'] = 'Suscripción no valida'; +$strings['SelecSubscription'] = 'Seleccione una suscripción'; +$strings['ConfigureSubscriptionsFrequencies'] = 'Configurar los períodos de suscripciones'; +$strings['FrequencyAdd'] = 'Agregar período'; +$strings['SubscriptionAlreadyExists'] = 'La suscripción ya existe'; +$strings['SubscriptionPeriodDuration'] = 'Duración de suscripción (en días)'; +$strings['Product'] = 'Producto'; +$strings['YouProductIsActivatedYouCanNowAccessIt'] = 'Tu producto esta activado y puedes ahora acceder a este.'; +$strings['hide_shopping_cart_from_course_catalogue'] = 'Esconder el carito de compra del catalogo de curso y dejar el boton de subscripcion a curso'; diff --git a/public/plugin/BuyCourses/plugin.php b/public/plugin/BuyCourses/plugin.php index 828ee671239..844d1409ae1 100644 --- a/public/plugin/BuyCourses/plugin.php +++ b/public/plugin/BuyCourses/plugin.php @@ -1,4 +1,7 @@ P)-`zCK6?qWo^brgE=UTU_mv;6D(f2mP6-h1&cKXk?+>ulhdY1g z_aE<~XZ_r|@@hH6Z$suDNBFgg_$_-&1B42nUkq4nJH1D_ScZ>JJEV{y7K;zu<#2H! zr0nSMTE4{A?rt*SgHU@(_Vae}2`E0R`R;{H0@&fN4GyJ&Nz6 7fNktxfv+g9!$`9^u%F|2<2*f z!P;2P<@5uyU6-F0Sp$DK<8Uod+VQ}YBa9ok67!_kPXT*fVQ+jL7@Fq;#AW}UEFXX5 zc=um4fEa-TeXgCX?+6;vUq%KPa$+?BzQTn{du`EbpzQZ#xO xMlJA4DQv4pFjVDO)=-Gha?q1*)4~C8 zYGtN=b{3~vs@qqdnq~FiJ*3$NHAoBJMpodqh`#c9UpZHbH^=W5GY;HeFf8~Qkroao z_r5bvAyy1fFmP(Ty{mP#rakEgXo@P6mtJjn@d0ux^MqcG;{MzFETlioy29+_s2?Db z?CK(JrTHo&`RhMJf =Fjr0A6XO MPyBYuh8+}H6| z&vO0UpX-szbQtI+!1&7v6yiW`tl=)F_%?<4uk>F-9~l`S4sIrLSN6t>$!O>k18o4& zgcc!c(vM)maxxnF#6TNhME8sgFyxF3&?SRD)HTosP?ONRCc@}G?a Um3rT zAlv2}YShOmFJPFjTMsPEOtXIAacYHM=$*(O6E}~bF9xWF8~@otW#R;t$pdN2NQ`m_ zaTBq&H30%|cU!nBTpOi **;xy=lcSFAGpy;!OF%&kSn$5Oq3D*Lluf4 zT&hNAZyV6O%AarDwyg=68Iy0Q>dai3qekKfhyvz%l^NF~GwulEG0w@uU!k0gTgGlh zp`?cQcJm!Rc&k #ubYDj)Mrfl{pGaZ{cj|1`gc}rRk%r zPamO2uT@B$p)i13iML>+32GR>N`Cn=g{AsFG2>SmU$}@{S!4CkyLarX;jPSpLT%~* zp*I-I)DDFK+KKiv#ifQ9e=E6_d8%Xks7xL}{2EiQeh+W)($51+MDX_?X64=wfb`^5 zjD2G$Vt{tYFJFy$+!aJarmnuWG4W*U8j7m8i cc~J+O{! z;}o@tmAS}M+zyA|dqrvnaNsY2^J$ge7xIlC`MlyyOoQ0M75uy>zt?YB%}BjFYpJA1 zebe|YoKAH$v-c<8{j`)zrzHsU>Uayav8jJre&~@e1I(QN!RI9OA5T_s6M_IPH?G)9 z$L{`%EBE}$w{CrQmCErvFNsL1t5>9MfGG5pZylyo{XRFY-9fP9?im| jRkN^4Z z7lDtZA~1?8m!Q$Je_{Na@}Z|boV=jsSQ!NB3op3feT~A{9n9WVA6ylS5Ayt%|1BML zEyzXm{Q0#L$qI>wl?Gr+KMHIl+`BI9YcK(%y#5ggCzBNxgIvU1g<5r={@@=ck`>b$ zI}M=bgWEpm@*76jN)QN@YVY5=-7VRO8bB2)lfRRwmKfM+0MR?^ws{TW#2~Qmg#eDT z@fM0k1Zq#fx`~|zfMa!A8fWU*8N_BH zj*=N#a0!=3qp zt^IzDiA*k)h$Y9;!72lA_sk*cmSoz*aiB0j{X z4h~rLC|ys~#Ro9vTyjEMV^ b& z%M7qfx`C@v1~66yfMA~i27e?Fpc3&K8I!SYs<1T%&=+6K1N+j}(KUW8ItX;kmy#9J z8fy$dzP39S-dT^j`%TCPpZsdFVp?O50fJy~-}Szga^n|S<7M9v5$je_w#NWstQsZj z2nEU!HGu1VGf^!uvBv;TIQVM^SJoSk0SMq`|1NPoF|fw~YnivP>qR5&Q;rzu^RjDl z`Xg3Og}254a_ZD7@LJkBx+2N|uKRMbLgHhM0RRxbmbQeB34`bkAjkP)vSQ+6nE`@- zi5^I|ob`z4-xy^n{O4rF#K$TF$o*$tN914A*3l8`5!HVtdr6*ps>$e3x>#iZ00RHh zD6479Xq(6Y(0x8xA?;zE0pyn+c^ktg8Kkw@E9K}6AYYzIR!n W1dS^O#4`E004RL^z%5J0_ kR-P_nm$fpOe5# zX=|w?$^e g#JZy2Z= zU@P*_>AwZiT`o2%{o8RDlNHiA18aayEbSwZ!RWwZ@C`7cOGXA5az+Liaz+Liaz+Li zaz+N|hMljn89)Zx0HW!=kueCGOahf_$%^Tm!8U;Ue+~RF@kCPJhsC-2mq!Ya$*fYy eKAotZF8F^1$ZOdOlEg9q0000 004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE @L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K |`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn (gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6q n9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6 EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4 z=0!`QmC#PmhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`h kG4N#KjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^ ^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=? zH;57x71R{;CfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV z4H2`e-B#~iJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOj zV`f+`tbMHKY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9 zk0dT6g(bBn MJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3 zsdQ;h>DV6MJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP z-cdbwfPG-_pyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1 z@Q#ce4LsV@Xw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy z`y}IJ%XeDeRku;v3frOf?Dm Pgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3 ze|F(q&bit1spqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bE zTE}(E>+O9OeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$ zcQ|r* xkvZnNio#z9&IX9*nWZ zp8u5o(}(f=r{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8 z{*wQ4;n(6<@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh; zdbp6hu<#rAg!B711SuW>000SaNLh0L04^c`04^c{s^Z;}001(3Nkl K`?jnQLcp*MpnyL?HUSsrhcXDr;z)>z5D+kgB?3VR0)m7n3JJ;*S&b|T2-y*5 z{0~9`2o5MN1Z4n0kX1z>EZN?>x4Zw}cdAZxb-(+vzL(?$zP!^_=c`jo*E!YO?Ryht zS!UkHdl#`w-^Y6t?+3tp9PbCfdmQgy0{|0e&NNMJ6;p{K6Gxa72vNcE&=nFRLtb>p zM<6Ithn&{q2D+xS6&vN99r*|fRrbY %aD _e20p zoI2G+8*hxsN!NM+aP@o6+c8}^=Rfk?U1Cc|6N5Gg+JY{5 JNitdCuQtBiKkw# ;G;)6C+N7h2q@@~+i-E=9 z=`bJLVwjYNSZ@Ph9Gu_JoEYm7yFx^F5<19Epq7zE%6g8Yq2|>N ze=gtk5kTt@wmoZ0s%+14c<6Biz%SD*ySp04^Kp&0pi(jQvhyo_tKw)PNt*pwY!E=n zI?Qfc+G_{JdKm!YZpO-o_k93F(I=uxkr@F0^kA*2wuw&kGe}>DhK`{Tkr53%?(QLBN`LSscM-#QQDQHWMG$wof zRkPb}V=M`fTdyF_4-m(dgR)9x4rXsx#(F4NQ4puYR&Sp2a;JMP^R^ *&L2W``7N!L5!l7+aTUFhpDgeqPFIHzI`LiE zQ760&Hd2Nt3Z3qb@VO2V9TM7!P9KywqC6JM 95Y`DyO3< z*2aP<^@pFkQ}kXR0A=S_TPjCjpMQXz+*npQg%bb?&%u(C2j|b_fnCAI36Zy%2Z7aX zLD)y`bl5tM2 zzw`Q+PcHKcXPTd`wlsaB;@ zuMU8+^D9l2QAjSs4h|7VU}saznx8mJiOzDaLYY{K*jXdmsg1WM??ie03B1lS>Vb{c z<3@QYbE$~hu`#i+W6}B)%iEMZDQQP^*kkvzC_1Oz#M`R#JL)xYG==se&YpRq*9Jh@ z`B_utXsn3I$ZncX41{GW*vLdvq3$MMbsFi!i>;*uY9~S+qN`7AwM<27*)%V+6EC7% zpnE&zLOUuzI9`syj)TID*$NIl9v6G9>U^4tU?X*rCzyZWg`f4#02qB$?)=ucV)|4n zM`6z{!A=de^N{bfP7YHd TDWCp#dt=Ul)Hti;jhaT2Jq{$i7e zqbXtw$>$~QT>&sMaDF9=xid!~dntBisCN P&KxJaTto#rgs}Nyz=)_$ z#p$7wL;^c0v!;I1y$yvMmxg_-hz<$IqMV51in;{BaNHTRsPoZ+NZFnb1$s>Ygw7|h zdPiVqFUJmj!0!-K?jXcZXu!G2DRNFHayus_PHY0s>l6^=WJODfwFzy*0HjkzFL1Q7 zTvq{8kP^rC2-MwcX_gK0&WEEZv?07bHoYPM)cGyVu~~>TYKe#8g6}Hq!zSFPe22uW z^JEot>nO#tC)x%K(Ul!DOm*_T4a=xQ%5@dtDM)m+ah! 6r1>SP;bWIH 75i4s) z#qu_2m{-m%3_pQV21pq;$|+Ci3RV=xLUFv;ZP9Z$8-Mxj#o69(FOIHww uH9O?It{rp03EXvzKN5hFqA2>XcfR9%Ia4R=Yycb_ob%(f z7MZ5_z{o_mLM=YqXI}Kq6JK_wtXQYZVUc>kQ3xhsT@hO(c`f7QGw*F#E;jjCSVmAq z{uz`V^Uh*3&C%jG%5nRBUi4ufJM`&)w7+@~>i&1JO%-aE>*RE%)FIfv&C*7zJ`iG^ z41j|#vCilDo~WDZfr#kaFy;*#?TCo8_0Dhv6Oj^6G+x0@plgxkcplC9vYpo*M-;e> zhxTmJ(pvOT&S3-4ks(gl^ThVWiTMhOU!sZjOV}|wqI?(Q+F=n^{-(++G@I||I(QMN z&R6eeQFIV)X>P+ Xy~-f$0HnsV_ByHz&qce zC5;Y6atj9QSH5=$#p$|JI-#DY4Mq68E>rHj*s@#&o6s)gyab%u5oH^33>2|TO$YS3 zHeho{(2l~pv_{C1Y&QC!iEWd0R2;`mfy?z4bv*l(zJYQZ>r4QYo!{IR9frZ(gn Bcn)Vam| zC$h!y3n*W#cC1Gsq@Lqc_nal0)$vqCEMKUzP6WU{CFeJ_Mk6p$*W(&SuJ-ND*>f<# z3G soB0+K%rg5KB^7z zcKcfy99UBu+n!AcJq?IhDz}3nIT7Ws$@5~q_5*; >cBf-i20j= ur$de2(n5v3iEIo zc4UY|C ru#y4h2Uj(WRZx z&efH6th6Hev|Z(>ltiZ4)pg|}{DR@s`|mXT0>K>*++kYVTJ{BBk@0K$%rm7upzjV) zCl&UqU_KYOkK`e1Edc2JCQQOo>=1(hiTyl3Gn=xUgO#09ky ukb)wGSfXNlFkXXQ^CwLLiA@`Y~kpGzqqFbX>{IX`emJoC+cGF+^s< z^y$W2KOxGZ_%t@5ZPA8cqV}rmoTvz|I`fw5WV=@03f|{Dch1L+3WFey%u#U^O~N^H zC?k^RN)>&Jme99bnesh%E+(6IysPWqqt`Ow^S5)QjP1F$L*3RZy~*qHwhVd4F~f0a zSvkdDo{vm|{4dN>b7b6_Ej)4GVdnb#=a>jrhaG8bS`ZL%Q*5d*eD0MFv;F4H=fxE> z5$(%6oNR~CuZ<}ew2! gPt4>Wht>Z|i0kp#L+FA1HlzK5vs^1JDXpmN8na9ReUL1ptmdYUkTqlL4U4SM={= zj=%(dAMybi6gXXdg+T^+&%t)N-|X?uRL(idn0BNs`aOT!Z(s*Pf-$J;%ft3ueOq1{ zcezax00J(7{uJ!*#PXljv83ZKX%f}@46JV66jwfj@}pt)G1&Lfy5+G*zZ@etZQG|} z$Nh8x09~O+0NN2^zor79?EF4$W<;f8reHrd;h=P2>LmQx0Xoqg4mshm2|2E4LOJV9 zh%pNxKf>AXmTEORAU4r=p% wuI(=ndRD{yo)wEq(2-C zQAVft^R}+8t;biqH4kxpOF8VwsjbYR>3j;%FNx%BBJaw26lLePwitd*^(x##+0XNZ zwHGD+0)@KgtPsjE ?68G^pExWH5BT$2b)F5a|894aL>9y1UX>L1#W+u%lqys%sg9@H#e>9uI)s z&$}60dzar_jicsfb11^|hfp_W=r*3z{3?|?p|?Sy9X1JUAwmnh4dx3~9#7JAU#Mf3 zw3}ys_?2PpKR)v)mOYJ1{8+grwyamID?)@1PY5O=*l_H6mmoGELc8+5DYUL~-o|kv zC64ICm&Kap{UYDV1`_t&qXA%@ZxNYyqtvAS^L!3K2E 6&nPj2 z4~*l=Z8$$|DCZt`4%2fHB|LxIvd-57s8>gNTU<9|mu6-$`M1+|%+NjqhN126p=<+i z7qqvvUOnTOgO<5-V}COHVDxc4>^EZ{Y`<`x1t;fc(Sviav-SI+I`hKYi?#x%spGAk z>UKX1a{}JyA(Ho8>3Somr*_CMM$(r~R)iOUQWqTi?{;iI4$j9>zt!|Li_%4=4(FSw zVn5GExkMk1of5H5S0R|#Xm%^aaRll;1-W!_YIu<&{J>~{nfBGgXQRn+s5jz;x6E># zPrUJF`rl|^8v3wbs0VDnPM|X-I2K< d_Q8#-(mhb;6Lfx4Tic;H zaNdGQEWFI2=SjjJ2`DV5s1Bhm5%85kW?-{rZCw@)jQg8?Cl>EE8e!zrndZ2uvrN<+ z_Z_%Fya)RK1co5(iC|;<74y<~I-i44S9Bt`a}sck+VeU@=R}SIQj*(gUFpkl4aY(y z;1b8FsGW#4?Y;mAoljI++YXE3_$G8TsNAs#6w$fETBaf`*wk{))^gj{;&h)S(YwNX zJA`vvKZ)xu@nx*~IL?}}3O)n%LR7jF`6)<0Wc#sp(w@^r3c4MOBIhB{LnrA+vV`c4 zCr3N#RFo5Ox|Ef;(2h{MP*-95WvHE=YDjcT0Bi>5^G1)7HTN}9OWOzn+>gjh4A1 zrIhfxisxJqWM(UqMdx6}?@(Kk^Xx}H{cC`D;zTp*y4gJbZP$`iCW7M2rQ=a=s5p#9 zOl|vCs0W;PmT-P7-cB3=>FkjF)3-1 h@%ma}Di4i0(L4!M%NSC06_{ YX8 z%dy8vQzgZY9-Kwdb;zERWs!W3FrPp;bQ%2;qAL$wgoV^yU4hy-LdrmplQNrFIJ;2S zv51fo&PsVaavRCK>X3p>SAvb&u2ukq&Tp=?q0x+A)byX{vx9Kb*t-l+Icy|PJ7*i( z=>#*e?Qu1^t8rttLv49i&`)p)`(ou2BZusC66)|!{~2kA^$X)*d$MWRZ)nGIDFdNp z0$1kkKuJ3+k~ZxarHn#b2B5Rkenq6`oYQ(_LtE-BwDV%^#FmY^G!#E()}slyRStmA z`4;KXSoxFD$EFg+K}X@>$f {s9IgSXOOfJ`L@QSVH zAgn|VQm!i!=!Dk;UIa?W5vr4r#OdBvtk5rCJSjn)&O~ijIsh6te-u{!B%Dw4uV{w? z8_kCUP+LW~I;70;%25cJ@GN`KWYxz>318=7kR=wp=mYk|N&Z5V_m{S%B -irsT;vf{E5GN^# v(PfUX{aQlbDO4LNvu1fcZk!&>feivF$jhAS+v!rU(fL^60BGQR-s)YBto$Nj z-muG)Wa>H!2UxcAIyTgaoO43X@-LfO`Veh&LdrlZ{|5dOEGtfo9g7G#%|imaxyX;n zvgAX^9|-D p$4MdS5){}nI+F _T!%xbtgsOJ*wQ_Ybg6sH z8F1bXAy}}Ly2VGu~Ri_-o+4ecJ}wcAP#& zjic;sP`9N?a$QSH^*NkTme$+T nt|_;*nRloG}{= z>=*TG>3;~08#kf0|B7}QzVR@RjXF~~-5GMCE02xmypurSY!7E$i2xYy?GewvI{%AO zsQBC^cWm0++Vlj< L#9@munp>_G76fs9=MisDP5NWm>P0Ja!6 z-Q{@iRsU3_Qkjln*as m-+Q&7= z4qt+O{5FQQG#n%T{2WlYpPU29yE*B~jyjRgjkV`(XwD(;>{Q2JK?uoXqtY+{;*k^0 z%l~{* ukwW+!d=9fRz zuu2F!>r%R~AuJ#4Y-YB`ir@dyZ;g;Lg2A-cgyOC0+D4M_Mb#{6 Ily{{yYUzdC{GS9@MdA7zH^S zvbUyL?Zh;#F80?5*qwG<-~awQoi7Nx3&XGZDQ+oR T=yf9h-1Yh{A276a2}BUjx$%VJ-KmF-zdtKGKLo zr*8&f&Kd^5mZ!U0zldLCPq-5wx5Vm!zVic?JSGM@2jm9rQyPa8!&L4dSQeRoMkYNC zm8aKUU0^DkZfI>F)E~Vrcf`tI_%+i_b7X(00h6;69Q_frx*57{hWtH?vj;JPzdrxc zpUf5?*vU^OQx1&$Ja=bt+O>D|ZynU~FYIp%4QQgy xXT`FovSUhMhJpvYeY!qK=0v;pJoDCGd)Bi~A711HUvZV*SUuOizfL^nV>cd4vqjDmUY zC<}COYR7!B%uWuH-(b~`hW 5B=q%6%oSWWW!Oa>3$)O_lj%YQ-iKd+o=z5wT^9kqU_ zcWmFJFMo|}3Z|1E`s{@^{l~} r z&)cetG|&mFmoD-=Z-wBeRpFd?TS+4>To1KlS$F~7DFDJFLY76FyKJ|Ct;+x@Ubk2J z+O_3!k%^NM dH0 zqPu*khf?B+kRx=AZceON?zi;?|1>HDc}ble`Az{)2;(UKt-0<72cr|C2qw9K)15$< zGAQ_~K=#9lY#PRTR+Lr-G*>gzgka!LuryT?)2F3k_M1Gz>_2IyIq*_Q-yLxX%=X41 zc1pEc c~>OPCE;yC&A zQc7|=5$X^g0jP*AjQ}^NOR}W?gQ))|h7u3lM4T;l+yGJ+Sk4h3!*yf#gFQ$$a1wXS z?wpHYv9RS7mWd82PlA-o4oCdx_JV42{0M0NxFX*U-3=w%LbgMGZ^&qLcP-N2!TJ0y z;YpZ;U69I;Feq&M!LtWQ*e|+!2abM`&Ssg2E8`ay6=_v|^EcKq3c;ih1S;52q%SE! zD*Kk((r0QXw%8#Sd7T@pU)b@^!at{IK*~|E)@Mjy%a)88bI6zm7lEfvcegpbmo*0< z|36mien|9T!wVGV?FEXxP%2#PXdWVY$EhuKrtarc_<_$76!Al!RLUb$g^nxvs1>I2 zpN6wOD;6%C94~q4!?mxx?dOp+N)9nu^hT1zL0tw!W^OrQxEXWf9Mjrt?m$2MxjT6r zOt4>n1&>YGFGVhP0rKUt@K(~7(bl(Tb&O*g?%l_pxbI=|AIo1iZ??VqXStKF{>Nch zI5r44?*()uOI?l;UHhxc_6Q0QZK+%jc#(i3nE1!a4$MO5VRrzE21Dm}?uS6<#aurG zyWHckUtO%62hFoBFVs78Z==U)Q5L^ZtJ|rQ6$@FoWT7~pNK!Kx^ZXwu %|sHUd!n5f}Jt<*E;HFzxu#qZ%)AN=+$%Qn3MJ$X8VB9_O)L<#%4S^ z1;88E9c!&2m8EaLOiBuR7=9 >(cF^nx995zn~` %m;KKivE$sl@sM?X;r&UMday8ytW^6APSCplC5;|I zaYx*a &TVfuBid8*<`QTuW8Dtt{oB53AO0MF!>p#bn( ZvrRsTc1~XK$m373&IWKko!xh@UHtyN)rIqkh5 RS)b z|37kE@pN|U9y^OY@$MsCJD+G60I&V%IMa>>D3#`>1?co@SJZQG17?yty)-$ {) zSsRfOM>OI^+@YAK5bAnprU1_(;c7lQUc7W+9rtylc{ota9yikEEPgcl@MmE^1*avx zWZHGVs=JQ4pUc`8DT7W}JFqzCBRT!u-_C!WJXbuO-MqVXeuBmq{bt$DCmMbjL<~7? znrY>|15nS**44=HL!r%t=pnE-y;UjR>J)Dc8MQJr=Alr}%Zs->o${`(=*UplGRMD+ zHXnp 1g^u^h+lR<$jo5ukSA zn5~_;4|g5j`OUlSEY6R1!OC}bE9!ir%K%Ue-ej0rlw|dK{hiy {-p)4nmd=&GE;3UyiRBS>&)S1 z-UNH4PmH)`7FKTK>6=}7y^i*N=eo(qBAOi^g{6ftVH4Uh$;+h9{Yb`l{BgcGzY6Em z+1buJQx)6#N;seB@)V%psi29^9Dyv3Hmk-Nzhi%h5IqQ)T5RNSiL5>J@l{)wXEE}@ zVbOBj0DN~q^Y#$y${>8u>3sJN_G&C_Z!5nsTZ?MuS6#d&KH} +NV>?H@_` z?c(F6&gRq9yU^#M?1rZr_RFTj!#|(6GW9yg=?0+t&5hg7`{1cFqsQj|Q4Fx+&13UT zeJ6L=r_5hD=M&2f0AjOK^2ft4|6ml$^LAeC_9)!E$ 6%Um52U zoTKI9m8 q{!URyo4BT9!%&nu_4w6nI^up~?N zf9RX`9mCu%Gy7aze9!Q(@6R#=21Y}0T`(Etd@taPCKG=jW7)k5=hI=pr&0Y{RNsV3 z*d8Hca-5DYx3NM5`~%2-Rh@r6R{Xc%{G}hUSNlB0(fP#6I-gjfBY 1yjvsY9#7omI~NRzdV_<_^Yke478jFE3GZ!7(xaoUK0w0+xC6NRMaX(K7^e7)#_ zEX_`s{N&?*0d3BO(=UEvzB%i|AJuX*2|BT=UvgQg03b?1@F8sZjNr4P_Yh>VfG_}L zBI&?@6K672-KF?L-UW SJXQd}RZOPSOS#?qj!O|$!PSu*DGC;!AFt~nddr?b!4{-aXPW5oBK z`V%v&^$n+$4gjJM1jc+2d%+)n=1;Hn82scQ&(uy}=X-vy2X$;2CY_vfNP~K>V@~(4 zrRI;ddWRX%ry2HG(kA<2REfsJWJd%*AFU(e+Vc)oj;WId{UD!@rBDt|^2W?dliKlD zeECbygEHf9pDE5h{X=%;6PJ&|?I;|-x?gW&pDT?QuPpo;*Rz Qx~o% zL|z~Ew4r#;>cD;VdTq2i|7*9+GT%F5xH @#@pS%)H_h^G_k{C_)eZonbWQLQM$P{WuSbGFCxjE2Pk!zsf=PMuDFk)@ECFa_ z=XJ*sjrdSkXxk#twTL=>7xK8pgL!s;k|blVA3Z{D^|<2c?Bj2k30t<6nQM>j8Rrw- z5&%Rg2wuh>@`Li gz(x%C{oL&mUFfR&gKc`ec#kA?d@15 zdcZjvD?dH$hoeWx%N!@(G*g`Yl^? TYh3r&>)GiyoG{`E+Ks`A zr?Zd!Ay+ 7ndK)ce3zhGfjP1caCtkic@Pje@1(?ulMqCr z2hL=|DG%*jQLa0JV^G~ut`9dB$6HQ>Z}QB`lI#pz-N}=juS}gO&OZ7&=X}VGV|w2C zM7IY3;e&vC9h(<0oBSO0e&MFh6Eov(cI z#F}tE(PIHXl!Ab_IAbCAkm@#Y;+*3+Wp*NQ4t5-&ldE&eL>xvQ8L7ttrnGYk6YF%^ zS=|-+_Ecv^?bx1Bw86&pI}hp^NtQdG>By_>%4a)k+WEw4KL}b8_=iPUalrPFD hIIe?1TK!5_*Ki* z$J7=%&I*y+L0C>HaYQ4&z&Txx2qg}f2l^CsK36=QKkUjGV#g!I+HyXzMgoB7A_(pl zts5W{j*U!eL3ihD5`dIBy=X`2bk5F&T!|+_-HYcleyVrk?9=Rh{^3)mi?jKo6ttn` ztkdkgtPSTAYb*eWQV{$FdwnYM{JvecAfI?AmX>_O)s8t2b!(Fcj4yL}mJ>|WR&{R= zaYurClX`8;oUa`zpXby0boS>jw=17@*S7PCH5vef20>O&(0lw$mZT>`?Y3J)Izv-+ zh<9qhi8FBm);v>!iHPIGnNpH-BG6e+uJlzGE8*|0*J@*aK7Q15)W2|rb^gKMn<4G7 z-kqnfediNvJOGF=2%>8IEK X%%cNF2@$Pf1^AEy`r?dB;lwa`u zV*I+}d}6Hy01*ZO4#$5>YjqNj3b~pP2LYkuLY)T8%ZjEro*co%AKq2SyS%g`mZE1_ zn%z^c)ld56H%7_#^FMd#baD26m)Kii2Fd?(|F7Y?;(TJQ1^}T!K;XXpg{)TRJ<;zi zvwEPTB!%RG;8rVdz&$5ff!7@;5^#j);YV<6dTx>?W9OcKq`b* fFW|uNhAk}xk*QI z%6;b@Ay@nR!Rd7Nr@v#Jk3Vzox$CC$iFG0Xh(Zv=(MvcIFbG!rbU+74icEeKfY{aR zog|{V;|R+KrvlH(!k$-8({T?>ID*eLWX03j|9%miPaE_xZyk0%vCaelQ92U5l-1>Q zz@L6wEzt3VbDWdX`5mGzLbg~|=4_MmvU>KlhranG`9JGE4X4xDpZb _hH9f8BOI zu}%d5Q3wJPy_nXLFCioUP2B3BD`(14AuLw`N4KfYV?BX{pXbj_vgC|kUpP`8?{dY{ z*`Ju`Rz5Zl_5$Y<>s$a3#S268LYgFepMc+yTV<$YRD`291Dyz+E@ElPGYH_%d$TMV z|C HZi}NzMmyl4g82!KE`zt@tH9G^!xhyaV|d+c17gwLFUZIE*dE-f6oci%x@=- zG`pQYP1 _uQBynH3^2p!V&sWeGXM*P~3 z*;WC1;U}UTNXupXpTbX8=kJIWPv`IO_56abw>zKcRRKVRL6BsIpSmFkGJa2bk&vqZ zI@AY)F$)m{rzBZ+78W>vEE_BS4srH&XW9QvjkZr*V#m>&olo?tQ$Psb9n>-OXklXF z0o7Jq#O;J|J{QavP%KC26#)(9T+Uw!iOd~oQlFHi(UWa$l^QP$iKixyG~1qWhdVuF zI6Xwd^>*hIy*2=d4}A4@!vLsk&}1U|qGH-i7VVNn*^zJ+KX{iPYFZASN8LG*Nq!tP zRi1g_ 9s )I zzb|QO*|>E_Q;qimxm}h;L$J3k2#h5-f4>IHCvgq&a9XQ9)7;crOKNW?Eqw=?=U;x( zY_r9O#n}nG&Vv90fII`^ub12N{`!Jm9{`FiPsRB;4*>JZl&8$*CvR^IRx;1*2mtOa zT`CuFMEk _n^WO_tZv)_ctQdOTbAb2J my?8$W-s5;b0N&Fu=KljWh15#Q(Eh6c0000 zCg36_1`@-CVD8Q38iG@)BvpaLl?RCvii9GMqAt0qU;=S$hd43V*Rd>PCk7cT1d=R2 z^uT(owCmOCvG3X0dG_PvkKVCnrn{$SW>*?n+rO$Qt-8;A=j%CNpZ?BwzH?g8U>^SI znfuJV`KOlSbUC)8sG62BH0=f1Wc|-iZCO3hX#J|;p?zoXvCRCJZOdNf*p8yAYEIRZ zmzvs~dp>d9nhTBAuM(n>l|O!D ^B_K{#s%psXDe@a!ys1oZh5t|I|&ZUu}?jp(u^2_&bNk?gH@_s;Y{4Z7rVjmSwky zd}dDrRI8fDkBsdQQvRK)DQesN7DU 6%(A;N+Equx3_uF`$A!OjLq|7sPZ`s+ zmVRr`nU7pn#cD$SA=AI1rfKML%~Qg*toDcY4gB`y)~s3@VgUbsWT+MRx#DAn;r;Od zP^?c}29;{&0Vx%bw-+BXbi=o-Z8~>f7NzQ-F+G54bW-Mj2*qC&>9FK-s8lOAygJba zB367%r~xjOWYOi&sU8|)0BYXrd 7ID03%)f?;p=(x@x%wB@V 2mytXNY@bOb5p|+S)J}=9(MFkf@uriu5catE z`P`s&I`?y*|KyCS2t1ST`3DeJT-Q4n5gHh49h9 }eA*_UWO!hobmtW>F0D0R3aRgtiOUZ~!iZCQvr`P|IIpXGm z%-8FY>Foj9(suyM>Jb)k=}|iz-{UeZK3tDH? KUxGCxut$}WfkS?=8vKPa zWEyfuOUo-w5^be}sCp1PGwcz8H6p;d7|+SK)^H6u?=^_HL|^G3yi*_*5pfW@M4F|s zB_~Upy#DiD;`P5CszsjnCzPzJO{HL*w7?qlb~5T@-doo3w>mv#B6Fq3?3@5iL0{>A zH_Rq72j&^YGxAj}6X8gta 93EPwLI4#a{^0I+~<0Y2m_>9t|(Z#cqj0DEwcQa zz kz~m+%d&mTb{;=plk8bX;v4o*Y@60MM@x=bmgOsAQSY$7=z6aq zp!1Q4rL~H>q@iG?)g8xrYLSxeU9VmIuOrFl%5D)rld$3G*F49SCW*G>@>qa~gSJ@u z{^;GiF6MbiN0Q5y- as6xCNa=qtR(H=X wpy>>0h$rRElGfE-Y{*#w!UpsYq z6s?1XO$I5J#g2daH|8HcM&2y#I^)vej^}o>?$sj=(yls$<8aHPPttYZ2v)xI?vF{y z?YsAI{Z9@wNW1E|On$UKs%i1QfBpZwtF?uJ4Qt6XH?!o;L6-E-D7<}HQ5>6FpV-OG z&2iqmb{(nK7P #X^qD+W6udKPA$SbH=yBcve5P+At`zdU3UboB*ht2l zv$e{K9szTl$N=UzkpawcA_JJ?L w>=M5irMz3}B8E8NeJTGJrWw zWB_xV$N=Uz4P6&t+YY&W>8c=AQ;6x+t7SWqT&{FXq^b(Bpq)p3a2!c?hBA;6kt$op zrYgv$n16YH5oEHZE2kAj5RcWkhP(zEW&qFcJ<5~+^$KR$s$d}mTQ;uZvmbpos#1A> z#UC9!!DGAjlQX@mayPGA&ToGFHgv7>I{pKP`*`R-_IeBeU|n|?zjMzogf@VB@C{=B z_c6p&+H=lXyMpW=-HY_u5WAS;eHZwL$6sV}%DWbFdDnb?`<`E5;r!VT&otx_kj fGU}lr29Qi=12=>yFgcZ}cs`di0~^1< zM2HNxp319_6UlHHB9W|oe!TMes`N;O>roGp6FA3-3}B8E8NeK;AqJqS;X7>UA!Srm z!MkC5DTZD}Jt3n6U8~|J3K_P_Du%V1TDhL8^r(Y|7{G$IX4bCg3_RZyH`utg@_t7# zLu1o5%LC6Fy2^Fyg3lM&vN3p5G*wl&VZ+K$8P-jkgHI|7_RX6@Wo&&%upUCdjn~$^ z=%*??_t2Cn{}XucC8@25T;5{e;XbCycHNHY8rQF1!J-ANp)yR%X8)l+kB6*lZsRXr z*cK|ob|eQ5_c1n^DmkvI3Y*q0V|my7@QaZWZSNt(&{*klRl(l07H3VkAxa6a9UI`> zNTTGpA_Uj0>SFE6i#N>ily5!&OJe-*jcwwe!xg?r!wevzerD4EA}4T;6B)o9Co+IJ zPGkUcoX7y?IFSL&aUuhl ((vjGauOznxWKxc9d^Ev4?Xb6D1os>6*%Q>sN5^ue>W%#<`IM-}ugt7&t$UEE1xs z3h!9ElwZGl2TgJRcN5QqntOmmGQ;D~z3gdxaHD(wx%Vi&1OEHt7ZBMzv9CYrZG3>d ziT1)i)K`vGl;Jp%hyG))?>xF`+3Y)Xn*B%mD#`$Oc&E4V!A)0t^^F1cRFM$!=+2*V zc6h?GdzWe196Z|3i~Em<%6RPA{k(Z@tfcV^dK@}F$a7apLdZli?NPFv@kFZPc_yd8 z_J2V{0Wn(n<&xQ)8JNjaU@YOErBlp!NSUzn02jt4E1w^!d>&wEv~tqO`O$D0^$__0 zbDS$;xA3c#Ce38ivMldfaRTGq&k(r_sA2*kO>i7AZJbFHX>{=E%?3X{ZLs(JV)EAI zYnI3WW|?&hN4ah7FxM{`VWEBwQFt-X5Fk|O+yqQJb6N&vWB?`yxZV+5-wpTmKvrv} zH?@$*PhP{Z@kN(Z- Mq-hwZp4fK~~ufGHs(AR~yIX*L;YHoap2Q;+l7)M{R~!}AjAp=KYTtD}w1 z1;H;CYl<6Ovnn{*13-4P;jCH`Tp*@nZ(37PM$FJy*WDF(-kr}6e~DJ5q!A$mo39Ce zho&&cFa{swOFJHCN7qZGjbAG|&?ceNffo7JM7?fi*%td5pPlzr;z$1ytl544P+j=| ziDZU7ul9O|f`*}S)8?M45-~(FjrRThh-B%AK^i*tE!W|!tY9G1WOF7jy>il%x~*$& zCQtXWg`qNXrp2CDPI|n3RaMx$ZaLSi^f6{>qmS-HKmQ2At|49ftw+E#RtCmS_?NYT zDFNBCCel>St@;?p7X7N{D^WtoWkAWECf5H~DB1qnzg&v}6vzpf6rT4a=2{l<%DOL; zH5R{hEJ_Hu#AstL&~)N+^)-II#3U?~V3ax(vD64RANqBcj@R^}P!Ev-RD-mL4StQ- zz~6#X^LD&5N0G2VLQ|;`2-{)9$*-~D+~3zPdZxNv^~gNUXTOL>A1E`7#oH35GBA>a zu@p?^-DiEZv`N=NET*}IrEUFe8~W3_REm6nN=S?5vwx0IrbEt79>z|&|5k&E`wTY) zSQ1PH@~ZpEXkbm>f0_d^2U<<&u%J2QwYX^kNdYY_(9;ddw4BkQ*Tt4^-B8OVMg|aw zB!1>AsA}1qgq?%&Q{V*5LrB~P%82m0JFh@WhqO@|Gl<#HnTM{tPYX?B&V!{rP`rfR zabV!&x5bVp?g^>+Euu$20Q%5(QAd9WQ|C%gs4?hR>wO$Z++o|W;{IDr*KRnlAO}mP zpry#5aw?o@g4gH41)seM^cGmwUDo`rm|P{uA 88?KVE$?lMNQ{O= je%SbuGP809{OOQo-52T0PAH3z_m>b1_ z1*>7;BqV3)Eo+AD8o_wn^$`kWG&tG{Yb>~CO=+TxENc7$w$L!-i$L&tv%+Q6s$(*h z< 838YpSKhM&X3Ms;}=jQEX+V_nWO0l z=+)rFP>~K25~soT$tB3MQhxszzYtnot@@26QrIE8dkl|NPHsp{rG2-DDUlJft41bk zlFC#blZVMDN6DT>AKe*Tpx6io2Vrb1xNH!*21^#h!iAMn-sb1LMj!?BW?dsFG=6@{ zolx?7*JED!g8ad46&E*NxzoY3aASoeE_pD{J&f<$n2JeVfYB*P)VXC#PY=Z7(-rD) z?tF0B`8lu!WXc@D-VDf7Fn@X;MZw+PyL_I=7CN%!>%hl?s)(GxX_V|~)XDwf1#{Hj z_^NWT@d28v*!8O;2YOjtKmw=L(utyG=|5!5iM! K1^r7z(+U+>NWSu`* zJPu3Crl;cubS;KTn^cJD5kh(6Is#5N7nQ>kDxTI^MW+8INPNv#qbT8DQ9_a^6cH{X zED@s`?>=nTjRL|>qb2r)7o76W%2mbUF1ThbELc!_Tv1_hC#+i!^MZ3MFznJeL4mYZ z8YgJ>76HH#|076r%?7Y!Q5y@|f@*Syf@_vnPGjn5Z>FmwIA=gp71pf^PWAwZ$8>rs z%=Zf+*wC{$@O&|9;)mhkT?_Brd^Idt3|(E79X?Hk?p4rQVN;BGIe$m*eEed^rAp9z z%9zZTFMRObequdZjpgJ)Lt#s>Ca!n=;(_C2GNo2&7#iDeSVQ;H@E4DcPp0|7zGI}) zrJlU5t8Clc ~Yv`zu?f8^2e|x_;Aw6UQMaMQtJuQ$CTwZY!yf~u!bXh_Frw5xGU@3q?b>rW7&rr&X(zJ19abzWHH5S0U^F0( zVkvOm$8n6?uxWY-U;<-49lOquxMQcMOZ1e?IfSo-xQbBIZ&Yr4aA)*tZG54WcIk3D zR-Y*vK_n91VPIQ@bUMue-DjAZRUusn72`h|u<4WswtAl39s?LRnL%db+YcpOc?lXo z?XP4846XFJpU${FKsghWWix>xIS0)F+vAQGJsSM>wssIqE%`wCVUGb!+9W3{Z^3(2 zp=2v>N)5R4`L$AQkKx#mFER`(B8N(9aY zjOD>}U`;a^S8=>hw6+5k9Ix?7sMjqT8ZI3L#N)7j9pv-wCzp2}!Bog<>T(nZY@b$c z>W0?o>>|HWbS~pr1ygY{C~3i=By<|kVL*!-oT2o#MT=4Kszi;AQ%pJy!^6;7)*6Q4 zep-Qr9j*ZkoB^})a`(3gx*;76v?lj&KSxm7p6 qB&P2G`Tl;wE~WJXO6B_z^n&=?zEv89<;HB7uB84$&2jLq(IWV(uf9p$jmX zfJKX7UJGbGx2LANK0 7DELenapQlFx>yaMh5T7$#;_a0EkQL{*c` z!kOtIr%>GSen*G<2q@6h B9IrR) zk+fsJ7zh43T#KuNj2^O;yGDIJf}+6c9(M|O$ztdXm?0f0i~AQRjQEiccqA3a2b=(f z1xGw;`jwlvh`#`KSJvd}Ag!+mFI3Na8+E;OBaEP_Ub`${6y|f}1D^9OMLkteFi~-S z>N(_BZkrIM9pfXwi ZIE0>kt;f4Xr z%Yt*2f XY!}?~JO1TEn+EQu|Qo`tXu)MV9 zriPcZph&SG9d-Gd-{Gp#!tYup(!f*GpQ{de;Lbk=f(-!N6}v$WSP pLqmD!qTGe1Pxmi`JnINfZ}rtg+~aR^NRs`9gl+kf$C!Y!^7So zVKGyN|M n-eG5|o_xT_!J4?_#K)nNdR4X69uF@N6Y?oOxS zRG%9%4#HL-=`)qAIk2iImmnx-QFnF+iH;1QfZ%UK%V>Ca=%@xMU4P(YZ|U(&26|6H zDkSbU5%Z4i1<;)-%@j@t7=RJ`tsv2n0Tj6L*_|LmQiE{~AYSL}kz <#mDJ zdi@EXu79Bd?_33HQH07b6(xwldkSKajfOpyof+zEJ+Cjl^8p?$R*xUnqg>n|Pa z&n8(7M&sUL-vR}0TIt@pb`B;^!KCGH08R1<@t$Yyu2fCb19*_XLs?D)P}=z5?q$5X z8)BE>C!8{1q{-X(T@Gwtd9l^h7__f}yq|+e29XNgD=0F6GQ_rLdx76AIjFZldyjW# zj^vxrZn^98X9GvTSd;7Y6{AS#NyEydce@%b=B_@{%O)&h^4G-eyF(|lqenmha{rx= zAo!&3o;<~yGZe6Zq*8mdus~XaM9e$Y+n$G>Y-y@@b0@Txg^*3t9Z{GjG|6v@_dN6I zYO0M4AOLyfwpQ%L2Waov;JNe58^4&maM$NmYX}(~CJlEF!2&|UJQJ4Zg7*xJEr#~8 zm0tNg4D=omw?9?kefFh922cTc>NhqZ;;*4j=W>TNela%g&@6{LJ6E`Y<@AJ3Msq)f z@x3CU$%Zz|-5)S$aR<0YHX&e9r<-d~AUT<)xoe?V{Xo@uOpyVEAW!_SEock(q8PEN z8{Z=Y*B~+)*bCi!dx6{Na>BjKV@`D*Sq_*eD%d$~1XGh4a_MDa%R@EI+(rga1@dQ~ zS&upSB>Ch!W+bSd?c$5c3U`@$Ig92Gq9)dhZBN&{us0e7RDsy|jpL{nZbrz*8m2_b zr||_4lTV48A6-#T<3nTsRU K;1VGZytf^pzZ)rT05&37k5rej_}Zli)t!9Kq$K@)7DA>_IERoYP{gy$ jJNK~I_VQ)ftLeW1qqSGQ947b-00000NkvXXu0mjfGtS;^ literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/32/buysubscription.png b/public/plugin/BuyCourses/resources/img/32/buysubscription.png new file mode 100644 index 0000000000000000000000000000000000000000..359169ef617a13a8bae29a3f6340a407c6d2caf7 GIT binary patch literal 1263 zcmV wKexM1hP7#F&6XJX<;UF!ljhK*5IL=pvcV~C){L{SI^lwla!MwmxG>T&D1 zD7vS+r>DCI#y{!gR@b@z`R}>^sk$X}!J&8098lpHAl>5HQHv~d)d+x`?@b+lXV14Q z#hMSUYHq->2SmgJh!uZ2VrPPSbLVEZ&Ha9(CAs70FzZH_5veNi?Q3Xa$$Bme)tCfj z%adb=Kbo vS(Zmgn_om64c( X1q{lySeS5dV_PyL=?aZaDn#~1 zoFqAL9GfH=0N0@^B8e;O1My^?W8A!#^|Im$W#r D`XxMhc9wE21|XmFnA$aVSHjxS5b$T9 zlx*sQI1wh=w*S;mvn*Cq0mFHpsa<1~1NiXk2zzH<9h*iRrgpoH>v96W){@5ccvDpy z0_H9JoARTojC-whdwS~#3zf9BhVniDgBf`11&_EjKfVLgO@D@oHn;)SJE<941dMuM zB>gwk<&FRH#)lrN%fre;VZPrJF$+N>##jJBS9i_s!W~4ObH`Zts{T7;Ujj ziddJIAHbU7#<)849C3Xk)#5E)#CqdI16zA0ZQ>8j{aH?zYD^}QZbt|njy#?RXFzxs zc(D^nG_akZu=G-@4NrDXCcNi6oNUaqWW DEheXuGMHp5>`4VhUeVS);7SfMsFfho-( zwF+0C*hk{@_Cr@!sV?_NC%9n+fb9G%CJAtF6`8nxzMdhtYXQyxpQ^+2xzd$aH~jGV z)xxD8zv!w&6*3tRVYGN z4Dtivk-@5>%r;}TdB&h)7o$n{S zw*V8JgYFNL76i5Q6T|mDTN45D)V?C{cHaVO)zqtH|Kl|g03bUj-$&&L5cLeMR>02| zW&i$LYbF3dcJ2KHIMg-BT8LvX=1jl5t2`0e?#60-8*2Ig5s>I2NVwwtxGumgt{BsX Z{{XFxsll@FFLnR`002ovPDHLkV1faFN3H+> literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/32/buysubscriptions.png b/public/plugin/BuyCourses/resources/img/32/buysubscriptions.png new file mode 100644 index 0000000000000000000000000000000000000000..359169ef617a13a8bae29a3f6340a407c6d2caf7 GIT binary patch literal 1263 zcmV wKexM1hP7#F&6XJX<;UF!ljhK*5IL=pvcV~C){L{SI^lwla!MwmxG>T&D1 zD7vS+r>DCI#y{!gR@b@z`R}>^sk$X}!J&8098lpHAl>5HQHv~d)d+x`?@b+lXV14Q z#hMSUYHq->2SmgJh!uZ2VrPPSbLVEZ&Ha9(CAs70FzZH_5veNi?Q3Xa$$Bme)tCfj z%adb=Kbo vS(Zmgn_om64c( X1q{lySeS5dV_PyL=?aZaDn#~1 zoFqAL9GfH=0N0@^B8e;O1My^?W8A!#^|Im$W#r D`XxMhc9wE21|XmFnA$aVSHjxS5b$T9 zlx*sQI1wh=w*S;mvn*Cq0mFHpsa<1~1NiXk2zzH<9h*iRrgpoH>v96W){@5ccvDpy z0_H9JoARTojC-whdwS~#3zf9BhVniDgBf`11&_EjKfVLgO@D@oHn;)SJE<941dMuM zB>gwk<&FRH#)lrN%fre;VZPrJF$+N>##jJBS9i_s!W~4ObH`Zts{T7;Ujj ziddJIAHbU7#<)849C3Xk)#5E)#CqdI16zA0ZQ>8j{aH?zYD^}QZbt|njy#?RXFzxs zc(D^nG_akZu=G-@4NrDXCcNi6oNUaqWW DEheXuGMHp5>`4VhUeVS);7SfMsFfho-( zwF+0C*hk{@_Cr@!sV?_NC%9n+fb9G%CJAtF6`8nxzMdhtYXQyxpQ^+2xzd$aH~jGV z)xxD8zv!w&6*3tRVYGN z4Dtivk-@5>%r;}TdB&h)7o$n{S zw*V8JgYFNL76i5Q6T|mDTN45D)V?C{cHaVO)zqtH|Kl|g03bUj-$&&L5cLeMR>02| zW&i$LYbF3dcJ2KHIMg-BT8LvX=1jl5t2`0e?#60-8*2Ig5s>I2NVwwtxGumgt{BsX Z{{XFxsll@FFLnR`002ovPDHLkV1faFN3H+> literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/32/discount.png b/public/plugin/BuyCourses/resources/img/32/discount.png new file mode 100644 index 0000000000000000000000000000000000000000..ec27b0093be29408d5eff2073e658c72be3e1c63 GIT binary patch literal 4181 zcmV-b5UTHqP) 004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE @L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K |`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn (gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6q n9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6 EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4 z=0!`QmC#PmhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`h kG4N#KjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^ ^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=? zH;57x71R{;CfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV z4H2`e-B#~iJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOj zV`f+`tbMHKY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9 zk0dT6g(bBn MJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3 zsdQ;h>DV6MJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP z-cdbwfPG-_pyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1 z@Q#ce4LsV@Xw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy z`y}IJ%XeDeRku;v3frOf?Dm Pgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3 ze|F(q&bit1spqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bE zTE}(E>+O9OeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$ zcQ|r* xkvZnNio#z9&IX9*nWZ zp8u5o(}(f=r{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8 z{*wQ4;n(6<@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh; zdbp6hu<#rAg!B711SuW>000SaNLh0L04^c`04^c{s^Z;}000G$Nkl JQ%qgd2mhc|nwXdnOh{d%650n*Nfc80vk);@XhA@vP#$O+Q6pePB8gCgD2gJ5 zwB7DflD3OK;lUV{8Z}jk4<^1CG{nS*tp;K5z2kSz%-r2=OKE*Ge(CI-IdkTmZ|0nt zTk*e#H2t)(yFWcI5|(Yzuq=&+g@}ZNge*wr7Lp HGKlDUFjM)8o&-?9LNNSB0wNh zUqFcU`b22_rz7Ru_}$BXA%6~gogy|IOI5qR7;rribA2Upz7UYnlz?7%R;HfkV8c2) z=Ke-ssWrys)CoNKW@<4U48kdbYiAw;cmWA^o)6@SQOJ+OW){reA~Mz%eWh_bH3D@9 z`)KDw*iEb`nCZ1+a|$HW>3E`dbye+9 TI3CwNp;hZC|K6bO{sw;YXwls8fZEASY_oV-K zPR)n@4-ROHjG9dmk7>uG(|X;TK)^TxbGCQaxV}WrMJzZrG~|>5G?Pukp=61xWH-h= za5`JhYa44{7|gY`5fI@}j3NT%t=-k0lE``fss)ZPMu4Ma=PUUPc9tML9RCiv6J*x% zar@#@VIY ~d_XTHWMBIu*@CY_S?eh%LuVl_r7;2P^ivu!&nlkM zP)IEO{Ds6v#^jo4?@d1&4#`ga9BV)3TL6EM9dT~WqS_^7Yf>O@zz-`d=%(;-x%%k1 z20Zb~qL-4l7!&c>Yu&Q3vv0}j!>RtJw^Jj{@1*V}J?y`uwYn}$ZP+xxAFl6Zb^tH| z1S0}LIxMKFX)(X~Xt+w1;5Ab7a`N?u_azTW5&j-FAEO3pLGC`tchEWny@vwP`l9@6 ze=dr$lLG*pg4vsnNvEXrXNYrXTnL>C`l9JCUhsu0{@UT2FAqk;stq=wl87^m`O07& zdb8GrZOgVtR(xRG>l3(mq?xK>KgnaEQ<2{R-)k#-N MKajn$^2x9`1Ogmrq;m*WKZE<}}N`Nr>Ra(uA z*9}R>xgEoRgk@1c0^cCn^69R`H4APcT$cbL3lg!ah73X#)r3t2807HV^7WpT(+W Kd88v=e-K~z|U&6itjTt^wle{=Ti&E9qFU3=}dBgctzHz*=OEwofL zRcVD#=mSt96$uH^0#7`E;E~WGR0tR$@j{Cbaat50K}0kp!ic5{O;yp9IIxZrCr-1D zZ)@+a_rB*cXLva4wKuU{0%^tn>6|m) I6k$G>!6&-wN20kri771|SCzc*l8R(o&r^nLFZEND3Ue16|1 z$8mHV`IUFG2M_@2z&AIeiJzhvSUGs{(~m|HANpWxAy?wS$ul!OH 1ys)`FbZ@F#LOrUgJWk;0x^vBCnhpaP5Dm3~X}Y1D!M-xi0hlOxD8ipbnN;dpt? z 3tX zzYBn(r82w^6}VP{s-*mpsAyjLw(dz-EE|kY%#bU%=Z};QV>f1*o?oonyfd9<{AQ~D zE>amhm&OrQ6M#z9WOQPN^kQk%9P1Joeq)ruBg6dh><9qk$rL~O)t~v S8ls~uOuQE3cKm;9;Qc@Yfx)3+o<20h=)?>F z-jlD<{Mm2ed-*ir3htTj9_4#KKUMen`t!fxYtOw*q2zAw7mlCf=|e-jec3$`|Mrh- zeEB;=y!6VOs}g9?fMMDw1(qcN5QeK{YKpcjiQ^~?bGb{JmW^dgZ0UBweciJ>*?)~r z@jCjg79N#zeDo83lA?s<{yPXXXrNLxDOF6Ots%E%*b ^8%1wED`YQGza|v z6iQWW=@1E)@!$L*o>HO~SwM6E7XIb-fP%ng1EV{hukPvT4X#RH)f)W=5XLM`sl!mX z304Iv0t}!MfC><_q00u@3~il?^z?4=z=<)qO#^@U>qQ2KhM7ub0eJgzlEEXxoWFP- zfcb2JpB()Q$4>u!g_k0bJPgGt2=+i)gS-GkfNn#R33)FhLJ;bN)SRGboLlm4An?!e zDMqi)Fgu?I;GL-jMki*to}33@AzLJIZJLoQx9UFn;_GPTF)#{n;|46rBN&98+achC z)+%Tc-b#U|1QzY;)lYo`Y9h29e7XjofBeJDW%BIW5(nU8d$$p73$d*?2Edk$9enYL z2Z*#ZtswBK`%n>J*BZXp3w?c%&BB(=aCID74VVc*#tXUyws;2ku?~>2&|`ks-q*?Y zzRr5^SR_m=60X1deL4^A-P*AJTKTH`V614OUN2ZC%+7&rgQkH;g4cnZ7rHF4-TRUb zFj*m2l*ED_?iyP+#6iR%dlitiYLvk+Vb@N`WWjRpiFh2aHR#_BwhYt>I53aT?)ehN4Qm(xD2K;>I6`HRSB+YFrdWUT}T|^?e ADAB4*A7k-cv%#W zoO rxpNwrS^0000 T+ literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/32/subscriptionssettings.png b/public/plugin/BuyCourses/resources/img/32/subscriptionssettings.png new file mode 100644 index 0000000000000000000000000000000000000000..21f37ff019db9ff36684650041f37cb3beaa61a1 GIT binary patch literal 1680 zcmV;B25 K~z|U&6itjTt^wle{=Ti&E9qFU3=}dBgctzHz*=OEwofL zRcVD#=mSt96$uH^0#7`E;E~WGR0tR$@j{Cbaat50K}0kp!ic5{O;yp9IIxZrCr-1D zZ)@+a_rB*cXLva4wKuU{0%^tn>6|m) I6k$G>!6&-wN20kri771|SCzc*l8R(o&r^nLFZEND3Ue16|1 z$8mHV`IUFG2M_@2z&AIeiJzhvSUGs{(~m|HANpWxAy?wS$ul!OH 1ys)`FbZ@F#LOrUgJWk;0x^vBCnhpaP5Dm3~X}Y1D!M-xi0hlOxD8ipbnN;dpt? z 3tX zzYBn(r82w^6}VP{s-*mpsAyjLw(dz-EE|kY%#bU%=Z};QV>f1*o?oonyfd9<{AQ~D zE>amhm&OrQ6M#z9WOQPN^kQk%9P1Joeq)ruBg6dh><9qk$rL~O)t~v S8ls~uOuQE3cKm;9;Qc@Yfx)3+o<20h=)?>F z-jlD<{Mm2ed-*ir3htTj9_4#KKUMen`t!fxYtOw*q2zAw7mlCf=|e-jec3$`|Mrh- zeEB;=y!6VOs}g9?fMMDw1(qcN5QeK{YKpcjiQ^~?bGb{JmW^dgZ0UBweciJ>*?)~r z@jCjg79N#zeDo83lA?s<{yPXXXrNLxDOF6Ots%E%*b ^8%1wED`YQGza|v z6iQWW=@1E)@!$L*o>HO~SwM6E7XIb-fP%ng1EV{hukPvT4X#RH)f)W=5XLM`sl!mX z304Iv0t}!MfC><_q00u@3~il?^z?4=z=<)qO#^@U>qQ2KhM7ub0eJgzlEEXxoWFP- zfcb2JpB()Q$4>u!g_k0bJPgGt2=+i)gS-GkfNn#R33)FhLJ;bN)SRGboLlm4An?!e zDMqi)Fgu?I;GL-jMki*to}33@AzLJIZJLoQx9UFn;_GPTF)#{n;|46rBN&98+achC z)+%Tc-b#U|1QzY;)lYo`Y9h29e7XjofBeJDW%BIW5(nU8d$$p73$d*?2Edk$9enYL z2Z*#ZtswBK`%n>J*BZXp3w?c%&BB(=aCID74VVc*#tXUyws;2ku?~>2&|`ks-q*?Y zzRr5^SR_m=60X1deL4^A-P*AJTKTH`V614OUN2ZC%+7&rgQkH;g4cnZ7rHF4-TRUb zFj*m2l*ED_?iyP+#6iR%dlitiYLvk+Vb@N`WWjRpiFh2aHR#_BwhYt>I53aT?)ehN4Qm(xD2K;>I6`HRSB+YFrdWUT}T|^?e ADAB4*A7k-cv%#W zoO rxpNwrS^0000 T+ literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/42/buysubscriptions.png b/public/plugin/BuyCourses/resources/img/42/buysubscriptions.png new file mode 100644 index 0000000000000000000000000000000000000000..359169ef617a13a8bae29a3f6340a407c6d2caf7 GIT binary patch literal 1263 zcmV wKexM1hP7#F&6XJX<;UF!ljhK*5IL=pvcV~C){L{SI^lwla!MwmxG>T&D1 zD7vS+r>DCI#y{!gR@b@z`R}>^sk$X}!J&8098lpHAl>5HQHv~d)d+x`?@b+lXV14Q z#hMSUYHq->2SmgJh!uZ2VrPPSbLVEZ&Ha9(CAs70FzZH_5veNi?Q3Xa$$Bme)tCfj z%adb=Kbo vS(Zmgn_om64c( X1q{lySeS5dV_PyL=?aZaDn#~1 zoFqAL9GfH=0N0@^B8e;O1My^?W8A!#^|Im$W#r D`XxMhc9wE21|XmFnA$aVSHjxS5b$T9 zlx*sQI1wh=w*S;mvn*Cq0mFHpsa<1~1NiXk2zzH<9h*iRrgpoH>v96W){@5ccvDpy z0_H9JoARTojC-whdwS~#3zf9BhVniDgBf`11&_EjKfVLgO@D@oHn;)SJE<941dMuM zB>gwk<&FRH#)lrN%fre;VZPrJF$+N>##jJBS9i_s!W~4ObH`Zts{T7;Ujj ziddJIAHbU7#<)849C3Xk)#5E)#CqdI16zA0ZQ>8j{aH?zYD^}QZbt|njy#?RXFzxs zc(D^nG_akZu=G-@4NrDXCcNi6oNUaqWW DEheXuGMHp5>`4VhUeVS);7SfMsFfho-( zwF+0C*hk{@_Cr@!sV?_NC%9n+fb9G%CJAtF6`8nxzMdhtYXQyxpQ^+2xzd$aH~jGV z)xxD8zv!w&6*3tRVYGN z4Dtivk-@5>%r;}TdB&h)7o$n{S zw*V8JgYFNL76i5Q6T|mDTN45D)V?C{cHaVO)zqtH|Kl|g03bUj-$&&L5cLeMR>02| zW&i$LYbF3dcJ2KHIMg-BT8LvX=1jl5t2`0e?#60-8*2Ig5s>I2NVwwtxGumgt{BsX Z{{XFxsll@FFLnR`002ovPDHLkV1faFN3H+> literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/42/discount.png b/public/plugin/BuyCourses/resources/img/42/discount.png new file mode 100644 index 0000000000000000000000000000000000000000..9846e3eff2fe640c7d3902c0bea4c5d8db63ba30 GIT binary patch literal 5070 zcmV;<6EW 004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE @L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K |`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn (gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6q n9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6 EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4 z=0!`QmC#PmhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`h kG4N#KjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^ ^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=? zH;57x71R{;CfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV z4H2`e-B#~iJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOj zV`f+`tbMHKY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9 zk0dT6g(bBn MJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3 zsdQ;h>DV6MJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP z-cdbwfPG-_pyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1 z@Q#ce4LsV@Xw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy z`y}IJ%XeDeRku;v3frOf?Dm Pgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3 ze|F(q&bit1spqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bE zTE}(E>+O9OeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$ zcQ|r* xkvZnNio#z9&IX9*nWZ zp8u5o(}(f=r{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8 z{*wQ4;n(6<@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh; zdbp6hu<#rAg!B711SuW>000SaNLh0L04^c`04^c{s^Z;}000RINkl A!9p@tD>nb0)GR|q~)A>lNC})cF zpNy0_5$AQ`>Pu?9wQ?B|M}OGarSe*j$;Wza9P4XwB92Q=>C{mvaW1V}=mg!<)L&;$ ze*ll5^7iEFS;m{UG9r%N-O+t93vOcZIu_M9?40n<=3%hRIXtoTSXlPD>6m&Ziu5XN z%u`opoc&OaF8@WhhJmpav1-H78W!i%vp5dO=k*JF2fcIFd0z)%EZtPBl3b(@;#ke( z>X~o(r4+-%m&B-Q@IWz9vkFC%FC z_8)sRC30Af&fngt7eCN7u8^257@q+mw~$|u59UhOraSGkbvJg3@=fp-D1^Draiy3# zo%(3M {OPD+Xs$=EbmeKv)Wn2!vV6u(+`5S$+?!r#&?>=4;H|#ZaF(n*`lN zU4*G|e#xOZI(u`c{?^vc@fg_(YFRXA7Z1j*lbJT)GnVRp9LM*bE~@Qwr_Mh9@4hz= zqqBzb-k|3(3VhTrJv2vgtco4q&nK^Cu{dQaIAdec_u*8D&1`%sL;Uvk^_i1m^LtZo zQ>RWP|Ds<)p=8U3lS%y>)TzI2-5wIRnn2oV;dIU |z~?aA7HPdPF?t(1_t8Hl=<~%WoqmvWGJ3^5?K+BbRqSvp zEY-5hT!y*#Vc;>Cx{&?|Y(Qr(y3-lkO*?NHJxk8?ea2q~y42^s1a)D(Vfv&&Fj`2W z3)vwl$dD&FIGz!=YxTqj1+|Ec&!um{L$}udu5C&Ed$92s?H5zs43h&udt{iG16ZmD z8IaLS?r7J!TvSa=Zf2*m*j+AMgMk^Y@Yl3fb-!QLa9HNdYwe0FBK1w;cNz1pCx$Dn zzA)u)Dm%}%%UGrKwryX!4l$}4W_|G-j24X^%WgIUN#>SG8#jKJ_Es^b8a6*8`t{rP z ;JNUaD3-Hc~ZEGL9rF9siot({4WAqq` zO`rz0xO3gaQp}WY4vap}M&6fsv@c-j6O0$B9|p~!J~7F{Lb14-gib7*h0Hx9bF=7Y zJCh{}I1waubmEGKM@3Pzmawg(nHLo|$t7#4yB*uz;*ly!TLee`ME7(Sm_q%_#UyEi z(N}jYYACec(r7j>s6WkVc#`XKDSCgij)-mk1lz$mVKN=}_C@Srl25L6?n_knfJ>z> z2r0q^y(Db56@s3p*gg(Z&Av5_C%o!;W!3Jk9AxZd{z7+%oV|XB$-Yz75$rcCxO%od zOwQ32?TUoCl 7Hqkj@P2!!Dqe~o$H9Z8);u7b{4mF%e+rI8}2Z<7 0^{=fkr+J6 zyuD(lvO;~FtZ{>#>o;D=#-}Zb|3n?=D up+%oDMWMygMI`3p#&{$~nyoFOO? z7P6o}rn^E|79HD%8jJsx_T5Z9_MHbi`59!LyxiLH@bd%2$%AZSIU73am$qVKRAj=+ z-5=qRu!X9`>VP83a a$+-!wPa*c4g1v#XjPZr$iy;bIg0 z(yNMj>LBH!)iZ8-(N9UmGAcsw|A&vfk?M1R{q+~29j4fM|Co|eQVoC=vl>>uFHYXH zr8AoIv(C@Xy}zsaRG&J**gG~Q1z-?e`?-NI`I1|$TvA3wCN@7T#U#)IZji=6A}Px< z;(r! icxu0pl=4_>nID9#~GL3{i8)U!{mN4$dV0>{h17cYDwOGwo_ej zRbwyJ{a`W}56U(pBFu_Nu8@Rbb4I4kMkazvLTMSZZ_|;QKzl5jmol7pdUk@C>e0&F zPDsD-bZ18}-B0`y<-#o`LGgL2tzeq%JVRunWzREXUqzwqV%0O|ne%-z?#CpSVbUyZ zy`}z;vwC)6N`E=tGFNDmSXl=4fqrSr#;c7p7oTZXuyL2E0~?dl7j*d1PPw0Jwu$-n z<~g4X$Y_uZvvOlyYdg;n%OtFE+jvH$EXA&4x{OuFq*hJ4n(BMJne)nkj0UmHD$DHc z;Lo5Rvyum4ro^CSv+P%A+V-crhqgRU4tNuTl5;W|Wa5f;PDmu#pbcDQJ2N5&!^NFH z^&aW3Qr9-bYY#Em^xHcd<**J(&dF$y<1IHEevAvVw}K}D{FFqVje$8SDg2G&nYOnS zOcu=&`VRVOLy|!;8l v7H$Sr#i%{1y3N_a=Mp4anGD*z3Px cq7 zefxZvEy$0#CE#&T#;mYs|BEN3Wz^pH2k2Wwx7>KcmLV}3WI{8)_f>Q`)rWvw45<*7 zo=uxCd%%k4*Ux#z4-Z?0#AuK=w%*KBF?osDoKN$YK%R(_T0=hVg~dnsS<=W;aM+(a zE5l+m$b{wXD$41PVMcB*`6+V|=*8&1C^F9--8}Cd(HjZ*P>u$vYT`E+xyX>jXqx1M kzT}@fzU>D8w?wJ`0{
K~z|U&6itjTt^wle{=Ti&E9qFU3=}dBgctzHz*=OEwofL zRcVD#=mSt96$uH^0#7`E;E~WGR0tR$@j{Cbaat50K}0kp!ic5{O;yp9IIxZrCr-1D zZ)@+a_rB*cXLva4wKuU{0%^tn>6|m) I6k$G>!6&-wN20kri771|SCzc*l8R(o&r^nLFZEND3Ue16|1 z$8mHV`IUFG2M_@2z&AIeiJzhvSUGs{(~m|HANpWxAy?wS$ul!OH 1ys)`FbZ@F#LOrUgJWk;0x^vBCnhpaP5Dm3~X}Y1D!M-xi0hlOxD8ipbnN;dpt? z 3tX zzYBn(r82w^6}VP{s-*mpsAyjLw(dz-EE|kY%#bU%=Z};QV>f1*o?oonyfd9<{AQ~D zE>amhm&OrQ6M#z9WOQPN^kQk%9P1Joeq)ruBg6dh><9qk$rL~O)t~v S8ls~uOuQE3cKm;9;Qc@Yfx)3+o<20h=)?>F z-jlD<{Mm2ed-*ir3htTj9_4#KKUMen`t!fxYtOw*q2zAw7mlCf=|e-jec3$`|Mrh- zeEB;=y!6VOs}g9?fMMDw1(qcN5QeK{YKpcjiQ^~?bGb{JmW^dgZ0UBweciJ>*?)~r z@jCjg79N#zeDo83lA?s<{yPXXXrNLxDOF6Ots%E%*b ^8%1wED`YQGza|v z6iQWW=@1E)@!$L*o>HO~SwM6E7XIb-fP%ng1EV{hukPvT4X#RH)f)W=5XLM`sl!mX z304Iv0t}!MfC><_q00u@3~il?^z?4=z=<)qO#^@U>qQ2KhM7ub0eJgzlEEXxoWFP- zfcb2JpB()Q$4>u!g_k0bJPgGt2=+i)gS-GkfNn#R33)FhLJ;bN)SRGboLlm4An?!e zDMqi)Fgu?I;GL-jMki*to}33@AzLJIZJLoQx9UFn;_GPTF)#{n;|46rBN&98+achC z)+%Tc-b#U|1QzY;)lYo`Y9h29e7XjofBeJDW%BIW5(nU8d$$p73$d*?2Edk$9enYL z2Z*#ZtswBK`%n>J*BZXp3w?c%&BB(=aCID74VVc*#tXUyws;2ku?~>2&|`ks-q*?Y zzRr5^SR_m=60X1deL4^A-P*AJTKTH`V614OUN2ZC%+7&rgQkH;g4cnZ7rHF4-TRUb zFj*m2l*ED_?iyP+#6iR%dlitiYLvk+Vb@N`WWjRpiFh2aHR#_BwhYt>I53aT?)ehN4Qm(xD2K;>I6`HRSB+YFrdWUT}T|^?e ADAB4*A7k-cv%#W zoO rxpNwrS^0000 T+ literal 0 HcmV?d00001 diff --git a/public/plugin/BuyCourses/resources/img/64/buysubscriptions.png b/public/plugin/BuyCourses/resources/img/64/buysubscriptions.png new file mode 100644 index 0000000000000000000000000000000000000000..be1bed82d16c3c3f17acf258ae67bd48edcf83d3 GIT binary patch literal 2148 zcmV-q2%GnbP) %i^hclFDzE9wD#OEUL*)TN)^SwxwBA6n&&0UcWD^QbPOy33BQ4V~H!J zj&$D>j1g>0FAz0-HGmKB^Z(S280(z@$tPth$98DC!F#JprZxS>A1`EWskZ4$g3$w* z%y3VJ>B3vs>aC9S^|jqQvHP>Xyc$n+ wg*a zlc0$Nc~3Yf$}5%j9Lc#847fRq$< By70tZ5vD}!yOWyL%R zGzAd6&1#c1LLf>#ZLM2iYh`S$+Lf8q&QDs~*6JG1aGU3s4BisB&O4f>8sFmR^t# zgka-NAwXB(+zM=6iCadK+>qo)42gsHdW;%~n)VNSIt2a30sjYZ9tT9RQjcunvrJ&{ z`kS_$!?^%wo_n3Qu6EAf0Pi0!@Wi9{x_)I}a4x`dHBS9(zNGx-#fb9eu@oZkk;8^V z<8HmSLx4AG%Gn#1C}F-Y7 iX_}nhTLxp4)34xh}hD~hDp$!_* z6E^Lx`}Snnmr&8|fB@MZ{j)=WnTGPWl1*&sKvw){XH8^lxL8wOEGOH3Fcika6fW?3 zRryyXxtTptj%K}X(O)8h U#Gv~>a<^iyNhT`~fY>?Tc)YkCDg5g+J&;;AZ0%0kkQXK+#0u!0!T3)Hc1`|Xg z{Ay{n@&G2Pku6SB9y^?#qz8ls4sT#Pz*0hpGSDqCuhBUhWS6GMlz)|6z* P1y#GU5b76=?7iH)^HB#(y dHvT>Id_ty~h}M02msK$?0H~^T63|d1}h&EvrZJX2s=Isbwrr zLQ{bK1-TCVsMnXzE$bV=Jw039gxDB0o#AOOXej5#a`L^cmfx1M!S%@8oMU+QA||dA zg?UQ*?;{FRZR|S7woij5sxxx!- Y$VR@0^xr^i$E@Ptlw%D`nJs_x- zK--5Szg8x9{WAIaORH(w;ta*R9>l*@B!B5;P^CO^6mnxu?b&`8(BwU(?BaCWe-qcq zE>4r3yNt}wfGWGLUt{?A=PBmhoww|mNYKQMj OUc=>^2m7hKUg90c_!0G@%M=@B;G z<%~XTiPGcfZdbJK1W-M=_GbWV_^{>pB#KA$`KO#r;SL3mO)psVg`h XS54oUq zCxFPo%`^4IPkYajF2|(l;c^TZtN^ewzN|v_x}bC-fUaCxx^p!lGnj*qcE}DI177{} z7_c@^jTBaTtLtlZwrx-9vI|N#i=n#N-{zh{2xI%ebGX*BcHK2qecJ`CD+@aZq>SU8 zvZ!UTWIV-t<(vyzH!ffXJOu*OTGm~@UzEwGqKz}BhZ_Mb`cD4Zj`#m6j4Y;wTqN-4C`GDFF-*#fs aI{X)l-I8FHo@kf=0000 004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv zX+uL$Nkc;*P;zf(X>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_ z0K*JTY>22pL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr z?{oLrd!Mx~03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE @L0LWj&=4?(nOT_siPRbOditRHZrp6?S8Agej zFG^6va$=5K |`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t z74chfY%+(L4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AW zE=!MYYHiJ+dvY?9I0Av8Ka-Wn (gPeepdb@piwLhwjRWWeSr7baCBSDM=|p zK0Q5^$>Pur|2)M1IPkCYSQ^NQ`z*p zYmq4Rp8z$=2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV z=Mor9X9@Wki)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3 zF4znTKoQsl_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZX zRY(gmfXpBUWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6q n9`(3jA6(BtSg7z~Dn z(ZN_@JTc*z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW z#Hr%UaPGJW91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5Y zU_t_6GogaeLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*C zkMxR6CTo)&$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6