From 3911017e25e329b3649051d77760ab3eba7713bf Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:21:58 +0300 Subject: [PATCH 01/27] =?UTF-8?q?#101=20=D1=80=D0=B0=D0=B7=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D0=B5=20=D1=83?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8F=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- ...21\206\320\270\321\217\320\274\320\270.md" | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 "docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" diff --git a/README.md b/README.md index 7ef04b3f..f4cf9b3d 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ 2. [Соответствия объектов ИБ](docs/СоответствиеОбъектовИнформационнойБазы.md) 3. [Программная модификация форм](docs/МодификацияФорм.md) 4. [Подписки на события](docs/ПодпискиНаСобытия.md) -5. Управление интеграциями +5. [Управление интеграциями](docs/УправлениеИнтеграциями.md) 6. [Пользовательские функции](docs/ПользовательскиеФункции.md) 7. [Настройки отбора объектов](docs/ПолучениеДанныхПоНастройкеОтбора.md) 8. [Загрузка файла через табличный документ](docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" new file mode 100644 index 00000000..b52574cd --- /dev/null +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -0,0 +1,51 @@ +# Подсистема "Управление интеграциями" + +## Общие сведения + +Подсистема предназначена для хранения и управления настройками интеграций разных типов: +- **Файловые обмены**; +- **Прямое подключение к базе данных**; +- **Вызов внешней процедуры**; +- **Брокеры сообщений**. + +Содержит в себе функции для взаимодействия с указанными типами интеграций. Содержит в себе функции для логирования вызовов интеграций. + +## Состав подсистемы + +Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](docs/ERДиаграммаПодсистемыУправленияИнтеграциями.md)): + +1. Справочники + 1.1. **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; + 1.2. **пбп_ТипыИнтеграций** - содержит в себе перечень предопределенных"*" типов интеграций, под которые выполняются настройки. Необходим для определения варианта настроек, + состава показываемых полей, определения функций взаимодействия с конечной системой; + 1.3. **пбп_НастройкиИнтеграции** - справочник, предназначенный для хранения настроек подключения и аутентификации в системе. Форма настроек параметризируется в зависимости от выбранного типа интеграции; + 1.4. **пбп_ИнтеграционныеПотоки** - хранит в себе данные о точке входа в интегрируемую систему (ресурс REST, интерфейс SOAP, команду BASH / CMD и пр.), а также передаваемые параметры и аргументы. При внедрении с подсистемой пользовательских функций присутствует возможность настроить регламентное задание ("пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов") для отправки / получения данных, используя пользовательские функции; + 1.5. **пбп_ИсторияИнтеграции** - для логирования вызовов интеграционных потоков. Содержит информацию о входящем / исходящем запросе, задействованных в процессе вызова объектов, протокол вызова, метрики длительности обмена и вызова и т.д.. Для периодической очистки истории интеграций существует регламентное задание "пбп_ОчисткаИсторииИнтеграции"; + +2. Определяемые типы + 2.1. **пбп_Пользователи** - ссылка на справочник пользователей (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.Пользователи"; + 2.2. **пбп_УчетныеЗаписиЭлектроннойПочты** - ссылка на справочник учетных записей электронной почты (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"; + +3. Регламентные задания + 3.1. **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. + 3.2. **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); + +4. Общие макеты + 4.1. **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; + 4.2. **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; + 4.3. **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq; + 4.4. **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka; + +5. Общие модули + 5.1. **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); + 5.2. **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). + +"*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. + +## Ролевая модель + +Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. + +## Реализованные функции + +- ** From e3f1505f547e13d3cc05e13244e94268d97c9a84 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:24:51 +0300 Subject: [PATCH 02/27] =?UTF-8?q?=D0=A1=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D1=83=D0=BC=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index b52574cd..acf6be09 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -15,30 +15,30 @@ Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](docs/ERДиаграммаПодсистемыУправленияИнтеграциями.md)): 1. Справочники - 1.1. **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; - 1.2. **пбп_ТипыИнтеграций** - содержит в себе перечень предопределенных"*" типов интеграций, под которые выполняются настройки. Необходим для определения варианта настроек, + 1) **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; + 2) **пбп_ТипыИнтеграций** - содержит в себе перечень предопределенных"*" типов интеграций, под которые выполняются настройки. Необходим для определения варианта настроек, состава показываемых полей, определения функций взаимодействия с конечной системой; - 1.3. **пбп_НастройкиИнтеграции** - справочник, предназначенный для хранения настроек подключения и аутентификации в системе. Форма настроек параметризируется в зависимости от выбранного типа интеграции; - 1.4. **пбп_ИнтеграционныеПотоки** - хранит в себе данные о точке входа в интегрируемую систему (ресурс REST, интерфейс SOAP, команду BASH / CMD и пр.), а также передаваемые параметры и аргументы. При внедрении с подсистемой пользовательских функций присутствует возможность настроить регламентное задание ("пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов") для отправки / получения данных, используя пользовательские функции; - 1.5. **пбп_ИсторияИнтеграции** - для логирования вызовов интеграционных потоков. Содержит информацию о входящем / исходящем запросе, задействованных в процессе вызова объектов, протокол вызова, метрики длительности обмена и вызова и т.д.. Для периодической очистки истории интеграций существует регламентное задание "пбп_ОчисткаИсторииИнтеграции"; + 3) **пбп_НастройкиИнтеграции** - справочник, предназначенный для хранения настроек подключения и аутентификации в системе. Форма настроек параметризируется в зависимости от выбранного типа интеграции; + 4) **пбп_ИнтеграционныеПотоки** - хранит в себе данные о точке входа в интегрируемую систему (ресурс REST, интерфейс SOAP, команду BASH / CMD и пр.), а также передаваемые параметры и аргументы. При внедрении с подсистемой пользовательских функций присутствует возможность настроить регламентное задание ("пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов") для отправки / получения данных, используя пользовательские функции; + 5) **пбп_ИсторияИнтеграции** - для логирования вызовов интеграционных потоков. Содержит информацию о входящем / исходящем запросе, задействованных в процессе вызова объектов, протокол вызова, метрики длительности обмена и вызова и т.д.. Для периодической очистки истории интеграций существует регламентное задание "пбп_ОчисткаИсторииИнтеграции"; 2. Определяемые типы - 2.1. **пбп_Пользователи** - ссылка на справочник пользователей (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.Пользователи"; - 2.2. **пбп_УчетныеЗаписиЭлектроннойПочты** - ссылка на справочник учетных записей электронной почты (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"; + 1) **пбп_Пользователи** - ссылка на справочник пользователей (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.Пользователи"; + 2) **пбп_УчетныеЗаписиЭлектроннойПочты** - ссылка на справочник учетных записей электронной почты (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"; 3. Регламентные задания - 3.1. **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. - 3.2. **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); + 1) **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. + 2) **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); 4. Общие макеты - 4.1. **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; - 4.2. **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; - 4.3. **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq; - 4.4. **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka; + 1) **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; + 2) **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; + 3) **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq; + 4) **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka; 5. Общие модули - 5.1. **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); - 5.2. **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). + 1) **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); + 2) **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). "*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. From 4cf5cd6b3b62e0d78934cfdb9a3f66af2fa55da8 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:29:35 +0300 Subject: [PATCH 03/27] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=B2,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D1=8B=20=D0=BE=D0=B1=D1=89=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BC=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20?= =?UTF-8?q?=D0=B1=D1=80=D0=BE=D0=BA=D0=B5=D1=80=D0=B0=D0=BC=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index acf6be09..157ac5bf 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -15,30 +15,30 @@ Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](docs/ERДиаграммаПодсистемыУправленияИнтеграциями.md)): 1. Справочники - 1) **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; - 2) **пбп_ТипыИнтеграций** - содержит в себе перечень предопределенных"*" типов интеграций, под которые выполняются настройки. Необходим для определения варианта настроек, + - **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; + - **пбп_ТипыИнтеграций** - содержит в себе перечень предопределенных"*" типов интеграций, под которые выполняются настройки. Необходим для определения варианта настроек, состава показываемых полей, определения функций взаимодействия с конечной системой; - 3) **пбп_НастройкиИнтеграции** - справочник, предназначенный для хранения настроек подключения и аутентификации в системе. Форма настроек параметризируется в зависимости от выбранного типа интеграции; - 4) **пбп_ИнтеграционныеПотоки** - хранит в себе данные о точке входа в интегрируемую систему (ресурс REST, интерфейс SOAP, команду BASH / CMD и пр.), а также передаваемые параметры и аргументы. При внедрении с подсистемой пользовательских функций присутствует возможность настроить регламентное задание ("пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов") для отправки / получения данных, используя пользовательские функции; - 5) **пбп_ИсторияИнтеграции** - для логирования вызовов интеграционных потоков. Содержит информацию о входящем / исходящем запросе, задействованных в процессе вызова объектов, протокол вызова, метрики длительности обмена и вызова и т.д.. Для периодической очистки истории интеграций существует регламентное задание "пбп_ОчисткаИсторииИнтеграции"; + - **пбп_НастройкиИнтеграции** - справочник, предназначенный для хранения настроек подключения и аутентификации в системе. Форма настроек параметризируется в зависимости от выбранного типа интеграции; + - **пбп_ИнтеграционныеПотоки** - хранит в себе данные о точке входа в интегрируемую систему (ресурс REST, интерфейс SOAP, команду BASH / CMD и пр.), а также передаваемые параметры и аргументы. При внедрении с подсистемой пользовательских функций присутствует возможность настроить регламентное задание ("пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов") для отправки / получения данных, используя пользовательские функции; + - **пбп_ИсторияИнтеграции** - для логирования вызовов интеграционных потоков. Содержит информацию о входящем / исходящем запросе, задействованных в процессе вызова объектов, протокол вызова, метрики длительности обмена и вызова и т.д.. Для периодической очистки истории интеграций существует регламентное задание "пбп_ОчисткаИсторииИнтеграции"; 2. Определяемые типы - 1) **пбп_Пользователи** - ссылка на справочник пользователей (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.Пользователи"; - 2) **пбп_УчетныеЗаписиЭлектроннойПочты** - ссылка на справочник учетных записей электронной почты (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"; + - **пбп_Пользователи** - ссылка на справочник пользователей (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.Пользователи"; + - **пбп_УчетныеЗаписиЭлектроннойПочты** - ссылка на справочник учетных записей электронной почты (БСП). При внедрении в конфигурацию с БСП, необходимо добавить в состав "СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"; 3. Регламентные задания - 1) **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. - 2) **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); + - **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. + - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); 4. Общие макеты - 1) **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; - 2) **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; - 3) **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq; - 4) **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka; + - **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; + - **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; + - **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq (см. [PinkRabbitMQ library](https://github.com/BITERP/PinkRabbitMQ)); + - **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka (см. [Simple Kafka Connector 1C](https://github.com/NuclearAPK/Simple-Kafka_Adapter)); 5. Общие модули - 1) **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); - 2) **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). + - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); + - **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). "*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. From cf39ab680443d01c01b5488e8b0c0bb34d346e34 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:32:25 +0300 Subject: [PATCH 04/27] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D0=B5=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\260\321\206\320\270\321\217\320\274\320\270.md" | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 157ac5bf..8da11962 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -12,7 +12,7 @@ ## Состав подсистемы -Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](docs/ERДиаграммаПодсистемыУправленияИнтеграциями.md)): +Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](ERДиаграммаПодсистемыУправленияИнтеграциями.md)): 1. Справочники - **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; @@ -28,7 +28,7 @@ 3. Регламентные задания - **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. - - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](docs/ПользовательскиеФункции.md)); + - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](ПользовательскиеФункции.md)); 4. Общие макеты - **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; @@ -46,6 +46,10 @@ Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. +## Порядок взаимодействия с объектами подсистемы + + + ## Реализованные функции -- ** + From 5394ef4f36fd4d43c9eb70cea72f8504d14d69fe Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:37:46 +0300 Subject: [PATCH 05/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=BA.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\320\260\321\206\320\270\321\217\320\274\320\270.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 8da11962..fa31d96f 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -28,7 +28,7 @@ 3. Регламентные задания - **пбп_ОчисткаИсторииИнтеграции** - периодическая очистка справочника "пбп_ИсторияИнтеграции". Для успешных вызовов и вызовов с ошибкой можно настроить разное количество дней хранения логов. Для этого необходимо выставить разное количество дней у элементов "Количество дней хранения истории интеграции" и "Количество дней хранения ошибок истории интеграции" в плане видов характеристик "пбп_ПредопределенныеЗначения" соответственно. - - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнения в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](ПользовательскиеФункции.md)); + - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнена в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](ПользовательскиеФункции.md)); 4. Общие макеты - **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; @@ -37,7 +37,7 @@ - **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka (см. [Simple Kafka Connector 1C](https://github.com/NuclearAPK/Simple-Kafka_Adapter)); 5. Общие модули - - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в **Реализованные функции**); + - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в главе [Реализованные методы](## Реализованные методы)); - **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). "*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. @@ -46,10 +46,10 @@ Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. -## Порядок взаимодействия с объектами подсистемы +## Порядок взаимодействия -## Реализованные функции +## Реализованные методы From 728cdbab7e9b32b72eedd379fbc3f54be3137a10 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 16:38:45 +0300 Subject: [PATCH 06/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index fa31d96f..15e3aaf3 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -37,7 +37,7 @@ - **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka (см. [Simple Kafka Connector 1C](https://github.com/NuclearAPK/Simple-Kafka_Adapter)); 5. Общие модули - - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в главе [Реализованные методы](## Реализованные методы)); + - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в главе [Реализованные методы](#реализованные-методы)); - **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). "*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. From f811bda9dcbdc92927995341e65d6310dc568ab0 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Mon, 7 Oct 2024 18:18:40 +0300 Subject: [PATCH 07/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=BA=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 155 +++++++++++++++++- 1 file changed, 154 insertions(+), 1 deletion(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 15e3aaf3..580a0457 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -46,9 +46,162 @@ Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. -## Порядок взаимодействия +## Связанные подсистемы + +1. [Предопределенные значения](docs/ПредопределенныеЗначения.md) +2. [Переопределения методов БСП](docs/ПереопределениеМетодовБСП.md) +3. [Пользовательские функции](docs/ПользовательскиеФункции.md) +## Порядок взаимодействия +Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Рассмотрим заполнение данных на нескольких примерах: + +### Заполнение настроек для обмена через FTP-Сервер +Для этого заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: +1. В функции ПредопределенныеЗначенияИнтегрируемыеСистемы, необходимо добавить интегрируемую систему, с которой будет происходить взаимодействие + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт + + Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); + + // Добавление + НоваяСистема = Результат.Добавить(); + НоваяСистема.Наименование = "FTP-Сервер"; + НоваяСистема.ИдентификаторНастройки = "FTPСервер"; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +2. В функции ПредопределенныеЗначенияНастройкиИнтеграции, необходимо добавить настройки интеграции, по которым выполняется подключение к ранее добавленной системе, с обязательным указанием ссылки на интегрируемую систему + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт + + Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); + + // Добавление + НоваяНастройка = Результат.Добавить(); + НоваяНастройка.Наименование = "Подключение к ftp-серверу"; + НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияЧерезFTP"; + НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( + "ИдентификаторНастройки", "FTPСервер"); // Идентификатор настройки интегрируемой системы + НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.FTP; + НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +3. В функции ПредопределенныеЗначенияИнтеграционныеПотоки, необходимо добавить потоки с разделением по логике интегрируемого приложения. Например, для интеграции с FTP-сервером, где предусмотрена и загрузка, и отправка файлов, а на самом сервере есть разделение для входящих и исходящих сообщений, необходимо создать два потока, где в одном будет путь к каталогу входящих файлов на сервере, в другом - путь к каталогу исходящих файлов: + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт + + Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); + + // Добавление + НовыйМетод = Результат.Добавить(); + НовыйМетод.Наименование = "Отправка файлов на ftp-сервер"; + НовыйМетод.ИдентификаторНастройки = "ОтправкаФайловНаFTPСервер"; + + НовыйМетод = Результат.Добавить(); + НовыйМетод.Наименование = "Получение файлов с ftp-сервера"; + НовыйМетод.ИдентификаторНастройки = "ПолучениеФайловСFTPСервера"; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +Для вышеуказанных справочников обязательных к заполнению реквизитами являются только "Наименование" и "ИдентификаторНастройки". Остальные реквизиты можно заполнить в пользовательском режиме. +Реквизит "ИдентификаторНастройки" в каждом вышеуказанном справочнике является аналогом платформенного "ИмяПредопределенныхДанных" и должен быть ***уникальным в рамках одного справочника***! + +После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. +В элементе "Подключение к ftp-серверу" справочника настройки интеграции заполнить адрес/имя сервера подключения без указания протокола (например, 127.0.0.1) и порт (по-умолчанию 21 для ftp и 22 для sftp). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем от ftp-сервера. ***При записи справочника они будут помещены в безопасное хранилище***. +В элементе "Отправка файлов на ftp-сервер" справочника интеграционных потоков необходимо указать путь к каталогу исходящих файлов на ftp-сервере. Например, /test/out. +В элементе "Получение файлов с ftp-сервера" справочника интеграционных потоков необходимо указать путь к каталогу входящих файлов на ftp-сервере. Например, /test/in. + +### Заполнение настроек для обмена через HTTP-сервис (только входящий поток). + +1. Интегрируемая система + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт + + Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); + + // Добавление + НоваяСистема = Результат.Добавить(); + НоваяСистема.Наименование = "Шина данных"; + НоваяСистема.ИдентификаторНастройки = "ШинаДанных"; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +2. Настройка интеграции + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт + + Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); + + // Добавление + НоваяНастройка = Результат.Добавить(); + НоваяНастройка.Наименование = "Подключение к шине данных"; + НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияЧерезШину"; + НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( + "ИдентификаторНастройки", "ШинаДанных"); // Идентификатор настройки интегрируемой системы + НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.RESTAPI; + НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +3. Входящий поток: + +```1C (BSL) +Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт + + Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); + + // Добавление + НовыйМетод = Результат.Добавить(); + НовыйМетод.Наименование = "Получение товаров на складах из системы N"; + НовыйМетод.ИдентификаторНастройки = "ПолучениеТоваровНаСкладахИзСистемыN"; + // КонецДобавления + + Возврат Результат; + +КонецФункции +``` + +После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. +В элементе "Подключение к шине данных" справочника настройки интеграции заполнить адрес/имя сервера, где находится шина данных с указанием протокола (например, http://192.100.0.1) и порт (например, 8080). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем или JWT-токеном (bearer-токен), в зависимости от выбранного типа авторизации, от http-сервиса. ***При записи справочника они будут помещены в безопасное хранилище***. +В элементе "Получение товаров на складах из системы N" справочника интеграционных потоков необходимо заполнить: +1. Ресурс, к которому будет происходить вызов. Например, /test/goods-in-warehouses (обороты по товарам на складах); +2. В таблице параметров запроса указать параметры, если они есть. Например, для текущего метода есть параметры запроса "from" (дата начала) и "to" (дата окончания): + + № | Имя | Тип | Параметр URL | ЗначениеПоУмолчанию | Поле объекта + --|-----|-----|--------------|---------------------|-------------- + 1 |from |Дата | [ ] |01.01.2024 | + 2 |to |Дата | [ ] |31.12.2024 | + +### Обмен данными между системами на базе 1С + +Для обмена данными между системами на базе 1С, посредством встроенных в БСП средств (правила обмена на базе 1С: Конвертации данных 2.0, правила обмена на базе 1С: Конвертации данных 3.0), необходимо создать только интеграционный поток, с наименованием, совпадающем с наименованием плана обмена (например, "Обмен с ЗУП 3.1"). Это необходимо для того, чтобы встроить типовой механизм обмена в механизм логирования подсистемы истории интеграции, посредством заполнения справочника истории интеграции. ## Реализованные методы From a4e13968c3029a3d8448604a5bf32266248fa844 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Tue, 8 Oct 2024 15:55:10 +0300 Subject: [PATCH 08/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20FTP-=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=20=D0=B8=20HTTP-=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0.=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D1=80=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=20=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 82 +++++++++++++++++-- 1 file changed, 75 insertions(+), 7 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 580a0457..3f0eec9b 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -56,8 +56,8 @@ Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Рассмотрим заполнение данных на нескольких примерах: -### Заполнение настроек для обмена через FTP-Сервер -Для этого заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: +#### Заполнение настроек для обмена через FTP-Сервер +Заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: 1. В функции ПредопределенныеЗначенияИнтегрируемыеСистемы, необходимо добавить интегрируемую систему, с которой будет происходить взаимодействие ```1C (BSL) @@ -76,7 +76,7 @@ КонецФункции ``` -2. В функции ПредопределенныеЗначенияНастройкиИнтеграции, необходимо добавить настройки интеграции, по которым выполняется подключение к ранее добавленной системе, с обязательным указанием ссылки на интегрируемую систему +2. В функции ПредопределенныеЗначенияНастройкиИнтеграции, необходимо добавить настройки интеграции, по которым выполняется подключение к ранее добавленной системе, с указанием ссылки на интегрируемую систему ```1C (BSL) Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт @@ -121,14 +121,21 @@ ``` Для вышеуказанных справочников обязательных к заполнению реквизитами являются только "Наименование" и "ИдентификаторНастройки". Остальные реквизиты можно заполнить в пользовательском режиме. + Реквизит "ИдентификаторНастройки" в каждом вышеуказанном справочнике является аналогом платформенного "ИмяПредопределенныхДанных" и должен быть ***уникальным в рамках одного справочника***! + После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. + В элементе "Подключение к ftp-серверу" справочника настройки интеграции заполнить адрес/имя сервера подключения без указания протокола (например, 127.0.0.1) и порт (по-умолчанию 21 для ftp и 22 для sftp). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем от ftp-сервера. ***При записи справочника они будут помещены в безопасное хранилище***. + В элементе "Отправка файлов на ftp-сервер" справочника интеграционных потоков необходимо указать путь к каталогу исходящих файлов на ftp-сервере. Например, /test/out. + В элементе "Получение файлов с ftp-сервера" справочника интеграционных потоков необходимо указать путь к каталогу входящих файлов на ftp-сервере. Например, /test/in. -### Заполнение настроек для обмена через HTTP-сервис (только входящий поток). +#### Заполнение настроек для обмена через HTTP-сервис (только входящий поток). + +Допустим, мы должны сделать интеграцию с системой N через шину данных с использованием REST API. 1. Интегрируемая система @@ -189,20 +196,81 @@ ``` После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. + В элементе "Подключение к шине данных" справочника настройки интеграции заполнить адрес/имя сервера, где находится шина данных с указанием протокола (например, http://192.100.0.1) и порт (например, 8080). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем или JWT-токеном (bearer-токен), в зависимости от выбранного типа авторизации, от http-сервиса. ***При записи справочника они будут помещены в безопасное хранилище***. + В элементе "Получение товаров на складах из системы N" справочника интеграционных потоков необходимо заполнить: 1. Ресурс, к которому будет происходить вызов. Например, /test/goods-in-warehouses (обороты по товарам на складах); 2. В таблице параметров запроса указать параметры, если они есть. Например, для текущего метода есть параметры запроса "from" (дата начала) и "to" (дата окончания): № | Имя | Тип | Параметр URL | ЗначениеПоУмолчанию | Поле объекта --|-----|-----|--------------|---------------------|-------------- - 1 |from |Дата | [ ] |01.01.2024 | - 2 |to |Дата | [ ] |31.12.2024 | + 1 |from |Дата |Ложь |01.01.2024 | + 2 |to |Дата |Ложь |31.12.2024 | + +#### Заполнение настроек для обмена через прямое подключение к БД + + + +#### Заполнение настроек для внешней компоненты + + -### Обмен данными между системами на базе 1С +#### Заполнение настроек для командной строки + + + +#### Обмен данными между системами на базе 1С Для обмена данными между системами на базе 1С, посредством встроенных в БСП средств (правила обмена на базе 1С: Конвертации данных 2.0, правила обмена на базе 1С: Конвертации данных 3.0), необходимо создать только интеграционный поток, с наименованием, совпадающем с наименованием плана обмена (например, "Обмен с ЗУП 3.1"). Это необходимо для того, чтобы встроить типовой механизм обмена в механизм логирования подсистемы истории интеграции, посредством заполнения справочника истории интеграции. ## Реализованные методы +Рассмотрим программный интерфейс подсистемы управления интеграциями, выполненный в общем модуле **пбп_ИнтеграцииСервер**: + +1. Для того, чтобы создать запись в истории интеграции в коде, где происходит вызов, необходимо инициализировать структуру записи с помощью функции **ПолучитьСтруктуруЗаписиИстории** и сохранить ее в данные справочника после пост-обработки данных (для подсчета общего времени обмена) с помощью процедуры **СоздатьСообщениеИсторииИнтеграции**: + +**Пример записи истории интеграции:** + +```1C (BSL) +Процедура Тест(Знач Сессия) + + ИнтеграционныйПоток = Справочники.пбп_ИнтеграционныеПотоки.НайтиПоРеквизиту( + "ИдентификаторНастройки", "ПолучениеТоваровНаСкладахИзСистемыN"); + + РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта(ИнтеграционныйПоток, + "ТочкаВхода, НастройкаИнтеграции, НастройкаИнтеграции.ИнтегрируемаяСистема"); + + СтруктураОтвета = пбп_ИнтеграцииСервер.ПолучитьСтруктуруЗаписиИстории(); + СтруктураОтвета.ИнтеграционныйПоток = ИнтеграционныйПоток; + СтруктураОтвета.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграций.JSON; + СтруктураОтвета.ИнтегрируемаяСистема = РеквизитыПотока.НастройкаИнтеграцииИнтегрируемаяСистема; + Попытка + + URL = "https://127.0.0.1:8080/test/goods-in-warehouses"; + ВремяНачалаВызова = ТекущаяДатаСеанса(); + ОтветHTTP = КоннекторHTTP.Get(URL, , , Сессия); + СтруктураОтвета.ДлительностьВызова = ТекущаяДатаСеанса() - ВремяНачалаВызова; + СтруктураОтвета.ЗапросВходящий = КоннекторHTTP.КакТекст(ОтветHTTP); + + Если ОтветHTTP.КодСостояния < 300 Тогда + // ... + Иначе + ТекстСообщения = СтрШаблон("ru = 'Код состояния %1: %2'", ОтветHTTP.КодСостояния, + пбп_ИнтеграцииСервер.РасшифровкаКодаСостоянияHTTP(ОтветHTTP.КодСостояния)); + СтруктураОтвета.ОписаниеОшибки = НСтр(ТекстСообщения); + КонецЕсли; + + Исключение + + ТекстСообщения = "ru = 'Ошибка при получении компонентов из JIRA'"; + СтруктураОтвета.ОписаниеОшибки = пбп_ОбщегоНазначенияСервер.ПолучениеПолногоТекстаОшибкиПриИсключении( + НСтр(ТекстСообщения), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПолучитьСообщенияПользователю(Истина)); + + КонецПопытки; + + пбп_ИнтеграцииСервер.СоздатьСообщениеИсторииИнтеграции(СтруктураОтвета, Истина); + +КонецПроцедуры +``` From 9cac35bb0226250695d2d9e87cdc8aeb30a22e4c Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Wed, 16 Oct 2024 19:21:12 +0300 Subject: [PATCH 09/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D0=B1=D0=BE=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B2=20md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\321\206\320\270\321\217\320\274\320\270.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 3f0eec9b..0c67268f 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -60,7 +60,7 @@ Заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: 1. В функции ПредопределенныеЗначенияИнтегрируемыеСистемы, необходимо добавить интегрируемую систему, с которой будет происходить взаимодействие -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); @@ -78,7 +78,7 @@ 2. В функции ПредопределенныеЗначенияНастройкиИнтеграции, необходимо добавить настройки интеграции, по которым выполняется подключение к ранее добавленной системе, с указанием ссылки на интегрируемую систему -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); @@ -100,7 +100,7 @@ 3. В функции ПредопределенныеЗначенияИнтеграционныеПотоки, необходимо добавить потоки с разделением по логике интегрируемого приложения. Например, для интеграции с FTP-сервером, где предусмотрена и загрузка, и отправка файлов, а на самом сервере есть разделение для входящих и исходящих сообщений, необходимо создать два потока, где в одном будет путь к каталогу входящих файлов на сервере, в другом - путь к каталогу исходящих файлов: -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); @@ -139,7 +139,7 @@ 1. Интегрируемая система -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); @@ -157,7 +157,7 @@ 2. Настройка интеграции -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); @@ -179,7 +179,7 @@ 3. Входящий поток: -```1C (BSL) +```bsl Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); @@ -232,7 +232,7 @@ **Пример записи истории интеграции:** -```1C (BSL) +```bsl Процедура Тест(Знач Сессия) ИнтеграционныйПоток = Справочники.пбп_ИнтеграционныеПотоки.НайтиПоРеквизиту( From 0cfef6e5818ebae8d67cb4c48877f42e455a00fa Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Thu, 17 Oct 2024 14:34:37 +0300 Subject: [PATCH 10/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D1=85=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 0c67268f..5d9f83a2 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -12,7 +12,7 @@ ## Состав подсистемы -Подсистема имеет вследующие встроенные объекты (подробнее в [ER-диаграмма подсистемы "Управление интеграциями"](ERДиаграммаПодсистемыУправленияИнтеграциями.md)): +![image](images/ERArchitectureIntegrationsSubsystem.svg) 1. Справочники - **пбп_ИнтегрируемыеСистемы** - верхнеуровневый справочник, хранящий в себе наименования интегрируемых систем; @@ -31,8 +31,8 @@ - **пбп_ВыполнениеПользовательскихФункцийФайловыхОбменов** - ***доступно только при наличии подсистемы пользовательских функций!*** Настройка расписания выполнения пользовательских функций в разрезе интеграционного потока для формирования сообщения получения / отправки файловых интеграций (с локальной / сетевой папкой, ftp / sftp и т.д.). Логика формирования сообщения должна быть заполнена в справочнике "пбп_Пользовательские функции" (см. [Пользовательские функции](ПользовательскиеФункции.md)); 4. Общие макеты - - **пбп_JSONEditor** - содержит правила формитирования строкового поля в JSON-формат в виде дерева или структуры; - - **пбп_XMLEditor** - содержит правила форматирования строкового поля в XML-формат в виде дерева; + - **пбп_JSONEditor** - содержит web-приложение для вставки в html поле для форматирования в JSON-формат в виде дерева или структуры; + - **пбп_XMLEditor** - содержит web-приложение для вставки в html поле для форматирования в XML-формат в виде дерева; - **пбп_PinkRabbitMQ** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Rabbit Mq (см. [PinkRabbitMQ library](https://github.com/BITERP/PinkRabbitMQ)); - **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka (см. [Simple Kafka Connector 1C](https://github.com/NuclearAPK/Simple-Kafka_Adapter)); From aa945696db2bd047f8aca4de3a617ad4f8421b9a Mon Sep 17 00:00:00 2001 From: Ivan Smirnov <52702497+ivanmolodec@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:17:49 +0300 Subject: [PATCH 11/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f4cf9b3d..0c4062bb 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Release](https://img.shields.io/github/v/release/firstBitSportivnaya/PSSL?include_prereleases&label=last%20release&style=badge)](https://github.com/firstBitSportivnaya/PSSL/releases/latest) [![GitHub issues](https://img.shields.io/github/issues-raw/firstBitSportivnaya/PSSL?style=badge)](https://github.com/firstBitSportivnaya/PSSL/issues) [![License](https://img.shields.io/github/license/firstBitSportivnaya/PSSL?style=badge)](https://github.com/firstBitSportivnaya/PSSL/blob/develop/LICENSE) -[![OpenYellow](https://img.shields.io/endpoint?url=https://openyellow.neocities.org/badges/4/751858948.json)](https://openyellow.notion.site/openyellow/24727888daa641af95514b46bee4d6f2?p=aec5d010e2aa4fcf9ec351e0b013705e&pm=s) +[![OpenYellow](https://img.shields.io/endpoint?url=https://openyellow.org/data/badges/4/751858948.json)](https://openyellow.org/grid?data=top&repo=751858948) ![image](https://repository-images.githubusercontent.com/751858948/a45ea547-c23c-4ce1-b30e-609d9ac8d558) From 339ff78c263dec67c97201b3e0ad7044ff45e523 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Thu, 14 Nov 2024 17:23:51 +0300 Subject: [PATCH 12/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BB=D1=83=D0=B6=20=D0=BF=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1\200\320\260\321\206\320\270\320\270.png" | Bin 0 -> 6285 bytes .../ERArchitectureIntegrationsSubsystem.puml | 12 +++ ...21\206\320\270\321\217\320\274\320\270.md" | 96 +++++++++++++++++- 3 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 "docs/images/\320\227\320\260\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" diff --git "a/docs/images/\320\227\320\260\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" "b/docs/images/\320\227\320\260\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..81fbb753a11a2fee1556e42b7a5905098931d8e0 GIT binary patch literal 6285 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 literal 0 HcmV?d00001 diff --git a/docs/puml/ERArchitectureIntegrationsSubsystem.puml b/docs/puml/ERArchitectureIntegrationsSubsystem.puml index a01a4c41..b5bf53fa 100644 --- a/docs/puml/ERArchitectureIntegrationsSubsystem.puml +++ b/docs/puml/ERArchitectureIntegrationsSubsystem.puml @@ -83,6 +83,7 @@ entity "Справочник: Интеграционные потоки" as eInt ТочкаВхода : строка (неогр) ПользовательскаяФункция : uuid <> ИзмененВручную : булево + НаправлениеПотока: uuid <> -- Параметры входа -- @@ -116,6 +117,12 @@ enum "Перечисление: Типы параметров интеграци + Дата } +enum "Перечисление: Направления интеграционных потоков" as eIntDirections { + + Исходящий + + Входящий + + Служебный +} + entity "Справочник: История интеграции" as eIntHistory { *УникальныйИдентификатор : uuid <> -- @@ -134,6 +141,8 @@ entity "Справочник: История интеграции" as eIntHistor Пользователь : uuid <> ДлительностьОбмена : число (5, 0) ДлительностьВызова : число (5, 0) + ИмяФайлаСообщения: Строка (150) + ФайлСообщения: хранилище значений -- Объекты интеграции -- @@ -147,6 +156,8 @@ enum "Перечисление: Статусы интеграции" as eIntStat + Загружено + ОшибкаВыгрузки + ОшибкаЗагрузки + + Служебный + + ОшибкаСлужебного } enum "Перечисление: Форматы интеграции" as eIntFormates { @@ -187,6 +198,7 @@ eIntFlows <- eIntFlows : Родитель eIntFlows --> eIntSettings : НастройкаИнтеграции eIntFlows --> eUserFunctions : ПользовательскаяФункция eIntFlows --> eIntParamsTypes : Тип (параметры входа) +eIntFlows --> eIntDirections : НаправлениеПотока eIntHistory --> eSysInt : ИнтегрируемаяСистема eIntHistory --> eIntStatuses : Статус diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 5d9f83a2..322325eb 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -37,24 +37,114 @@ - **пбп_SimpleKafkaAdapter** - содержит архив с компонентой подключения и взаимодействия с брокером сообщений Kafka (см. [Simple Kafka Connector 1C](https://github.com/NuclearAPK/Simple-Kafka_Adapter)); 5. Общие модули - - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика взаимодействия с подсистемой управления интеграцями и функции взаимодействия с другими системами (подробно см. в главе [Реализованные методы](#реализованные-методы)); - - **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)). + - **пбп_ИнтеграцииСервер** - модуль программного интерфейса, где описана серверная логика и функции взаимодействия с другими системами (подробно см. в главе [Реализованные методы](#реализованные-методы)); + - **пбп_ИнтеграцииСлужебный** - модуль служебного программного интефейса, где описана логика взаимодействия с объектами подсистемы, а также вспомогательные экспортные функции (подробно см. в главе [Служебный программный интерфейс](#служебный-программный-интерфейс)); + - **пбп_ИнтеграцииFTPSFTP** - модуль программного интерфейса, где описана серверная логика и функции взаимодействия с FTP и SFTP серверами (подробно см. в главе [Реализованные методы](#реализованные-методы)); + - **пбп_КоннекторHTTP** - модуль программного интерфейса, предоставляющий удобную обертку вызовов REST-методов HTTP-сервисов (см. [Коннектор: удобный HTTP-клиент](https://github.com/vbondarevsky/Connector)); + - ***пбп_МетодыРегламентныхЗаданийСервер** - модуль программного интерфейса, являющийся "единым хранилищем" экспортных методов регламентных заданий; "*" В рамках общего отказа от предопределенных значений в справочниках ПБП необходимо уточнение: предопределенные значения справочника **пбп_ТипыИнтеграций** используются по причине того, что в них перечислены общие, стандартизированные и широкоиспользумые типы, которые, в свою очередь, влиют на параметризацию справочников **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** и **пбп_ИсторияИнтеграции**. ## Ролевая модель Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. +Для просмотра справочника истории интеграции существует роль **пбп_ПросмотрИсторииИнтеграции**. ## Связанные подсистемы 1. [Предопределенные значения](docs/ПредопределенныеЗначения.md) 2. [Переопределения методов БСП](docs/ПереопределениеМетодовБСП.md) 3. [Пользовательские функции](docs/ПользовательскиеФункции.md) +4. [Загрузка файла через табличный документ](docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md) ## Порядок взаимодействия -Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Рассмотрим заполнение данных на нескольких примерах: +Взаимодействие с подсистемой будет отличаться для разных типов интеграции, но можно выделить общие шаги для любого типа: +1. После определения типа интеграции, необходимо заполнить информацию о настройках в справочниках подсистемы. Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Создание не предопределенных потоков допускается только в случае файловых обменов при использовании пользовательских функций; +2. Если это "предопределенная" интеграция (без использования пользовательской функции), то вызов должен быть обернут в запись в справочник истории интеграции для хранения в нем логов; +3. Подбор и реализация вызова нужного метода интеграции в зависимости от ее типа; +4. Пост-обработка полученного в п.3 результата вызова; +5. Запись лога обмена в справочник истории интеграции; + +### Заполнение предопределенных значений настроек + +Для заполнения предопределенных значений необходимо перейти в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый". В соответствующих объектам метаданных процедурах добавить строки в таблицу предопределенных по обязательным полям: +```bsl +Процедура ПредопределенныеЗначенияИнтегрируемыеСистемы(Таблица) Экспорт + + // Добавление + НоваяСистема = Таблица.Добавить(); + НоваяСистема.Наименование = "Система N"; + НоваяСистема.ИдентификаторНастройки = "СистемаN"; + // КонецДобавления + +КонецПроцедуры + +Процедура ПредопределенныеЗначенияНастройкиИнтеграции(Таблица) Экспорт + + // Добавление + НоваяНастройка = Таблица.Добавить(); + НоваяНастройка.Наименование = "Интеграция с системой N"; + НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияССистемойN"; + // Параметром передается идентификатор настройки интегрируемой системы + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("СистемаN"); + // Заполняем необходимый тип интеграции из предопределенных значений справочника, например "SFTP" + НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.SFTP; + // Указываем тип авторизации. Для большинства типов интеграций - это базовая. + // Для интеграций с типом "брокеры сообщений", "REST API" и "SOAP" доступна авторизация через bearer-токен (JWT-токен) + НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; + // КонецДобавления + +КонецПроцедуры + +Процедура ПредопределенныеЗначенияИнтеграционныеПотоки(Таблица) Экспорт + + // Добавление + НовыйМетод = Таблица.Добавить(); + НовыйМетод.Наименование = "Интеграционный поток системы N"; + НовыйМетод.ИдентификаторНастройки = "ИнтеграционныйПотокСистемыN"; + // Направление потока служит логическим разделением потоков по отношению к системе-корреспонденту: + // Исходящий - ИС-отправитель - наша система, ИС-получатель - сторонняя; + // Входящий - ИС-отправитель - сторонняя система, ИС-получатель - наша; + // Служебный - для служебных методов, по типу отправки оповещений / логов / очистки файлов и т.д. + НовыйМетод.НаправлениеПотока = Перечисления.пбп_НаправленияИнтеграционныхПотоков.Исходящий; + // КонецДобавления + +КонецПроцедуры +``` +Идентификатор настройки каждого объекта должен быть уникальным в рамках одного типа метаданных. +После инициализации и заполнения предопределенных элементов в коде, необходимо зайти в пользовательский режим в формы списков соответствующих справочников и нажать на кнопку "Заполнить предопределенные" в следующей последовательности: интегрируемые системы, настройки интеграции, интеграционные потоки: + +![image](images/ЗаполнениеПредопределенныхПодсистемыИнтеграции.png) + +### Служебный программный интерфейс + +Как видно из прошлого примера (заполнения предопределенных значений настройки интеграции), для поиска интегрируемой системы по идентификатору настройки вызывается метод общего модуля пбп_ИнтеграцииСлужебный. Помимо данной функции в этом модуле служебного программного интерфейса реализована следующая логика и методы: + +1. **Работа с историей интеграции**: +* ПолучитьСтруктуруЗаписиИстории - возвращает структуру со всеми необходимыми значениями для заполнения записи истории интеграции; +* СоздатьСообщениеИсторииИнтеграции - создает запись справочника История интеграции с информацией о событии интеграции (лог). В первом параматре передается заполненная структура, полученная из функции ПолучитьСтруктуруЗаписиИстории; +* ДобавитьЗаписьВПротоколОбмена - дополняет значение ключа "ПротоколОбмена" структуры строкой события через разделитель, полученной из функции ПолучитьСтруктуруЗаписиИстории. В первом параметре передается структура записи истории, во втором - текст добавляемого сообщения, в третьем - разделитель (по-умолчанию: '";" + Символы.ПС'); +* ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных - возвращает представление текста запроса для внешнего источника данных. Вместо имен параметров запроса в его тексте подставляются значения параметров. Первым параметром передается запрос, который необходимо конвертировать в строку; +2. **Работа с данными подсистемы**: +* ПолучитьСтруктуруНастроекИнтеграции - возвращает структуру со значениями реквизитов настроек интеграции, включая данные безопасного хранилища (логин, пароль / токен). В параметре указывается ссылка на настройку интеграции; +* ПолучитьСтруктуруПотокаИНастроекИнтеграции - аналогично предыдущей функции, но получает данные по интеграционному потоку, добавляя в структуру данные по точке входа. В параметр передается ссылка на интеграционный поток; +* ПолучитьСтруктуруПараметровВхода - возвращает структуру, полученную из реквизитов табличной части "ПараметрыВхода" интеграционного потока. Вторым параметром указывается заполнять значения по умолчанию для параметров или нет. В случае, если параметры заполняются по умолчанию, то каждой строке параметра будет выведено значение, заполненное в табличной части, конвертированное в JSON-формат (булево: "true" или "false"; дата: "yyyy-MM-dd" и т.д.). В противном случае, значение будет конвертировано в тип 1С, указанный в колонке "Тип" табличной части; +* ИнтеграционныйПоток - возвращает интеграционный поток по идентификатору настройки; +* ИнтегрируемаяСистема - возвращает интегрируемую систему по идентификатору настройки; +* НастройкаИнтеграции - возвращает настройку интеграции по идентификатору настройки; + +### Заполнение истории интеграции + +Рассмотрим заполнение данных на примерах по типам интеграций: + +### Файловые интеграции + +### Прямое подключение к базе данных + +### Вызов внешней процедуры + +### Брокеры сообщений #### Заполнение настроек для обмена через FTP-Сервер Заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: From 2d423be1d1c3e181eb7cc7760e9172938ffc29a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:25:58 +0000 Subject: [PATCH 13/27] Render PlantUML files --- docs/images/ERArchitectureIntegrationsSubsystem.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/images/ERArchitectureIntegrationsSubsystem.svg b/docs/images/ERArchitectureIntegrationsSubsystem.svg index 6c448a69..077d3a1a 100644 --- a/docs/images/ERArchitectureIntegrationsSubsystem.svg +++ b/docs/images/ERArchitectureIntegrationsSubsystem.svg @@ -1 +1 @@ -ER-Diagram integrations subsystemER-Diagram integrations subsystemСправочник: Интегрируемые системыУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия групп) : uuid «FK»ИдентификаторНастройки : строка (100)Справочник: Настройки интеграцииУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия групп) : uuid «FK»ИнтегрируемаяСистема : uuid «FK»ТипИнтеграции : uuid «FK»СтрокаПодключения : строка (100)Порт : строка (7)ВнешняяКомпонента : хранилище значенийУчетнаяЗапись : uuid «FK»ТипАвторизации : uuid «FK»ИдентификаторНастройки : строка (100)ИспользоватьПользовательскиеФункции : булевоИмя объекта : строка (100)ИзмененВручную : булевоИмяФайлаВнешнейКомпоненты : строка (100)Безопасное хранилищеСсылка : uuid «FK»Ключ : строка : "Логин", "Пароль", "Токен"Значение : строкаСправочник: Типы интеграцийУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия элементов) : uuid «FK»Справочник: Типы интеграций - предопределенные элементыФайловые обмены:КаталогFTP-ресурсыПочтовый клиентПрямое подключение к БД:-Вызов внешней процедуры:SOAPREST APICOMВнешняя компонентаКомандная строкаБрокеры сообщений:RabbitMqKafkaСправочник БСП: Учетные записи электронной почтыУникальныйИдентификатор : uuid «generated»Перечисление: Типы авторизацииБазоваяТокенСправочник: Интеграционные потокиУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия элементов) : uuid «FK»ИдентификаторНастройки : строка (100)НастройкаИнтеграции : uuid «FK»ТочкаВхода : строка (неогр)ПользовательскаяФункция : uuid «FK»ИзмененВручную : булевоПараметры входаНомерСтрокиИмя : строка (неогр)Тип : uuid «FK»ПараметрURL : булевоЗначениеПоУмолчанию : булево, строка, число, дата, любая ссылкаПолеОбъекта : строка (100)Перечисление: Методы запроса RESTGETPOSTPUTPATCHDELETEСправочник: Пользовательские функцииУникальныйИдентификатор : uuid «generated»Перечисление: Типы параметров интеграцийСтрокаЧислоБулевоNullМассивОбъектДатаСправочник: История интеграцииУникальныйИдентификатор : uuid «generated»Код : строка (36)ДатаИнтеграции : дата и времяДатаИнтеграцииВМиллисекундах : число (20, 0)ИнтегрируемаяСистема : uuid «FK»Статус : uuid «FK»ФорматИнтеграции : uuid «FK»ИсходящееСообщение : строка (неогр)ВходящееСообщение : строка (неогр)ОписаниеОшибки : строка (неогр)ПротоколОбмена : строка (неогр)ИнтеграционныйПоток : uuid «FK»Ошибка : булевоПользователь : uuid «FK»ДлительностьОбмена : число (5, 0)ДлительностьВызова : число (5, 0)Объекты интеграцииНомерСтрокиОбъектИнтеграции : любая ссылкаСозданОбновлен : uuid «FK»Перечисление: Статусы интеграцииВыгруженоЗагруженоОшибкаВыгрузкиОшибкаЗагрузкиПеречисление: Форматы интеграцииXMLJSONDBFCSVTXTXLS / XLSXBAT / SHDLLHTMLПроизвольныйФорматСправочник БСП: ПользователиУникальныйИдентификатор : uuid «generated»Перечисление: Создан обновленСозданОбновленРодительРодительИнтегрируемаяСистемаТипИнтеграцииХранение параметров подключенияУчетнаяЗаписьТипАвторизацииРодительНастройкаИнтеграцииПользовательскаяФункцияТип (параметры входа)ИнтегрируемаяСистемаСтатусФорматИнтеграцииИнтреграционныйПотокПользовательСозданОбновлен (объекты интеграции) \ No newline at end of file +ER-Diagram integrations subsystemER-Diagram integrations subsystemСправочник: Интегрируемые системыУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия групп) : uuid «FK»ИдентификаторНастройки : строка (100)Справочник: Настройки интеграцииУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия групп) : uuid «FK»ИнтегрируемаяСистема : uuid «FK»ТипИнтеграции : uuid «FK»СтрокаПодключения : строка (100)Порт : строка (7)ВнешняяКомпонента : хранилище значенийУчетнаяЗапись : uuid «FK»ТипАвторизации : uuid «FK»ИдентификаторНастройки : строка (100)ИспользоватьПользовательскиеФункции : булевоИмя объекта : строка (100)ИзмененВручную : булевоИмяФайлаВнешнейКомпоненты : строка (100)Безопасное хранилищеСсылка : uuid «FK»Ключ : строка : "Логин", "Пароль", "Токен"Значение : строкаСправочник: Типы интеграцийУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия элементов) : uuid «FK»Справочник: Типы интеграций - предопределенные элементыФайловые обмены:КаталогFTP-ресурсыПочтовый клиентПрямое подключение к БД:-Вызов внешней процедуры:SOAPREST APICOMВнешняя компонентаКомандная строкаБрокеры сообщений:RabbitMqKafkaСправочник БСП: Учетные записи электронной почтыУникальныйИдентификатор : uuid «generated»Перечисление: Типы авторизацииБазоваяТокенСправочник: Интеграционные потокиУникальныйИдентификатор : uuid «generated»Код : строка (9)Наименование : строка (100)Родитель (иерархия элементов) : uuid «FK»ИдентификаторНастройки : строка (100)НастройкаИнтеграции : uuid «FK»ТочкаВхода : строка (неогр)ПользовательскаяФункция : uuid «FK»ИзмененВручную : булевоНаправлениеПотока: uuid «FK»Параметры входаНомерСтрокиИмя : строка (неогр)Тип : uuid «FK»ПараметрURL : булевоЗначениеПоУмолчанию : булево, строка, число, дата, любая ссылкаПолеОбъекта : строка (100)Перечисление: Методы запроса RESTGETPOSTPUTPATCHDELETEСправочник: Пользовательские функцииУникальныйИдентификатор : uuid «generated»Перечисление: Типы параметров интеграцийСтрокаЧислоБулевоNullМассивОбъектДатаПеречисление: Направления интеграционных потоковИсходящийВходящийСлужебныйСправочник: История интеграцииУникальныйИдентификатор : uuid «generated»Код : строка (36)ДатаИнтеграции : дата и времяДатаИнтеграцииВМиллисекундах : число (20, 0)ИнтегрируемаяСистема : uuid «FK»Статус : uuid «FK»ФорматИнтеграции : uuid «FK»ИсходящееСообщение : строка (неогр)ВходящееСообщение : строка (неогр)ОписаниеОшибки : строка (неогр)ПротоколОбмена : строка (неогр)ИнтеграционныйПоток : uuid «FK»Ошибка : булевоПользователь : uuid «FK»ДлительностьОбмена : число (5, 0)ДлительностьВызова : число (5, 0)ИмяФайлаСообщения: Строка (150)ФайлСообщения: хранилище значенийОбъекты интеграцииНомерСтрокиОбъектИнтеграции : любая ссылкаСозданОбновлен : uuid «FK»Перечисление: Статусы интеграцииВыгруженоЗагруженоОшибкаВыгрузкиОшибкаЗагрузкиСлужебныйОшибкаСлужебногоПеречисление: Форматы интеграцииXMLJSONDBFCSVTXTXLS / XLSXBAT / SHDLLHTMLПроизвольныйФорматСправочник БСП: ПользователиУникальныйИдентификатор : uuid «generated»Перечисление: Создан обновленСозданОбновленРодительРодительИнтегрируемаяСистемаТипИнтеграцииХранение параметров подключенияУчетнаяЗаписьТипАвторизацииРодительНастройкаИнтеграцииПользовательскаяФункцияТип (параметры входа)НаправлениеПотокаИнтегрируемаяСистемаСтатусФорматИнтеграцииИнтреграционныйПотокПользовательСозданОбновлен (объекты интеграции) \ No newline at end of file From 7b2149b9c4ee8f2e2793ab8289e0c514ae10d049 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Thu, 14 Nov 2024 19:57:18 +0300 Subject: [PATCH 14/27] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit остались примеры вызовов... --- ...21\206\320\270\321\217\320\274\320\270.md" | 421 ++++++++---------- 1 file changed, 182 insertions(+), 239 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 322325eb..6a4a67b5 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -48,6 +48,7 @@ ## Ролевая модель Для создания и настройки объектов подсистемы управление интеграциями существует роль **пбп_РедактированиеНастроекИнтеграции**. + Для просмотра справочника истории интеграции существует роль **пбп_ПросмотрИсторииИнтеграции**. ## Связанные подсистемы @@ -72,43 +73,43 @@ ```bsl Процедура ПредопределенныеЗначенияИнтегрируемыеСистемы(Таблица) Экспорт - // Добавление - НоваяСистема = Таблица.Добавить(); - НоваяСистема.Наименование = "Система N"; - НоваяСистема.ИдентификаторНастройки = "СистемаN"; - // КонецДобавления + // Добавление + НоваяСистема = Таблица.Добавить(); + НоваяСистема.Наименование = "Система N"; + НоваяСистема.ИдентификаторНастройки = "СистемаN"; + // КонецДобавления КонецПроцедуры Процедура ПредопределенныеЗначенияНастройкиИнтеграции(Таблица) Экспорт - // Добавление - НоваяНастройка = Таблица.Добавить(); - НоваяНастройка.Наименование = "Интеграция с системой N"; - НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияССистемойN"; - // Параметром передается идентификатор настройки интегрируемой системы - НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("СистемаN"); - // Заполняем необходимый тип интеграции из предопределенных значений справочника, например "SFTP" - НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.SFTP; - // Указываем тип авторизации. Для большинства типов интеграций - это базовая. - // Для интеграций с типом "брокеры сообщений", "REST API" и "SOAP" доступна авторизация через bearer-токен (JWT-токен) - НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; - // КонецДобавления + // Добавление + НоваяНастройка = Таблица.Добавить(); + НоваяНастройка.Наименование = "Интеграция с системой N"; + НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияССистемойN"; + // Параметром передается идентификатор настройки интегрируемой системы + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("СистемаN"); + // Заполняем необходимый тип интеграции из предопределенных значений справочника, например "SFTP" + НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.SFTP; + // Указываем тип авторизации. Для большинства типов интеграций - это базовая. + // Для интеграций с типом "брокеры сообщений", "REST API" и "SOAP" доступна авторизация через bearer-токен (JWT-токен) + НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; + // КонецДобавления КонецПроцедуры Процедура ПредопределенныеЗначенияИнтеграционныеПотоки(Таблица) Экспорт - // Добавление - НовыйМетод = Таблица.Добавить(); - НовыйМетод.Наименование = "Интеграционный поток системы N"; - НовыйМетод.ИдентификаторНастройки = "ИнтеграционныйПотокСистемыN"; - // Направление потока служит логическим разделением потоков по отношению к системе-корреспонденту: - // Исходящий - ИС-отправитель - наша система, ИС-получатель - сторонняя; - // Входящий - ИС-отправитель - сторонняя система, ИС-получатель - наша; - // Служебный - для служебных методов, по типу отправки оповещений / логов / очистки файлов и т.д. - НовыйМетод.НаправлениеПотока = Перечисления.пбп_НаправленияИнтеграционныхПотоков.Исходящий; - // КонецДобавления + // Добавление + НовыйМетод = Таблица.Добавить(); + НовыйМетод.Наименование = "Интеграционный поток системы N"; + НовыйМетод.ИдентификаторНастройки = "ИнтеграционныйПотокСистемыN"; + // Направление потока служит логическим разделением потоков по отношению к системе-корреспонденту: + // Исходящий - ИС-отправитель - наша система, ИС-получатель - сторонняя; + // Входящий - ИС-отправитель - сторонняя система, ИС-получатель - наша; + // Служебный - для служебных методов, по типу отправки оповещений / логов / очистки файлов и т.д. + НовыйМетод.НаправлениеПотока = Перечисления.пбп_НаправленияИнтеграционныхПотоков.Исходящий; + // КонецДобавления КонецПроцедуры ``` @@ -136,231 +137,173 @@ ### Заполнение истории интеграции -Рассмотрим заполнение данных на примерах по типам интеграций: - -### Файловые интеграции - -### Прямое подключение к базе данных - -### Вызов внешней процедуры - -### Брокеры сообщений - -#### Заполнение настроек для обмена через FTP-Сервер -Заходим в общий модуль "пбп_ПредопределенныеЗначенияПереопределяемый" и добавляем следующий код: -1. В функции ПредопределенныеЗначенияИнтегрируемыеСистемы, необходимо добавить интегрируемую систему, с которой будет происходить взаимодействие - +Познакомившись со служебным программным интерфейсом подсистемы, можно приступить к инициализации и заполнению логов интеграции. Подразумевается, что каждый вызов в рамках обмена должен быть зафиксирован в истории интеграции. Исключением из данного правила могут являться только потоки с направлением "служебный". Информация этих потоков должна записываться в историю интеграции на усмотрение разработчика. +Для создания записи логов в методе, котором будем реализовывать вызов функций обмена, иницилизируем структуру записи истории интеграции и заполним ее информацией о вызове: ```bsl -Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт - - Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); - - // Добавление - НоваяСистема = Результат.Добавить(); - НоваяСистема.Наименование = "FTP-Сервер"; - НоваяСистема.ИдентификаторНастройки = "FTPСервер"; - // КонецДобавления - - Возврат Результат; - -КонецФункции -``` +Процедура ВыполнитьВыгрузкуИнтеграционныйПотокСистемыN() Экспорт -2. В функции ПредопределенныеЗначенияНастройкиИнтеграции, необходимо добавить настройки интеграции, по которым выполняется подключение к ранее добавленной системе, с указанием ссылки на интегрируемую систему + // Получаем интеграционный поток, по которому будет происходить вызов + ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ИнтеграционныйПотокСистемыN"); + РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, ТочкаВхода" + ); -```bsl -Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт - - Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); - - // Добавление - НоваяНастройка = Результат.Добавить(); - НоваяНастройка.Наименование = "Подключение к ftp-серверу"; - НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияЧерезFTP"; - НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( - "ИдентификаторНастройки", "FTPСервер"); // Идентификатор настройки интегрируемой системы - НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.FTP; - НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; - // КонецДобавления - - Возврат Результат; - -КонецФункции -``` + // Инициализируем структуру записии истории интеграции + СтруктураИстории = пбп_ИнтеграцииСлужебный.ПолучитьСтруктуруЗаписиИстории(); + СтруктураИстории.ИнтеграционныйПоток = ИнтеграционныйПоток; + СтруктураИстории.ИнтегрируемаяСистема = РеквизитыПотока.НастройкаИнтеграцииИнтегрируемаяСистема; + СтруктураИстории.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграции.TXT; -3. В функции ПредопределенныеЗначенияИнтеграционныеПотоки, необходимо добавить потоки с разделением по логике интегрируемого приложения. Например, для интеграции с FTP-сервером, где предусмотрена и загрузка, и отправка файлов, а на самом сервере есть разделение для входящих и исходящих сообщений, необходимо создать два потока, где в одном будет путь к каталогу входящих файлов на сервере, в другом - путь к каталогу исходящих файлов: + // Оборачиваем вызов метода интеграции в try-catch для записи исключения в логи + Попытка + ЗаголовокОшибки = "Не удалось сохранить файл на SFTP-сервере" + + // Вызов метода интеграции. + // ... + // Пост-обработка ответа + // ... + Исключение + // Функция возвращает конкатенированную строку из заголовка ошибки и подробного представления информации об ошибки из обработки ошибок + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + // Сохраняем описание ошибки в структуре истории + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + КонецПопытки; + + // Записываем полученную структуру в объект справочника история интеграции + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); -```bsl -Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт - - Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); - - // Добавление - НовыйМетод = Результат.Добавить(); - НовыйМетод.Наименование = "Отправка файлов на ftp-сервер"; - НовыйМетод.ИдентификаторНастройки = "ОтправкаФайловНаFTPСервер"; - - НовыйМетод = Результат.Добавить(); - НовыйМетод.Наименование = "Получение файлов с ftp-сервера"; - НовыйМетод.ИдентификаторНастройки = "ПолучениеФайловСFTPСервера"; - // КонецДобавления - - Возврат Результат; - -КонецФункции +КонецПроцедуры ``` -Для вышеуказанных справочников обязательных к заполнению реквизитами являются только "Наименование" и "ИдентификаторНастройки". Остальные реквизиты можно заполнить в пользовательском режиме. - -Реквизит "ИдентификаторНастройки" в каждом вышеуказанном справочнике является аналогом платформенного "ИмяПредопределенныхДанных" и должен быть ***уникальным в рамках одного справочника***! - - -После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. - -В элементе "Подключение к ftp-серверу" справочника настройки интеграции заполнить адрес/имя сервера подключения без указания протокола (например, 127.0.0.1) и порт (по-умолчанию 21 для ftp и 22 для sftp). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем от ftp-сервера. ***При записи справочника они будут помещены в безопасное хранилище***. - -В элементе "Отправка файлов на ftp-сервер" справочника интеграционных потоков необходимо указать путь к каталогу исходящих файлов на ftp-сервере. Например, /test/out. - -В элементе "Получение файлов с ftp-сервера" справочника интеграционных потоков необходимо указать путь к каталогу входящих файлов на ftp-сервере. Например, /test/in. - -#### Заполнение настроек для обмена через HTTP-сервис (только входящий поток). - -Допустим, мы должны сделать интеграцию с системой N через шину данных с использованием REST API. - -1. Интегрируемая система - +Рассмотрим подробно каждый ключ структуры записи истории, и, соответственно, реквизитный состав справочника истории интеграции: +1) ИнтеграционныйПоток - ссылка на справочник интеграционные потоки, по которому происходит вызов; +2) ВходящееСообщение - строка. Строковое представление входящих данных (ответ ИС-корреспондента или запрос к нашей системе, если инициатором выступает сторонняя система). Например, содержимое текстового файла, содержимое файла JSON, содержимое файла XML и так далее. Вид отображения сообщения регулируется типом формата интеграции. Для форматов интеграции XML и JSON реализованы html-поля для отображения текста в виде дерева или структуры; +3) ИсходящееСообщение - строка. Аналогично п.2; +4) ИнтегрируемаяСистема - ссылка на справочник интегрируемые системы. ИС, с которой происходит обмен; +5) ОписаниеОшибки - строка. Подробное описание ошибки обмена, в следствии которой он был прерван; +6) ПротоколОбмена - строка. Подробный строковый лог, в который необходимо сохранять данные об создаваемых / изменяемых объектах с однозначной идентификацией, данные о предупреждениях и ошибках, которые не прерывают обмен и т.д.. Например: ```bsl -Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт - - Результат = ТаблицаПредопределенныхИнтегрируемыеСистемы(); - - // Добавление - НоваяСистема = Результат.Добавить(); - НоваяСистема.Наименование = "Шина данных"; - НоваяСистема.ИдентификаторНастройки = "ШинаДанных"; - // КонецДобавления - - Возврат Результат; - -КонецФункции -``` - -2. Настройка интеграции +// В таблице значений ПолученнаяНоменклатура находятся данные о номенклатуре +Для Каждого СтрокаНоменклатуры Из ПолученнаяНоменклатура Цикл + Если ЗначениеЗаполнено(СтрокаНоменклатуры.Ссылка) Тогда + НоменклатураОбъект = СтрокаНоменклатуры.Ссылка.ПолучитьОбъект(); + + Попытка + НоменклатураОбъект.Заблокировать(); + Исключение + // Добавляем запись в протокол об ошибке блокировки + ТекстСообщения = СтрШаблон("ru = 'Номенклатура %1 не была обновлена по причине: не удалось заблокировать объект';", + СтрокаНоменклатуры.НаименованиеНоменклатуры); + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); + + Продолжить; + КонецПопытки; + Иначе + НоменклатураОбъект = Справочники.Номенклатура.СоздатьОбъект(); + КонецЕсли; + + // Заполнение объекта -```bsl -Функция ПредопределенныеЗначенияИнтегрируемыеСистемы() Экспорт - - Результат = ТаблицаПредопределенныхНастройкиИнтеграции(); - - // Добавление - НоваяНастройка = Результат.Добавить(); - НоваяНастройка.Наименование = "Подключение к шине данных"; - НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияЧерезШину"; - НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( - "ИдентификаторНастройки", "ШинаДанных"); // Идентификатор настройки интегрируемой системы - НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.RESTAPI; - НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; - // КонецДобавления - - Возврат Результат; - -КонецФункции + Попытка + НоменклатураОбъект.Записать(); + Исключение + // Добавляем запись в протокол об ошибке записи номенклатуры + ТекстСообщения = СтрШаблон("ru = 'Номенклатура %1 не была записана по причине: %2';", + СтрокаНоменклатуры.НаименованиеНоменклатуры, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); + КонецПопытки; +КонецЦикла; ``` - -3. Входящий поток: - +7) ДатаНачалаИнтеграции - текущая дата сеанса, время начала выполнения интеграционного потока; +8) ДлительностьВызова - время ответа системы-корреспондента. Перед вызовом необходимо зафиксировать время начала, после вызова заполнить длительность вызова как ТекущаяДатаСенса() - <время начала>, например: ```bsl -Функция ПредопределенныеЗначенияИнтеграционныеПотоки() Экспорт - - Результат = ТаблицаПредопределенныхИнтеграционныеПотоки(); - - // Добавление - НовыйМетод = Результат.Добавить(); - НовыйМетод.Наименование = "Получение товаров на складах из системы N"; - НовыйМетод.ИдентификаторНастройки = "ПолучениеТоваровНаСкладахИзСистемыN"; - // КонецДобавления - - Возврат Результат; - -КонецФункции +// Инициализируем время начала +НачалоВызова = ТекущаяДатаСеанса(); +// Производим вызов +Ответ = КоннекторHTTP.Get(, <Параметры запроса>); +// Фиксируем время вызова +СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; ``` +9) ФорматИнтеграции - перечисление, значение которого отражает содержимое текстов сообщений. Для обмена текстовыми файлами - TXT, для REST API - JSON, для SOAP - XML и т.д. Исключением является формат BATSH. При заполнении его в исходящем запросе заполняется команда/скрипт, который передается командной оболочке на исполнение, во входящем запросе - результат вызова команды. Если результатом вызова является перенаправление результата выполнения команды в файл (>, >>), то должно быть указано его содержимое в ключе ВходящееСообщение или заполнены ключи "ИмяФайлаСообщения" и "ФайлСообщения": в этом случае вместо поля со строкой на закладке входящее сообщение будет выведена гиперссылка с файлом, по нажатию которой файл можно сохранить в каталог; +10) ИмяФайлаСообщения - строка с именем файла, если в процессе интеграции передается файл, который нельзя конвертировать в строковое представление (например, файл Excel); +11) ФайлСообщения - файл в хранилище значения. Данные файла интеграции (например, файл Excel); +12) ОбрабатыватьСообщение - булево. Если Истина, то перед записью истории интеграции из исходящего и входящего сообщения будут очищены значения атрибутов (полей), длина которых превышает 1000 символов. + +### Реализованные методы + +Переходим к методам программного интерфейса, которые выполняют вызов к системе-корреспонденту + +1. **Файловые обмены (через локальный и сетевой каталог)**: +* *Раздел будет дополнен позже по мере разработки новых функций* +2. **Файловые обмены через FTP / SFTP (реализовано в отдельном модуле "пбп_ИнтеграцииFTPSFTP")**: +* ПараметрыСообщенияFTPSFTP - возвращает инициализированную структуру параметров сообщения обмена. Ключи: +- Путь - локальный полный путь файла сообщения; +- ИмяФайла - имя файла сообщения без расширения; +- Расширение - расширение файла сообщения обмена; +- РасширениеНаСервере - расширение файла сообщения обмена на сервере, если оно отличается от того расширения, которое необходимо передать / сохранить. Например, если на сервере csv-файл лежит без расширения, а его нужно получить с расширением "csv", то в ключе "Расширение" указывается "csv", а РасширениеНаСервере = "". Если расширения не отличаются, то РасширениеНаСервере должно быть равно Неопределено; +- ДвоичныеДанные - двоичные данные файла обмена. Если они указаны, а ключ "Путь" не заполнен, то при обмене путь будет заполнен адресом временного файла, по которому сохраняются двоичные данные файла; +* ПолучитьПараметрыПодключенияFTPSFTP - возвращает структуру настроек подключения к серверу из настроек интеграции (аналогично, ПолучитьСтруктуруНастроекИнтеграции, но с добавлением каталога входящего и каталога исходящего); +* ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока - устанавливает и возвращает FTPСоединение по интеграционному потоку. Если указан каталог исходящий, то он будет установлен соединению, как текущий каталог; +* ОтправитьСообщениеFTP - отправляет файл сообщения на FTP-сервер. Функции необходимо передать FTPСоединение, полученное в результате вызова функции "ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока" и параметры сообщения, полученные в результате заполнения структуры из функции ПараметрыСообщенияFTPSFTP. В случае ошибки возвращает строку с описание ошибки; +* ПрочитатьСообщениеFTP - аналогично ОтправитьСообщениеFTP, но получает файл на FTP-сервере. Прочитанный файл будет находится во временном каталоге, адрес которого будет указан в ключе "Путь"; +* ПроверитьФайлЕстьНаFTP - проверяет наличие файла в указанном каталоге на FTP-сервере. Возвращает Истина, если файл найден, в противном случае Ложь. Функции необходимо передать FTPСоединение, имя файла, каталог, в котором будет происходить поиск файла. Возможен поиск по точному совпадению и по началу строки. Для этого необходимо заполнить четвертый параметр "ПоТочномуСовпадению" (по-умолчанию, Истина); + +Далее идут методы взаимодействия с SFTP-сервером. Так как в платформе нет встроенных функций общения с SFTP-серверами, обмен с ними был реализован с помощью утилит системы, взаимодействие с которыми выполняется посредством выполнения скриптов командной оболочки. +Для взаимодействия с SFTP на ОС Linux используется одна из установленных утилит: +1) curl; +2) sshpass; +3) expect. +Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. + +Для отправки на ОС Windows будет использоваться WinSCP (*Находится в стадии разработки*). + +Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. + +* ОтправитьСообщениеSFTP - аналогично ОтправитьСообщениеFTP, но добавлен третий параметр на вход: СтруктураИстории; +* ПолучитьСодержимоеКаталогаSFTP - возвращает таблицу значений с колонками ИмяФайла и ДатаИзменения с соответствующими данными. Функции необходимо передать ссылку на интеграционный поток, каталог, содержимое которого нужно прочитать и структуру истории; +* ПроверитьФайлЕстьНаSFTP - аналогично ПроверитьФайлЕстьНаFTP, но добавлен третий параметр на вход: СтруктураИстории; +* ПрочитатьСообщениеSFTP - аналогично ПрочитатьСообщениеFTP, но добавлен третий параметр на вход: СтруктураИстории; +* УдалитьФайлSFTP - удаляет указанный файл с SFTP-сервера. Необходимо передать интеграционный поток, имя файла, который нужно удалить (если он известен, если нет, то необходимо сначала получить список файлов через ПолучитьСодержимоеКаталогаSFTP), каталог, где файл находится и структуру интеграции. В четвертом параметре указывается необходимо ли проверять наличие файла перед удалением. Если Истина, то при нахождении файла удаление будет продолжен, при ошибке поиска - будет возвращена строка с ошибкой. По-умолчанию файл проверяется перед удалением; +3. **Файловые обмены через почту**: +* *Раздел будет дополнен позже по мере разработки новых функций* +4. **Прямое подключение к БД**: +* УстановитьСоединениеСВнешнимИсточникомДанныхПоНастройкеИнтеграции - заполняет настройки подключения к внешнему источнику данных по настройке интеграции. Устанавливает параметры соединения пользователя и сеанса (аналогично управленю внешними источниками данных, но внутри подсистемы управления интеграциями); +* ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям - функция-обертка для выполнения простых запросов выборки данных из таблиц внешнего источника. Преимущество ее использования перед выполнением прямого запроса является то, что колонки таблицы значений, полученной в результате выполнения запроса, будут типизированными (данные о типах берутся из соответствующей колонки таблицы внешнего источника). В параметрах указывается интеграционный поток с заполненным именем таблицы внешнего источника (к ней будет обращен запрос), строка имен полей таблицы через запятую, которые необходимо выбрать, таблица параметров запроса с колонками: +- НаименованиеПоля - строка - наименование поля таблицы, по которому необходимо наложить условие; +- Оператор - строка - оператор сравнения поля таблицы и значения параметра ("=", ">" и т.д.); +- Значение - любой базовый тип - параметр запроса, с которым сравнивается значение поля таблицы, +а также количество первых записей: если не равно 0, то будет выбрано указанное количество первых строк ("ПЕРВЫЕ <КоличествоПервых>"), и структура истории. Если в переданном интеграционном потоке заполнены параметры входа, то они будут добавлены в запрос как отдельные предопределенные условия; +* ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника - возвращает инициализированную таблицу значений из таблицы внешнего источника по метаданным с типизированными колонками. Заполняется по имени внешнего источника, имени таблицы, и строке необходимых полей, заполненных через запятую (если не заполнено, то инициализируются все поля таблицы); +5. **COM**: +* *Раздел будет дополнен позже по мере разработки новых функций* +6. **REST API**: +* ПолучитьЗапросТекстомИзСоответствияJSON - конвертирует тело HTTP-запроса из соответствия в строку. На вход подается Структура или Соответствие с телом JSON; +* ПодготовитьТаблицуКодовОтветаHTTP - возвращает таблицу значений стандартных кодов ответа HTTP; +* РасшифровкаКодаСостоянияHTTP - возвращает строковую расшифровку кода состояния HTTP; +Для выполнения методов REST необходимо использовать методы общего модуля КоннекторHTTP. +7. **SOAP**: +* ОтформатироватьXMLЧерезDOM - форматирует XML запрос в строковом виде для удобного чтения. Если содержимое файла идет одной строкой, то оно будет преобразовано в многострочный файл. В параметрах функции передается исходная строка xml-текста и указатель использования отступов: если истина, то будут сформированы отступы в соответствии с правилами форматирования XML; +8. **Внешняя компонента**: +* *Раздел будет дополнен позже по мере разработки новых функций* +9. **Командная строка**: +* *Раздел будет дополнен позже по мере разработки новых функций* +10. **Брокеры сообщений**: +* *Раздел будет дополнен позже по мере разработки новых функций* +11. **Прочие функции**: +* ЗашифроватьBase64Сервер - возвращает строку, закодированную в base64. Функции необходимо передать исходную строку и кодировку текста (по-умолчанию, "UTF-8"); +* ДатаИзUnixTime - получает дату из UnixTime: ковентирует дату из числа секунд в дату; +* ПолучитьПодробноеПредставлениеОшибкиИсключения - формирует строку по шаблону "<Заголовок ошибки>. Подробно: <Подробное представление ошибки из обработки ошибок>". Заголовок ошибки передается в первом параметры функции, во втором параматре передается ИнформацияОбОшибке; + +Рассмотрим заполнение данных на примерах по типам интеграций. + +## Примеры вызова -После описания предопределенных значений в коде и обновления конфигурации, необходимо зайти в пользовательский режим и нажать на кнопку "Заполнить предопределенные" в формах списков справочников с указанной последовательностью: Интегрируемые системы, Настройки интеграции, Интеграционные потоки. - -В элементе "Подключение к шине данных" справочника настройки интеграции заполнить адрес/имя сервера, где находится шина данных с указанием протокола (например, http://192.100.0.1) и порт (например, 8080). Ниже в табличной части нажать на кнопку "Параметры аутентификации" и заполнить появившиеся строки с логином и паролем или JWT-токеном (bearer-токен), в зависимости от выбранного типа авторизации, от http-сервиса. ***При записи справочника они будут помещены в безопасное хранилище***. - -В элементе "Получение товаров на складах из системы N" справочника интеграционных потоков необходимо заполнить: -1. Ресурс, к которому будет происходить вызов. Например, /test/goods-in-warehouses (обороты по товарам на складах); -2. В таблице параметров запроса указать параметры, если они есть. Например, для текущего метода есть параметры запроса "from" (дата начала) и "to" (дата окончания): - - № | Имя | Тип | Параметр URL | ЗначениеПоУмолчанию | Поле объекта - --|-----|-----|--------------|---------------------|-------------- - 1 |from |Дата |Ложь |01.01.2024 | - 2 |to |Дата |Ложь |31.12.2024 | - -#### Заполнение настроек для обмена через прямое подключение к БД - - - -#### Заполнение настроек для внешней компоненты - - - -#### Заполнение настроек для командной строки - - - -#### Обмен данными между системами на базе 1С - -Для обмена данными между системами на базе 1С, посредством встроенных в БСП средств (правила обмена на базе 1С: Конвертации данных 2.0, правила обмена на базе 1С: Конвертации данных 3.0), необходимо создать только интеграционный поток, с наименованием, совпадающем с наименованием плана обмена (например, "Обмен с ЗУП 3.1"). Это необходимо для того, чтобы встроить типовой механизм обмена в механизм логирования подсистемы истории интеграции, посредством заполнения справочника истории интеграции. - -## Реализованные методы - -Рассмотрим программный интерфейс подсистемы управления интеграциями, выполненный в общем модуле **пбп_ИнтеграцииСервер**: - -1. Для того, чтобы создать запись в истории интеграции в коде, где происходит вызов, необходимо инициализировать структуру записи с помощью функции **ПолучитьСтруктуруЗаписиИстории** и сохранить ее в данные справочника после пост-обработки данных (для подсчета общего времени обмена) с помощью процедуры **СоздатьСообщениеИсторииИнтеграции**: - -**Пример записи истории интеграции:** - -```bsl -Процедура Тест(Знач Сессия) - - ИнтеграционныйПоток = Справочники.пбп_ИнтеграционныеПотоки.НайтиПоРеквизиту( - "ИдентификаторНастройки", "ПолучениеТоваровНаСкладахИзСистемыN"); +### Файловые интеграции - РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта(ИнтеграционныйПоток, - "ТочкаВхода, НастройкаИнтеграции, НастройкаИнтеграции.ИнтегрируемаяСистема"); - - СтруктураОтвета = пбп_ИнтеграцииСервер.ПолучитьСтруктуруЗаписиИстории(); - СтруктураОтвета.ИнтеграционныйПоток = ИнтеграционныйПоток; - СтруктураОтвета.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграций.JSON; - СтруктураОтвета.ИнтегрируемаяСистема = РеквизитыПотока.НастройкаИнтеграцииИнтегрируемаяСистема; +### Прямое подключение к базе данных - Попытка - - URL = "https://127.0.0.1:8080/test/goods-in-warehouses"; - ВремяНачалаВызова = ТекущаяДатаСеанса(); - ОтветHTTP = КоннекторHTTP.Get(URL, , , Сессия); - СтруктураОтвета.ДлительностьВызова = ТекущаяДатаСеанса() - ВремяНачалаВызова; - СтруктураОтвета.ЗапросВходящий = КоннекторHTTP.КакТекст(ОтветHTTP); - - Если ОтветHTTP.КодСостояния < 300 Тогда - // ... - Иначе - ТекстСообщения = СтрШаблон("ru = 'Код состояния %1: %2'", ОтветHTTP.КодСостояния, - пбп_ИнтеграцииСервер.РасшифровкаКодаСостоянияHTTP(ОтветHTTP.КодСостояния)); - СтруктураОтвета.ОписаниеОшибки = НСтр(ТекстСообщения); - КонецЕсли; - - Исключение - - ТекстСообщения = "ru = 'Ошибка при получении компонентов из JIRA'"; - СтруктураОтвета.ОписаниеОшибки = пбп_ОбщегоНазначенияСервер.ПолучениеПолногоТекстаОшибкиПриИсключении( - НСтр(ТекстСообщения), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ПолучитьСообщенияПользователю(Истина)); - - КонецПопытки; - - пбп_ИнтеграцииСервер.СоздатьСообщениеИсторииИнтеграции(СтруктураОтвета, Истина); +### Вызов внешней процедуры -КонецПроцедуры -``` +### Брокеры сообщений From 988bc6ec12e01e46a822dcfc7847e5b4ad9a0be0 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 13:35:57 +0300 Subject: [PATCH 15/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20FTP=20=D0=B8=20SFTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 149 ++++++++++++++++-- 1 file changed, 134 insertions(+), 15 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 6a4a67b5..aa47be27 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -159,15 +159,15 @@ ЗаголовокОшибки = "Не удалось сохранить файл на SFTP-сервере" // Вызов метода интеграции. - // ... + // ... // Пост-обработка ответа - // ... + // ... Исключение // Функция возвращает конкатенированную строку из заголовка ошибки и подробного представления информации об ошибки из обработки ошибок СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( ЗаголовокОшибки, ИнформацияОбОшибке()); - // Сохраняем описание ошибки в структуре истории - СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + // Сохраняем описание ошибки в структуре истории + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; КонецПопытки; // Записываем полученную структуру в объект справочника история интеграции @@ -189,16 +189,16 @@ Если ЗначениеЗаполнено(СтрокаНоменклатуры.Ссылка) Тогда НоменклатураОбъект = СтрокаНоменклатуры.Ссылка.ПолучитьОбъект(); - Попытка - НоменклатураОбъект.Заблокировать(); + Попытка + НоменклатураОбъект.Заблокировать(); Исключение - // Добавляем запись в протокол об ошибке блокировки + // Добавляем запись в протокол об ошибке блокировки ТекстСообщения = СтрШаблон("ru = 'Номенклатура %1 не была обновлена по причине: не удалось заблокировать объект';", - СтрокаНоменклатуры.НаименованиеНоменклатуры); - пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); + СтрокаНоменклатуры.НаименованиеНоменклатуры); + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); - Продолжить; - КонецПопытки; + Продолжить; + КонецПопытки; Иначе НоменклатураОбъект = Справочники.Номенклатура.СоздатьОбъект(); КонецЕсли; @@ -208,10 +208,10 @@ Попытка НоменклатураОбъект.Записать(); Исключение - // Добавляем запись в протокол об ошибке записи номенклатуры + // Добавляем запись в протокол об ошибке записи номенклатуры ТекстСообщения = СтрШаблон("ru = 'Номенклатура %1 не была записана по причине: %2';", - СтрокаНоменклатуры.НаименованиеНоменклатуры, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); + СтрокаНоменклатуры.НаименованиеНоменклатуры, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); КонецПопытки; КонецЦикла; ``` @@ -267,7 +267,7 @@ * ПрочитатьСообщениеSFTP - аналогично ПрочитатьСообщениеFTP, но добавлен третий параметр на вход: СтруктураИстории; * УдалитьФайлSFTP - удаляет указанный файл с SFTP-сервера. Необходимо передать интеграционный поток, имя файла, который нужно удалить (если он известен, если нет, то необходимо сначала получить список файлов через ПолучитьСодержимоеКаталогаSFTP), каталог, где файл находится и структуру интеграции. В четвертом параметре указывается необходимо ли проверять наличие файла перед удалением. Если Истина, то при нахождении файла удаление будет продолжен, при ошибке поиска - будет возвращена строка с ошибкой. По-умолчанию файл проверяется перед удалением; 3. **Файловые обмены через почту**: -* *Раздел будет дополнен позже по мере разработки новых функций* +Реализовано через функции БСП. При внедрении подсистемы в конфигурацию с БСП, в определяемом типе "пбп_УчетныеЗаписиЭлектроннойПочты" необходимо указать СправочникСсылка.УчетныеЗаписиЭлектроннойПочты. Пример реализации см. 4. **Прямое подключение к БД**: * УстановитьСоединениеСВнешнимИсточникомДанныхПоНастройкеИнтеграции - заполняет настройки подключения к внешнему источнику данных по настройке интеграции. Устанавливает параметры соединения пользователя и сеанса (аналогично управленю внешними источниками данных, но внутри подсистемы управления интеграциями); * ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям - функция-обертка для выполнения простых запросов выборки данных из таблиц внешнего источника. Преимущество ее использования перед выполнением прямого запроса является то, что колонки таблицы значений, полученной в результате выполнения запроса, будут типизированными (данные о типах берутся из соответствующей колонки таблицы внешнего источника). В параметрах указывается интеграционный поток с заполненным именем таблицы внешнего источника (к ней будет обращен запрос), строка имен полей таблицы через запятую, которые необходимо выбрать, таблица параметров запроса с колонками: @@ -300,10 +300,129 @@ ## Примеры вызова +В этой главе находятся примеры вызова функций программного интерфейса для произведения обмена с ИС-корреспондентом по типам интеграций. Подразумевается, что мы уже создали предопределенные элементы и объявили структуру истории интеграции: она будет находится в переменной СтруктураИстории. + ### Файловые интеграции +#### Локальный или сетевой каталог + +*Раздел будет дополнен позже по мере разработки новых функций* + +#### FTP + +Для обмена с FTP введем условность, что вызов обмена будет происходить с сервера, а на серверныый метод с клиента передается описание помещенного файла на сервер. + +```bsl +&НаКлиенте +Процедура ПослеПомещенияФайлаНаСерверFTP(ОписаниеПомещенногоФайла, Знач ДополнительныеПараметры) Экспорт + + ПомещенныйФайл = ОписаниеПомещенногоФайла.СсылкаНаФайл.Файл; + + ОтправитьФайлНаFTP(ОписаниеПомещенногоФайла.Адрес, ПомещенныйФайл.ИмяБезРасширения, ПомещенныйФайл.Расширение); + +КонецПроцедуры + +&НаСервере +Процедура ОтправитьФайлНаFTP(АдресФайла, ИмяБезРасширения, Расширение) + + // Объявление и заполнение структуры истории + + // Заполняем параметры сообщения + ПараметрыСообщения = пбп_ИнтеграцииFTPSFTP.ПараметрыСообщенияFTPSFTP(); + + ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресФайла); + ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); + ДвоичныеДанныеФайла.Записать(ИмяФайла); + + ПараметрыСообщения.Путь = ИмяФайла; + ПараметрыСообщения.ИмяФайла = ИмяБезРасширения; + ПараметрыСообщения.Расширение = Расширение; + + ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ПередачаФайлаНаFTPСервер"); + + // Выполняем подключение к FTP-серверу + FTPСоединение = пбп_ИнтеграцииСервер.ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока(ИнтеграционныйПоток); + + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ОтправитьСообщениеFTP(FTPСоединение, ПараметрыСообщения); + + // При получении файла с FTP адрес файла будет находится в ПараметрыСообщения.Путь. Перед удалением необходимо выполнить пост-обработку + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ПараметрыСообщения.Путь); + + Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + КонецЕсли; + + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); + +КонецПроцедуры +``` + +#### SFTP + +Для обмена с SFTP подразумевается, что файл есть на SFTP-сервере. Для избежания ошибок пути исходящего и входящего каталогов должны быть со слэшом "/" в начале и конце. + +```bsl +Функция ПолучитьФайлОбменаСSFTPСервера(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории) + + ПараметрыСообщения = пбп_ИнтеграцииFTPSFTP.ПараметрыСообщенияFTPSFTP(); + ПараметрыСообщения.ИмяФайла = ИмяФайла; + Если СтрНайти(ИмяФайла, ".") > 0 Тогда + ИмяРасширение = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФайла, "."); + ПараметрыСообщения.Расширение = ИмяРасширение[1]; + КонецЕсли; + + // Получаем сообщением с SFTP-сервера + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПрочитатьСообщениеSFTP( + ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории); + // Файл не был получен из-за ошибки + Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); + Возврат; + КонецЕсли; + + // Пост-обработка файла + ЧтениеФайла = Новый ЧтениеТекста(ПараметрыСообщения.Путь); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + Пока ТекущаяСтрока <> Неопределено Цикл + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + + // Записываем строку прочитанного файла в протокол + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекущаяСтрока); + КонецЦикла; + + ЧтениеФайла.Закрыть(); + + // Удаляем созданный временный файл + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ПараметрыСообщения.Путь); + + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); + +КонецФункции +``` + +#### Почтовый клиент + ### Прямое подключение к базе данных ### Вызов внешней процедуры +*Раздел будет дополнен позже по мере разработки новых функций* + +#### COM + +*Раздел будет дополнен позже по мере разработки новых функций* + +#### REST API + +#### SOAP + +#### Внешняя компонента + +*Раздел будет дополнен позже по мере разработки новых функций* + +#### Командная строка + ### Брокеры сообщений + +*Раздел будет дополнен позже по мере разработки новых функций* \ No newline at end of file From 622e059961b5c72c9a229f29b03b09047f7acbc2 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 13:46:04 +0300 Subject: [PATCH 16/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D1=81=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=BE=D0=B9=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20=D0=BD=D0=B0=20=D0=BF=D0=BE=D1=87?= =?UTF-8?q?=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index aa47be27..dd97d63a 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -364,6 +364,8 @@ ```bsl Функция ПолучитьФайлОбменаСSFTPСервера(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории) + // Объявление и заполнение структуры истории + ПараметрыСообщения = пбп_ИнтеграцииFTPSFTP.ПараметрыСообщенияFTPSFTP(); ПараметрыСообщения.ИмяФайла = ИмяФайла; Если СтрНайти(ИмяФайла, ".") > 0 Тогда @@ -403,6 +405,50 @@ #### Почтовый клиент +Подразумевается, что учетная запись электронной почты уже заполнена, и ссылка на нее указана в настройках интеграции + +```bsl +Процедура ОтправитьПисьмоНаПочту() + + // Объявление и заполнение структуры истории + + ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ОтправкаСообщенияНаПочту"); + РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции.УчетнаяЗапись"); + + Попытка + ПолучателиПисьма = Новый Массив; + ПолучателиПисьма.Добавить("test@gmail.com"); + + ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение; + ПочтовоеСообщение.Тема = "Отправка письма на почту"; + + ТекстПисьма = НСтр("ru = 'Письмо успешно доставлено на указанную почту!'"); + + ПочтовоеСообщение.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст); + + Для Каждого СтрокаЗначение Из ПолучателиПисьма Цикл + ПочтовоеСообщение.Получатели.Добавить(СтрокаЗначение); + КонецЦикла; + + РезультатОтправки = РаботаСПочтовымиСообщениями.ОтправитьПисьмо( + РеквизитыПотока.НастройкаИнтеграцииУчетнаяЗапись, ПочтовоеСообщение); + + ТекстСообщения = СтрШаблон("Сообщение обмена отправленно от указанной в настройках почты %1", + РеквизитыПотока.НастройкаИнтеграцииУчетнаяЗапись.АдресЭлектроннойПочты); + + пбп_ИнтеграцииСлужебный.ДобавитьЗаписьВПротоколОбмена(СтруктураИстории, ТекстСообщения); + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + КонецПопытки; + + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); + +КонецПроцедуры +``` + ### Прямое подключение к базе данных ### Вызов внешней процедуры From 6774283a4ba9becd038b74b7429d5b3afc575eec Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 15:38:24 +0300 Subject: [PATCH 17/27] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D1=82=D0=B0=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=92=D0=98=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...321\200\320\260\321\206\320\270\320\270.png" | Bin 0 -> 74974 bytes ...\321\206\320\270\321\217\320\274\320\270.md" | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 "docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\263\320\276\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\224\320\260\320\275\320\275\321\213\321\205\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" diff --git "a/docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\263\320\276\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\224\320\260\320\275\320\275\321\213\321\205\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" "b/docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\263\320\276\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\224\320\260\320\275\320\275\321\213\321\205\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..df07e54b0dfa23b92789d8e94dba746c30b97738 GIT binary patch literal 74974 zcmZ^L1z4QP5+ET24Nh<;I6;EDLvVt-ySux)1$PUs!QI{6b#NHm^(Omv-`m~0gO8d1 ztGm4IudXIkR$3Gu78@1}3=CfEn~)qB*n501FmPCCND!nPHU$a{?46paprEXnpdg{F zowbpvg&`OiMXX~?oA~?hNP!dm-+CeHswAt?(FNj>^hsD4^giaRciYxiR^L`2Ggk9{;bu^& zI*K@gGK{y?eXka<$X3;~O|t!+UjjLclD63+hwaR+2B11b7HSCIls}p-Qi* zLKl4?wC%_5!;OzuXK${{_-o8*kRG38R#<%YN;xKG`VWqg z>FNGoXbz@E{~xs9HUB~TL$Cj^kZ3&2U%ztw!RG&}`JbTw z!Bn(2v=g+p1R*-`{Ld|aBLBVe--v&(RQVrER(7_(v;14l-!Olxz#(I23gV{w+lD+0 zTy*~z?9cXGbiWP!H-rDjn}0w-?&N{xqWf>x;DLSW#@Yh|;{y{D;#Y8acaj06^Qmus z;H~M9n<#R<#X(j`wj_+_-L7uWIv-!JAF&g^2Qhlp9fF=<_4&2@R&fypq1?}JbcZqP zXKfqoHJlBktW7Xt6zuPRtYu_8rY*JE?~RT=e$i;0L|_o$gNA-bLkWt}d65!>KJpLK{t5m|8oo7@suf_>k_EBL>=&cZ zf01Xh0H<-O`V=YJV+AGW_FtNRAj{H02%Q&UjK+ohsnDN1O_Cv0R=PwWqJvc5R{3N5!vJ6wTGMO4w&SFHFzR&s23%G-8dXk63jH`Mo3%(y-vqC!g<0 zT|AvqS%ChMd6j1rXX8>hlS~}g$iDA(yFWmR5OXwRu~;nco@*b%2zwbN(IUKA%X+EF zt*&<$S}poSO~H@@Yo5mzMr>}YwkT+5zb|rCQX5jT%3y;ptl8jYX1>*)?dI$kInNZ_ zKOS#*B9ia~cEWtq*&okn1lF%imaDV2zCIog-=1w~H(hWukmLJupmMo1tasr)?tQGU`su#D1 z*m@O})rsVPM?CTnC4i5;WM|XMiz_<3=IE$nN`|_>(Et|fPuH)ywk*d3mOx;hvTz=H z`|ba|gc51kPY)|<5q%EV-B&|TziTc6)}P+bg% z`|kHbpU$WDxGc(P6kgxO12_04^w3^<>-bt&rm7OvE(YFh>HwcRl@gm*QNeG-eLjRg zoplhfuG+lsk0yvdKesU)h`{pyo+q*u$+}*&@cd1$PB42M0&#qOz0G|pM-a;Jp;bxB z1b*pFF9f_tRNMZt z0=quXqw2!phYqLbx!q@1dzG7;h5NHO(#DtDl{QyXms5zRx`n+Gg1NV+}_Vx7OXyJ`l(l*-voa>AWAKJvXYiTnP%scN<&* znzhteZ5Bl|@S|e~be*<6F*uy3P`!TQeT}FGauQE^hBcB{V*8h8R+AI^Te$x4_vyqH zN;}QD@YyqjA=~T*N@vnZ0|DN z6h|ucAn6+`T4>cT*)cjQ z@#A3mwO5=sXW`sOW}G*7{zW^Bye311gUCUF9Bp?sXPbFh6}wF{!cFS3DbsUTm+XDb zvthrz+KEe6V@uKpOuBTRuRZ>(-q7c-kN~udGb!yXR%7T4eIAZ=MkVcyeGUgjkBIB9 z7X3ef9td0;b8jZ(qFKB!B zJ?v*`FAU{qcX%llR2z+@QoSfFyf^=G+I&pQb-Sp4u+mVeehyq|07P+~cJ?6hp6q!s zVThJrP*6|^DJeOzkHnc=?TsOi%0mubvbQMiu#yiPpy5mLm%zHOI42``tGc1&q|E|M2w}v(BC;DQ&oi?=#@0{;j&bx=M(|1dY8Z)#6 zCQSUi%K+_G!PW0zFj-DevIEvXuxg0{3vdu{DLQFV&2cf1LVbMb)9uGG!z7$dGMcUq zT`#Bc?{~Y;;6*vFszH5lYm~Hemp3?5zTPboX2aQ@?u!u7QpxkuF9iLQ5Zzriv&^VV z*=HVZ>z(M0N{&{ZquYuNxc1hGCdu~mt!sy8ToIg!yHFegdrO2TNBg_jH0nFA!YqVT zQMsSwyZW&TS-T6^V-y-Mj= z+WJn>$bJZ67hMAS9DbJ~snk_xbHo%~ zRKTu9eQ_;4t70V0#W%V!jzac>lwj6vfcA8C7I!L{`vSJb!?87$2g%N2I!WI=d=?8c}Tzh6ny>5e!?zn|FObk*Q>c@EY-#={z z-UR#iO}?rNkHOfvK&aUY#7PM#aB(D6Af{Q`cmNb&ICEEOuDV71CGFG+Bd(3 z4uN-l#??DHMF&VmQfXm_sO0_wwsR^K*h@0D#ooiVWCfai^(U+#`G<{aYk*y!5rV3+Y()RW*y{g_Kt+Se8_BHO&yk4l~ z+yy1vXxFp%x1%tU^n>k~@5yelqYXQZ*_RjS-aJ3N;V;8@PqS#W6t~w+O|aglIJ=(e zijfhqq%b*=Cfm-yyBs_qetSX|v1~`eN%Z#BdZF#w$4T#Wa4)%hxUI`jP@Leonk1bQ z1+d>VJo;P0aQm3iY}Dfnz1=~!KN<42X)ot7RVggly>8;S4{m_hKe8iauch2)d08JS zFlSL^v8qkwtygNzUp_qZ+@(avW&&KNu?h-1VhP&b;hv%1*(s-`L1~M+)Dn?;@N&6G zlNfkjQOw6ud1a9x(vr{fJ-6LjJG4A&Y20^maj}|n-M-x>rfnWMIy!yUC2k2qICqsw>|KoG)%pmS%`N zsy2ION>vVAc49@%6c0B22d0u#eop06S()^!{dBaHJD~Z(t(zL3g>tkEMOE+9`wCPrM z&yRryJ9P`hONmDm19gB3$1Amr=L4S#bBJl+q03Qm%A-=?fMTf<5h){PausJv-In$j7n^(q(NrIMfQ_J+!A~1kU5PYUu1GTTD$oDKcJQ{>IZbVV))v_>){zyGe1Y(*5pqaDuM0%YT>I zl;dz+FgR}h>7Ao1oRqJN-mAxyiwT<@moCgf;Er13reD>H_v;nGPoT+6P=Nhc8V8T_ zE+}!rqT^y^c*DqGa0zd>o1;L{V(Y$C#7r$__gjms0`J4~cKm3y^G#?!(=Cw>t-@?o zIb5Ym)$oj#TXrTq4wACZIwNqyv_?@yY z$E$YXrzu8c%L_sK^@^bW$}-pE^F`B2{L-m)T6SQKBJ43$Bin|@6qZn`@4RG9S2)kjZhiQxOq38O#cawjsq_8kVoBe z`ej>ZG?!Hb1z@SFQz|7psVnEWN7SDfobAWd`m6X8jq$3FXrUAzBev{M&sci9lgMOy zTeR*sH&k<{PXL0q#2qWa+br*yQ##p1Gqf%i>M)vj!*Uo1l-}OH!5D?v6Zh&D&ub0Y zZmst(4~8TT(h|2g6ceH^ z59N2EYpuH^?9bp0xW+RW-9JBS|6WDo`msgAbj9XZJI@AgVA{pBbS**U%?ULkUTl(n zvNw7HHG%S&%X@#TjKJ8!1`%@Vwh>9x<0P1R{(NC(vKxp}XM+N5n#F>ZAKxkmQrE(m z!Nsmym(0&wUCjtxfFIPeHumd!MeWbIl=`He?&h?kwZ2o(ey9iL`!e7y-WB>ciT(_3 zifkbk+LT$209)>*W=_5SdlL^F*zkTU7b&6&bKYq8+;p`+X=s;naj|(oUWk$XS)Hv* zhHaROo6<6B@nrfT$l>q+6ImM8Jn|DYi*m9d_k_({3GnC@8(V6u@P3@<$%6HbE3EId zjEItze1Va`XwZ7yOT8R*ilp=PwJV=HtgAmuxk$4|V;{PObgxHP>avGqA%oMofUD?K z`DgKGPu4iOBTo*0!v?~Ve8E1N^p7cDR*KoUY_o7NUjnou(7m-&5?IVSSryJCIzc%$CAaK4eA9xhvCnna3T_zK z@VR7H>${gj`+TK(R1q}(FB|L^%~%9Y4#4ww44qf|3B4;LV{+98g^5)7Ra&z?1=-h4 z9l%=G1QV|WvumcqdWji%!d#6EmxDk8E~`apYk9@JA+z3L6XFG;j~8P3tD`U}gOUd* zHm}~tfLQ^WGKb79FD??3N*WJs+8<|LcPSvSVSW3;F-pB+(K+rjN*bo-QW3`dFwz(5 z3Iq!sY35xHYNPvXkLSzHV%g0(_Qo^d)`4a>M{{+V32LZZwIX>TB6k36tZ-)b2Cl~< z5yG*u;7Q`f?c8oVY~-ukYTij&#&XfMcTam57o87VOem>3Ds=4BRF?kJgF=#x*`!Kz z8B*=y=W_$$lX{zALXO8rqzaDdz@3zGU6&)vn8*;dcXkU3LdYqnc zFjviPiNZ&a_VFyj7eg{vm{@qwMl}RWr{TN0gJq5gdU358Z_er%FG*sOslv?Xm`Cc| z-YEIPj^K(PS|S=~<*rmx6@-a-Wg7wb_cpuI0cF}jcZFKJ8b9Rt#ZPvcN)vk2`Eb%1 z_s~ai2m<8A>ve8;N-x$T{Pb{F>j*sQFoTMOg3r`AFH#8@KMbf5X6QW{txAR`{|N7y zIy+jiJ(ITvUv4G2a&nFuEy>cW=$z7diZmi-PT)` z+`n90pm$WRdfe=P!L!8xCue+zk2Wg+mGq-<`zmP|>LaF&WcXUlyh~O0<~ZkBZ<%V% z?6{KW>X zUUhSeI%MTo_9c3?eR6~M%Y1)|G7XFuRqA-TRgXVe=O36W0e4-mDcyPiKJyj39?-Vr zQ1EJ9=FBXRbUvzRBu5Dbo485U+WVH9tF@;qv+}x|+>x(eWOHz$UO2;OxdRQe7V;J1 z&&XiVPbL;CE%+pVz%p}lQB9Bl-0-^B=-R(^kK2ekj7hV9kT+5OIKj+%l9PKTZ!%tC zKfF|_^*;Mdd7f6w?T}QBt~Q|-FUf8aR?2eL`stRT_nx`6?fgYe^~ZMV_q39$>*X2T zMiDK4`?mfqLpP%h?|oCX0bBT>kB2b4GL8{$^E9%{so44Qv?0@GjV+h7BF{8ejAIjW zj#=b*X>`DV7bS(?8}v|D_Vy!_(gl}`cOUUwO7zEqwBQ_%umsy4@0{{DCej+%7T1#Q zTz?NVMD0df73~*S3DMO+K0%V~I_%a0{ln>>1Nrx$ody&f-b|s4vN^~HGrPj4?6E0h&(;TgTSkvRAz>6_{Byzcx)w>A49~CX}-L79~G}*5Bq7Ts?p|Qb$ zEPVz=EHDL=`-z~8iVH63V}z)L_kw4kS~qVl>nWbO;5fnAb|RJxVR?)`8&txa^=cZq_| zcV&9R(cXnrSBxeW&Yu~Qrinf77rl{?umabO)AvwR!M_5_K8fd9I?b5K6n|R|94v-g zLYu}7C8_NH=`V1;ziK;3Nl7>stodNOQa(s3vM>`DCo&sE93!l~L<=L)TdwI$biTl9 z^X8{)D?9WHGWuyEqZy3DH(p7PJkWteW%aPD~q_H;#_ zZ#w!%FeBq%;1^I@28SY6hHlq=--Wm2#z_vDQ487{+~5W1RBM0IW}_nz6s9Hcy2QFX zaE+=(BX%dZtn}DozGt2(aWc8wkLZn|pCmyx-|)c1;dxy~?z5I?7cpNB(dmq=p?(vn zB?)ki>%d3c-~vB3eOd)~qLS=u#gaciUFKS(Z6>e;U!gcYzADeFEXgqOt}V)+cB_aB zW+ZN?3E0f2GJXpRjed)Osk9I{qn{s5Ai(6%i+-=ZPb=B47RC02Tvfh2d*XV9UU_zA zPXej^0HG!~i;ZI3e8FZ>c$e}*zdd9$^%S}A^I>>Q*_)$ngLSuC1fa;R28Fk#MuC@u z3wnR#%XU1TH%p?LC_4(=84$m+1uZV;4P33NGCXyTFQ6H!h?%8q_nfH}3(a~p5AuN9 zdj7nbtW>y-tZ(C5XAE*8oY&*NN^N9{qJQy~rdW*e#;`X%9d|eQg>Wl1puX@U+Ou{i}C{mIueeMVY2Mh8E!s!3wl_Jyv~9j-g$Oh@xUXmuS}U z{V3x^&&v-hrNjnNBUDiqDyFLb2t=#3h;?K5pJxo|CEL_@h4sft^Uw@{B#}1Z7OxWl zUNwW$u>;NgSx>dv39@b?jk?0v=-_zur#-1y+esJc<^D8gsg>bo?6&XM9i~ZT4@{4| zmIi(1R4OEm21CZ;0L+ErpXO+D9M)1#^{ir-19!Ezpg}2H%HSy_^Glor9@P>I>NBQe zi%qA3hU-vY!cAsC~M==I)a-qzXg}7^Y7Xl7e(RG?;pEQK+|mHta=iy<}6y7IJY98Ag|?n zB>g8hLwFH0H4gEx@XlklppP7Q7oQz$z%3rq*Y5G3bUSbh9{W85+C1(lmW9c~ly;4& zOV2RSS@O8|NG^K90voRrtIaYXDibi-FVLUq3|S#3BS=r>${wxWCwh59lMEmV%RIW3 z={F$R-x2Rui1b^DL?QpGQaWHgayyDC1f-5Y%^=+7K!5r8B?<8jA7eX@`IsKqZ;vdJ zp^^3loQOz@!RZoke|u)3VJ8j|$y9R~Fep#k@B76XkcnfONdg?~Wtl*anqplI>Ue!b zGrogS;Gurj4;6(4x=b%-?$w7YumF`hSxRapO(jZ(Cl;fe9PU5FxGuoU+)QmZmfbrrY*LSL(yM?0027eZmGOw_G5{@!^eRd z&GU6GerWa^Nssy|RRWG)Ro1cI?wjKAM+)V)0vQ?StJE{;mSgGKJjmI2I<6NyOHe?Y zeVM@1KIh>ahRt2a-b04dj-A;cy>Z51DvC|@d8fKl7Z%Thb%GA*V$Dr={mR~Ep)C(t zEiMA#I_1gY5#ghHRp%CwgAH3-J=`r){F1<8v4H*5huKWQ=PH9G^qUto( zve3rD#)VBSAYk3)c)t#Fo;5LG+yLzninv&muJvw7z44^qmg&t1V;JFAj1?E}khfRZ z)f4&Q0n*%?wu|=_k8#@(=kAf{27T1+Uy-VdEUZCsD8)VX(v)PwlVPaL0xst5q=wQ!~b|O{osh3d?@`i9s^b_?d z9q0i;wf%WoE3@5!aHh?VQ#jPZ)s_R&PsrHPUrIl7v=4aIztxP4>y}tgQ$l-k`+?Vd zv9=qe9MF=}Q&!sWK97?)dCAKIw!k7T)&K*SmomkSEi%abr5R6#u9M1V@~2HpxC38* zF~1fx?(~detZgxl3kp9}t-uXtShoNA`O}GWg=Uy;<+6V;+G!#WwO+&osMa+lzBQOg z9SlR3=2unD!3%Zr@Nf*wAYNIr#$#0tEIN=GZr;5`K=!(Yxk_4WXcjt_9N09j!Fl`0 zA%Y*_fhJG!iws}1(e7c4*xSNBVeUd zK2hm3B|70Yd+NQkueq@jmA`eXJ+nAwV#=|0neO;n;@0kINnXG^@HF0*Img&D5&6J% z;Bk0-$>q>A>QW|@QC6eaIG`;a8TxkNT|a)={8YNES$I4y+QKojKr15UI?@4Jv@^66 zfqm{Ho4B?(J7T!i+2r@V*Ya*QsLS_Ej z>%O`BW2QB*j%6;a4jXT!pnn-ZBJR@Y!f;jlpuvHzU-Y*(wAXzl|R_H5YfKSyAnsLZ_9;+Ew(`Sd+d3-Q3u=!-=PT$nX=;2#rO%VC;M7z zQ4bN57rf-l3IC|I=U+AL*KQUO`~a&iP32L6d4yE_xr~D2>I+t?^!EJk)szcSYb&KB z8?rq&_*Yl#;{HFPRv(_tFg&lzM1fZLmi&8GcDln|DHXxIYd%uOXA=#T!2C-$qw);h zh&)E^b(e$Z)GeC+sU<2&=Ni1?%4qu-JK*qIR!y6${la1MLY9+bL8T_wM&DUgf^$@24`__&76*`0T2Pe7)fAvqVxU0j@=RNLO+t<`|LRa#UECnc_ zb?I^hd&=Vl2^YHBvV;qNb9w@OfAhq|IL|_vWg(An4l=r#n*RpwZ zlx`xa>F*R9zDVd~fC@9LyTFHO^AFd{zNl1J157nzCa69}gTrcyrnJv)+7St^7|KVY zR+)SdapRrdGae6@;^Yoo9jGVsoFx?LIZLW6#@OSyOwhcR%~;&cbwAHQ?+yi*b&vz@ zr!w=;b9Yba&h;D?4W$|7>1t8Sd7Kx4(F~WT>}J64z&tp?t)C)m*B;#^>T&*rj?S6FnZ)8`b>P{>|~_Gq;r_v9V#cn5=j z6QqQK@_T&zJu3^faVJjV8x&FzPj$}P4h6)2leK=U26`w$1^-p5n4y#KE%2{2u0LyR zND2Ldso~i%!2d}yTN*lK^EsodXsQ zPWa$FC#6cKzbrWg^PhrD%EHWkJJ*p4PCi0LGMWRBw*NyQXkg@nYkw6(*JQNbx|1yX#DhTe&3P#!f&s47>#NT>D z8Hx%1Q*S045S-~8lCbYzw!Pu!gNT02rZN4y2SLLIQW^w@TnEd){}*ST->x8tCx!o) z1v+6MW*r|$z69Ht>`O;vTyw#~!XjCYh-zryo@(EJ$j$Ye>`hc(P-SBPG^i=ID;M4a zwt}?QYAB zFhbXXJHhirlUf^UmVHo4d+UqGX|n-%3vRNv7Pi3c{59xL_ZC!`r4`!u+2cR6`2Tby zhy9&`)%{!}tDzB5xV{9+vGEM8fpq#z=1Or5<(9cbV1H*ha9McD|MXBv%*KZKWhCxX zjRvnE(vV1gvz3ybiO{q_WEmNHBBiruhJurdrtwnTY&CtS3|`uz-0b&(q(kH01>7Ka zCoz3TUXG$|b9dFE<}9;NmgfhohmhLcqT`-5|eRTkGw! zY^N;rIfLmI3rl*+tkdBUI1dGHEcC1PQg=+O zd+II+gU5_qzA;@{&!RWE#*=K2yeJtx$V=Th)NrkhUdvjfpD>LaM{I2VP}DgeV(Q^M zbuTD&b!lEu_S($cIHAweDCb&@PJVWHaanf`U>u3nWgaFtv+k{|)E{*#{iQW_dF(d5 z)e~_bi(;`O-!S9A=-oe4LJc#>dd$%0U^nZp>fI7)k*mRZA=j~G%mWray%|?*p|(S{ptRCMQr*_x<}eBi`g6<-{plgHT9F? zsao(#7Di}Q75%8^MH4JwFqY(EHG*0J*LmHWF4O&#T}VDUdFH$|lfyMA6+01U zO2E|UvDP{t^V8nW=HqeYKw>RDv*AgC@I;K8vm(l-{#bT(w*6WLbazIOLEZ;e8$ z@T{QaT*;?(cboW2R>OX%BNbd-<t`CXm3 zUhe^oR~N-0kr8}u&9>ZEygy`>l!Bh{T@mj#yg9e^eR;jKLZNu>zXzHN+hv&ZSkw~+ z1O#lB?^k@kC=wdwt=Jtzq<72acuAb~_1H~lKwfQUMW@q>aFC$+eHO@i#wHqAF9&tK z?oQA>d|hOBk(8LI^LXtXlb9GZ>T_;)r#a(zZgRHYU&nI=NZr^L`J9aMrqnw(_wr3P zTm6r|63(zZkYUe5e-xbgp0=``_RD3p7Aoij4%-X(i011m5KiViGcIL4db?nsjU zDO^LT(;l}+-)_fK?8^D;(;1+Y_p8EqsfSl)`)gIX?_St z+$HpTC_(%-z z5gZNqDX!=34K}-$69DZV;_98eXq$;OI{ASoq5$FMq%#v7DKlvJwFa|L^e#gtw&OCg zaCSMI9>E7vQp}shx2;@>{mq}cKiP!jYx>6@qd4*xa^0(VPd)EZH8{2`KAy<Ajv|{zMGRH%OPC-&4EO5p+(O^07e&nzQ3jLXArnVBpI3+K z4dSyuN0E*9DTGo5Z5Oq*JXFkdL+ZoSMWY!Pxalk#Z!HXdIwQRC=jOt*fl%~>t-wmJ zg7F=1`gAlV#F*@h&1oSGrUDEt?+4>+9CyS$1cctBEbso=0VP>c2Q=wCq6ZX|Fv~A$ z`tz-6$limSIWvgE=L08CJhTIOFE~HGqoXOEJ;01y4uns52j(omE8f&xq$#vAJaMmH zT^m+GKoYHG22`V3_1BTCKB%+>xVxOX>_7&v9TmQ3Fan)|33!$*AT;N=2k<(ZKrAbFqOB!8Vp?uHf<_##93Y`U-XyuappfGNADBvUwDV@(Oub2HN~ z&uQgLUy~6JvDn$%@7_9VedVWfpCG#eXBniZ(153oJuwoO^(~w3z`vxM^+xXX#D-VH zb49ALdtkp%!`)OP;A@;yMe_^P^9#mgYZ4@d=wB-{Ij=83Pr3AqdVMx1<>6rM2~9Yi zneeRjiVWuCR>C|VhoetVPmfe2>}+i1%uM8=asuS79pj97`k^={V0M$wRQCR{(^rzN zdam4F+KJ`Fi8EoPsJ|e;X*2NYGr7*$x?Dg|P_DK1Jj?e1-Y!HLZswYF7XJO1+^>MI zOf+Z-Sjv!kdU{A$he#hBV$ATo-(IXidARGyLAhKz7Py{5)11fJE*zRn8-i%;(W^%jh zahqx{;x4yfST5Jv*0z*%r!8F_+SCI33Wa)q{JEX-MNRjyr)W!r)4PfG@dmI!OFVpl zX<}kA9gmzJLR&=nj=K!GhGJm`D}x@{ZuH#>78q28jAmkjbmGfCIJ_P>LU*48i=BpA z!O^=lFLxrv4$+ZMMiEjqsTL?3AD}i_AN%3wAtw@_;7P?6vB~m8zSxh+a!2!@-znK! z@su^0;tL$}i(IaVgNkm*Ij1FbO=r=ka(+VBt85Z{_aPJW8k8K%A9n}0oB3foba17M z$a1MHPEwNC$raX<9QJd>xpp9*SnayXncx-!iZHQJ=m6SuGf~P^haN%JcorY$BaY*? z?nNHghirX;k703e)hSHGDX+1$a{ZIZNLq%q_k4CiX-mSw6k%badPNybG+x>81C#Bl zNGyi&x;iTq9+&4Gro+<`E}vHxHA@NeDP7t=5E1uDAXFsZr-#w8k^3f#ux}$&Cv;_9 zw%YY5X}D|!c19DFx?8R!Zq4n}^{~&p$w)cEQo`84?T2&@{D77~XULtNQVX0P>yCL) z=aEWyFNFiwzcXY_M6+15?-TP?2r`1$=aoWo;)6`iFD1eaH$XKVGa}KHROzUq<$hs2 z6MIvjlLoJ8rg$2&_i8mlt}r4$J;tCyOsRO!_eDQ0xB_WcxG8=p#e=e{J)XHz1PlzF zfR>Z_w5e)+P>z<%81z_Ji{2viXyywWZL>acF8BJoVMZ7-3$@hL=&qW`+gQK?uF_eb zK=v2{@2~Zv1rap?92(5^`VTx$CyW-@^Y6|)k|Jtk%!6g_-lDtj%9vUM3ka3wD-;Vf zUlr!Gm?}eJ-c!wDb;Bd? zw3=XE1FU5glpobQFra^k12-36+;c29n~K;z;Ro9Cl$s*9Y^7n;)Ij>J`M$S-Hzsk` zN}Kwn+1fmD=MpKZr{{|zWYu`a_$d^5U$>4vvrx%)XPhl(d&ed=pI_&P<$~tJat7$s zKS4Obc_h)&%q&to;`M<2a9{Il5QiJy97nuBrael3i>SiN#a6zT?oCJe7^OpLcE zvT)am3Vo2JiC@%}Fl$)x*QD@2L0)dF;5=*o78;!^zBoJ{PP#@uV`D`c)VQwuq4I|Ml7=Z3gbhGFQ@x{ob4pr9g8956&pE zt0aqclENNSK;ot9b$^3F{{j)yX&+Dp)t76T~yPTlQ0^?nCzbM zcb0*9X!d#vH2^=!qJd!X48C{E#cl@_sPu`4iDjLmTr4EY?OzJhHJ?uk1^KX`nv;YE)J9_%RbmFU}b^L%R!_iU? z9E&Z?Jv-Di(d9}Ag$QhAUiwD)vD;dmxT?j4*H7&|iAjkB9CNUM+Hm#b>QV+uZMz%$YwD?7lsw z*hXc3RW}9e_S2uOP)bKn6UBEGGL^mseg3@Le4e0aYmVKJ=CnsLB7@H@rn*Aj7Hu>8 zTJDBea14jEZS8PrG}?&%?AwK*HK8PLeVWRMSDmhS)H#;S@Lu2OORi>?o#H^6bKTKo zeeMJ8PL@dL+Vc$6Z3-iKkt1rjDYB=D30pbFmMO!meQD5EMtQTdHC*O)z5=PyBB{iD zV>y4ZNc<EB7gQ81Y*(=0(67HeL}7 z$uVY37{OU`T&IrM^!qi;oT+G!&9l)ZYyMpcxJw-K<7TD%uky&nb#$^>=RI+JU)LQSJM@Va9eENjUxsO(!Mz$to?wgKx7|r`CWhrj+kbzM` z_#%d+(Oio}*WQTfyy}(`C4$$Kk!5FtGq=H5%UvsFihb&C2n&8#?RNN+V9wp2IX*K; zJFwTRTNzwA`7KcpC6 z!sOIM`Da{eGoNs?!DdU~>HY#xs)%`76r49Sl~SqlxVpf~pjH%5zNIc;Y_0M5X#?FnasPYUbj?24kvh(?T^w4Fzia>Tg}J#O6gjzyPpVL*K(h+j>EvnwXIJR z3eP@T-*c{C0#bOJDzrT3nd#;*cccH>%|QzAG2!2+OwCQX%<9)mpX8ggz4s2O>g!}= zu;F9v#XFwHwSHiq=lbmV*WOtmn;+F?&SmxiI~r0-4OaUO!X)=K-t==?DLuK zpRqn{@OQ{u*aBZ9u>KJ`4CrJaBlH_!r~nhw`g>rE51I+$cStWlE%EDLhWj&OsV|u= z;uqY(>wTpx=?D#7b2N$4@z-kfhrHxCzSuDM{QUgnIKdor(e$PEy>b7D#CF>LCLzkl z2PPmWNR)T4xIn|Gr!*=V@y}qRNfCtED$ZV1twRBhSxu}R+`Io;?{^&j2)QV>KhI4p z#QN{x-)*ote(UN67jyY96gNUbKT&SJ#Ls`TD9v z_?Kh{Ah^lF7rx=<;!DoQr@NFNyJ^a)9eB8eSu=s=$DF3h^ z=mPBT0BlYJ7-h#lITu0w4#2)Q5EJ;9w;aIV%|Yof`&-aQ2hK$c2tfOqp+YkYUeiav z&PDNq|266UAr~$uI5QHLPgxns{bAZdmH7hgu&&nzWa{DkO$z-2gS1?IBFX`Z3MnktfbcSRbj#tRkj_Kfkcmr$_e<-_`Pmz5Z+HmAymz6wfL`yIe29Pfu^oC=rid>28{H~B#i|6rhlYld*=%!H+UVNvyMb!7e;W+4 zSiWJ8s1>g`dKKfX zIv2TE2f3>OjZ6COB@T28LU}S@4E58>a-BJY+qDT(FGlb8?fA{V41>+}?vR%)jW6;; z^wFtV->Z5ZZ2xSrr{a;5J5_EjxXmzSp$_PZA)8%(MEf^9Fje;LGFt zm~WvYzeicl#l5Y*wa44b-5|SM_H&>xYj+4T34QCn^^x1`*w)b^i)|^#srYeOly>{* zhBFv#>UMB{B#!>+wZC|t-Hg9f!V_zyQBhtLFXP(zMvW+D&_}F@Us7!u=npJV!eENh; zArq~Y0|QNlXI(R$zgr8_G-F)u0XjTV7<4YeV!2we-Eue#fr6x-o!wZi&ci+O6X5At z5&4YQU9XTw`9Uqh+M-qpI{%WXFOrca3?PB{xh3IPsQDgr!AQ}mZn6tI2DDr1{T=|i zgq$?Y@j*>}yHPi@>i^L8kI|Ji-5)O8v7L^yqwd%p+v?c1ZQFJ_=-9SxJL%Zy*!J0d z-_QNv|BiQz^W}WVm+ZCIu9~yfs;X=L<}AXz3$vWyUC*<+&6uTKJRAGn5S}^i&r}CS1qN2A7`uhL&-Y7^rduuE>cImJ{QVYx-pu!p*BhCTs_@>6Sdn2IJ!Sa)o`#7%*XJy!x5D^bs`{y@Zu@##{H>Cej~iMb=0tPD0$8a&%*x8o!h zYDd!^J~#+XW2;*@zAmo%wv(%aEFb3%#a{ntg^;-`*Y6i$WSQh-)3&PrDOS;aCD^Sb zHr+BC@Z-6aLlodT?*(~YcFFtzBMt6=?msjm72fJ@iB}tL+n~t@RxL-RuRL3A&I-YN?I52&7K<@t{)~!&s7^e zv2US0o&Az_Xyg=H)Ele=Dy38sASQ9A1)ip8sRz##a1Hib2NUm+mXh&6%eawoKPY;; z(QgVgpe(UNF?l;hXr2k9w%rrQsDr~b%;@?Nio zpVIua(~iwK8|nFQiX7>!^$i)b=Cevv?e56p*yTee;^D%`a8Z-}kt=Qx?!E2sq6`s($xHGT*f7_Rc@iXC`_#ONa0=uGOepO6+mmTGN#A|`+uw$j{b z(daIjES}K`W*V<^cSr7nK^|S z6&*#J?yB3raCMo{yS->Gk^v^LKDzILh-98+zre4_Y-6K`AmU$h;J?nv@D8+Hbe{Zp zHA>bB21X;-CMtMnqXjP6T2E0d)OWXIfE5mQyFT9N%m^f=J3Kz|e7yRYm(FGLM*-(% zs@JI$Iib(Hnc7N=<>Fh2nzGskAtGO>#!@DY6dj))f6#LK^Rf{1W1G|qwoQTow_60{ zG8?ZqQtPtv^72>LV^xHd$;@q3#tf~+(1w~jrNbq0)m>pI|Ct_6<-1psT z4<8C?vmYX|oV!s-H%Y<7Y~4s8W7M!gyQy|*V7C2G4_Sgz$@KAbv zj=Ar06ZN-u*Hy<*E?#YTwB`;qQvR8OU*IM=BN zHOR!0p~GYE*$Tgs(V(E|BeP*48RcPMMn(N`r&4bjFZu*6Z0Wjgm1kM^%XZ3S5te>R z>1W=fs@Rq^mrS2Q&kqFN>9lV;CyoucIwuYb&XKsRlXepiYyf=T5Eo|ZdbjUW%-T~- zZY$|5-%KX+&73XpR$*H))si9F#5LQ!Q`2Ic^h z4@+Rl7yS1IGW?BI=9p4Z5u6O?`@VOLdip?sbVAj`8CBt{Wq~8&v8mXNeEGT6TC-eB zLE(>C=I?PLcq@6G3kZSh8Sle&s|_d%&<1O}FXeu=Q+eO;@p%uTZie0N;HT`WuYxd( z5)#ovb$lk2BA%T(TRgcMqIR{LCXq?i>rHb;_4_Nw_Q#tL#~z$`*4NYbZ3lDSlm|s# zuDs{3p6vIas#||F;82TI`{wjrr= zQ>n~DyY4Yn?B3Ep*V(NyLP}>HqC%!Rv>e_JUw*Ndf({e>v#>-+=X3Jr)OurNSv(1! z(&odX(y|q$tEV#;VwW5zx_*QgHzcd;M{4@(w_FYNZOyk+PidJ8Z+U%}wwnyTa&#YCjaJs~zUBrPdXvqHTm zq9DRnw#bFuB;BS9T$VU$O>I3-F{EDL`6wsd`#@g#l3((I!Mpn&&?K@|lqFAp!(gEI zQVkNv)H`NVU^TvsBlG zHPxvr>9Z3Vi4O?#19MSeb6J*ti9uM8h?p7^R5bl`R=gkcYD@K)`Rlk6WUF0G9PMhy zBY2REI)$U)Ksa0FKvrpk=nbxH%jnV!MIo4>FZXIeH1+YMO7WJnqTzU*Z1!BC%>}=| zX>+gS5zw5}@)ky|j;0{jGKr5Krl4*^R*7xB=G2laKobf*X`9$4OfvhJcs_8eM(GX? z1?b;;Ct}Of3A8V^=48~rI-}zi`^C)dao=Az#S@`n-7-LPC`#a!4^ZsftT7NRXwXGk z)b^-oH3s3oa4(p1;y%9detTvIxFS}qvrlN)bR=aY>d`=SX)d{cmx1HO;~UD0DOZ{a zb_v?`Jn>l3`p;_1*9P4D8n?8s`JJ?_aIovH^uo@yE5(bE;OuyoqIR+ zi-XdJa3bO!jB!APR>2MS+*Dd$?(WeIP#oI&@r~WjA7b`2l04iiYY=P{98j9=^Lay} z9p#I*i9}xcG4j%31|z9m3zJh#`v3eD?ao|@fVaT`R=OsPp|SY=L=KwA(f4+U*C3EG zVFyGGsHm5gl$+cvEA1bWR3etZM7Wj*(dmAF4B}ED6A*;TRh0w=XCe?jLuOIr-~e%ubZ6R2tQdBLPn4+LsLNa*R2?+UM` z^V5b78*rXY9cAx^n{GN0^#D>3-^)ZqpjOOpBevbvY4zGrx+6ZwXUnU@U>V+0+jO!0 zK8d=X=>j?mFb$lm4FsG#IkIb36KIp2f4z&Z>vCYf-&$*Cz6+XJ!QxJN9=$$}j!D9= zeB94tB?Zv0I8lAML{?|wuykdpE4VqT(9B$G@X3g#4KeA=c(_wr$Cp7r>Nwf;!6p$R%a-CXw3Wv;imz;Pnc+W!koBE;|s0von(!)pU^dU2tXFtERFcii1} zc@iVDvn2zyZQ|Y2y3H&|VdsTf{SuT1O!;RsxO9|g^hgrFX`%yGcoHHAS#y;i4=b~jJpUjUQsr7-}GB+;|g@6F*J={$T3x(_0zqFqMyp*t80P2HK z)AMS;>E2c)4x;5>ZxAvfkn{eJyG0#y+cKNYPBI}FwL@T~4FO=DZ%>8}!%*-iI4>ZR zk${#I6Dv-TOvlQ#%|O>8{tP-4{mFs@sEGP1FjP|pDz5g&3byj7TXE*^UfY|gXam)S zd3L*l#Ey8oum(9XCw?b+m65>y3oGw@22DcVI#O~f7%cyy*7Ei5ae(0a>7z4UY|hm! zpPQb(8f1R_N=K+Nq&5AV)PLw|6Y@*Q{~B#85a`Mw7@Z*bPycIZ+gBi-+s1%||=6k*u`}A-avS~Ls*NaU{KQU&O z&pm`lOe?a&`OlE~9RuH@y-&uH&#b|~4X7Q7h^_%owTux71o?UZF4>y@h8NUUecW!% zsuRs^7;2>{?|Bv*M$yAX>1l#Zm5>D3l6W&Dkbawb#^)oOegbzrX(jM}1hMe`K(JUS zm%9%@;^7k#5&|RdK)*7DQJnW)D1QP3Ksq@@to+KVr(^D{s3rdSSI3z0MT>9VxWYp}z)g*uS~<8)yc;5tuU*Bbf{Cl|)TJ*)cZYw- zlMZu?Rwd+3CkhTFrKhifOMK7kVd3rGG>tK~GdL>Iv#3er<1SY=|7Izbz%Sa^tv6Q+ zmnh$6ShkwuE&Z5e+`hngM2)64-@kNy_@h?2mGGw#nG3M0RNnTNS`O_Yhuurv%%u?m zjk&}dn~f&bpyUuB?B@IVC$W?UhIEG zC1Q1aFL<8N1uNUJiLBI1T|(VsTu*r2ZcT14qVfog?++i7d!9~Yu@4lNU>kSabif!a z=M(t&NGqGSHS;Ui{I&$q&toClyxD#0syaZ9Zll^-41#-Wk3VdSPh)GzB$|!N{B4i& zk&uy>psiN!`&Vpqx>L2J-!nRnWiLOe>I1ml>-B~-gCM3lE7a9TH@H)njsSbtHq5E} zSw7Jgl`UFY1VDg<^LRIl(+kL(i#&{>ah_;C_~X<@~js*=a&o zD3f-2r#{5%e*3lgwAP}=#HMsKV6MZ{dl@WwA65&4#R|jcMB*SGnHn23N*sh{ zo*3uOFbscKvD=N+N~|~?j@!K)CXtz`N|{V%V4jG}R6DoZwJxpo)U=lIsa&jly58GA zo?-@wdP_-v-|!(YD6w2l`$@8SzVFygFN1gG`eSv@fVonm!CW{mc}VxM7RL>}3i!?f z1~gt+ExUnr#(-fxHS1K{`-HU@nbVO5-rZ%o-4`3~?_OzBDwicPq%;#Ln&~N~?PaKF zXiClX_4?@S=h)Un(H>@Oa(z$W`(LgUcc%o^>zoZ{lT^9^mSRXm-Xfx3=w9K`pU^T+ zHQQfLZ&L2NxzgRu$qYYgL1nn_&>OY5K0#j>@lTKgmhu5@+e37`LnKIDK~Mzg zk;U?yy(1XUF9C2v2bMHMA#pMREeaQINKI?ksE`@h{`fwXgX`Zi2X3aO_$~Rr;6OF? zkGo(JGO|J29gU zB%!&nyIL$zN2b5iOP|dFe0*L}Fyc6Fj)#5|r7-fGEv!;J=m+}pcTdT~^3J*$;@9ZT z^x9Ng?lU^=Udtt1?sHBsRNH|fT8|7sQTgyYiqZEjSPhM*e$#`alx_UVTq@=s{mv%q zk9Y<;!$^jG;`0I`Y$P}$uUHatb%>B)_m*IzH+`ff`|2}xbr^-2H}XJ0#72(gvVO%_ z*>xZVPk<5hLF-M>B%Kih0e3F!n&^QLv?rP)tjan5(j{#DR2^tcn9PKiy!nWF-u3Yf zo|glJk( zB(neRVN)zT^DeZGpy%wSE002$2KhklJhv7r&(lowayUw%*wdypsp{_Gf{1e|<~8MA z>;}zz#7X`c^ty?{d$-Q)n3F0A9kP2jON4!Bp3SHC=NCF(u-3oJ6 z!srOJQw3&1tppe%90@1ZUSguZ`)0!V+CC3p_|%@R`=drc02Me!M|7j7{J$kXp-NH@ zT$)(yPm-Cn#N61<3^?Z(782(xA#Xex!*qJt1&=;BO}&bB8A#2f)w7Y+mDCK9u&`jj zVbbUidyihl2sbpYw>?SK~@fmTtYplX@;mGr`A67$@NEFAdk3BVonDvOTQeXnt&#@XbaSF^QKJ3 zv#C*4`?bWK(@K7RzQm&cUqaH&&d0Zh&Ck8-xUBLXJiky16GdWOX~ZASwdUU%Z(pyN zV*qEo)mfQwl0zLgB2n^-FAq0dgqsLMM)@-$5XZ-2dDjP1%t633cpT;zJYY3w7pKZ= zPr9UJDdGJxYTGMs8>3AfHTotGYH|h-t9ycLj3SrJ&cs!xvtVr!$2lohz2o^3X(>1( z{{zVo@T}Kk&k2n`JM~8qzK4^?rtLI~N{4ai?P=yS-lre-eYXwHXX*uB?|uu_<5|2} z#?Nb_-w;d#&%dy8rKpl57{u@+Qjiei<=i0a6Metw6GU%f+`Cu~I5FW7q-+N5k98M> zL&W<+N(k{Dbfj8W@hPvEB!G@ro?+RNU)RIA>BHngax0I#miPT9)wdQfKk(i-)5u&Z zSh!+xALJ`OEoAi15JGA~w(Or#z+1rgwGp+D`9ne5V99qnMk$F~q3tVu`3OM-hP}wX zjTrv^D0O!?W*pfgj{DL+T2$CpR;JzYP;oA)(ovdex|}m|=ncimn`@C6K(k!7x!7q) zVlkludkDUg;^+P}(-mhI832ouLE39HmeMP{$>hhM@!1-|GzIseSZkGE111OSH>|GunlMX#Q8OwhnJAq(>+BM} zm%MN)x*E%B;$o43>7c&8apFKvg(E?pn@gLRS0IZwcD( zVkVdp44K}h@(x;HGqY^9K3ylE=~>`_N1WtbqS_wseOQvv^fS*&ey&lU88Q}(6QLvV z5|B|a+`Gx;vdS+ALw6b#^zfoH`K3X$6UDk7#e>8xhJilZq;}tV4)>_N2B+!qv$}L9 z7{`T+l7yH8zs`(urrphkh%%f5;^-+wNFjMGz%@YT;e362cXv0F`eC3r9XeN({P(@E zu<(e%o#5^GrrQBNI9q0g5SdtTf{Br+!EQJ+^zDuC!VLV;HQGUcsIJJMH+q<#@Ut;( zF8;O?@)4hYiTypEx(|aplfY_Y+(ELq#&4q6Gz@#%-AjhDATjJca(?!^l7o)rBW>xU z@)>)FrVxwl|X zYtXD=jFJJzkZY6^q(s_k(+^5zM?EWy{1AF+4H-O|cVM-lJ> zghlGm6GZW$nW3>c-&^o|K)j>*Kl2rh<@?1ZSZiJrF1W&{XTxU~8$r}<)Hn7yNClOu zD7h~5TQ_(=RHVLN05gH$1cTx2WPW>*c7vzzVS@^qZaLjtIIVZ0c7^n9lC?xO z>waiDo==0)(LH~nv2jNRVX2E`Z!Ek-dO@p%Z6c(I79lqS=@2VPI*FnAeo`a$sO)~h?~>(qp?qhTt>Gc?*7x-w7NP66P_FO| zy-=fdfQ5RB-TR}8W0zW-?GDy6Hy6ec?UgyRc9U6J;dF45py6ayHGb|(V?QR@eWrkb zIFDo8?bmqpz%v5;fzS|+X$jhEyhl?*YFd`jCb|-m=T1EiYBv+W0I9UBl9!to`fjXlf)y^(v|@i&l&U z=LRwN7yU{59~Ic3Bpk}AMMdit7}UbzrPs!c4`Btp--vTn+xQJACoi+sIXs&s@Thdr`}~@cVWfi`2bVl zlYLPYWzi+#+JvRrZ=f0&#PzuS_^^UtDxw2M=W~s3*|Z)3?G+e#*P&U>fXZOix)mn< z#CCIs%2A^>^*GEO>WYzUxkZPo$vTlV@=H`H4;)cI*o|7m9(qCYW+(&= zRS7-#G1!q5Tisq_37&%=HLJxoX@Mpxcbkzh#~nf~#s~%0@iW>lj0zdV{`TiX(~kQ6 zG~aM7bnUZw+$+%K%lW$Rh8?5|&~72W#p$Bx1=@c}L~1{Hh^2-r<>+}{hZ7T4Mp&=6 zivP^Q=8wp1(+W~@7#uw*a5&&q8WwOx96+b836{X;kB9INsL>yQz4bJvyuP_X;akj8 zO~gAT1C04CVp4Z!4-pIj{cT@5gIi|io@_6XSv4wJ&0k{hc)2~ycp%PBrQehQ*vr6P z(pgxISl|dl)-L8!=6!#ZRrdr?aYC8nGgKH%SLyIZ<_T}oMA*kACzEyL9zWSPZJd(O zi3IW6^y1ZaxNIKT!~UFMRkUZ2z%-Hw5)RUSn8ods1R!dm(L|QR$ox7NPtYEmRdN_D zpF{r8Q1U+Bu@A_JnrCGO7U_F}^kp?& ztUNg|k1ZUWhTYfCZLVH;>*jJ3jcCc(9G$zlc9nwLKYUmdcy0FGqXijz*p~>5x1b~P z=z>Ot^4)crlv;S!a^IW+Ub2f0R?rmI#@xTVOewg3EY%nkpgkVeq86XsBYQ;wYnv~l zp`xBT{k}34%b;6Gf}scbGa-CJ(**^#ir%l4h;YN)j2`RQx>RYsctSq4J4u4C{VZzX z)fBI0MmLo2PzmMn_YDAm;r9JucrZkX7Sq1|wECzeKjv`dDx%lp+)&1pz0XsW4yw?R`5yt3=v z{oYkmj%IR@#TGPLEpC)*3a6Q-oabMy1R=HkidtN^c%&Uhzidn@s|31}+;6t8s#NE| z^G|P-NC`W2`X3|(Vf108?P^}W_u_{Cj*^j?LCobornDW(s~oP?B$WjLxiUWrfI_lA z$O9Ge4FB64r80bu9Q_XwkC|rVL@C;C-d8)qsuj0=czCq9AU!(u0j4pnuuh8wB~(#r zv}mT_;2h4Up=Wyv=uF?6=&2UnGFi6UV)Lp;S^uvZ~0GKQuy-7vS&>9V!pH5(0ae5 z3mTAiD^%b(oYY$V{S*IqFFO+%cq48zXyt(abt;oF=-QR(c*R&F!~go)UBH(UaFXQrCu|`BSj|w=D6e03?QgA&V<{@`2jr#rF*<)V6r6pB(e2#kM z&lOgw`h4F#ha7=>Hsw1*J;`hqXj_+N7V=tnQdud`oroO45X7~kVp7)0$-g`J87(wA zI`}bqyBqwN_9>Sw1db(wk6{K zu|v!sI}m6DIqCoPnEl5Nk$iWX=1Tf~b6`-p+2n$`!?e~EO^{I#-rn9RHKshd#C_YF z!+bUDlG(H{s_#vheIZCgJZ)L!gI)Qm)>3XnrVHiR7~Z%Mx(O(HP9@-D*45zcTD)q| zJ+lShuad1+)?QGTDv01f^)@^C!l~XUY&{GT`;!yXz9RE56D5(CAK7I)eVXa6Oz~R&%2_yOA|S z$b~j_f`~8JD2-ea$Rdexu#|}TB9>5Ay#PL1p@cmx9LF#2oR|wH96dlZbVw0$jGEIe zy8Qf^LgR6d-5GR`W%D;%Rl_j8RE@rQwDb`+gjtfitbY7K1O&pnPQ* zaWoIUGhYqKT--)~PDqh93qjquoTbun$vmJ;>o?sr)!j>v9<<_lG_2cPF*G_RlwiMS zhqSg`=}PnnT&(1DdYec3{w)tK=g^+LG!!i!04Tc%bE>j z{+Op)qihSp3`gY&YQb;nAtafgVqOOQG37n=fc?f{yN?q0QK2h6m23XIJ%u~l-!AEN zH53Oo_+X#;qhA2gkps~$lWLQCF$1D4Sx(CO{QOl;^F=gTS>`S^eb#wBKfNSc3shUO zetA|J41K_a5UaWGfB21#B~1xN+vAex?C(7`#b0b)=qP1woZdf9ot-_y#3gDHxHTe& zs+RxaE6&%}sl;m^`q#6ZeGWZ;JXe0{8;Qe=-4cEA_+hy!!dw51A7C;#w9B5B`_=tG z0#EW_kgzHHlxmYQJ^?4oH!LsH<%a{nq`+X|w#526ME7_eqB>DERwE^1<~D#gpx9c8 zz)x|Wq%ew`)Jgt!WK?XZeepp5y&~tlgETkZJzLB~ zOQ_84sFXuX!`|a16$Yu5nJ9D*V#c+nbxZm=z z#;@mz`lNG}I7%BrB$~-yY<$@yVx79;JDK=r zncgLgF;<%%jCbDSjKkgEmHzvkWvhE0>razN(%E(c@ZHLppZP-eqk^(6Q?77Ji1l zn&O{(Rd^h_&vV^`jQ(?n5e_m6oJcbgx5x|ch<26cia=ZsWPHS z*!9lF)HL9=W!x7S>MvY&CDqV1kV7qtL`8rtAAjE4`$e$l%7@*IO;G!rk42aRM^*?qk0Ge!7AiDQMTi9gGCB@d zqg87-@>NVB++Dh=)zFXH7e-SAv|;Ir+-hJF7!m@q&Lrvbo|%GC3JD1TVElZgp-p7L z+oVeSnk{UW3N}wPMkG7Mi=O~k2V7J@02I{B`Mc#QrQ=a9^?an+A|f#Ntwc;R)#3AU zUEYtBq>@B5oX>t{bA>YkH@etRNC0Y|92PFFwI?H$%$m;5&cpcA?etUhU;ojEjoa=eVl!p3j zWVWyA`cqkq*A`OQokt>!H((@zjHFB`Rl#OKvBF`00?=?DapcYBNsW|u5!s!oRbtL) zlgdW{`o!a`&Zaf5AePhg5Q zx2@@oc_7y`_D$1!pmxV|&%@&SB@IY)foirHMpPjwuB1M# zGC9+w$5?(1Z@}9sJK=;>;1?z3T6mM=z7`u&eIy^i>9EhVy`w*0(D54rHN{Y|CE@jv z-`YYs#dvPt1(5XW|xpxeO4@xybOxky#fl2&hD3+#DkGFF)$Tts7R;!Vb3Pzj3 zzZ$JHMofTQv{q755+48Jhgq%zQ9BMs1O#bom8mEo!V#q(v*d9W4qnB5S1o#A?%MG4 zAKHkT3z8N_c#P^q>4eU=go^K#tYRh*azw>C{1i{2^F0Cgj;GUi8|1$rZ{B03%BTn4*lk z&#fR%F@G-AR@zoWYg1ZZZ!)$oKK&oqh=T>PeYPbn24=yetTM@h3g}kPGEdUpis^^P zZ*?r(yuK8#WH7g}FCXAXmeblr(Vy}Q-SGb}Iu}2*BdJL$5}hK6M0i_B81+B_*tA@Q z=H@2cKL9t_U+BP^zB9*?kDkWW8#b7w_Ai~&J!?COP4WQ2@gfQ&6A{{sN1Zmny+**n zR`Tjt-ZhX6zz<`Sad@a|y)wqKbjH@Yhn|ug*uYlN-mo|Y7x->}HSp|{o&5za6=KBI zVja=(oCj-|x?j|Sr$3-C3xoz(q`NWK(}KL50}WtG5R_CE+0)>%;V-G9azWIN(7{~x z$R>TpO~g(3!EV@B#U5um!v!B#vAUIpVVutU{@LwQxfq)r{2KreaXVf*Cq2g$#L|vW z?BE@AhU|tR;c2ITLGdMVPY@Fu@(YCCi>N5WP7b1}xW0oI6C(yD?*3}>Jc`#QJ^qjO zZ%7uHG=Vf3=Q`gtR1sLStt<#akc#W2Q}1OBSC|iHutS*uK)*_w6867TuRNTF;fEmV zEz)i3twNQ}q!$*#$i&uYLBFm%Z{2R})G8nUycfi^#$AkRTNTL1W^50 zxqkHrS9EmrtpyF6f`=1I1^&_;g_81yuTbtJ+Sw&?GTd$8z#fX?2sq$>nAt0knQ;TP<1^7e+@YU#(xE5d zJ}-u=QZd@?2wg|J9uQADkr?kwwPDyapyn;LcdvCgRi1j;aXX$YNC~(a_rtDq!Iu4w zOj;B_nDi+{mR3|uO!xm5fxV2md(7Zaqx8Zh z4IK{=5QHP~WE03Zq5C!gm*{#9edXC zBAu+T6xo>*A0gMuv-X%oB6R3P*RegexBbZ61I4^uvchdPJEq!dE}iOxv-1%^hw3+>oaIc-Qe+3( zpa7&4zOUe=A6;#zevYj?8j|0ROcYmmLB(_bOGw zKY4))Mat1ZhvsLRSnjM>g94#n1>F+tYCrEw{P1Fwh!c;xB*e{Z3jgnS9YxO;G-QkYz5?Ik8CAI23M zb}{1WV_o*!OO1YON@k;i@`#{qczYOqZFyt@+VCG#b4&)L3yEf!M%Wgzskg_Zbffu| zLWkEe_^o`I2CCNa*la%mg{LBVdU{sj#%h1JRyG7&-@w2^%iU@OJri-}2ziqMFNM$R z3lMQUFHx2&0J+pJ^O+I_GHl$A8cV|eYINu)nTDOQzW~@jbm|XVV*8KQ~!Ke?C_^k4*i-S|8?iTE?T?VviSe(=C5G>o(S}QV|?Albt5{oF%c2F zI<#HzuPqXP1peI zsp)B${=q^0!|9v`a}ldCbTIWD&O#uBZ73y!GXQPi_igKI;Eyw+_cKRD)&bHh$1Q15 z<`z5WzkytF3ZJ7RQ@;y56c8l-VRAf;uqX3}Fz6T<_C_L;sk%Xh-xbLxdQ1>U_|5`^J`| zk2~W5$is@$`B;obMAojp9WGa3S|82w4<49Q2-xojo!CXgiSgE5sFFHz46r=mhl!Q}QvH4fSu)}i97Dwt_RLy7DuM{i8A}IJhO43qtO~f$~ zA^I6?Mfn~Lt9IJ^hm=K;^<}eVD*)yul?rjDN=sel?a_@wLxZO>2m0HFpkcFP8S2|h z21wnz$D!D}ISf2bhsa7)Dr!f+uwrc;wLn>+{gvF4F}o~sl`JvLbJ1it#^md8(*QLQ z^qB_H8HH%~td`0H$M}TvA62(b2_h!Kw;1Y8w>`e^>ora%*60+hiB09{|H7ca@xsLT zC&wJQ27?1|JFF2K0Tf#Av>aqQ=u1S&boa|mku>qS75uzmqr$H%lyP#vMC_R_fz!>I zZ>1D8zn)*$K9k$tZqh5su#-JeV3ymLgpt!*7p& zK_Tr0y6YGm=4G{a-qpsIJvC}oo~Bp(lOJ>rqp}Fg_akJ9jhX;h&W9Cn^k&j~$qJ7!4-xAaE>ITZZq zI$?*l|`R8&Cv{4<9a%T~@LF$TJY5DqnBKsOn^ZA$32vefegb{m`GPdcA*uwb(?( zGT{Y-;XyPGdF=@P{|5Awf4q8V&WB7BTF2sz3-iMw0$x$xpMOt7S4Er?Oa7QM8tr&{ zs%qYjn_+W#bXnT_#K66-rf|8rPG)Oy@G>Hv5a9IfsAnv~o5suWl4`tfJ3=`2yUw-z zS8c7^e`*2PT7Fm`%RxaBvd&n6z_|@d&5YV<_dZfeK0T)AT;iJ zplOj^-0Em5Y`JwpbviXP(SNTm!D4emRQ7(yW}!=qpi`j<7>I}c*>k#XO}8H}-ZkT} zS?=sHKfl3!P`jTNWM@Do8*-&5b5gmq3m1%xRoQ~Q&GQx7t|*%|{-#gtJqA5cj!8q1 zTt4^}jtT!n0~|+PfCSGKJ2i#z+6Jpd_cISqH9?!civE~?YBS$cQAY>%W>+1I)=%M` zx-6c)S(o2EbX}i59#>6oeY_y_kqG)D{kX60;bi(GA2f1$q8mlHK}+)9#-513z4C53u4!OkiN3{IbjWlHX73))K`u zHu5UXu^&0Ltj@2G;;FpLB?|DAb5o{Fxxm-<{0KYwSY|<-mRwaMLEb{Un}Z6^*QUiOw)oXnCyRKmit#xvO4JDDcQBDW-!0foXAdgOLzVYF z9j%p<+4u)@iLEgiUg09?jPwB?vKVng!!K@x?_cKBP6 zbIcwclFeN*1a6+uv%;5mcS+X|K#mkM75hr7)ymc-i-H#!rQ-$6nzc?m$U9uYT(mRV zp4!s_zTNme{q19veq>F3`xA%3K?Mou@dcjRP6Vv;Z9QOT1^Ejs*V;mXWlSH`2OPvp ziV9|-uy0X4bQ$*}fB*NX!>+o7`nJI@au$KzF~ABFQ(;$^B`co{G%F0BY% zKJPN%56#$AT`Mu1=gmlkBpyl3bWFUwSsZ44g|Aw)-AFkUYPkyW<`!YaEImuLuF#~B z=P|Cw{b9OSXRvjZiKEwBs`|7Q>M;IvM>gO_mvT3;?WkocZ5>Gp1mCsFzT;g}n#H88 zl$npM&Vmz%*U5SwBgaQLLKj|8)Qk#3-et~0&T&@xqm;@7<`81H#q1emH#hO9lGWjh z4GR^LVtG4irL0xLDMec-B?;0t*!&CNNFqP{?CRo$cQyhM`Tx(NlGMWEJg&b0T%95R z$PpwIYK5L80;&+F-p;C)-mh5L@pEQh)BjriPj^Fy@?%{wMy(*8J{4Q#QeW637uyX9 zl6wGUs_dXRpTCN%CN*VhBXed*GrUh1sD&2LxWEM|Gp+>=O)26pzNRJF# zgi@i7kWk?G3s40t!JV6%d+1sviIx$)TxVji(cXmo`7?-?I}fQ;+Lx)Y7y>bs?Ge?- z6$@nTOqeSZANj=r`y5??B20LNV^K4#OphE`K+=h`}yO6^U-Iy3)T$UxuYo4 z)y9g%I*$kIPz%oBcJglPR8kInpaOO%jrk`<2hA--%j1d8hkAj#hUkzOote{JMZE3g zUkganJ@CM$08XN)_Bh-cH|9+9q;%!TUlvWe^P!@;j;?rX>}nAKhi3}>lgt33d%Vy? znnz81@DF8?FL>c3GO)I!v}h!vlB5^Hr1dz9{#H}he_@*myQwLd!O;qjnWB?B=mrzw zj&6c5Y!1gGJVc)?!zq38CcJ${rV*h7ESmQ#DV*r!wZNb1k9?AZC6ZnK@yM!9Jco8( zRP9Zsz(YyTj17ODPP%`KKg!@8U;z(ilAy`CZ#N(RmN3Kr1_5Ps>T6Re^W zAnbS>6|y0dCxFZlFfH0eU>f@9<-uEb0d>c5<3URfGzpH*om>{)Gn3LjyH`GM3N#$L zpln{0ce!6VbsuUg4d5VkWP*$ngArA0R64#$TKkyeP<8PYkP z%|^FlyEUg^`UX0JwXSc#`tgWMlm9<#y#-VpP207b00~5J2=4Cg?g>tCC%C(7fZ*=# z?(PgExVyXiFgSys$&|oA(V@-mtmtL%c&n%8(siTb zHJFWFp<{kD1(Gvri2>Ew$j=G5<*ew1lEozfNpvDtCr@Wjqmis*OU~E5L#&VL8dB}s zSmLn}Dy%womn|YVpF~?kMwyh>86Q>|6V@1`TCn6#s4vCLhwBN8T8;9l(hhaF(hra> znjce?;y3;?2zAm(Xf-01hBz&oNuz?)6gRCR1RHWDpq4Pm<@yxI>4l7q$)yXCE)YiY z6tvH)<4%>+F+;qrCW|I!G6TMK2j)y?wQZcVxN>D2LPQ#}q!0_G1?^xHE+=5XfWrf@ zDQ|t`_WY=b3v-MHTwT74cHu08?)duhTQadQ%r)ihe#-A<1{R6+uRO`&H^ zq}9bc;Zz)Ig=*wK(p8|RKmyn^J~GSRvHvs(#|PfXLG3f za=$5ns%TNG(SPI4&!Q~rby1^P<9PVBN3@ALVbm>~6U-wg67Paj4(eIZIgZsZjKFF}`4O9~AZ0VLWCHYD*Lp1hhiwZPV`RA!q=x$UN^E5Fj0w{+GzNWDi#+H zp(g@x4+Xn=dC1(o*67xjA~wfq{gb?Hu2~Oh~pclgo=i!Mm0!qtoqJN@wGv94yq3 zAmDO-hlK0qL7b%c<^$A!@EAcin4V)B3!a%o>CHnVXwCoktLioAxSftj4e~e=|9sQm z7DC=AQSrq3pXP%6Bfk$*x^rGF7BJgF{Qqhh*Kyz3`FCT{4WjzVNDN>9s|o(K)0D)s zCGioJKU-ZnDyg>{{aZ)+JA(E`EgnsgJ2@|2w;EmgKXi|{P__nsl=wF$oL?~XAAEhb z2O=w)=?%w?N-}8vEXbE8?Ymr&zbgBy#tt1My(kHQ>01@Q|J~oL)=($srYpeVxmgyd zPLtKp8vs60#c72}Y7O_Fm7TzRhxW9T!<5>~&L;o+&5%53^MCHF{4`tN*qW|3lNZXbD=4Q$`)iM89pU{KaMc(M$ z-Bs9R{j)$*M;KOY_!DQ3yt**>e;At?7bq+&EJn0vvBR}(aXIX%Ad zIhZ>iZ@w%XW7hGpPz`o^Rtm`I$qxJFFV!aA1Jp` z8$Nen*hqtEBroW|gw7=VU=S1OoHaUa#NU+^%p;TcP^<{0bA@E|$jeVOPIl>cCktvL zgWdOKskjeaaSNqW{AAMBL~OqkgyKv%Ud>H1{XU{wosQpnTpmL*fzpoN&l|-pllB=I zK>995pXKb~!Vjt=|AIhrkc$H%C35QB`b`8#s6_k=#Zjfn;tj_W4%JfyTi|1|uD+pD zysp!sXd>72T@gN}XyRhuWgM8s*p7w`YL_O%Nfo5BsiEGDa341i6F_^Qyl|2P2x*La zCgAd1QOo!Itop3*)6G)xq#=>=<`Y)@r8mAi4{)0D&WfGPCnxvQBc3xCN9MI!0>va0 zK-~B|zUuQED86Q6E|@^hD=Nh*6TV1;v?%pN+Q!tK#*eyk^axLu?ox;L8e(SK;qHB>E`r4?{!%RgU-v%dx z+XUDC^}GJ-cLknCz?1funR^-w0%gRY)iZ_42ii9K)gaF2@l?E*q}h|deTOe3Mfvi$ zR$K!OZAYIXVuAm5#bN9s<^0^$dP7h;qZR4XE|yHDW}PKgCIL5EOF#<*@?rEjQu=th zjNyf6cQEm8KsoD6#?&k2%+xB7h)A{NoqNi*zA&$NMCu9cz8mcoj*JsRF89i=$6nb1 zCma83R0+N)tyFPhzx|qGPu|(dCXimKK{!iR(VF>FGy7l4rdC>C*U0Cq0>V-UfIv3AykD>l{ng7p6Sz<111wuiuH36X{G2SEBZ zcc7|J;C2Nq`EYSD;pJr_?>8)@NdCTM3eTwZA9?39V7x!0=lkpN#8TCCTRAymzD#_^ zSBq|v5{G&4IA@H9<@i!Uk%$VX{8KGyY2N1AnfAO<0Vw{Tt@p=nk-{j_FZeFq_~-}v z2EkJ|N`sO1Ltf(S?u|j_MJ7*~yu5Dn^{c$ccKAtoHW4R|XDZ7Q4dX3NjY0OSt{1;$ z(gWoT=gPvhQvA}@ySqj3d?))v!zuxVT;cF^*C~XN((4WcnmeyC`@WUXgXGv%g1Foh zu^`Zqf1NM7F_hoW0vFzsPnOyM6pr=j4`ewq=}KOs;y=vO2&2R;x2JpcqtV>`!n-pG z;^eg^P`vLyrgPu(Ig`Wa-*~L+Kisgnf-1})MTUdK@c{Oc(BW@6^FzSX}6U|GWdz^!B;c0JX%kqI?bTwE)VzeJam%cBU!n&tCH3)k3MCF(XTTwyD{!`}(HzG-;pF6MP zk~lB(v(?ruL%9wUB94j`65QDZj^f$g&^$7lJB~`lYGl(Mf5e_M=(_aUb%{dUUF@n) zm9FS0@2Dt|rUpk|IB!6+gDaFB55H%mCJHqUt^E%gCEWP%Z!qeIf!e~TH&d-nJU-%d zgNwoW-gwO)a*KQU^#6r-V6XTj95@NApChq95RuIeqXCx-ju zde+%>zvegMheV&753LBP-*cYahiXgOI=(lHdk(I8Gt?i`8sHypyn?I<%KL`yXkKIUXT6LGdsbgtvAzR^MDZ^NjoL&> zd{}j(5tj=i zN}2$AWDY6x)Oe>Wsa?&y^{9j?g}zIlFJg6_^e5uH7u^%UNKQ_0|^aK<7k^(SAh#nwvct;*m)BK3 zlgI6m)4KJL9DGMLotw&GbGpKy*qn$G8XHTvhPU!tt=syST2~PrUp|LSB6edtr?BSF z8l9O*544`ItQaAfuFT+-m1DRzR22u{@i>3>J__0Hse{y!j-S&YZwLVIEnmK7{5d%Y#`OYUq5C=&GIt6?BDut8iIfe|r`NWY|%9d$VN@_AY zn_1Ehw#pjYI8fD=D&^2jE0RbMlaal#0W@e>gF0WV=La>G>e6{As*-MiRY@oy(6j`8 zR^AnfL?j_IbFBDF-VRqypZ;*73sU)rIaQwTgtF(i1{hH z|6)#MLP0|#ZQ4qPMl}tFxnfi1R!c+BwIDLKd1QDCpNb%0MI=0X*FidCd>M0|iIZoh zA_@ZR#bV(1CbmL92eKPwj?otNXM z#W8JG?D4x|{pg{ObRuq)nLNt@#myH1NOU8wC4SLIar{Q7K>48CQH|9Q{BibIy7T+y zO6?X&ZRy+YO#?SfFB6!X6UhMG5cCui)aVM1uP_=D;95BGDmo22fH%+=C0%r7ljVYl zUkVild3GbAip0Oj+q`8fTvR%X5v7V&EA*3sa3(W41=;gQa=Fa#^4O0lv*j&c=(cL; zguU&FEoJ=m6yAF9j>T!u+~KkBf>_DQUJ>oweC25*&f@?88j7g3=rHu!3F89C)npN6 zBqbCEMTRh;7;EKR+HaODFwc(258{nDN`sdcr>@gdVq1|$UCfW0#($B>AwSNB-mFkQOecJKCx6t9@v1j*1*wwY(gzU5QW&c|DV)9%Yoj3SKKjqTgk6P}y zY6pw;g6_xa0b)03vET}B^d?BH$LfbzU;EAnu+(^)9!pG`zi^E%&Os0Ncjns^4aGan z2JgHq=2=>ZH}@j9<-)y=L@5hSM2Oj$V6ccP_Nw#1->Fh~_rz`JoPkQ5TIQ*w!udnC z$vw(4(_;sSly74_SX$$nJQv&Cyof8HP!-`QO6-^;TRB`RlUj8(b3if&qA# zp-(IgrNteJ+55G#&F&a=;`TMiTMO>tieK{HJi~EUn=&@z_HXM1eph6`5qXl&c6it? zV$-|Ymdo7-J6(8Eu985e1|Wgy+^0CEp%k#>6VdOQpNc9wu!0Z?5=jab6t;3C)E_pe z$cTxB$)6w{!*761NlB@MR$zj%1G7Q*Gonq`2c~ax6a`~#kkqzwh?Gh=F^&N-*)~B; zwi;rALkg^RvhB(=+3K%*v>qp`tXw`hF;HN1Ok@34SIvOJPJV6a<#|}i0zMse&1K$X zR6&JQ1GcQgHQP(UKKNKzojIR*X(zFliIg(CLotJ;3`D`c*C88|- z;o2>AImZO88$!M_k}qT8g>dr;&9LeYgPcGN{Se^(s0_SZkM-4id|6}Y#?9(RcqEMj zadW;t+JZAMN}aAY2?vrOVrHo8c6KvD2=OADjFYR|Og4yR0IocxQ&|U7Du@BST-WXw zYnd(f@PjiP>peXos2TRXk!l_nr){7uNQC82>7_;s4)oD>fxHB2%?#*CYltsbyJJ@p z;O*3EC`zVC;bEecAQnOZ`XaYpRo;^89T)IP_Z>s>XIPY->!LY>;i0~52pm+VpE`Ug z49oN#2{RL#$;M|Vohw;nk|mfIUf6 zc7vsQvjf=-QDjIb5OGjkl2hm$YVY&%ux@sLfJyb@i@%E)+%x@zfv4RFO?`x6K|>zy zgATzph01U=2AxkIdWe-9s2d#?Z;)F{<_|ML&lFYNO(q>D@iZ=`z>tIJkxYQJ^~;Kz zZ@Z7A$rj0T1UD2~=+;7C zS6o<&nqfjrw$4rlum+Ug8u8J-^DR_o)z~Ev8m!4OZJzou9kgY)R4QgSEFabWJ&Fn5 z`A92$d}gZ@$0qQXaT1d{PAECYithx=y3i%fAdy^G?~gpzC^zhz-Vpo<6Nm{zhNix` zfS_Z&L#XdIaa8EXt35cKJNHRBx+JR)0iyyiI3~RQ1as2;Vs-HSEFYpx@{p&Dk>h3j z|2mhkS)D-b@5kYK;{`o0cfWjW-+vqY1^e!8M0l?XL2!sA)}R^diB%r#7CB|Ev(_IG zoSV;j?doPOlXQyY010IdN=8~7(`tyaazt=`ytHL{vT@w@$NDO)!KsaZ)Ti)YZeJy_ zmeKJWj@)K>sS|_xoQcjXj{T=SqJ}xdGXA)LqxI*q-TGfdz#&yRt1|O=t2|pStlaCj zyxzPjIu9KGAsKfW&U-@uMYio~VY%$zj7o3F<_DEytmN|xF444w!pP|~b5jTafU&(+ zera*+yGF7N%U1k(=k_;mTM1mZ1wi@&tNPNoQ=P2t=-I`fFd z)WBd&(NDY>UQ9HYiu7yHs<+~rsh>|^UH}^FD5?B7010)K<8as`@5vFfv4x$!%shX= zWZdPe_cFxJJi&>?fNlJ>-uHxeI77Alm!3*W`bp--`@1Fr05KtjP<$_ql}n1Gi?!CB zel0~i{8QT;Wj^OL0BC4zJXKGBP6i7DF&Ez>*BIw_U1PJNAHGSQx`cRy35U|8iR|-N zP0`jP51C~Kl!{D^Fq-nY0|^(hd6m#6;wy&ykl(h8I)#%Uj@*@t*_VzF+w{0=TM*50 zj-;|l$+8VGVGKOheX_nt)s-eXaz3s&OBY8ib{QN@&!U^fWg|-zkJQ#dc3Cactnyfd zNQH;{I(=y90S~8babed~twD*Mk5 zp!ns}`pSJsciLB~4EnZ`Tyzj&F}!mhCZ(fS`F}+H1d@SYP!JWqi+s66Y8^g8T+*)>7}sAE^Z+b1($$vb1kwDE6fL z&`Mr#%3dlCd~)iaHv@*co6MuQjmp9&>`|y|MbeLj*o94~iwqA*ZS4KvE1jEnoN2U; z8Y0^d_vw3*yqofMJH27YtNx?e1ZE+8yFjy;vq2OZnj*Bs&4D;cx zDncl#fn3?6gTrMoF^eTlXK0w{tE5>H_2&34&|BsP^wy z7Oc{cq}K#zP4?(k%d!Q)Kg9EVGuoMdqlF|$QVd_PB&&w1!sM?kV5#Pc;x2NtT8sUS z*sYpfHFP-&HGa8;{KWKYDQ(482*YGTqUy+~n`DzKlO6mi*z5txNP< zCD?xx6WL>MFplk?Xga>~x}GMuLM+nV4}X+j+g%jBsQ!fI8%wU=Qu9VA@z3e<%Hlm^ zgWsfE&~F(U5hpU_SXyce16zJFA-x!tug-(1*#t+$gTM7?(kO$uOno$&n#DBonx zZS!9fJhnzi8%-M8Silh#=KtPS2t@h&gGuNDs{i53{@LuxkC0YqW?o9E_-CT#KTVO8 z@T%&(xg6YL|6dyod3mDw9VrDxw;m&8c@b?Hi`@VFvaR|%2qvZE%NVadKS&Wzw-Cri6nX&-&7Y~$%`1gTO52GFzNGD6T$O^yzZmd9kXF97qPwR z225yOjfn&8+OsEYYyj2b7fg;FWQc`UweMMkoRF!_cX{B5=N;PPrzkAB2;ueuxWloT zz-q%j%95f+vWVI56NPYsnECyiH*Ga8 zARBO}=Ccxkl0M#lrd#acW`1tRK%w<)78vQ~jTali70L!7Z5=E6*^MIzuRH@j^T-(N zG(wSaQ;+6U1XrU|PsW^HM9X{2)8gI;`^2IDSM<*oZAE zEY?K4i>JL-kX!!pR!s93VgiN=bF@vz%2Z|~eZ=l-6q43MilaBM7sb)Rk^>ZYVveju$M-c;GGdc%d|XQu zzX!ektm<&N$E%Avnd!K@!)Hzh$E`2zXJ_&Iob)7BwGX{!K?I9iK|wYxuU}Sc@dtk> zF_M0dq(lV&$7Np(`?0u!-# z9@)$!A?xerVa452O_w{b2ZTc8sr6aKf$*q)2PK#FjwppyITC&$S;pA?5AW@nQjgHC zAvCejqzK*NghYnlj(11=TKo$HvE&*q>Z8!xD&CLLB;;oQzF%WrG~sYC!K8D^HJsvr zoORGQn8&Y1t0ribdvr*pO1%lDBnQpfbUpeBW~)Y=;u0d&r&pI=Ogoyq-{67EbbFTdb;kofuAZ3-?@6C7KG~;YazAUXVi@GaaOY#?O~4kgro$-~`h(SGwu-obW?DtZvjT#fgV>*VekZY+}! z!`EbBtmn~8k;(P~x197Y4P&%7sVtGG3S1tZN8TAll&88?H@@DpLKUUIG&~%WATE4i zUv0fddj$c4q&gmPx9^>M3tJetBvcp*Kjnw z1ry`NR>C4aAMk>7ErWssxHGOwiu>q3RVEY{BQnRnsSZmy)kk)!WRuf$~ z>1wl2eR*bzIBs8xZ|+`O`L6ZG4F$Tj;b+HqBFbCTM(;}Tbo5%Mws&O zdQY<|hCcN9Dytc0ZO6JF2}bRt+t2BLm{ev_=L<45#k0#wmILQyh-5RU=^#OjYGLW?UeW~pI^)_c(jUtDXKSEua>mz?hL z6Es0Pc4ECYxYL86A4kgIyxZg@FyTts%{5WAs_AGgskHq_r_-EEj!%gT?z4!}2Nv15 zVUcjTa2%f3Px$T&v;6<|;X|%V&cBg&t=2L93c+k9`M&3;2NEKp*DBb`x0jb9ZO-!p z?}^P|6mi2Qo!NHwK5atSvOW<+KGL|yM<_^Xr1#pbE0j^a#U^p&GBYOyjdnW)W)Ra8 zL`&94S^EoGz77;r5Bln&S%h0)O#_jXcRrVv&O_wn1Z;IWsB#xxUq!GFTzOz zE;%=MJQc6)2TKNZoR(V1FKDP)EO$Obk{dUGO>42s51`Jv#}mVysRcC%lpMFe+^ii2 zDLVec)#v(rn_{=caG$N9zN$!Y{F2SgM=oW{HK?D>HU0G6^y(AT!~&9pN85h0)htH2ZDX@HORx0Os9Ag z3^z@DsNdm(t=jt8F`A}DZDKfe!Spw{KJeVb!*NwSWa>tf=B=v&eG>U9*s{EV~ zY%ck^LzZ#_&UgWJTnJ+hC7{a;T6ZB_Lp1P6PnPEm>pU?F2@VM?RbEjcF~IZSlg=w< zXo!3FW(?y678k9L`O)xXP9p+=vp*Hc4o%=!A zI3WYy;5Ub6m^VFy3laK{iEjtJNV2E*MQj*4(?>)J){Z_j|H7!M@I>|xijaVST%KW$ zIy`2=DrM{ydeK&8LNzMTdCH=8h31|kjjuH9az&!qC1g|7Ypp*xX}NFSv;PwQoMO8~ zBhfMeySB85Bhla&Th4;X=86~i|`M^ zD0G*J$2pKAbgZk1vkH&l(=J@@7zu=}=_k2pDBlT%^uYqGLw>z@KSQ~!@MHGhf<%fs zy!6a8G6_FuXR+D5T#$y=|F5liDvYdh(>TWJTb|}zBDUzfwgcDnSO&n}dz;TnET|Gp;|^dj0Q@Q|-@*YCjr$B5ga zP98<7jE(5i^$eI$3^Wm}PO*)o=uAdp=Ae-zRA@BBX8y>{CC2nR3`uI#A8W+)MHdQh z4ukFPlu0Any=|``1BkQWSB>ffyIu7aoLOj0KBtT-BEI%e!mFt8a3zFx&rsy0KfdC{=qb)b>Tp|KcIQSV3sdZqPS$MMi*NalscWhR%B)OYNGZ;5%qi*WrQH%} zt!26bj$RvfcXKQ?mEza$Ip0jlis8~&?3dc1RcS}`AIvxMlsPfDob7L4&{bXj%0S+TR|aYENkksDnf6u-rMsseO;^i`M) zeyn4@F5zVnv2+7J=fN{3P2gm{pGInPtg|b8+FvmSN(uDPAixh!HYCXTuco=*U^Tc-hwf3m+h*%atv}6 zfg8cN**xe#olxB0l-5GY#NvM6k1{#{$tC_>o0y3= z<#9dDdS3q6lt1Qi>GZAYzJxxUA}My7{>T!)>vg5Mv!JBR%(;T{AvHdjC~)9>^omz- zvHK_3kXwT92QL=!-a=|u)>RAjieG*+$ds_@-)iK@xsL1r+AmG70s5{R#Lk}?QSgF9 zPL(tF@n27~ya%SiTw`HZdlRXZeO4Shn@w5slM~H|&R#7a0+6lr+J<-tGVXXgUU)yn z>8krdIlS_;WXBpOB@0P%X?dd``|@&<0qcn-_Rybog+PTw=t$%@6-Ee0?dSL2c^7^2 z4O(v~o~}~9S~cKPkDoSGhjZ^m|Lq%`-nUa8Akyfyr}TQq{Je2`@`{fmW~+yF)=kM8yq2$EP{Z*>*6qu- zYt1-u=+xoOen<9R(u!CT{Fhu!da0a#;|{6Z1+J12)*7PX^4P6ZQuz|fSD;a!l-dtB ziUkV>zxHVY$P5)gGkWeopMEn7G1a3bR;_5K0?}uVbH0~Rlx~uqa9q4xfAwE8jSd_S z(h|nddC5p^EN;c0|>q&TmocDIVx-D6sXId6jU~R@P5rjOlZ;;N+`uy{J8ZmqK z)PLB;kq^#@hR{v%mOf16xA7IylaU2f0&X-8Pg519d*PZFG>H;PA;qZu#reQCElOnE zwZ7?t!ND8jjip}rF;+_x6Og-qJcgPrz&m8eEXJ4pQHB9B$(WdP=9BR7)v2d* zgF)uUVmN@JUHgF}6UikU-Q(FOs-*deTi|jMrCOz?eQ<07xv(cUA7xj&=1Blo@>6^G zxJVuN_G`JPQi^6klVJD~&TX^OovpXI{z9Cs?2FRjMi$4~=i6X#`}vKJp{KR?Gf8Ol zaHQ5{NchLXFourg#0poLJvIh{qp5;0MxJ$|pY2Z`Wc^PmRP&xBe2KwJ27?fK)qD22rps=##JxNOc0 zI1U@D=%*Y$$Z?3DF!3i}qo}Q0@>eZ6Xs+IQ%d=bE&M=biow`e1H<7` zuTMEcFTI@9e(IOpXcPl5UVj+)Qr*Ep&C8m!QqJ#ip=^|WDKq>o&pBhPPg(*Ulh^kZ z+;_-Bu!2P1U#en9y)AIb-B2?t{w7_(SB%eIkn>wyZw9D zL;i3||6XX;Bk^+S;$5W!fQr?~YGvV_o&ppm=T z5?*|4tZ-bWt7vOj%uBC;6$c%pAAWu>;4dD5EruA;-c6*nOUqi57tNEEif>O~ZSQwV zBJEb+x_?p>Ln852#}GKvUFpz|M^Hha0)Wi`Bznj)kk4O#Pkuri;f z`f_yX{782^pZDfo?d!4*#?&ywcy3c>204(x+cK~{XwsUyS)a?PV_#EUK&~^Vla*pg z=+a~?o4}M(#>4VsLsN>znk3?sh|9W+)XNe@hEixZyhJ#rkPBa75Qd4udQt+pe4cp3 z!2`(TtGhe*)8$eT-tpvxy_vvv8W|e0(AC9{r6~lZsqU;NYsRXL*yv zCy?@kYz=dCyG+}aV**~>{W-(4F!bAec^t$bx5VVBi1}^H?&9H$#{oZ`&IaEJY7CY|4)|CXj zJU<*MtRR~8yS$WZdmOsb-I^Ax@^a8J?DQEi~?QfCHIEOJdy=X0TJNz$gNrX>l#vk~j~#V;f*(*w+TJ&X8j~!= zW=ThtfWq@#s+E- z9i=KywL=5@W9>VQB_<2iIrg>Ps)m<1tL@aRz*|XU>GQqar3#GeITavp@h)6kffR?C z|66UFDvCM!2c3u8s|R38GEpWtmE#2(m>7auU+Qk1bn_hUW4@hr{~3pGTcpjS!WD2c z(j&A~e@9b~r(BpQ$1vKixGh!Uw?%B#)uUO@V=^+=4Az)!E7;QBlR|Cy_3SmAaXeYe z47`&dn5A!VsBILPS#K!9E7k!NHM{z_#Dkok4xC=iR_L~S5!5wY4|mLt9W6>}o*y%N zSbE=^Ma*@+klkFEE90L4eVCdMv}*CT)ph9k;d^@7J=M#gmm<*#%na?^s zn#R^i*Dy2{ODR=`{Wds^A$#9s<@4qGbE5rJkDiCRh#UHkz-WH*T$lVpZ9671{Dm)A z8e~QRK?+7j&CS90SHamTIm?GW$F*#w16H=jHUr}o_n%h}yJleC3$*KiH;~Egl!JSMX*5S( zohui(!jJ}0Q~zja4*eXb+Ky?q4|)Eh9mLL%YTNIFYk+kuxv8$TNQ~K0{B;0bHRa&$ zvbUTJ6mGfHY0d`^-sh{=HCChykm#8@j_Z@(JR(#2+AgAFQ0OD_l73E?;pR^B-oRxG zo6NXE{Kia5_c2X^MWlqWhhK~2ilQ*r?~*dK=L7?>{lK5$t6m~_JSlEU^d4MGl^|d& ztJ3~~GLzYVE5XHXADP|m-Ja(nS6~=xC=C&*jE*usjLp_?19OtZrN>XVO5N6%?X5nH zG_nxSvf|*_UEh89>lP83+bP9a0mM5Gh^d+ZQVOJWWwCoRhSP- zW!STN!%Wgexn~wN>K%KJM}ckfDY8krNY%?3#&vDPz0O1dazWqTpA0fbb=Xpd(%`+FP+x?vX70VhfCJ-o=C9tgasoQH4gE99q-=T{2r zFKubHSE?$mijwS9cX@-}f4H5N^GTc#QjNZk?oC@jBf)BE!0grl5NG-H}>H8Qg&H<{qwam?|xR6C<_Qva5^hhuK%)P*x&rc z#S~ubZs+dfBz`b^PBX8LmMD>a*N>{V#M+)I34mt|tMyQV#IK$~mGMMNPn^rWEO_>f zd9-mi&-KC2ZM&SitfnRy2G=@9xP#fF795Ih<^+-l0-sw2>U3?e=jdZ{5v-B!Kf0+m zD30ywj?DG5=en7I}Nq20W zPX!o!QPL?64V>tx*0aLyn)T04=Hv# z37M3^^Q`v1I+#R5HnW7mO;^&ad#u`>fmCKpn!nh^DWj8fQ z59_pS32QGWEQ1c+f$%esT!PJ}2!EWp-%N`41CV2q%dYY<16Orgum2Yw>wT)lL58Ys z!~Ul~W@>gh)NUIEJ*`|}hC4oB0SZCJ()cU0Jw9c_U zaN7b2FHq9TQLwhAzXmSPhp4LAGw<&2PY1$l=4%J4t;N%hV6&PMg4$O?W{uBJ9iAp? zjaW)tRL4kYhcv>RORg48Y+{OApNh=C@NATNw$cQht|1293Ibj}^{AAq2?548T`b|S z)@!KmB0)@HOhZlc{-3VH+B_SBWBu(0eWBxHVuZ9?(>L|Tu<4^98K3#kuv$)f8R>0o zjPw3C_lkB@^o^dd`Fh_vA>->*Ubot1+i=kA_d3{#m6p046oVV3uU~~9Zh&5Pq5SkM5G#{g%vIvaFSYH_qOK8&w4=V^TKn>uaYz0u$dgSqyvM zjoKf9DpMHDJ-HY*xeBe+&I{&T1~9D{s<4oxJnJ7vm+nYTr@fa49Io%t*6+LmElixS z^Fwsi9GiJ%?oe9jn;S+dGzg zyqC-I(3Z3XXlMHnar1$60@PJyfvc5Pn%!~z_h_eVO^;GMO8I88iYHhP^^+oFa~*0m z3Q`!As-ECxXRC2i;KRE2yb5S7&k4jM`CvVW|Bd8ReFFYmUu0S?oqDVK0iyZ3&sDwi zbu&eSzkQ@e))5|;X*GMZ6i0>XcwPPBwDFJ;^8HZe>QdFEiTV6^dXW`+$EalQvFoC> z)n(2)+x{c_!^HJa*6ddrvZ~|7yn5BOyDzR&MI&wSts=|RDCLhP@xUoC_px7EeU;A& z$qJY3pyoNhioM`=*-+M4fz&$F5&@1V*AQ1eAJZwe2fx?L7$g?e&Y(d=-#asGwe7>+ zuoSPmynBo7-WC|&H07aQ0VA`*tIpCtk&N_I{UU?C)W*f?>G}Gi^rC8ie&R#rOyX0s zMl)}|)jiN)6yK(3!F6aoPebe%JMht$!(7UHW6)DuC+pIB_6E0NtNh}No$8&U^4QgF zb!ZV40q>b(XyfWDPyz>Nw#LfGED7^{|&%E!+KB_7%0_eY7iJT>wbGw zlHqbHXf<1?MJG|oG?}DQLZ)P%T$(zi-qx!R!Y#PNwfM6=7cp3hK&eJGeV{3v?5$IL2$$IncA) zNk31%#yi;&-%{#*9^btNh@$aPuUuvSmaBEM-E6C@I|a!MgI}s8Xmp)?E(0fX(iq6y zlEBtK(6@YUySk5A!txrQdVAF(yxjWStYZ1#0Rk|vbtnM}kGRO@9(C+AaHkX#bLhN4 zMpg^JDD!1-+)w}7_Y!nw>7ACHjY&rNMHU=Um^n`!$JLfLjn9u2Hv=*x4NtjdTQ@oY z3fa58Us4-K}sA9g^>=GH^z{zEOgj{QpGJ3Pha+Ypt z4NFI_%u!EhKu@F+k3%;_!;AQAD2BL)8^{v)0n$=ZdDFel$Mn!W14G}XfVB~b%O`b6 z8TocTHNFndkEO^inF?DaG$_O05O~7*@p8igmQ64^NW{}6OIptGQJ15iNyNR>cF{f! zj$VL5kU7@S?uQJz3+@K*`ys%EC5xfEnvF^%3$t6kxZ0xjqKd`ZNQ*hS#Qw!2lvmG} zhy`skoEigTU9al|J!etNH4Aa8rFy$mCzk#)4RJ1pk{&dyH^ z&t1k&$*z0(cH074TnWafm$%$4DM>BPhf^xe^Six$&txW~IO>wKbfrV;iJpjMuH1Vf zgU((sGoeL6dT^iw58;TOkGra!kHP}aj-Mk@ya8all&VJqIR?NLO2bL2aErd9$4E~K ztI3$djG!UyxQeWLs}$TRgHJ@_b$PQTLt0aKWlP_rmWKPi2~9s5F2pkDc8Bf~g1mfb zwxO&VHhSptWnHT>$-91FQ$D!VUA+o4dWVOmM8pAD_wH8n_-HQ0qZbwJN{PxMcHfpC zb%k^6(tqD~{*;XbTK7rxN#PU>K%YM^H|ecYa$gt&+2PnN1et4oUGAOYf*y;(coT9x z#!u<+oV?7XW4l-JwRQpE@Bpenn?IF&gX#^NnSO~~&}bz=M%)4sOgI3XasuhbkTT6z z2YD|jCX|*gR6ieeMs=?mX`6=5qjE=goo^SbUh+Q+c(bLLVDkiXXPPLhR4j=?-yd6b zg!-SKMhK{a)^F%wcORVge%9@l2XWZ1G|{LIo4Q@%8HaZknG8GMoxSE#EE{Sr0#V3q z{(Rm+I@_i(loezTNZgwkBbh|YoX{-4Ta`IK2b#qI9rJpCQadH^U+6p(G8Z1A(F|`G zG^8gxn@`gt>+gJCayFqsg#<4kmm|I_;;D}kn#BzPcI2QV5o+BNIy(aE$n-`WA4HI@ ztx8opvy`{14%5Btk@Hwem+zWhAp6nhEH5js(&_svl=tQ{ktifIRI#e{y}OE`YQ5DC za;$7tb3eS*t~gf-Wd~EAgV)g3!Ch5b_2I_xhM`@lUh45=bME3{Z@FT7^i}PIA*4MW zu#%VrTYg(yK{!hcSx78C%Q-m^vGu2StD3r_)cbd+qarEv>KTc%jJ%PbUe5RuZ0?j* zM2~N@Ma4??6&9y-DP=i}IK4s=RZ!@OQo_cSR?t5;j{g>ziBoEzf2bku`lC7c>*sMhr~5c`(8>SD z+*f#2xqR6qeF7P7F&8$B>+3hQMZt!nlKS#Crn#1iIh)Zc_trD)?;RaQo8L-jc=|GHd`DBoz!%;pKv0mZ zSN|4G8;)+D1w3*D#7k8Rtz)dDQXSQ-YJ7y|iIq+eTp*d`Trofm5PB6XInu4`fv=9* zZ4P4QVvlbI@yHgUQT;+I9`b>XZyYB~H^hpN&rm75rhm>;fJNZkl^C$cRTREK*K8<> zqMqlIs2#`<;~xZ%ZSuVbF6c4m};V zW^u*#*2XT~Xjv|3DeGmjgbGU`dcld-o*KsCWi4xTzL%7E$xWf>_&4WPRRNWvYW4BM z!Sk@S+jp_Xx=jzAR6W?(^GUNgUnQK$lf*pj_!E4t($78S!NmLxTORe><*aAn(+|-k z;}XsiEH7g|7`MrW6-k9dn&^GBc_n30z;a{NN}A?KZ?Ti|LE{^>_6r)`Xb(O6L?mAF{A-yPgZLjQv$i!Zu%%&rfyuhU#!I!{^!wh*eiNmoHf zJWnbuGP|x&Io)#nvvH`CE?R5L$KU~pVR7l_&I4{~j(`_$&B*O>=%aRz#g~qY%19`Agu23dO1#SG zK=Q}4YPxs?_)G$Mohj#D>w8~qKa#SJPci6no+8^pmkVWy(YWd9OtkiTs|PD97Fv(n z_)gL}Dj)7n?cJUqeJ^dXec6MI^9i_ZG9x$DbKT!;_98{WH2?*f<+;9cSPhHr{IyLq zbG^#Xd9#@0*e$fMMbWv3%0L4CH2uxg#IZB$OJfe7u;Z&nmHsascIhQCI5u7!5?5DL zW3im(CPetbl}^qmmN@s+KS%-HE4Q=Z!iOJchdn>9NB{@|ln9)#vE> ztSiF%1TJ_CDPMcP5v-`|2lbWsEQ04+MER~0OkJ+EIwbVqLpV5VBR zQO)mMyOdzSNo)6^vH4~rku>PWLZFjIxo*u?S!a}5*Lu6S{A@MI^mU!gvY}{N;-zmp z&sp>mDp#Cbp*`&qm29D?mr}~*5=tV;g_O18_a#GpBchCZyG~UNmhWSSb_{kjMkM4X z-*@d6Mcyp$u@f1o?8l>%#x@WY{i-9bR;dji+~cv%itpu^wS$Yy)npLwzdv5=sME8G zDA$bH5qOG5LeI-cDPvcSXyzf$P8@=JC;4JPZ^EQocgtn2B`9jU^_`bJ9nw^M*!qMB(_+Oeht!+?m5kL%UkO2j_09DU7xS~PE8}H59!eS^kqwjM zp35)Z7|Rned04-Kn6Wy(|1M*r$|TE>B`f1#Ha{P$Jnr?}3G>kOnIEM?ZEtWPUVLm6 z-8{d6(LrFlIhE9xdT|AHbyyv)yl2H%5C`L}taUh3Yfd4+pQUFZWa?W3z&K9ttgre_LTm? zpw-fr`(zHV`1Jg#8;2B?lC~6!#ZqMgsx?kuex?0vjn^|ByI3wdk>^oodoBb{W~Aa{ zq_qKGq=RETE0rsiZnt(QAagM^nfip1=2x+}_l>E{ zFZm^}LNKyKSt&}1PqpAzZm{WD4W?AT$FLu6=a0*OV~|zr6%@uYX_96dBBc}K@S{rw zEuEyJBGM=+*0hZq-J)SPuF|X|F>JMTKA+yN^pvL4I1ZOK7vA@9e0vp=$DbkA@XsqCU6GCV2we%AFzrm+8c7!O)y_HiLSQcm&Z* ztV>w(3vKVF%~Q_0iV;($e@dq3?e&y+XhG6H_Qm={nIj>BsqH3x)CCwKU!wj3f22y)m9hCQVeMTI_I!30#6!E>_{9Rp8K0&XS(yE` zk$^z0qIPGdz>4$)i^_i1?ahbdnnupRj6Q1uah64aZ>Z4v`GdX9G|&iEDO5^{gjm|{ z8xD#yqU`?bAm{0nRn!2(TtA)eIp)I4EJ)(!NcYm6EU#J+kDm6DcUeSzc4dy9kM4WF z_qpx8OV`EWN@t7UvvqNw;ighgans<{8SSqsolGKIY(~l5R%sgC@jgup4flx%%#nleX)l^53H27YqVe@dZY$PK~Cit*vZA4GQ2`$6}? z8;@9mM8b>kQ|0kOE`RT~z>(v~wPYF8`sHjP&fAI6lx9S15WVif=@4|ma3Wk8J7*-) z!c)+V$Lm8U)@2eEnFaL&ZI!puz8ew_&ClbcHPlU1Tf)|2gEN;Rb^Eh^_Mu;-@Q(J3 z-c{k3s(cQI6!phlgegS>EA)sKD3j(WLmTPz+Fr>4=pOX?`wd~WVAnJFs z%f|;o_@RCgVPDQ>UU+YC4S1Y;<5wqo#9g(nL_!3zq~obLiEv z$}PPx|3j;65^%oRi%&WK7RTy>dV&}5<{-}%_uLK zs;Up2+@Twhn$Or5nQ4yC!`IY?X?M{d*esJ}ug3Qg|( zyorEYXah8xHbQ&whIOq>h*5kXOZRSuSt~BOEST&X&XdLKxcF+NlD>HlWQy69EZe+V z|8+N!K`%)YqRv;xu&F)7N4FED)`?bk!aG1OOtj6!5i!>1(18{J)>N9lTPIYQkiUMe7?JhWtQZ##hR^~I~SE)-l!3$F85(5 ziFikLZ?$n?o``xrX_Dnjx~CeNV$-|v0lFUI>pG@2*F^yv*DXW?xLFraxCU`{kTe>g z+unGoc=tIy7Tc$)JvYey*LnQ)-Row!lGTq8knlwxl_nqi(7Bxvt&cEayz^U10VcYw z$_xtaO%BikL0=1jvfJ7AA^c^v0eB6UdyH$xA8#f46&-`ccxf| z>L^nh_;rniv3M#={J8rPRV`_&{2S4INNumv;lErdGu$KCx)hX$HEUD5mfmCBv>}oX ztJ{73uV|NT7A5RTaPDTFVL*?Wv!`61ZMcKxLcrnEze*FKXJj&yv7?$0Cz zgLV6%t}yHofeHNzvjKST6XC?`j&^tPwVPz4SI&W8#oejW+``i4n{`nX@-!}(Mm1~v z%EjI87B!Oxr_ZUq^+yu=+E_+e4n0Q-SU@Z9XNl&IfyCf*n3la>SDJ+gr0$yZKo9 z9ph9$f6PCoUnmUj)9#$Xoy=VBA@DBEOk~TgE6I#rFf#%G-wAWA($vIPeYg(H9JQ^z zkm??p*kTz59oX3Nb#~1_J=B&j)ZvZVPup^pkGs}UN8b6Oj8g5`@}9wWf^KLGu#{BJrRs4Zr$Hrj^z7 zSXU$Z%Zoo4N>7lkLY`c>UWL3`e!Xe-)ZLExg7Hr(&HsKvMV}C(`9yvt`VTke z35+zrrBToHMfgt}pFg)CrLV29L`D3U9z^z05@<#GP1#?>qQ6N-M|d!fd{9wL`~P+K z=NCqRj-(&-6!+hRA>jKx#pm#V771b0-#VoNT45Y%h5Zj1NT^j0e)#wZPx2Sc-`)M$ zdl`^P6+lIx{_nv9-+_7IA-ShO=KihIIG~lX_i)dC8@~?*FkO1D$Ps_*G)gEB{Qpd% z&@wzSP=pnTOZl7tKlGWT3R=EuIJoc`UgAiywhSY+1U44Zs3%mj|` zH^T%U4U;1y|C<^2*VMKq0j*40e*A4=mT7=>yh47}@mr_rSU@XDFD!ps80dRo9R+>A zzWlAzPmkVE;rq9b{ngm#v`25Ci9r9Y(~mMhE1x*Zep{F$tVeHv$29n@)1pUj7FI;t$eb!+ll?Z{Wh1QRLy!AGw3w6pwUH7XUd;w)CLU7XUYuVD|Mmx8 zf>*66sQ1mAhftw>c|G{ctr0(f!X%RBeM5(XgL6#*>;0QK7RWHE+sm?uKAVVA*W<@X zsHi!*fUr4(Jcgh4f2YN_UgVKK=R|WYf&5>W6_P>En+z28u3|k1#QJZ80Ew-&FdQ*XJ%yq!$m~liozN3F{9GYw^5DN_ z4gCqMx&_XYJapv$5bMa69~(u3AW+5z!#@%QC#XIrj_qLjdHgk$JgrA#YEH27|7(n< zWV$9h2|WVz69l;L%mQ-V3W|!9yZ)rs9ixR(Q&B0@ST6+nAmE_<;|{O_OjWCi;m&}<`kNlK;nVhO;HHP@X-b zOf%v8jP{RJe=cx=2tWhe8UCX6-$jJ^!-=stT>nFjgh9_k1-!LD!EIz*+sn&i)QeN0Y2RN5%8Fx#dZO{L)Wd{x> zO}6R;r@zvCYzq(gIG|Bol(9USaESu3$7v&#nCCfbY%{y@^(ET9HVuPo{u zlV;_wJ$UzjjL)lqw{Ywd@q!+kl_~N`H3GU^1lO;X^;dOUkn-%+u<}V*4ZiN#rjIFL zRbo8-+nrkT-=~Z5l05%r%CYFa%fy?-(tP#By7}59e^WNlPBK(8t}|;=%%O@gWIt>J zc&Qio5#a6tN#12l^?0G42kt&Yd%!cb)4mF^+qnmS~YQQdGqCo zimH%+eHG|5sUU+fs#cHEMsLbV=~>AEz3h&)qahBb1D9CSaiTH)d6%gnmzV>NDF^!v zXU@_V-q1gbFV6(~43`nT3E3ULA z{W0fKKZwAbeQ$Qdwpr&A&sFu479K4MPh;f+*GL6Of$9m}5+L-Po@&koMTs-`5L(`g ztkhUW=kARn?Q4Ap99+Q)wp=;R;+vs^nHLNddK?Zos1585Z+F6mOzKQ{t4)nLHeI4w zRJ$&f36xLMR!bTacQK5^dH-HKp#`c|uP~rkrUjrvn>55u0tAHcxpQDpf zzj54>2iOUF3fq<_63Q{m0spiSd9%vx! zK$)vIZ6th+|6}Wuh7W4iVF$5I6AL=C3!U-%u8B!feSjRd7k6vtCa zP`#h`-;~UWOy*S;bJ8i1=vAkTdC+{M~ zhvP0YggFyX#!m*gwr>qI0#J#gNZ+a2$JW(5q&L3$Di{;mYvywei6<=HTXEbPekZ^n zJ?U`O$ej>7vIN`;z9-VFf_{at08rjR^R4x^s=uidXYcBpCFeP-(X`{VhRO;Zr`0}t zZf4IPORB}1Gv~d7o}9Vj;LevWknR-X27SmN>Fp&IpAMTFBTX;yl8W|3%7C(NA)k|q zcg!u2%N)1pwn?m^I&-(=^RUm#q74SMzh!W7Yq$2Io1b@1jU;r9$_5%`~pZnU0RGi0b|&1dSc6>{)asrlFMc zAyT}kAkrQp?r#;>d10xRaz&rW7$UxpGuLxf`T=PF21wv0uaQB+5*6W}7ZZ(e>n2#057V7u>alF9cvoyFkg(PV z;#pMgGlA-Nk=}W#S#xFVB#MV>P|?sxS4`>o=67%5` z9warEdQ5T+S}Qmct1)RQIg^ST0hY5Ngk{bSs;r64PL(Xa3+!?R9`4$m-Sqq=^X1xd z`kL2+JeqvZ3toCN8=ddal*6#>oDg6B@^fN?PlOUg37d+ko#r(*+yc!-@jfbqOF_w zXyfzA^sxwX5h8($nTNfZ3iHuyNoNJvuOev|` zAlUYvueDPgBDJzm)~(`0`s+&lm3JsM28@KmpIWwqlKH4V#!wa}$l;u+ZB5 zG;Z0h%H(}z&lv`gte(q)le2ui+C;K}kOS+wLpRM|Y2T}RTb?gs=G_C?`M~*WNoK=$CWYnZ20#6hA zZ{(+3zdk`EL544HzIe$+^!YO>(s+D*3H721FzuhFO29zsh(elxS0E*_iWls>{u-K= z$xNwU%g!^~wKXHi5TN-2XfTA@VzEDHAOw>RIX2$+Xx3-kH96jtjpdt9dq0R0LXTg6ymsCm zeLw^SXN;}fYIW@;kXM}56rf#WNq9H79OeLT?LNzqH(|EE@4V>Xw72T^PI;HZ3ecRw zIEj|K_3)WglVwdAXeX0uS{$d30*)!>(^uhSa2>Adk>1<-U1N$uh@>( zMm+qsORg671_pN0+4qbr?JYT70zi)lD8_5)vHBo&Euu&8JRGgqZu3x)kKOW4>(Na@?+Zard z2Jv}<7Wm}R>gwtoyYNlrb<6Gvsq1!~pVHH&ty@e$-3Sg`*Edv$zjLS6K4)R2{%YNF z_q?D)JO1ZK^)>kNiVE|4Xww@jd#SJh9Xz;73q)m2gN_?oHh=7eK5{ zxqX#RDaOMo4bUS1ihqQ;pYMP}Z3SUqcm0>PK9SQYGx7ZhofyS#y{Pt!f47!RQ>bEcQRFs#;jmG_dj5O@nAjj&W__W}N$W+LIj za@|eirzre~Jj}wR=ch*BsIWqO{#x&4Q&<|~t}MguaO-G&lJixFAaLBG-r%z*e-JoU};<)dxZ?xOgLmYpQ<@Tl8YDnrYW8;@XrdP~MBcn0;))=6zwfktSfbDk3GLO9>yWp%XKOkug&SRJ z>o=*ioT1jN$%p{XdlVL<5kAo=X0z-8>nW73rvqy8Azxdzc1zjKx0i0BYBr8Fgk@jq zIH}<2H%CS#Ic3K(Oey+b9UM%v#&+o`y=wPxvrdZfa332`)Xldt*-YdXC+DCPQv5>I1J;oGyd&@RK|JxAtkq+il$Qpt98kJ7m;9; zMK+r~Jg#U*2qosSEr|^(5>*bZAenQ|r`eJWPRs(H$_ zdkr{fk+|9VWyUGlAy`^|tZi?5@l?&zg!jPl<=v0_g2IyW0MjBy?)FgU-jQ_HWPpJCl+~fDMY}$~WJRe$H*+u8mY#)$ z2E}G`{q9Gije@o@hNzg>=$_BQs*zswQ@&YkVz5~53@GV%IPF~Fgx*2M)7B&el)X4! zZY(|9SfS{g>0pnU_s$R9nOe~E!D;B@HFQ!-nvPtb@_d)ra79k9fSNeOhnpLsh}x~c zt9nPXe0F8Fn$lAq&|rT0^qBmfctN20$CbQfdiF*92vD;~7>oKWKJ$&tWnW4-GL~3S zxHx>%-GxV`ondBR%{@@hAcbD+CS{>s);KR_wGXbK<_;{5%( zuueo5<^eaC!oY6$otTrL_1p6)X;IC=Y-*W?K(r$n3MO7-9xfu)>SV{l-M8`EeD?Dr zcY`T6x|EPKUg9Yo7b>fnj389`dZH@;RUr4eJSTPBNW5XGCv0cGQDfthB@`v%bqvHb z4~@24lkFbPz>~k_IL;Jt`y6*yscHKQ!#R?1P!vi$pbl)+og6g>YvjZ!nGf?-2=tQB zj3ORlOOpvy+qtZ#vD3sgFijqpaekVr-m;Z1mN|M=5{R04jd4g_yr&0iu@mdcQpe

zO9b|S_>gV^I2iqCXY;(WrQuD*xCT!CV6C`(DBZQCz9+}-OgO_14BXRS!K!uVj`1*) zKYi#IRTVxFtGYUAq9`2B*A!WKE5Yx*bp^MClXg(a9ACpuxRC&IgER3IMfGhlg zTjP3-i>m7&T~}w->^w)96_Zqs_tHpl?jo}MwC#ANwgK+0>6|9XwS>f4Dp}g>7<8y; z9!bqh|AMkcLD-SH%DfWPIdUKRiu;p8cY=|{$d%g2@vzyMaZu&15S?f@XXYBhbxi7% zLQd>Ljl^`$kU+xdkaJPdC^0b!V>?J132fDX(m|3S#a*r!qb5l_7q4XRw;w~O`YsH< zreo_I8y}Z(zvcir_ulWRlIxb(&PXxqfR_VY%H*{rhN6GyiIt}d0!)!i3)@9D7J z{Vk)?TpXdZYilL(?vtjp21z(xpgl8}m1a#$NgZ`iW;+5|M$W>L6m*HsL_slMX7}lt zNIvyX%UAu5ZUs>DSgAwxW^cU|*`9%R^UY?=rp6$seox6Nc_>_gvUVX>;7Qg&Z|Ugi zLUQ%zh2wxbLYqc?pUt9K7;CI)S^qZu6LvjS@0ce0-JL-bRbY#S=yrB`)&zriefmRq zk%_4L)|{heUe3una20VTCC&+1t7+gbygVPpd=N@cMVCK(=M+^4&2yREi{FnWv^hLj zbUGhQYQKh_4s8SPR>#-(-GcY;fTMkrpN5Rt_f)7BSD`5_eU^2-Ku# z=%Ttpk58{1`>lYt2UU3EDXW&T(&LGH553G83P|_LdxlmhdS`cCfFPQkX$v)0a|w^h zN_X|I0`Wg%?#yvcQs>fBI@YPU8(wvlU1@;X`CW=D6}J@+zMm&8YYXo;RA&p`Uum6e z91(D$IxXYj;ThBzdVsHHMtow4yHDHZqG*}J$CT-t);HpYO%3XFR9D_n{amp|XBtRp zr_VVZTpOG)3Ap0!ZhvPf^hWitv7t4F)Je@cHuZ3^5iEWGy8ik&q!Uj|G^?bXU&nYf7n(98s;LuMR`;0NV^<4^Rq` z2iYg$^nH*V0d=o`^IZeSus-Kt-wi7VDqc~Z@Q7(Z_Sz zA$H_NxpBw5+b((W6c=P7+p7`!(#iC^Pei0sF;Js&N9fgCo5k-ZovE0r#|=I?;r?!C zGwoTO!z~G{5jix6X)lFJ;#LjqAw8-;@orV_2R0ZuTr!6Q0Y&tNhQurM7a2~sL%Ekr zX*AGakRo|j-m5s2kZ6A&esQ+)jy!ii*YXp!{A~|X1Bx&Cl8PiueW)3NoR#Su18n)m z_RZ_R?2w-gWFD1~C3&~#E>@tNM_$6GKEViHu#Hk_jBQSTpYbc*UvnFPIT`f z@cBT-D^@sG>-p<(9=nDFeA*07ToM4eCwXO*4G83hV>91tbn1Z{)TX+=v}5o@BucfE z=+a$89R;{IUnSVD6TIp==iUfnCA$A;=bj+I9;5P$c%ry+O-MX3Jog@acztChU9fx? z9T=@Us9diMjqz^pBHEd!(riR?!)CtF`5N$4VJ-VLk85pAu=EporGni3Q? z-)en2{`#Pnf2e3RW0VdKd04Q}WiffV2wGm(P%YH6;hwMywcwP;kB%&eK5nLbAxB9o6tcD*UFk99sTsXhJVyjHB+ zG}L9g;P23hqb4sY8RY1_;50RZ$Pjw}X;nkdXIVtzd+m-cAEb}iAGr7Ay@D*qGA@$! z1y9A5<1cCa;NE3vJQ7|-iAuX3tRT1S&N38p0l10v;|z603PYZzKHux0{T2`RcNeZd z7Plq|o1%=*HV4@IP`{o~TP}n-__o1W~`6rT^a^h1t;(7Zt$ zBxgn?>=$Xw3#9^U`Y{>(4)z@^Z&7dv2^srHZH!F7^CzdkJ;&aS;Qh2LAY6v&!O3^K z=J{!^nu$rHT=)t({={h}X@8yVn4BpN%}%|p4tye_=ile;R71~P@4ZkDtEK&h6)R%% zRs3Ck6P*ehz-Fbp-@7~;qclG?@v5j_&05VJZ9A9_H>E%&;iDZ(NY-K=weKg9Q`?re zFIe457%VEXAHk4~I8jz7LS2Rw9pgC+6)sNS<5Zy`6$EXsGEpMgEFk0(&e5 zvFGLssHU7;jUq%L45bv>$HIGjU+R9aT`i7q}Y^H*%Utaap8mvZXRnwd_jP z(ilkPPo|a`jlZF7LIH8cImm^@v%K5~R)tzXTQ(l&RWgW>Q+B5gb2E}%waa#f=~jXA zU1N{DuW1cEUtxp7Byho;%?OFROS1$Eyyxo@@oYR|F*{mBRc)+GW+}Z(hCS*aO9}>q zs4jJAIr#6BM}rmVGSfff^0^W#NV2N5C?`@Z(^&a)f%AE!yoRZQNKrln&eC%n>;l*P z8(t0Y3X>VMNjF8_zkV*C63D+2Rd9B$AM+rh!>64RB;&c>zVS_vjlg#lwb&2W^a;ct zt8L2$^NaEGijK{LM$L~t{wS4}j@BK3N{rQo^~;{?4HI{HR02yb0l_tF(91-(C=k@vW8YSUY!{6cs_sEDhE7RJUV^I4UgQihe5ZhesJVHhk*i z5)d;!>)znQ`njK_*biDr06@x}8DQVqNVbvUAfi#TSLUkq1LU5U`&=SV42xJoi)t6` z&%=7H`@Pj4wsX^@4*8}Hw85vn45e4l1(Q%Y89qcN^)eyCw-(A(KUZIvX^*I?g%NQp z5?x>Yh~_N$>Sp85z)REZ)c>(3it2)r_%60`XI(Do>T@Fht(B(ktTG4V{PwaJ!b9CT z)IvO9Y}Kmn7gn+pJ6pL~ug6l5Qm@z;!izJdm;%DQmg_re3fm>WXItIL4?4wpM{Go@ zGxj}bL12j+#PS)wac55pO)ET^v3$IZJnU z-w%J&@_^-GJ!nQPenI(@J^R+=#rep!j)79OLREREQl|)5udWB98&b~Jtp`rN6@>O3 zK6o>P0jYtqDapHnm1Y~c>n7{F#NnZycV-99J?`#or|0M@JpJ3{qut`Wo)uQo!!Zw( z+$)O9T??jtFMgpdf^&K6d}(#<)2A(kD9pT1+mN+lPVS{KO%RHOvRE(MhoBX#U0c zkYC!)_*;_qZS^GRM=oAEXc6Q=RbN|sN_H)7cxRRlcYgXm+n#qA0+*G&E*QZ_V-~b< z>{O3a1`Wrij1Z?b(JV9db;Tl_UF{F%61eUz5mDOQb;`qZb_9%l@hHWnKzU#HTAHWM zT~9oCE$a;JLxqoVi6YLN`k_3qV+Q!gDVa$ySAFsn!te2@-GB3n!AIrf{5;vBLpQPT zs*>Hm@ZyMOM@zILG=QXt>w{zoj>RaMTxj-T&KA-goL0})bUa$;v|iz@H8}t?>%dz z|2T#2p>4tf@3z&k!m;wjh35ypyiiM*svVWfgqK;lg&)>MytBDxr24JRlqqBp9a35- zDu~t-$5uXWn}*dKHm3Rcb3LL7K=Kq#MMH$t|DDo+#>qrqHt3Nb-(62b3t$ z^o*}ohtzRHhnjz(#H7`q3?c@jt$zUkk{7TA#9a9K3i^e&J%N5LKhNsc6!0()SpusR z277K^<}pArsb%5pRjdz)#?)VK&dPDwLvpD5lW2@at^k@bWR^H=jq-k zDy{8GFv_Risyoa)(%+GAU!&q4BV(`=zvx7h7NGXN_4m2V%4x3&jPtY80T66Vgg;nb z2}s|I4(Y?6q74tF2`)jFo9L3Nbax%P*NjYrigPueQ2^2Drjh@y&3ctp$HLOKA0PS= zo-Z(p+YrR{M_!K%Y~C(3x>Uf4uebA%@d$^gXp-udhV5Ji1{^Lh z_A0*zj~yNA8X^>``W`W)qu!mBU`ZLO$bpSCjt48=M-Nft^hUItGoGg=w(`~DD|>^E z^xn$~9VCv9MC%)Uu7flDUIS^JFa6_&dY8k+&z`&{CMGxD1vqJL zKq|4=Y?;2F7nX%gJNHEUGtBmFPfI|)DCI6SW_(;ZQ4k=^mL5Z|Px@HyQc2Wc;W|sB zkt|O-_qXe8a>p`AQ5Agm6BO0#KI0>ezlCLO!#TNH?`faIYI&B5Jqs)M_2Upctcso= zGtxM=Z}hc}ijw)dE$np(hxus7Wwtqx5oRQ_MaH<0&*t=Li0rkNAdzG|mL8piI33w%v(YUAUe+&nU^);`X#x1jc-` zo{f|-$q5VKF@-@c69C~2Km+-zP*r%5$$UJA@b2-e(SMY#jZQMcNf&$4AgAS0!>DXD z&CPwS-x%*V?jQg(EZqT+K?M}gJGEHFeDJCj^&bcpxZeUkeCPlj5spm#KM)-NPH+Jn zEZOhmuYO}Mx{?7DPeh@zr~hX90T8U+qW~P2h{V4UAK?3u5CHn1eg633ACTw~0S=H@HQyZ+}0UCGe#@WjDj@F>oX zFps22R8gA%y07pfLLt54GP^Bm>YN^ zR@mQ~5bB0A{#!urPn(6vmVv&IxD4QbZ=x(*d}Z?P>}(%x*xRn!)5Mhv0YT+g;m1Dm zB&RtMX9pvgKTu<#0rbGa{){h8gl6+HHDkXN*0ysZIfw7C4%7J&FdP|a%S>ygKA>Qr z{Q1{b)V9KcWamzNGeVb?lc6u#9WuDb zQupC9US;G%z0!HjOv)(U``E36V8R{`#Vvg|LG46}!x!!0JsuzI60AuwYbfp7-1)M} z@BhTT$9Z63v@DEe^W)Ow7}QF#kJq~AiZ4P&Y94h6qvZr7`3N(|lN~lkiCyMpuCF_l zsr%C~FF5CI{q_l%_71R}uY0-wVju`$UY$?rK^Pqk3}Ee2psjFd)4OUFsixuuJFA3d z2lF*Xc_uC+*boZ$ z$0L^)3lA%>mSMt?3U#Hc;=82hVaoiT6tgM+-qyD<=^KKQqk@3d2L>Fa2W0H{7Qbq% zD?cd)_Yj7t>S7+D?S>QcNsmJXOG`%4k|jx?QeIAG1Ud=^o(Z3Yah-5B;D#2gzFfVO z_Yn^t7dHXeT{JqUMUp(|{mAwzJ*CH8FHjKtTS${TIPq+iP;acmBQ@i6P&U&k6N?RU zZR}`kOI^j}vJd)sny(DyKl!=oICHiACR^|M9obK>gGA6)8{%Qk%VbZLw8A6$_TZq> z(O`AE&cN^y+1c7-mta&Y$#=$)*wG$e7cr%~o-SOYpKp!CR{L;+1U!!QZ@RPOB%afLcG0YIh1vb-A0j(-tVXdh zF|P>4^4kRe+)`T5YuBTs&Dy>o*iU}GbXnh2tB>u26MW=cUJW0TFMxA$6g?ZQ@{0)5 z#6cur;6Q6|Sv1IhshuzA{$?zUMVuiuc6&TOdf|1u;)X&4A>W^yz_!rYm6lRoGQ>ks%iPxF@7LqyMVdA3(ybK-q6_$tIEU$(*-pQR@3fo(X3kaeyKH zQR8htDC*ow9W3TaJl7ItGWcDRJ62<~Ic6~Cl6pWoFUomrQRddT`xPf`9FUn`LF|cR zOq?ZIGcTc8+iY3DS5AizfUB4ncgV&^7t@Z$Ek-WtVLlK}LBL`8a%7doiGeAhyuyCl zHz+GxAoI-!RQY^Y`iDQc$VlVNu!HnBCvUt^#YH@cpgTT z<&5H%+FZ&hphqQz(sZ>N65~K7!(3IawfZL)sMQAE71!{9ouwCC%$*FH+0{y|^WLn( z>kLu{DU6L9)pf5f1_%td<5ZA0>e>7}9g_A^jNEuF)WN3bzD*S@`8?{vEopyiQ70gq zS8XL9-tKOx#m5Kb*%)UOgM%So-CA1#*D_NQ3h`eoC_N;2%X}5(bqspCMd4DfvhU1w z7cjw-!4TtcBRf&Jg6EQ%4zf04q(h0KR_-o2jYtCrMQ;j2aeb=3KGpWd$LW5r2*)bi zg@^s;26~RPcXw;*ew6dc{IWSqxx`<|Rr1x{&4RsVysFSKu}6r~Q$t9n2QzT(#WbY3 zZcLOR%oLLuofIYZ?u}2IaPJ_Vbh2;=9ZMcQ)n(&XTqai$-BN*bq_;su>5aYc!IA=g znw-p8mHZ5}9}3ecZ!d=VFGKM68twazlndCNWo=8SBBe|;A&UkOt98W;bA)Fq{oHQt z^1{}@l)b&k9=W>|5JvFVz{Y0e2>*-EJx>1zpGU2=JAfHr60+KFaPI@ydo-n9BPthr zg~dKg>AQ^?)U_Mkq0!|((>_{1q=!tWwXx&61VI#`9#T+V5(Tdiitf{Ae?*t%@0kdJ-G?EW4FH6A`fub*h-$sZKnQt zIuEra@;Kk2;tVAeMVvEQ^c>o?N49?d9#ElJ41oQUu_%9w^op9gH*uHjSidxk09+b< z&XGjwc?1(i%o_*PUN)((>0kaMqJb49V`dHqXyHtPqY5mD!EBG={AZyBn%4cGo54#p z3p{3RS~T1hstRCxhm`*MJ<+8#U+z(5JWOy?S3ksjOo-{=3gKPNkT zAJy7ojr7;Fc_5|hmhijzCj4nJ7v@pj+7JEqr}RurPBBl3{}@QCB;{xK>+B5i*2nNm zo(Ab_Kmg(!Vjy6ucSOd(_(aBBG>Kw{`tA=pn(M0wGHtWf0&Kjgfp@E4{vufV?qCLH zo_|tPor<11@H%iMTB=Zbsu&a=FjcmK{uo=rzDv*J^VQ5veTSftsMz=|T%7E+2=!z4 z<8H9Vu?jFUSwqC2j$aEfVK2Y_6`qMNyV`lIybj3}u4p`cqV_jo|gB9$E7?%drW<4$54FSPXG0pe~f!y5UKyhce@Gz zC`|V&NOb=MrGLa?)<{>L1+j#Qqx9+w@t2K1mEBlSRw^K!bf-9xCnRGZlf6r6qh0=b zMzgCFeHCV16{W*ooKE18sT8?*$L56U zB6Uff(k+>`5d~~Nj8_a_Un4$-7^O%@b-S#{VUo8G7Y9$df-Az;u2|}{b&)ezWn3BP zV)B)d!~9WZV}#+Xif0W9f6Bl7j+#k}!aiA(NH1U9X;6r3^=!40_M;QgzVg1jcoC)9 z5-lz*0)fF-b~i$sN!`|LmJ<6zDx^#FHO1owLE}klC$c0iRUEZ z%V@RKtb=7!Cp9xO15bjtSFVTwiy!<~o2W+&R7Zd@8L;BHtYNl*%0t+Q4ZNag>uziNm{xIpgG6&B$ISKs974Ur zpkKY!B!ALf;_X@gyEN3KzKL2EC22vA(vsx0oI011ai5E~TVo*{I}>Y$u_S}zAzJsv z+owMH#BbM>TR8Rf(jFXC{3#3idcD<}8>-9DVBpau5Pa3Wl1Lgi^^1KR{k>0jCuUuY z(g?H&&zE-&cO%pI(_8rJ#biqNF(LKNlKw+TUhkj4z&Bz`%mJkr6M0>%L4%JQ!$3<$ z#+>13aZixUBoPRqug1JH7>7U*ny$2niVjfn!JWH!T$Ci2-UoO|{2tZRy6hT&82{AN z)SWs&(V8^2;pBoGxPGicK|xVYa2Bpo^;*)tCd_R{c2jZR$`zc5TN6ovZrvElUW>M< zZ^c~hpSk?P6R&T1TQoOVh6Rjcs~eW)r=bep4N7M+>_Rmg|GL0DWh%Z)ZB)_Ngfy?vUa|db=w9@UlGMC!dT3 zV>@Mi?xtW~5c7)8*boCX2&fbz@?5h{KbZ_X?SJ_^Djkwvh<9)AzlYhACm z3s`r7d(kooPn7bWcC+5mfII~7M6%)ktLn-Fq1^hgnT9Yo$&_iGw4jcbODr86iuk>`P=B8QXWJ`<1u(h66<$YRO4%XJzCVAuf^0KnB;s|)L$M==>ThH3q6j0|VK!6QR z7pr#Y=U_!|oIIQBa{G+s*EhTS`-*yq>f3z5yC*^t|L=olj}{dP#)SKx%G^c8-dKF4 zpGe)zt9fw7t zyxFD^cNJCD^ykl?dp7Z|DQ~qfHojL|SJ%nz zHg1o)i`>w#uGXZy@L>OdL~B(~nND3y53_)*l%O}XyzsU0(S6-bVF_1i`*oaiqqv9P zyEA-wyX-6!Ep%ed7@T;E-oQ@%Z(Xk>`faYnAMIP1bERMXi5s+FFR0VBAT$KIgB_(# zY;-(?-ZD2oIDF_UFJ)1VL|q;>BH3+YUCfSDitVyTE0;_wb=2v6>`XVwzn9~~d>#1O zTCI>>v+j0rlw4<>TEE5uYQEGeK59@{Fwj(Kp8n|;xwG-hKZvrmf@LSUTUc8Uk8cm3 z@t9k?26t46d*3lfS7S`J;ht{BhCkF~imbkl6GKa6zpyFvCj0uW<1b?VdHb}!BW}az zjI|_;&opIms=`krv1WfY@>d6dhRoa!B6(`^pQ$Bm{EbtF5KXtD^q{i%YACHwN@h|o zYgGT@PYVHYLosj!W@#$7ao;byfgvIdgDUs1v*gPl=0tZ8PnetVMN~N_NN~y)*8LM8 zMtBMeqAklgYArYV4Lm;Cx;~@hj#*sZfPe)MlO&qY@pO^TemE_m8A=E*=;&if1^v+m8g8>3FI6&C{BU2c>TX+ZWuX>HiBLN;SxXsP;=Q6*v><$sM zm4^Q?zj6e_3KV^_V|FN*aLM3D78p*FsGKxzjRToBA9t#bC474qN3skF-SGdB0O06J z(Ey6gwWg7#LLXOy@pLre5xoidIspzL${Y=dnl%+#(p?=+Afc$HA1w9^WCTQv0P@n7 z#po*#)0(*ssK?28ibDuJZ3hT#(SptFgw$d$DKj}F>|#QLjHq;^ue9$edw>1uRNFMH zTwpcWOJf|Fc;MB$#*9$)ba7qtm=XSuQid#O(j1#${!3N`qtLNztVf-7=2`oYMh`zJ z-IN9HHwd|6S28og`RoF);kjbp!ER&TCRbP2V`Kh-?YqYnbBe$CePs{k^U@CS zM`Fyjf(R1&#!4||y442s)FRJ_;G_v!g(RH8@!ah>{(Rd~;!V*nBK9`S^_p7~>Li(rvg zFmIW^b{uR1F-}RX11GEkTD9Z6G5;~7l)fv)h{t#MLl$UqU{MDO7?R@-h7F82>8zq0#?M-b+SLIXn^F#$Z4-9o|gXe6EYl;`w$a%u> zAZ-mU)+W1*8y#c$2>iX=GkJ`*oJ*L)1kt?q2h(M4U6L6cB@7Md;Hq>7dO}M%rbjQ zcoRo|qF4QKTTb_f`N+sfAL)syvSUx29uIP2yw8L6{i6YkMFrhGuGXr%A(~l9MeRFy zFglSxMr3;2xSGqmWwK@Tez7(#$1f^tZQxXdi86*5x8g;eNLrk&nhIg0yt5;A2GClXf{S-WY)^OiR-jq^K|XzRI@!w4_fSzQ0I=P}1g?#<8rRH4quX)8*l4{=_0!S|*RYPxIHR zc`7d&Es%+yiD)!zBT%|}gLB=fBG^qs&mLI)j1nYrltIo6Zx5$@%FVml(^24V{$Cd7 zgJ72b%Uv%y&{sq-BzV}arJe}s-}=NF!Jo(^lH87zKokS-*efdO`$qy<#}E>_`2}$K zYk1tIOTUo85F%khw3cgc1Dsd+$d$3S8PR-jl>6eSHaroYfG(1CTyFy%$g@um+&7nok){ zP|SLu2lno@f Date: Fri, 15 Nov 2024 15:43:58 +0300 Subject: [PATCH 18/27] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE=D0=B5=20=D1=81=D0=BE=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index c84ea0f7..78bd1fcf 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -459,7 +459,9 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 ![image](images/ПодключениеВнешнегоИсточникаДанныхНастройкиИнтеграции.png) -В интеграционном потоке в поле "" +В интеграционном потоке в поле "Имя таблицы внешнего источника данных" указываем имя таблицы, к которой будем обращаться. + + ### Вызов внешней процедуры From d66ee9234451a5a1cc8b190bccc441a6b987b0fb Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 16:26:05 +0300 Subject: [PATCH 19/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=B2?= =?UTF-8?q?=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B8=D1=8F=20=D1=81=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=D0=B8=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 78bd1fcf..42fcef32 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -269,6 +269,7 @@ 3. **Файловые обмены через почту**: Реализовано через функции БСП. При внедрении подсистемы в конфигурацию с БСП, в определяемом типе "пбп_УчетныеЗаписиЭлектроннойПочты" необходимо указать СправочникСсылка.УчетныеЗаписиЭлектроннойПочты. Пример реализации см. 4. **Прямое подключение к БД**: +* ИнициализироватьТаблицуПараметровЗапросаВнешнегоИсточника - возвращает пустую таблицу параметров запроса внешнего источника * УстановитьСоединениеСВнешнимИсточникомДанныхПоНастройкеИнтеграции - заполняет настройки подключения к внешнему источнику данных по настройке интеграции. Устанавливает параметры соединения пользователя и сеанса (аналогично управленю внешними источниками данных, но внутри подсистемы управления интеграциями); * ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям - функция-обертка для выполнения простых запросов выборки данных из таблиц внешнего источника. Преимущество ее использования перед выполнением прямого запроса является то, что колонки таблицы значений, полученной в результате выполнения запроса, будут типизированными (данные о типах берутся из соответствующей колонки таблицы внешнего источника). В параметрах указывается интеграционный поток с заполненным именем таблицы внешнего источника (к ней будет обращен запрос), строка имен полей таблицы через запятую, которые необходимо выбрать, таблица параметров запроса с колонками: - НаименованиеПоля - строка - наименование поля таблицы, по которому необходимо наложить условие; @@ -461,7 +462,88 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 В интеграционном потоке в поле "Имя таблицы внешнего источника данных" указываем имя таблицы, к которой будем обращаться. +```bsl +Процедура ПолучитьДанныеИзТестовойТаблицы() + + // Объявление и заполнение структуры истории + + ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ПолучитьДанныеНоменклатурыИзВнешнегоИсточника"); + + // В имени объекта находится имя внешнего источника данных + РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода"); + Попытка + // Заполняем параметры запроса выборки данных из таблицы + ПараметрыЗапроса = пбп_ИнтеграцииСервер.ИнициализироватьТаблицуПараметровЗапросаВнешнегоИсточника(); + ПараметрЗапроса = ПараметрыЗапроса.Добавить(); + ПараметрЗапроса.НаименованиеПоля = "Наименование"; + ПараметрЗапроса.Оператор = "="; + ПараметрЗапроса.Значение = "Новая номенклатура №1"; + + // Заполняем наименования нужных полей. Если второй параметр не заполнен, то таблица будет заполнена всеми колонками + ПоляЗапроса = "Наименование, Артикул, Цена"; + + // В четвертом параметре количество первых строк. Допустим, нужна только первая строка выборки + ТаблицаРезультат = пбп_ИнтеграцииСервер.ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям( + ИнтеграционныйПоток, ПоляЗапроса, ПараметрыЗапроса, 1, СтруктураИстории); + + // Теперь по полученным из таблицы данным устанавливаем ссылки на номенклатуру. + // Полученная таблица с типизированными колонками, поэтому сразу готова к помещению в параметр запроса + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТЗ", ТаблицаРезультат); + Запрос.Текст = "ВЫБРАТЬ + | ТЗ.Артикул КАК Артикул, + | ТЗ.Наименование КАК Наименование, + | ТЗ.Цена КАК Цена + |ПОМЕСТИТЬ ВТ + |ИЗ + | &ТЗ КАК ТЗ + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ.Наименование КАК Артикул, + | ВТ.Наименование КАК Наименование, + | ВТ.Цена КАК Цена, + | ЕСТЬNULL(Номенклатура.Ссылка, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)) КАК Ссылка + |ИЗ + | ВТ КАК ВТ + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура + | ПО ВТ.Артикул = Номенклатура.Артикул"; + + РезультатЗапроса = Запрос.Выполнить(); + ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать(); + + Пока ВыборкаРезультатаЗапроса.Следующий() Цикл + // Пост-обработка + // Не забываем делать запись в протокол обмена + КонецЦикла; + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + СтруктураИстории.ОписаниеОшибки = СообщениеОбОшибке; + КонецПопытки; + + пбп_ИнтеграцииСлужебный.СоздатьСообщениеИсторииИнтеграции(СтруктураИстории); + +КонецПроцедуры +``` +Использование функции "ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям" можно игнорировать, если планируется разработка собственного запроса выборки. Единственное отличие будет в том, что после выполнения запроса нужно иинициализировать таблицу значений с типизированными колонками. Для этого можно использовать функцию "ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника": +```bsl +// Выполнение запроса +ТипизированнаяТаблица = пбп_ИнтеграцииСервер.ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника( + РеквизитыПотока.НастройкаИнтеграцииИмяОбъекта, РеквизитыПотока.ТочкаВхода); + +// Переносим данные в типизированную таблицу значений +Пока ВыборкаРезультатаЗапроса.Следующий() Цикл + ЗаполнитьЗначенияСвойств(ТипизированнаяТаблица.Добавить(), ВыборкаРезультатаЗапроса); +КонецЦикла; + +Запрос = Новый Запрос; +// Далее аналогично предыдущему примеру +// ... +``` ### Вызов внешней процедуры From 4c32b7365338104a692f8d386622b17f6a93460b Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 16:27:05 +0300 Subject: [PATCH 20/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...320\260\321\206\320\270\321\217\320\274\320\270.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 42fcef32..aa465a1e 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -238,11 +238,11 @@ * *Раздел будет дополнен позже по мере разработки новых функций* 2. **Файловые обмены через FTP / SFTP (реализовано в отдельном модуле "пбп_ИнтеграцииFTPSFTP")**: * ПараметрыСообщенияFTPSFTP - возвращает инициализированную структуру параметров сообщения обмена. Ключи: -- Путь - локальный полный путь файла сообщения; -- ИмяФайла - имя файла сообщения без расширения; -- Расширение - расширение файла сообщения обмена; -- РасширениеНаСервере - расширение файла сообщения обмена на сервере, если оно отличается от того расширения, которое необходимо передать / сохранить. Например, если на сервере csv-файл лежит без расширения, а его нужно получить с расширением "csv", то в ключе "Расширение" указывается "csv", а РасширениеНаСервере = "". Если расширения не отличаются, то РасширениеНаСервере должно быть равно Неопределено; -- ДвоичныеДанные - двоичные данные файла обмена. Если они указаны, а ключ "Путь" не заполнен, то при обмене путь будет заполнен адресом временного файла, по которому сохраняются двоичные данные файла; + - Путь - локальный полный путь файла сообщения; + - ИмяФайла - имя файла сообщения без расширения; + - Расширение - расширение файла сообщения обмена; + - РасширениеНаСервере - расширение файла сообщения обмена на сервере, если оно отличается от того расширения, которое необходимо передать / сохранить. Например, если на сервере csv-файл лежит без расширения, а его нужно получить с расширением "csv", то в ключе "Расширение" указывается "csv", а РасширениеНаСервере = "". Если расширения не отличаются, то РасширениеНаСервере должно быть равно Неопределено; + - ДвоичныеДанные - двоичные данные файла обмена. Если они указаны, а ключ "Путь" не заполнен, то при обмене путь будет заполнен адресом временного файла, по которому сохраняются двоичные данные файла; * ПолучитьПараметрыПодключенияFTPSFTP - возвращает структуру настроек подключения к серверу из настроек интеграции (аналогично, ПолучитьСтруктуруНастроекИнтеграции, но с добавлением каталога входящего и каталога исходящего); * ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока - устанавливает и возвращает FTPСоединение по интеграционному потоку. Если указан каталог исходящий, то он будет установлен соединению, как текущий каталог; * ОтправитьСообщениеFTP - отправляет файл сообщения на FTP-сервер. Функции необходимо передать FTPСоединение, полученное в результате вызова функции "ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока" и параметры сообщения, полученные в результате заполнения структуры из функции ПараметрыСообщенияFTPSFTP. В случае ошибки возвращает строку с описание ошибки; From b14099013ce6d153c6fa65a6579ec6b4976d1616 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 16:29:19 +0300 Subject: [PATCH 21/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index aa465a1e..a890d931 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -547,8 +547,6 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 ### Вызов внешней процедуры -*Раздел будет дополнен позже по мере разработки новых функций* - #### COM *Раздел будет дополнен позже по мере разработки новых функций* From d7840801331294feb4a3342253ecdd90a6e339d0 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 16:30:42 +0300 Subject: [PATCH 22/27] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index a890d931..58e97105 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -251,9 +251,9 @@ Далее идут методы взаимодействия с SFTP-сервером. Так как в платформе нет встроенных функций общения с SFTP-серверами, обмен с ними был реализован с помощью утилит системы, взаимодействие с которыми выполняется посредством выполнения скриптов командной оболочки. Для взаимодействия с SFTP на ОС Linux используется одна из установленных утилит: -1) curl; -2) sshpass; -3) expect. + - curl; + - sshpass; + - expect. Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. From 9a517e2b7f82e853c73395c96dc4d09272b44077 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 16:32:44 +0300 Subject: [PATCH 23/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 58e97105..0b66a1ce 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -251,9 +251,11 @@ Далее идут методы взаимодействия с SFTP-сервером. Так как в платформе нет встроенных функций общения с SFTP-серверами, обмен с ними был реализован с помощью утилит системы, взаимодействие с которыми выполняется посредством выполнения скриптов командной оболочки. Для взаимодействия с SFTP на ОС Linux используется одна из установленных утилит: - - curl; + + - curl ; - sshpass; - expect. + Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. From 56b6c829e1492b0255432a23fa3c069aa7c4bb5f Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 17:54:27 +0300 Subject: [PATCH 24/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20COM,=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D1=8B=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\265\320\266\320\270\320\274\320\265.png" | Bin 0 -> 69537 bytes ...0\244\320\260\320\271\320\273\320\260.png" | Bin 0 -> 43164 bytes ...21\206\320\270\321\217\320\274\320\270.md" | 103 ++++++++++++++++-- 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 "docs/images/\320\227\320\260\320\277\321\203\321\201\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260\320\222\320\237\320\260\320\272\320\265\321\202\320\275\320\276\320\274\320\240\320\265\320\266\320\270\320\274\320\265.png" create mode 100644 "docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\271\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\230\320\267\320\244\320\260\320\271\320\273\320\260.png" diff --git "a/docs/images/\320\227\320\260\320\277\321\203\321\201\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260\320\222\320\237\320\260\320\272\320\265\321\202\320\275\320\276\320\274\320\240\320\265\320\266\320\270\320\274\320\265.png" "b/docs/images/\320\227\320\260\320\277\321\203\321\201\320\272\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260\320\222\320\237\320\260\320\272\320\265\321\202\320\275\320\276\320\274\320\240\320\265\320\266\320\270\320\274\320\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..2ecf535613e0072d157f4cc8604272aea8715a4e GIT binary patch literal 69537 zcmd43Wmufc(l!bNm*6%y1PcUr4Z(uDTX1)G2=2jxyAve1y9FKG-3E8pZ`N8nd#|#@xpL5{idV0FMs=BMId!DYki!gavaTG)VA_N2kio|CTMF@yD00;=EI(S%cjhuJ# z3IqhCrn#`Nyo9hYsl0=&iMf?A1O!d2^S3t1HwtJ$!2Zv@&~-nht8j2WC7>Bna4;Jn z=d0&-k;pGEmxX=HIvfp${~F5pWd}2~@*5V83x_H!)->EttUzlvZIH=~3>IAQJy$xu z3G5k4a(dD;#CsJjBc;oS#fM;GHzBkhc(O>c_!;+ZCKjVE*JBhAacXI~1pDFLiP4zH zrlFeFrZSbOrtdR9v-;12$OAaz1bh8Ant}6NKbtlwHWh@V(6eY6n!R$kP918tGzO`{ zY{SIW2kFrSF~u)*JgOq-cD!%u0u}{~R2+vb-WucK=Vu$DbLS#YVBox*5AeRcvsmW} z>|_Y1=_<^GrX@61?=@HMVhVz{M^+eWe7HP)bzdZ2VNZkg!j@a&@Z0^t1DxvLSIZ$- z_lQsHe!4H+y*uQcVonM`$$r%yYEU6%f~+OU_p<%G&<_1TTrzhL4QXmf+4ZwG6s&9m zV|57=85xN8;4(Y}6eI@38*m8{{0k9c4gvjV83KX|`~kY$0(gP>&6U-i)Mcc33~j9$^o?u{j2Yal z?fxKv;B(^v7p;w*^hw>Ut!x~5-1y1=?7;&r|543IPWopTCrf^Ebs2e5VOs}dQVs?t z1}1U=L{d^xJ_jQc9z_wcf02Vf@spc5Ioa_rGP=6DGPtrb*gBXpGIMitGcvI-vaoyr z_xRxGZsVly_QA%H;x8t@`G^=h8akNUIhotqkp96}-@w+{iJzSO4?+L_`D>iUZsz}y zWaId+X@Mum_(uyPGXoRj|BcMa+~j{D`=jMAvOnkbmpHyZnDNM)yBS+)h?rZ0wF(}Z z00%cK-=AXsN6UW(`WK~&qp^dqtu>g?N#H-r@-O1QH~u%_pCZ-&Ba)Mw?e8N0*77&X zKc>JV=U@(&rvHZy1(^95|3}@w`tvdVq2RwM{IAvgvlhIZ0*HK!|27Q)#6;nIu!((y zkPs14c7r_1fb+rlPmH(Z!{n2G9qoxcPV9e{>-Y@zcl4HQQeQM)%*s!vp-lG(rmhlLi%1 zBQF*%jO$-x{I@81EGU*-1uPE?)!)Pa-Bbi^B+^3*Xd?UX`L#fcOxPu*2V(wh&VLYf z(n2b*rRT;H{6`gk@oJRH?!`t4c()}S`J4Igfn$gGxk{L_Gcf2Er00xyTQto`4p+>ACwB2&4LA=^K$kQY&)Z_AM)Xrz=h?x&I++!XmTi222E ze!94&ulRG|NeD(+++R;tTDB5{d~=d z*IBA1^)zl)ky3W6822XD&ZE-d$5YD%)19BJwrNGtB-G~SBu47@1aB-_R@NCCcltqo zmX+-fA@M058g>z8VDN;ZtQVt5t0s25qsb-Ul!w!+(Ta_-M~*O&?Ua=g*1jG}3Z*cn z8fE%&ycvO z;#qAt*dRi@X4gw<00s5#E<(L!E= zd=W9CeO|8^8$HhY*+x%e;lPY!x}e%ikXRI;YxoD+WXq zP#}jkNBZ0(o8@eokckP^Y=uq)fep=lNpeL(llKZ80}l9f>feeHtVr0sIbH&VyPU4J zxm`_&GaC;jXrI_CGY%P{DRkZpxpEI_Yk}yx+ z(sOz^TiHPWaC?u>c|~MFzm{Q6SoJeRgo1Ue)?RK&Kn(8Hqd)p;s-Ko(nCoSfFfW8N zvL1DWjiZKBJid7hZ;7tkPldRrT5B-yTeR35S>?A=H|P9QZR1uqU*9~BFW=DfCsA2o zQD1E{uO6L_4bSX(DB|B47!D=Qd1uAe9zUi(1OYq88qacS~EkS&O`=;sZm45yPtC<(p zX>}QFPFrth#hCJae#ciLvAoXo#)p;L)N_za&*$uS_e_x=VCO`$!_gI*600%^QE6Nc zJGN2!=PgSCXI3SdDvw%Cm7{J?r43B=#4;S2B&;LFWfvGK}T3#XGaL=DWVQ-R_aN=WVnkZd$!|aUSg--0?EE;dYklv-Z|Iyr4aJqy^nK z6c+iSTCuqjcz#!G@?>L9PH`l@?+Cd*Rr3diUEkN*Pww+J^DbuGPn{&KOGnXbmEO#8 zh_@g;KHki^=ps5VG}!7H9?q5rA@*c)+OAs3Q#6im5Wc}mfV0@6yT8+33efb99N@fxxzMjRAeNwd_hQq>q#*=1w~g2w3$++ECb#-Y6F0yN!oG9PvSCcV`Np=|_GEMjauO2ta-w(jXqRRI@n|u~bv^6CvWx zz#T~ofe|csO>NJZ<4eM=cl5F8@^M5F5KRv~zg>Z|?HO4Y{NY;@v>=K!Y}0h`-mAj` z8&Frx4Qf(<9U!?g9Yxe$C^yaYjDE|f*Wz*gwdv3YL(iqNEC zpu=L@)jO}we;ZIN5yC$!!OsR*BzUGF@{&?!mPh5Lf zvP%U6T}eJ1s8UJvU0neYXz1TPr2-s5at15SQG2&pH}whCx5qvGQOofuzyPbu#K*70 zUbk^Tt7zY+bAp#_o~Go?cpmFdi7nrOv@xiebwQwrERzm|2mj9Gv|`V9B=HibIb8wN z5cpA-O=(+BewlsPbToqZeBnWZzWO`B*v{6?piC=^xe99@?QQT$o$34Hu8bPdJCed` z|J3-r^h^%9(x@`+#ZBd2lIbhXJ)gPesSavj0!sMUCpkAfd8A0?s&RKrV2QhE;>fPO zG;@h56HZOu)Yh_%lzHWFH@0i)KCby#&Jkm z&NY#B;fV>Qb?S{?vR!93`y!;gh5#`J3H_ggKhz|h<;tXSBr_WZYi-k{`FyVq>gS$DR;u* zh>$R^jt<22Tw9*p&s&uq-6ge^DTe6vZGFoSSN|o6OrU5(=3t>bZ>?_(T5jaw1($H+ zj=p1aAp|g)z&+ZEWYrZmu@ir4XHG11(VC8}H70IW;SE5=J?Y*@USH{W`_)5U zi2pD<_MJSCsF*r=b0sLiw=LpJ%#`~11s7It8n%EyxKumvvp!#@7&;HLgoF(GksdI5 z3!(Q|FRa-|D0IG+$dsj|oflzvj4c-yppfU4I^fvQAcRyodUjq2qTQ1A2Tr*gk;l4_ zO;OoC`+Pfah065uhP;U-y_L&~I!;NS<$hmjn0#r+h9Qt1i0>=1nX_X$$dAqj1rKPF zhl}#_hh?$5m}?jx>{#zhTNMaXj!`-vx&op}?d$NrP?kw-T{%6Qh3;L_**!L*7W-J1 zlyu};kRCfYVGC%T;VLHZDoJ&>3c8a1@IjFWA|B*_6VvmP5KIZL8*b1)nZ!0}lUrZxeV#bvjv^A8d{;a|Lz@sIzS(ND^NsHeq^wFLczvMd;{e1@tO?7Tp_rrLM`ci%Q^h^H}DIuSm zI*1IIa#}^Qiqs^N_T63V(*-n5;G5e}0kO-mdTZ7Y*iSv=KS903&TejQ>!2*P&BTFz zCAqaP@2J!1MMetewA`mR*=`+(72k#-wCZlF73_=OiIY-(fN5pz8E*-e_g}Guy?EQ1 z90nwv4HfP1aTk|UR8l$zSP#4HjOR@MH2)GzyDkW$pdb8}C;_v``B?Ipn17#)C=5dI zM;r*(uV_E#c)qSE?piziFrw+EWOXSD&jTpG%=3#!avR;RWI95fzp8mVp)Y%&mUeft@T)krJK9c0-({3fwfiI+|TrU2r+Jc!|)=+}|&;;3r|^KtawA zbHZg71f~d6FqtA=x3_+F!fpHGOGwP;-(Nz1SX{^5a5VvEbvhAc3ZtnxPjgZ}GNG%L zRT*F~naw=z*nJxmH`n=cG0fOkPns@nq@MFr?=B-Nu8XB=vM1tHN^@|%_Gr%RXB#=5 z>XldVn^aR8?1qiC*z^iRSTA7?1m1NDa7i4!JP*%{L=No|w%q*Ke+y9x0sWD%rXx;e55q@~CiD&VDHV zy0W0CUa~GGc_6#-e&Mm3G9y&)z=FegnmEfG*a+cr>wk(^p;c&Xa`tTr!)7}Ti8Qom z_c66+I7aKHc*q`5;XmI^!Za`If^qbC<1vRKp7Gl(NsBeyXmMraI5bqsdLq2P7YWg zMmD|fN!U$D(m2hfkN@^_SMJM4EQ2}vzL!XgV(`u6u7e%wWx*sw%;#ch`7;@6DRyM~ zCqcW*8W*)t62rG zx-ItlrYttejrjgKE9a+&d1$dxo6Fz79*Ekk-7kcvRxaCrpS{fDooVGTJ>B>uNIg2z z2z+KH$arG{lAy^|v!Pad-g&F?z;OcImQa{|rLj+A-ovYKjwL2ukac`Cri6W;1`uV} z^S;KmX+0NP!l`d{{@}~I6)R3W$bOtTRi#I&JMDyo2s~C&<+$?{!0xgGaWNu-Vv$e0 zc2s$zm`!Se<3htCq_? zw$C}Thiku-hQJseA2?e;uU8FZ4mtxz?w@g=^`C_H%TKfHPo zQ#J6XU>`H2dExDgt<+XboW88Yr0w=p7bgQ<$Yg^ZJy*oslBa9SH5l__C+wE9^f(Y; z7gB@F;5xiJ55F%$t5gz0A4W$@?AZgdjoGEGjyq?I%W*FI2>md_5W&S!Q*_Z}*wVYjka5J%>>jVyB|Y>JdYyhi}|^&*_NW z&nY|<)w=q_3w*Y@G=Hh-=Fwv1nYb4#azP!cpbrlmFq$aXvZ5qt_If!*vYUdO3~xaY zZzhWW&SAsHtDOc`ZPkv*OeVJ(SDOwn;cxn_`j{H9=EqZ9nNgt_E3))_ks~AKfqkaX zAPlkk?1DJk{z^9cT1zJ9Q|s$3J5qt#0Xs4OYERPZa}I5y4ifO3t_UZ^IDf_Y;2-4i z)v-}N#{2womG$5Ka2Dh+sVCY)N%}Cib5Qc?F zO-5*W)XnX!lZy+~O}~-G0M+M~{HC?fW8IUY9f}h$IqyI0&OhE-qzk}Ezfi(%?fUvl z#H>cAd9Vvz^Z3ADH?Nn<+a|TW6aqb@oSjvFeQ!#E&{-#?b>0 z-?zBhc0H4_s7+`nDPG@$6YgZPWMNfi5puUd^pxA1~vU_@q#36rMQBEpp&w>_B7s>&J&^ zg)d~=uF`|3->n3pO^Zq>R;K9Y9_DOYBOJ#OLpfGJy2U7)3?iXYAPhED$Iu^7Fr!J$SaLKf zg$Qo{(u-z%tMn8OJ9@e`n>ob`D?xE^W? znRYsiF;acMn#qik<#QkQ@H4V#MO*JAZ2Bb*^|)s=zpA-LEWr52YB?FP;C-Q7RzR%xc$OIg}Ij%pQTYF z(6B1ow|u+WGl)bzbH3_%N~ePO_KCZUqfGr`4Ax@Ijcjsm zJ&Ao^N_%u^q}TCbfzLT6E9b@nl-=amQDkn+jqxlBv@o1pKJ{G>BOD;t6_wA}A{oQB zd@VHHGWNhtM%OL#*?V_CTsxRwcCm=e(Tb#*gDeA7a(2inStZQ^RsG}>C~`*pp;jp` z2wkql@r&YZWx>8AvPAZ}n5S2RhuTs@XMmq)XLfaulWn)FKUTAza`;}v79LMK^ymjKWb<1i67nXHIv8hu z^%tn;#p>xy*+hGV55MdeWtFnC@P%)fx%E)#^0o%L7}4V>O`n>{%jL7QQa-^fTE2qT z)BtJqryQzf+Q#V-tgeNos9vLgx)$^vt+!R)F+5ALVQd;kTE6cwvuHTwMrob6gC!y> zkLuIn(wWi&!f(G2e`WOM^^YdK!;k7d#BZs7`-6hMEZ+X{7`Py@Zk2V>*6(T?nO~cV zC$PaE8E~Euty6sWK`K&}Onz-VJB(|av6t^?yZSXcc=a~30}?~#aZ66mqw|S4L?`_~ z(O0dr-u3}u>(uy?=A^VA6!AjF7}h^V^dm~O7T0@4TiYU@ga=9s&|$sJDA8CCY<+1L zU40T!@KUH{tZv{bo?2M%`40S9f1m~6A$rycDb__LcrAW@yp+>BWvz7QGFf9{7<<0w zg~PM<(ywi=4i{3Il_2(>X5}Mq*-n^B85L7|I6+8?dQZYg^2TYL>eIo;>FfT3DVGx7 zCAiFXt!m##J%%%mt@q6LR=KI#?5F8ZmT#j_*3N!7a?N*ZFqW-N*gZu@FyOwdB9XxG z%PlEw?X_U;*Pr(8T{xAkHS5OmSUg7uf3G2)nVIb$I)*D-;~(s3-+S0OaAmtF#Fcgq zjOmB*H%>O%2b~@ ziV&|RK+PxnYnxWj`l3XR>4fiWjI4OR2)WPSbKQBQyq3Vox5tZLDo_SkvW{}u= z`hFa8m`297$1o-uX($`Bgp$@0kc?7kJv=O4ZNRby9iUM5Ft8$zWvzMFfi*2(nmvvGD zhv_ZRLBCEDi|hS#9?$u41Bv0@xR!aT3d;uFLjV1wRHaPn27gBD@9e`Rh(Q1)IdMF5+XR?6#Q$f}2aiORcGnT~L8)>7M(KL@Ui# z$`tQ+zgre^Ueh1w>|damgZ2zwbQ0GXcD0iZ7N~Ha`J=Qs2Njcb?g@Kv`gEtg7K*%S zvwS~@3!QE}T^vq2=3>$WfS$y#5r@R=qiDWC71T%9=|S5Frp9IwdSwB6)_;n!^I2@% zS+hQJxdX6$*)xEA&K5`WRR{VQJ6`<&V@L=H!8JSWM~t-lUlrK^99HYodI~$VRc8yYn_T?c zb+BIH`)p-w6MY}drKB?zW0KqXK1q(s%poh#`aXaRpvPs!TH|s>WFVKR*X%=5GdXX2 zB}AZMvsJ?omF|8qy51vZQ6SjcLuoNP&Of_(*|V3e+W1IqY`)MvtYjp=bUr6zPo)49 zY`?Z+=vGLZ3%+_LjgrH-LlJ9MC)LZ?M(#O?*0`|>>t(C1q0>l%sO7XaV+OIs4fR05 zMMI4SM~N6}PkJM$QB=h+;OK;v4^>AkhxKAU4hjgQw;brl4++Tm1P*~lw6~Re=SKn9 zYa4jlOhf}?Sj^1?1c5pc2krzO*F(I5&C<_`kwtjipTv0(D01gq$9!D!Tnqjh$)Dj^s!1NV>1ip zu?Jt#Q_%RJ=$#ApgK{3@H*wT~L%N#tj~!#hTD>J7$MC{hh#)s?;Di~1KDtwm6QbC< z5pKcFb_!Om2(_#V5$&)y#4-L6&HpG$CT|rk)&y7RlEC8X?)GJ*F`dyj=`m7o6B+SV zN*f}s6^(`;sx?1p;?rnxZuAN_@Nbl0oNCQfniv{{&V5}t@Z*Tu*N5|>COKM-|)xJ7+C&8uxD6q#ed0` z$iJ-xNIKOcMWl%J7Fy9SUMnVdZQ8xjd3RX7Ze616>B-)$V79jm_w^&6JLtb*M~#FC z3CX!#DKc_$19N)5QDB!geg>~=?M{ahXbg|V2!7S)(Ryb9jAe0vA5SQ0as<7XO&nP; zIlH>(Uhm?!yF1fA;&tO2sMJRI_X_>FF@_^QhRI|gUT_5jZo&OzsE0kV@nG%#mS3F- z?T9%3t)6WD`5MuRmmLFzfFlrC?|b%(B4)j{@2H66zB?vAolSH+`hy!dW_vdNuJq_hs>#;BLvoI@2iN=Isw-jewxmS+ z)%!?%B=eak*YapUKXvhXy;o1#bB3Qw_~s>VO;xE4>bd)TR?9X=_s|Yo?pI2@+qyrT zU3wwgIo8i29C|8lFNGO_fJ3|h@B zW(a!=-gPc55%d)D2lu1+&F+6Rup)!pyi(5B7?-oYo59IZ5i~q`r8u7xS>}8)b zSgh5+fWyxb`lQoot<-s6Y^7&~>mr-`rLV)3S*{!T5ZWeD!wz^9Ql z$B%uWBs>IPU*Fcp^N-ka&O4H?X0ehER`d`2=Yo`K$(1Ev_OB{0-v}f>!bFST_NeK3 z2W8VEE!JB{n9I4SF}qPg$O%5beVZw(bS}v5%Jv=x^20|z78WMEWm_)CU1YFNrfJG` zJ*kI+pbBJQKM<%=K!=Lm5E~mN6ysa8J&O32D!ON!pXCj{80-oDd6B~{3SZ8J^_FlV zb%))YhzVJAuY>9GbGoxCIGVxAV|iWy~xdWXr4srr+F0TSOxp{b&5dmWNH zLYSGUx$!nV-esO*>Qc>suI_8RAYFLnTacFn z=KFiNu3?FLG5NYw7Gu~OcB^pHOng6G0TUk9RoPDPJEZ>{?p2%F9g`)$OWB;Et|x?^ z*Evj|K11gFyZb>My|2$PC0=Y+p4i0RSAg0pMb&%if9>~dZ44S_(E#&4Md3n+ouRY5 z{_MOGEc~z|s|R!{!B{8$tuSgP^T~I$#}l%&P(4(mLYKR?ev5&!G6n|Zy0yWUbLFhF z;5^I0e%M`%ngK$8WvgU=orhCu_>hv4a(6yJBGIl8n%jJH zHMO?hLh^lUH_g-VBt2`-i*?bd++XDf2D9ZX-1M2(Hx_Ags&}OC--mA!1wv2SIu^)X zEMC@}yG3-y(mK1-FC?>?zTGi~PK*)sdC`O2F-G8Nbz|q_AN3y$A@+dauXJ4BdZ&Fm zI9KeIFx~N^!Xj{M;5DEx0(WbIIpC+)y~owj0_Gdoy5ab3=F&!9m!sat(-?6qV@fq{ z4ey$`7>Pcp?IGNacbWmnRDMK?x`rE|AN4gLJz?})&wa+X$*3F`X(I`5)ysj{S{t z?az`KtJ~7Dbz8(fp94R3d?z-;_P{b7%j}xi61QKEBq`AnE>s{OQ zvE~R>n&|bfVCoEf72^2JpesiNF7#B$4i5cdv1%9d?_Xhk>b^CT+(iM52B0*za4gbi z3MT?i>ij8Bm!l67pV#FiKcgH}Ri=3pI(sX2$-K5v`#a*ZPqYNUsQh|G*`B9+Larac z{~To&x=VImEQ#_i6{TosYJeJ2U>lg`Vbs>9`0d*c>VbAYvtnbkdrhh-;P^DjnK{&K z9$}-lI&dJEJP%np`qwAyQUWhGbWcX0lZsdqk2^nKtY}Eqt2vLK=BkF-y7wdwDjhO$ zW=iszJSQ6!W$_1EfD)YQfZ#w}RYXEaM@(U!Vg%qL>3E46&1C%hjd5L!&P^0Ko=G~Q zqBq5Ive)Q_Qog6|niTOWTIa>G_eXL|Ud%B>Ae8i*NE&B%S)$8)c9{jUv#&-S{zIhGeNsX;Dc`H)gXWdnK}%-0+B<eQT= zxH}1gZ0rVp#VSp+Zcg2)z11U@VIAh|euaSAYgR4PkbPqKEX7qcG*@I3#kVmzm{ruk z$Wvz?&adSf@2AUE1)?WUoeM_C&R(U&MUpcp_VA`!AQ_nQTXC{$<7k}{N@5TcY;JdR zFCb6kSTv*zfPFw)Pl48>SffrW2}Otc%cSKQ;1fOydcDOZF5&WhX??ICwI6LlL_}1~ z!{?&}83cPy!yz+y#?ev2me5Ka>BS_=7ZtGZZFW-79O=?wlv3-4Abq~=DptswX8W)T zBQ>ypDyQ>o6enDvYDz>sP=H)l=$xKTLNvyD7TKH;TwmCMap(JRWp0t4PtKLBIe4FZ zcjv~gBOP%d8dVQI0MRe8@c7t^(RRCGg!>A_Hg1!Fb-n*tFNlggQ=pnz0dA zMZ1I#e?WZzl|Y&iOW70^ z54I6ZNyPOlG)@|4;Dih&x~khEzWMdM4~L$v6YYCyoLkDeI568&WgxCK^^X#Fp1YC?-Q_s+Q)D0}BurPqSiR3XYwvk4ZXLe75Mj_2Un za*|FVN%6FZAdn{}HBaRn&szb#qx+4A&Ezp(8^TDk;LB9sEEK6ya0Tr;hZJ_lc|gJeO?#-TnX6f1wh`4{M?8>y z&xAzS+|_6~eG&-_PjGFE*#RNN8_WiqEYJ!MD&*e!+#~_L%C^v+_g!%qk*r14=nCvm z3s<-p8bnzmnNf?e%f52Ff(2;~-OaF~+&DcQ#M8ttAFlX(R#T*-@;-_@C^WF92vhSH zZ*btg3DzwExb!bXokivmkijBbOq|B>`j4r+nMm+R=QJLmm^gz)x#)aYz!=B6^^$2L zMZKfW5VA@Q0?bb@$+cC&MHl6%T%*l=)NbcS8T7fXItqZBSqywE`XGu%i^g}cd59Yc zTq6vT^oRV#)2Sr6T3?_qQ4!5P9B(Ju@No7+B-TQ>tf68hGy&eXmCq7j!4){Qs?AUB z`5@$7732{iM<^vy2d@{Xpc@cS^Eorb-uRsmDJD>u)Jm~9IW1+ReX16kO(bDqO+^9=&k>+ZpbQcfl=M5fu6qkQ6XK$3VN z&vZKX<@bkEdP3(SiW@8Xufi;6Lr$B*c~S`Z*=x5L{BR5jVC%EF=-E?XCmJv?u)B@i z!4qt6`(PYHk7}ee_k5`59nL!t)2WulAbg1+9IHEUwK*URYen;cgE@10&t@8LSTGe9 zX=W=e>s5D#ml%Z|nXxW_D8|FQCr{hU?p~IPyP`rAMsC-s@Lp0Xg4x>z5!g@m3N5|1 z6_k;qbMC^QhuNVUoemzkJThn^LD(| z-7!_%8%wLp8y(MBHI2$$%^Y*_Sor3RkqF^`ArA!(= ziRrli_n5kPkU($mkID5F= zT!)AFZ^+2r9sp)kbd@ICy*+EqF$=_Mc1P}m#W>4TgLEV<=gRtO%~@xD;qq4Mb?8RT zj$hy#kF;uhD2#s~!2uK|_x7p}Cmp;@$;lOfCX{*RF=I+=EoQ=9?9xI^Mstrpy{QNU zVy}~bkKh-K?sD6nNOX-g>>B}GNvM3$4JRK{XfJ0KmjJIQBhwXXLt=w+>MpWTK;gN4GOvvkk+`bxi zb}1o-6V;k;3b!*aA(3*oEB(;9?t4x=>feE;9pRGkfXD7tQXqaj#XS{VqEnRVJ*!l} znK5};`ANo@LbO21>a{r5YsYtS>yn3^>AH#8ZEb0}{D)x(Y%P~Jw1tLBue%&dX96v7 zqb9~%Wy|U&U%y!HL79>QNvUW#s0ujN6JqNXCh}@kcc|O~Ym($(@)^+j3@p`2HDiMA znyEh9j<}_H)f;($GVkhCV&o4p5%9Tl>1yb`qTz8hJ<|y6dZW@RJFYKJxL@z)w&7FV zfnOJs;1dD-|iq*rnSZ@D^n5tn`p5bYYZ>1Nfx=vY3L z2ZLWqy=c-fTLa6kwV9JMwSJly`ttm^1-aR~8x`ADa(<8O;rr3?#QbFJ5QyxbMftWZ zOI;FW60HpHI^klV#i6R{bmG<={fu^rBHlgKotw9G`{ zH@t%qth)n&4L8r(md}Ogt(qui)8j(KF-#O|c3_+=V`|LTA$FSUcP0Y&(3v1IOcuGw z{1PShk&ANt57;U;uA+J@EwTO7S7PP8G-v zDifarr%G4f0&yjTbs+WvY9#$0`|Uf*FCvYCpJ=3;>sB8oLM0%|&r{iRagXD!%gVj< z3Li+&H)NCwMm+G2@MFZ-pC+ijxx`tT2z`_+EUl~v20i=&hRDvPtSnqkk&Y)}O~2#1 zuo(Y|*z9yzI6o-(+bgw`=r{0me~GeMSIiXLAmu!BM*f)tvc$yp(EZS)Tm!O@mk!P9 zQ#IxccNk7Wby!i*wv~l(s(A(ilXGsd@>EB?+9+S;Qy+oKObV`ZO^FTjobKLT9KDHG zqLF!9Eqyo-Qljv#H{Qo@*$~osq=f4 z&S)~aqjM1GwCm5N2(>p8YaKVgq_+D*Tk;FY zDjm#E*UxS_IsSwa*tPV>g1Kz3Xvmp$yXBdFCH)~NXDP~K(55%s>@+xYwwPtu9PLsB zj7duQ>GPJIQI9Udp{D51x!o9#lde4AYV*hudGVwG=qlc!GQwwMP(!BzPq* zYZJG&MC=&n`FwoL-%sKlz+rxhnIZ&O0VY_}nl|Q#*w`})n>W$f ztPMhNZ@uxtus(%sfwNXIZ1NtL`=>XY_~@w{jEQ=<7i|eHkT+|7e0gczU$5VXM#L@Y z*64|U3hOmxD;VJ43^*kc<&C3^FoAz6Ws}Q3#7EcuV;Y+>eHmmkSp;z6MZi zh&~O(3953}wTy-2wdLl>Q@-6>r~R=D*Oc!SY#+7h@lw%mx0M34ucTMY5QCjf)MdF$Pq+oNTbh@*?PU(SALBU1 zH&P_ve;+^CV85(fM(Gzm%9h{Gh~J?AG;q#pKH#5jb+G^Z=nn_IOFl-0)Ia6wHYBt6DC4b%a%ZTeB4OgX%6`++%2q4Q*x)y7VV4pl zPlbu0UT}m#PDDf`8=MRSUPBs8mWXe^O(Q(wqo}!f!qsUTK{)K$al=}!Za(hA)qcR2 zSEW*E6x6)NA=OQED0g@x4X-NSS09zz6CxgRptpF)2d(;S$;9`2^HmggWEkMcR9QL^ zmmS1N6&Q^eghb!|*Pi(Z54JDt0wRUUj$0cVK#2YJJQea00$`8}!WLM|qMIn<Ng1mL>~~8J7hhLQZ22*jtuBB+NTbQm!HDoT!18$>IHBs z)iKikY4>PQ#wlQ4uwPC%b~a*<6kk|tJ|%Pjaa{Ys*?M8${4j@z@q7vvscskRPn)n} z+%TXhW!AyT-EMn1Ar6$6Q*wek)e)k98(K8o}(j@0l;q6XoPJ$BUEo7 zDZfb-yX}l7;zc8ICEVE92$i#_$PJgV$r+0k;+<|%{H5x=>S^(lhxf%&(c0f3oZGR6 zXD&*!bnH=XrF87UM_ZA=c48--NHkHB&@(`Uvhj6w!O1DU3;&(hqM$`49Syt@OjNxKSk zo2WalBHFIbZ!f}BK*&9M8I1WeilB#Bs)j%$nZy;1cBfV{pMk`V%aW*Rjn^sdxJk?R zMX)Nq(+v!VtaP~1j3MCsX1Wv&go&X6;|v6J*}thj2@(>lcK*1H6F`&|g;tc=&p7Z! z6Dcq_Q*{j#8WGWRFvDAAehUaH(qS8K^K=Y^OItg1yIr}x?7Mlm6dHPNyA==@`9EBJ zb9^Svw)ISG+n87r+qO9|CQoeJ*2K0wv2A-|+jjCjbIy71x%d0Gf8Ev9yQ;eOUbWZS zf&2vc`_(&3ANO8EPp=POyq=p|q|(JTp2`moCsXHoIkF4_=8!QkAn;?1cI0EaAhNw4 zD9jZOT{b(haW76&RU^xNDOD`mo$Bn7pf0wo+43)z0@nW3| zDlb2u(fiGn^<28xsErEqpWj$uw~3&@=fUabiT{}vAWJ7V3ZeWwdG{Hp*pM6T=n^F! z40C*Jz@`9;J0ZRaX87q13XCp~{^Wk;iTYGl9Dg^az+tcQ3)>x!i;9~v*1z8{PhmHS zY4zFDhBR+h>&uYjr+FNQl?AvP+Np>^8T1` z0Bp2V=w{Z#4@GD89d3fA5_}VGJ4or$r=xVj1#EacWprE0 zI^bu(`P;M1Lfa)RuZK%#V^eu3{>SpBDYnbS_{{wctR4`FTJx~6Qi0h>q`BDI`eNde zh*^w|n=Ya3)9bKL!Nimx_T4;w)mllQY};qmuqXeUYVQP<4z0Jh{jufo+fg0!=fk7Z zpI?03(YlJXq7f=+FXPuu7E5w1%f*G&=Ti?$Z~jLc9c?&K`YzGg z;-nn(jddgwW=G#AXLny$V(J_WZfQUM*-)Xr#`}I)(ZM0&i+wtC2k!%KC^x+j*~5lw z&Fr>9%|f@^>4z>>ZteQ~@JMU9(X86LY`>K=KixW!*ieL?d?|A@((l+B7(Z~@<#eAck-u4vqZBFCF$Kt%qkn9xbi&O-dGbPE*0IE zfAPXkUBPI+e7|x>dZZ*0)pV!Z0-?PFW&0eznxqQaf~yNOe@M7BK5e8$5uib3V=CHukWY8;;933k8b zTFr?ju7Bncm>#ZP-7cg#r3Z-K^j`H#d8c6n2bHh?xxRdj6)K*^%sWW7M9i7C9p}+lYMb#>557&A3P|`KMX&VIdRh6f z^yzTFH;=?+MR6q2+z3?&HXUgu~L0IN<+$MkMflGDz2<{~w>! z&ma0|bJ5@H;Az_6j`L7%GO<(rPu;r>_t4`D789M-@4rGoDgqf?BMa4rBQ1b)OyhD=sDVRLD;6}VdYTZx39_yqcKi9vOQ7k~lPrDQrIJox zr`FD3q10kCp6QzC+`IfsIOKd)KF?%q%^vVM;6y*Eh&G8jG$i$veZ@@+KZd7fJ7k&f zlS}7((AjGuAG>M8y?kQwk%Iug%V@(*E2r-6Y}ZM~VOvOPukxU@II9;ZTw|Hfu%h!H z=@TMg%;5m?(zMVL)9!M2`99Fg^f5<=#65mGe|c&ybRnrK=~CJhtNA2mvFTM#_bfGahioLo zjyAD)*{Ut=X76e&WChbqz^JimqS#SBF<1|-laQ+P&oBNRDzH&_}u;qIa8QPXf8gGXFtuzj1VsUI%k>`Wuo2GfDoO18B7~dZPD20S(uAh6|ZG=2RRT_fP@!;CBb`J`3~q(^H+f}u zNOpjgnp$c-o7pt_m&mJ0MCUg*}fpZRc!GXnVpzeb5us+baWfJ5rMXW`L?J)}3vFP~|cn$9jiwJYyNIq37i)Qn@5 z&SrH5Os6s!Pho8FznX-`Biyu^EeOL&)JGH!K~Qy8gSx9y;nI1n>%0K|i>o{>T;y(n zgudFsk$j{#!|gszcdg}Z0WJcs14UG;s*VROvZl`B_5J@Q*Kts6Ovdp6g zdUTjy61B)R4D7&-9rFiCGDqG`O0jgL$}h}+fLCX~_s&ORq-@`Dsc zjP?ho>GU^Uv`A2on=xs~0wNrMrc$H*-*{s$eVQ02al@3rAIaaCC#M~yIpG{Cvym@Z zbU_@Mns$w7D~XT4}E*O}jtv7Kjqqq*$Ko|q9mO+e&mP}{&&y?AWdHdA>}pHnBk zq2duldvc%n_diL0l$T%y_=_#^YMrxPr}ZLVtO~G=Kc@jfF30vYA&9z_ZI{ZgMR{R>`q!gTzJsV{V=80T91Fz z1p&dvu(=Pi-1KcsaL)uG(+A((>Io>(>*}P$1)m)~_0!`5q7%LJ3^;cG&Pwou5y;7_ zCzX16+<+GaJ&~UOu~gMvB%6*Tq1TI{d<~_+&!TCLeTc2hYN4j)G?ggwyo&l31dO1X zFwMX9CpOdg6B1McNh`Nay8ZvSjU@muYANo#0-wuu1(uVXpYLT?R~A8gd&VzJ4eFxh z9=|rF1$+qufl40pWvUTMk5mf&e?_u3H}w`~dSzOuzwf~85VK#x{4yIU`X_3o@e7}g zraa#CU`K;DKX`u0weEOX%(JC|DIFHd5rKYsdMYtfCQAzyq5sdY1Mv)L5a1(OhEBrL zwxkl*!_>9^bnqWQPC*Q+xltZ~JrWuEf0BKHdrhHzF_)%-F;v5rI;Y4DqXtjZI)sP%aP{+F~${pz;R35{+LujFAwe!uSfY z+p1}u9MOT#vtRPx;qe-2chmzANh+DF01kc|rX*E}AsHzh9sK>t0w}xlfHn?D#U3yU zRHE{Vi;GJZ3$@QOUsiY@b0by>JiC?Vf(SKLFX~t{j=}&+I!mLuk<^3lDzQxibH3gt(wf{yC1!|GDHj{s|&?S4! zdU<+=lU<@n&Oq664&OE8F}7;}6j|uS#4r9?a{mnU76!1rwO(?+f3~iF3~MV!#KD1O zT_GUFygT+F-UvQ?$F#M7{MDv4ct8L{r>@pjYdul+1Ny5th-6U!nM5WtUD0Ivwgp#u zRkXoq-TGc!7Iq%fF$L+#eoGCR4e-mfl|bh8Yc*oc8GUR)D!RC9Qf}{dd3qBZ6Q$Z{ z7VYH<)02>MCsV(Y7a(c46pl(MA{<63I8{~nP>f17S8y=viIF+UH8u+Lnbc7Xl;q z8wnE=T)Kyu4i+{xmb_I7y^i}5;6Hf4V{m@A|G_U_4*3FC@Hpg*2vX&p7}V*)zNExh|k-6WcX@J zM5jM%V-(yYs>sk8%T8FRgju1x18@jdatOsc^8 z3R|vGV+awz-z6k~O&p6r7~^Pc97MvJ84S*3WNSMopYpIT7U^+o+Rl2fsdCRSVC@{h z_2($%ZPqhT#Vlq5m%mrGgXFu@foH~UXH&xN)82lVMA<4dVZ~~gpE}#nQe6?r!i!5w zNZl68uURA8OVGOOr@2kTx!`I>0~x(Y95#4U`Gh!XQo~l+?n-3%Cgpfvp>8RnGCLz$ zjaIZM+{JoEvyC!zSH8_u=Goas!8q7|FLz2!kbh@#+8t)P%&HZ;6R3`mA7i}+!D7~U zy*k4Y@Mx^>Ft5hDDFl4%doYk;k2vmmTr$BV|H=~TIyIfY^te5MSNZr$@;8ZzkaiIv zey|towh{%Zfhs^+Q5_B_NIc8mUWv9ACv*A7`F7x{=a_!BEzBGaa$ldE-VPh_MB~3= zKEkK_8?8BHI)Tw(P7Opo@`QQS8n1VKjahf63+8)-c$kJPfG1VOztzhKfDQ=Wm4Hyy zFji)vxE}6k+G)gv(C=Rtu4N~~6(8m_86uYHv_Xq5Fp2HLd%ceQmO+}j`*7YT+_dJ; z{c_*;es|s674vNyDk|gW*?O=z#qPYi)Yu<3HF+! zAwo*X{dw2dua1FAUR$6^P_!@BbaEyGq%{b#YvX+Ws6KQ8`3Os8`KoOMuI@K7{>UN1 zAxrtD#p%$q5Dn7cIESmTy_~q01-D%HLyC2C1TS&`O7daa_^g34C zou9Xqa`C#ruwFOv+yQpd6kkPr^;ArM-hr?j>+F;B(FLybRV~Ni5qIV!Jd5Sdi`n^X z>$%a?_HGzQd+E{+k8^-Av%4iFk@KNqPUC*W0@dqGj{3}d zoWKWi z{dC^$@JKuq*K2uk^frw~D_`%C{>exWCt8UoNcM2!@X&}q#Nm7Nb6cJjA`iP6Im!qj zA?M)UNrf(&O19;Gye*i^-LbzNLuc?U-t)6j^J}YhbE_;Q+{rp5_fckj_6Bn_4*?D@ z*yqJYta4TKeq_W_j71e*VB8~L6zUzl(lHJsqt7Ukh~6VqBXvkdMi~vo{&3yJ{5Usc zOVb>vUEqb+-C7@(_c}U9qBq29^hY|W&6@#SXD4$}``xz(f|aCQxk59&&EL*dgVR+r z&EE4WXGQLU;FZyj1YY36t#I96-KVllOev0U=@^B!?1_-Ole`~C5bcT#{9e4A<;nRC#-qB9=GszI1 zZSj(*4eVp6huA_7%qeq1PL(;;iy_aRD8r)1bMAjNYjf;YAPO+B-E@4u7dIXnEFLvwB=bv|k-;vlK zyWnGZZbGfr#mK#`Z-9q9gTQ3R8ryA8rw>Bb#Tb0>WBxgw;}vVAd($B?CXwHg9M5Rb3+5@i z{WR{3BA5!?{S7|eo}acuE*IQ@uo4STZc;%8mU=!b{-5w?eh-oU4awM?ZHIf*>WB7;OP}0xA(6oE&GNm zC@$Mu)g(~K4w4G{6%FLW|L|sitk(P;!V?$-mYD|H9O)9RYQ@~KRA@E8ba*_9fi#2- zM&m~SBgy4nySHcy5)1}inQ$S@GTg`V`i%Fn{TPxNJDWc>LWMmKcl96`+6o*OlDj;2 zmz#tk2>88p1yFUF>$idOQeXJRd2aHfe%5Y(E_0(kQHI}LejZHjbqe>!34Hnbl~V)^ zd8*6Ru9Olgw7g`Cgs284)Ymth);=Q77X$=`nv$UW^`vSk4+H{HM1Uw3OaiJUUXp3) zRmJJ?TdJ`H)K?)_>g=?vs;b)`naA!YrNu8p=TBR8J_dJ3GxovK7V2i45F}A4oU8R_ z@p}|l;cpw>hdO&07;Y&(Ee^#YZcSj{XkXu~m zgnD20chF%axn$4sGOVy0okZUBeDhN4+#EeAd$YyBP^qwBl=4c_V|3s%0>Mo3Ws64c zYN+mP4ICscyJuCE=6RH7*X3|JLDOoomhCFMG#o*RYqW$T)nZLMqq=CnZG>Izc2{Y2 zeSVgP#n4}GbvjzCOy{B3_@2E%rW8XxqRL4DW=;nH3li6#2#)$A0(wbDXiWypzhcOW z`OXhZTaTZ(j^j6A(;0!w-6VvCZF?spBVd?=9t078$CZf+ktX?cGnPGlaZ|p1=-4C0 z98^daSAb_0SzZkY2JP~O&m_ehdbkjgNw$b1#ET&6qe9DC3)pjH-a)B`93N=DXtYpB z*b(sljW4F0bw|SQgVVHk1nA80ETM;;tN`Uep2uljI!}%=ogy>+(-N!;dmxHwlbj)8a-nGZj$f5-diZQN4+rR z{eDz(gGgJfz}{))tZ5r5peS@6z=FtNiCgilS#w0L#10m6g>|&A%V#85fe4Qq(7Ulq zjJ3FdFjjp@)Zs+fT-D-N1(qvmi0RpOZ&F_b&nHu)eat*day{9q$7tVAca>bm6|Ob; z9G;wI7(6x)LD$w095uV{8bqKI5TkF?id(#<2sM{U!obA_#fItD`YhUBpeIMd$$&Jm zGv0iWHim>Fc22h0xDS07$sJhjY`R@g#~2w*a?{<2*d_L3HU)6ruqq7j#qk$vEeYNC z4mDqaIX8rftyPCpiOFZVr+7=fh!L~$n0~j&|K!H~;5#>I7IK7w<_#)Eyz6&)#ixY1 z8fyEz1a)lgge_#w6)mO*;A2I7Pv1Hd3!6EwC5Fz$eyKrSwfojgbEl3ZKU(M1lmsxc z@5vBq?PsPfmbIlMkpdX&Ma_LMc!}OR{arjk$MU@ju~CJW=RFONlL8!O-)KwqcB@gn z0ka2cy^4W+0oFoxzd<#H26hL8kBECmUQZ6qFJp30wC8w{H{UK1LxaFPJ|x5<%56lH z>%a|ECrqEV+8Ca{AP`Dds$96&tum6c|tJ zJ8ohJGS@7#AAi_Mvb@s{?7mz~Tn*9BHn+gq@|bb&xNrEc)f7Q3n38;I{JOmHa>5H? z_JbAZM%zfqIzMHs5yvXxcSrS>9UG9u2|3a(R><%gest{-WmwIJo?_|x@@?+YzJy!e zT^`jjH$jr}onSg&=FL-gXVSc2z342p`6JqNx@?v7Pwg(~n!BymHRm>5YrKp3GuKuFK>X=w%q{dm3|GI*8mQlyWWx1~#uh_alPvFCtcvlX|JU#N!Jjts#R#z15{~0MrAw& zw?5r&Vq#)Kf*=xlH7nIb#MOBR;*-^3a!pWAL-jm-$|*V?G3!PJ#y|9yECNIP=Fvtn zajA=tw8D)x34|G=Y?&pESnT&Cw6yZq4nOljP=Q&H_EeLuZ6=Z46 z88;e_lceE9xkv`(mbMt5fkhrJVJXNt#&pkOF)S@=5a^yrKr2bCI#48aWJ>MQyI--W z`CwWkp%1kVLuIt&5I?xkQ|GWoLL7Ijo>tTNUKK|d868(>Vs+V4?d%vLrQ4y^70KO; zAUb0h4Pj>I?8>sw$(S!QA<+pXYmj=|o9e$aka1u;;D0RAe%Wl6>lM7bMB3mdL6KJP z3>~&L5zw!r2~ZgF(+2||G+H>V-&miD?B*SD4NKBQ#|GrAP+~lweg8&xm<|->Dup4bg2udFPOjkCu%@Sm6hb_W3WR$LG@z;ydKXBD*ym{~d zBq9ZfVUMIdUG=T(&*2%(lz!$zxmwa1%4^3wOO|4>nxhRgc+$`@l8#0fZy zMiaR?#;Osq)RXb)yuuNTKZ%7r6ja+AXE2(X5lPB5Vvt(Vg>OOa z&N!yo<Xco2S|PT)ZQ@CU`>IWQ{q3qwTA-S0H3zYSA1pZX2Rz9U^O1e_3l z^^gRM90a-f3gv{hn~un~O|7M?id8VLsn$LlqO^_d)oQeo;v^wS7(&Ml%jhXXGQRVR z8W78;_$)Q7j7XOM19cX?fNXcMt9l?$-AAl?Y_4RbrP=H%JyA*lL&mUt75v5tmepUj1W+>tS^!@IQ>Puttb|A$Dc4f}P1o zD7sl4OkYI<^5ee9Ql0_edK(oU5wc;Q<{lrl>a*#Mn?1c~eQVY-yf>uRce5XHy;47e z#plVvwXvr3p{C~2bq_G_Wxv>UJr5BoVC%roH`}_mS+biQ)F|Lrw#MP-WAcL)?6!&) z_>7a^ISnbwa~-m=)y9Rj$RA|UeX1S329dgnv!jHa_`#B=3h$&~qyrWONn0Q~B`8T? z)i*yJ+6@=@M0|X7? z$ys7aiW|r{G@eD>PAi+J>qW(GuD8oGKjPxdaUVt!hDzag_qink(dMt#FD^U#@b3_! zZY<9E-7a}K%ja{2ElQ!09_1bD^E6!}EU85J=lj9If^$s9lAcl?L@=w<uH&oEuQ; z)VN*9$7~tD+F+K5q02{*1~ROC&TkW75NLKnLu94bHd=aN1z ziW}v}A3`;4CX%P$i59=OkV+sE8+X(_HCo zmj#v2WkfQe8Bfd(+F$sNX{Eg4sqynQq3rp zO#!E3RSo73L1&IMSp}!Z^l9DaGK;z9*4?6oxEPr&ZB!&SjNSv4KSnSflXKCSM~_dZ z)m?+|>}v|93n(kd*B)I4eGsX|9N`Y7!^JVw)z9%W9M9C%Gl9tx+WQT+nUgqM&%Ez@ z@jfFDVTX0D-hn|n)OF=f&gI&U*oje4=2}i#F&a`EvZoV4?8oyu#grBOIl_LEdN2KQ z>qv{V$VQhP(g!@Ae-yy>(6&{ya_5nZId5zS8gwLI4Pq}hzvJHOH~fjSV3S~|$6%}t z0}$MxR+(dmtVQlJ;T0B?v1ncI)NjvTIbOgTM+ovGF&|C^k@W|z#Y?%@2J8F*0G@j= zu z^NKZtN|J_etzQnC&CoN`v9G7?YvVBr!dOW~gIyF$|DG#{7F5E-T7>Opa!nT!!K=Fu#GbP&r-Wg~xg ziE?5?vXo0=6{S*}2*Ujn%Tkv!%@v`)pg3S}wsGG=jhH7mFPRcN(~XmN0f#zd$Csx7 z4ZlBDcWKzyQyq&g|14Z_T>?~rxaiSK;ksRu^)X&i9fq{BF!}<`*CSXrC~h~&=z0h9 zdeL7IOA04J5;d{VBcjyHJ1%c4{8`(u@gc#6m_?_YVgWuJTDRE=j_o+iAo;7n?f0J0mbhfSRDu!{goxq1)4hNdI-$(KGK`EDy0SIQSFSv74P<{Jo zvv9F;R+|@u^FTCjw!!vk_LiOdfolwA61{7hCA{}gtYXCexBY11(c9&`x{*d6K6@@R zu|pEBU(T8C`{-bUE^!ds3oB;R&63Tg6bNzBM%*szO$gxc+%vv3Fv1j*-G`td z275&dwro-f(wLPBSw{D~nSLi`Ih#$GSuNu96FQyaB-xnNRhnTE?ksf{f5041m#SSX zUfGsPN>^}f+$rNH*v}x`C9|_4^F%p1YNjOFgV0-0tfJam zg%bue?2hBVLnTk<1s-xFY%7;&RW;UA`bPE#Ih^#no2Olq35quhIQi~|9eQ0T&9!vQ zmTup%Bt7qy-rurQ>qR<~6N>mqSgwm_~2`?6jmCGiFmrzJ)OU-k>Gf1pnMx6|jAj?PfO*?pQojfM% zRlEVWF@>7mj5t-GHIJ7YSS<#Pr}28zo+{qZOgMQ>>QlJG#y;T)YT-qZCOc4N`^+&L z_7J=HH55`O4rQhk&d1?S%0tL$Baci~Ia?!8wOp+SIUfzL$e!AcdaRHZ zqWaF97q-EjrXgoaWiNj4;314q**m4Y##4h z&S~O)B(eEN$vgt~MBm)8(uWPq!Yh08;(p1qIb`+6sJag!pdr^W%X@}nSye9a0=Bl# z*B0oEjN-=yDUdZTT?Q3&mvJ`ur@O|NMlye;g`}#)M-r_~tz6Y4D;|3J#YLkDwA9 z!6r&Xch`K#K6l|UHxmv9zx{i`vkZkLutNuk{2B91h3H69=&n&`aCr*Ey5?rv8t0R1 zC$;WzXup1K*O=w}ZSsD8@!gG9B~3W}es~V{MbX4Zdm2aQEeN(ULxV2Y`4*c+0vAdd zg)!-OC?)`kqE|9s(RrDKOv6pqvxJ+{Ex~w&Ka>mc^jZAzn*ul-U6#9w5Y;b9HzM-H&C!8|1{R&AP2ORLUs33RXor3Q`8F=hee?|^vf1u9l*i(+cu(tBlZ zwfbg9%PVdv_n&Q^{0YCwyP$EL_2kDi|!S zDuRm*P$!$O!qQu$1gTUsjPuT}H-)J-+oKTS8;2|SK*4;|v7*fSg!TF~s+O5z9KAM! zhFc~Drk|S3iC^i%jjq>yIup1BpG94nZaqf|zZPO?4SER8ziOj?ueY57?QYvJ2TLse zBPhoq`$c_HLZ5TjzCPh(ro78v5YQmq2{`t9GM5vpLTu2TX^?Yv3o%?|_w^tVL zSwj!GO`Zmh+9nsL96V>f!OEGE;OK4Mcyi@?qnyoP?tAzsId*F(X{r(mh^hX)DOgGD zX&DMOsXYw{MQfIY4;CP=6vS*JFMMelYP;-Q*I#iWhevJ%GrAr;0v48`jPqh|!61!x=MZ%n7-F26`wzW;m_{Uh@m-i#o` z$H#tMb5X~Qe;AVATiuB-3BmQGp}MS7EjjnFJfpSZb|3-swj;$o;&ep;>Zo0vyafIh zeM4bo;#?oZR8T*#weg-j*|4$|^u(uhwRT<@&e*OI- zXB!>qLGTRpo}>SMfvLCv6!w1}hs|}t&jd1w5mu@))`Liio+7-F-g_?Ako1u+)@=8+ zJD@_7J;=z&41iGg&Ax+f^7B7k6{v)Qk_|>;>UTIWwA<-W1gf_HtDOBb*adM;n>L0b z7QTaQa}f3gk8Rf#bCklCUk&J{qMK{pXqj^==L9U z6Q2ZU`fqpsPMlzQU%fv|SFg>w_0#+IBkTb{QOej&I9&$!K$@PvZ8twbC-~4byE4*p z13&Tv6WIQVx(~~r6<`e{K^`z*qB7XEn2PhiKUCopxbQBWG;NsDa#N6@%K{mE6B}E4R8VB_YR4MWUu$=RlM!Vxo&g&z@d4AwSNwblwCMl8#-Mlq zy8`ZXhT;F2q5rYoeT)EIWKTq*TJzhMJ&1DvE<^`{*b722F2W0ahH`cASRL#W@d;T5 zy*z z(f%|sT-zld8XB5Ay^Z%F{@sxs{<<)#f|k|^^dZB)O>BFNe6&r)gp@>@nk^ST4MZLYnl9$a=E9PKg7kSvrvFA0E=3mxoo(2Pgi1{$8NdAz2 zX8=6`NCOfJeb%5EYsdQ}x7{t>!~Kr?|C;>1 z(DPXWl}U18J2EviS-PD+k-oBk>Qpf2i`c~SA+`MJI^}Q9-BdWX>2Ub|(Q*Zk)3Y&_c)x?{%fh`Gi%;17+=>$q-hr%K2c zD-0=mc36R5;IUyt$|ddl)HkDHJ8IHg8tdW|jc0@sH$5bG9(EhJTE0jd&;Nomz5W`B z^@8=X?#*yPz=tp-!n`&Vm(>U>48iCB;T60yxe96YG(BT$az1o}Nxn5Pk-a_W{g|(} z`BkGGKy^bEcIDAzGxXlH8BP3d{mXl2cH)nGd0f4_>k`dss(%+#s5hAN=cUumjV?Gpu2hw4_Cp!1L zR#1FyJ$dOe2*ar?WyftSrD)5c`}K?7l5J(XwTnT?83wY~>zA`QfXiwAAJI2OPb43& zF6heEbt112`Xz&t$Y)1l)R7VHnc_;;NbRto$|4rLswUL*OKNpd`SPJECgMr{C#)( zb-K|5@wnr*5G&ka&R*mu)#Ibvmw?x9Le;8p^X1$dkDNK*R1Chqay>1#5B-zkeXA>G zV5Zk_+{Y7+&tqTJvAHPV&ZxL6nx&Sy5+|Afp+($ovy%7w^)qIi=!j>da3wk6zqT>| z?mx9gG_*GEJ7E-)Fp-TaClyTF{lIlMj|Q`&Mg#sO$Y~a@Tf<0VE0PFGgagaM+P(>8&FVjWq6#V5;v9U>@p| z1RdgY2VXmE^hq;J1jYS!_$Am>1Nod{Neiql$}sl4I*fU}YYI}9mqEF**GEvXpKDY87SEtc?#IG`{=lfX$~P#>zFyF{tyzD*h~P7gt1M3c2KD~>D89c) z^Q`*9BkK_^9if`^k!8GN;81h{q|p7Y+Oev-?0BTFrAihS{MrwC`h2+AyP)pUi@5no zJjMTN+!%?5g$32N9t|W~e*4Bk2A%U|Rk9hRN|A|*wm*Z@0jLVZCFKL|?2{d6n&k#D z;?t(v;+-}HESRV5{k)&x%@$3T-Jd|EEQi{5rlcqtr*%N$cqD7`aRvG!w;Br6aU)Dh z(6bFZ3+jBkp#g(*Se1BpMBtBeqiDZ~)w&@1qJI$7@{&^cKzYMn~l!0GGXqt@c+ z5QEiMkLx?;U8HXiZ{D(upA(OzqdNr^8$s@{H-Lk+Rp*@6xAzSCC*@W=otnEAm12|> zWB`BIm$WE$9I26X#a4dA$$Ykc7fWzl_~wv@i(oyzjYu!-f`b{zJb^>`G|ZeZG^rAE zQSk4_R<5>djtN>$P_rgGHjmCjjik><=D&9m8^)+mI6MA*aQlKU6fUZlvGHsklSKVT zlNPcLTBoW%x4LuIUozk6=O|+vFIa9a-SvHvIx$3x%j2;)=wV_g0H5x5T#mWV5)h`Q zt{ZHKv%2v|H-s+N>`yvzBXWd*h5~feaaO2J<7adVxooZJCbHv^GhOt%r69+8M5uK4 zk8E#o9V`JH5DM$|3bK_TFp|w2xCG&~=TH_HRf+FsXvHZP2I&C*ax{!4eDMlF4uMBm zRAbV}_5&8#$RqVp%?=!h;xUl&1;k75k1P~b8?o|eof)nx>A+=2sL-h5JQ8G~UPa$N z(HB0#NjE$y4`-4(E1Lx8F2N5U7U{FV&(7)xiuJbMs>1nwM5VjjmbTar^)n7@=kcS5BY_@GJGRQYIP71TO9+_8<%M6h>EWVr3Xn)DUXknH<_yW@c!<)U4;o2}oc6hn_^K$8nmWy&;5+QHzPGioi zmyl~!H^IL6m+>yRPM7Zw7b8QSC`x)i*u)=9fLxS$PfgkrIIjEh>A4rD_^q}DZ9%jkL z*gZYFmk=^IulX zXqcH%2lJ+3j*Y+FlcwHq{78Sw&I#+Ua z4oUxp0s^E&Sq;ED8=bXG#TPB-v85(Mp|!t*n6kmsl^qxH`maI6JXW=IRekBj#9xmo zWX>9V3X-mg{8_3h z2`!GmK)#nY(ONMAY4QyX3hI2LKnBmYh-LnlSu`}k@$So~9aP8muTZgPe0uVv~^&(-dxq>DCQgcg`nf*GnT&A_r2 zSy16nec|xwwFd!@wcCA_8ZCC9^bzplvC>%iD(4b>n2hIy%vMZJwsAwVmGuSeP(K*F?oYO^Yl#gF&^=te=AFRX2WN#HZId@uoVsRu%+CpPi9v1i12`ew7(>dg<`4_yn> z15Tp)ZUErWqcdYy1Do&rLP6hVOAS326tI;P{gFIVT^9M9Y`C=b07Q} zHE{%!V!b&?!zeQ?W=N@pZ~O82tXu@um7iZ2c$iSAHe+KC_`;3EJ8#z!^w76#{}mho z>t}04Ie;bAnSdPnb*IAOuvR3bP&xgw3rdkix1L*RPzoUGY%-e@tE${=dkp1B#0eB9 z#1}T`wOnahZFQnKL*RyqfZ2z0p334ifQF7s3-Nk=7zqp+8P@*e0N77TNFZWo$HWIJ zyE5$pDFS~BWNUP|vlc4ndYW4SJrdXrAr|oFh5Y?2a7d1zPIJ9ezXA zG9;&F_<0YG8s%kMlh^AFJlo!=E~TRAWIv)P74M zTX+MjG`XY#rNG{Zr}Fa?3k6A{OBd?@(E?Ba;Qi-JNEpCA%ANa+^j@(->c^btUxxY9Q+)m+LwK^l#g*Nu!iVTl}rCSBdAcCA0(i^TafN6=zVD5 zor9u+)v~G`TqLl>I=##zbVll|DIm)NUob!wyE7zcUvMS$IFLABomEC zMdW3HUWy}baa~?txGqe2uq8Cc@!$W_DV?54Iq{7C%;?QwEvbTed*V zCtnbqbhdagw)|GAYV~NL{HFRpd>7blH=%IjHVl@0$0`|yM znq)06hYphFP?td{_L57~dhknJTi1mj79o`^Fv%|M@JkJzg!wOxebAuyV@ESbGuPY+ zKQH?;9y@*c7aH`Ee|}fSEb`bVg+(TODa!eQN!ZSol%&5NaR`&}8M7>{C#roqh(;{G zxTNgEY7k4Wesj67D~5f8M5lS?YGwN3Gs;aTo(t6AlO%Nr;=gdsfee<_js~*&6}cPL zmJxD_wMhOQzBtMICQC2yDo@5iYfFG|tqhFNIS-W9qBb`7&OC)!b{eoxOTXNW!oCWC zx=|cUIDYdyf+MqS(RQ3D>vxH`XJ8R1EL86eYF2g75Dw*;Ql%#i1mf40&Nxv&bdO<{}$4F|>L5NEP%V2CY^-lQlv`D*Ma+|*)q+^CMxsK|Z+ znSUz@mhyHl)V-=|Dgs53?i^m=@Nv>iDdwqm@X@*;$*2-R{$?)|4p-99*C+gAQn?;8 z0?1odf}$d|3=v5Rfy!x~;NeHD5mVJCKpRMR}Bb zH1s>=wkVmD=)2?=`lOj63qRSw==*^U7g?Wyf|bp@cYW!-LwPufPlQ@Da%l)c+{7fv z-}F~OMyU>g-hw~(W>5XBuJ;Q;0L%kbn+AMQZ>i?4e1W8NQIITKbH^7K#ixX_{d6#!u<%94vQ4b&%=^*2D=4x@GU9rCS6;$O^7Yg@?pnTd9a+#n*m1$Go^s!$ zHSvaI!Ne|cC3pQ(s_Jb7_;&%NP&jUCLs;>s-P44W-KS0ICX?3h3x+>hZ(}zvoS7~; zHk&p;MhUSs^pwYeH%Vatq5WnYntw9?RV@@p=L|}9Bgl293?!H>M{Uq(cn(~ux)Azy zFTa0Di{$4jdU4YxfgJ^>MjvV7Se4$5~~ZJs$h)G zn_ajoa1a|@&xtH``xTfr`sB}*R28nx;Ro&zMv@z8xiFX4r!_X&8OSmzoC;q&sB=`$ z@5Ez#b48WG;iljVqh8AXT~Ifep{su2xI;8HT|1fq9+w`QI0%vqx3 zhG;cgPMaz|ai?3A&U#Y&xGDlQkJ`Vc81#~LVwT?*dF~Ln+-}AOT)MJOTZNMe@p<$g z=xYIKCOnTcZg2&?kAx2|02x==ZYPUNU4PalCxG}DeB}%|>&55$iz|#V`0+7x!i8c? zC&=4NBP>P9Mb^FF;;Jgh>|%!wM$!eo^@UgIXsG zy*#Gz%yR*7yk&ai`G4s6Ur_ht|Bsk>Jg>4cis~e5#bDEy*A4l92skjR-rnBI%&GI1 zB#r+AnUC|loi|DK+S4R>ovi=i^(N=wcm5u5?V-ma@3d$V-5KtHPTc#kpVv7OjVP~w z=M$RFd(Ywh=a9 z6+}9GQ0W6taPD_FS-ysqw^anjI}Y&{-mVLcBof_fml4Fj61rj^7xIIDmu{pyH6SHUzl>+ih2AuaP!;DXT--Q_dR}@(8o6WrgGaVXgJlRXJ-Hlff zf9Zw+#1+d#y=ka=*E}9vkLDWA@IHNFJ<7ELG#mN>IaUGFB21uYKXAL@r9*meNAkxt z70Q5{WlfQJXSBch2OA%x_yZdU&8nA6JmJd%Nao41|6BWK|AvhXe`zH6xVSjo;qC28 zCy+x}DwD)K(^acEv)xY{)-Rx;KD38fJI!zUfz5{bFv6E8DnI)vJ49YEX?z(Tp)FP$ ztE@(TuKqFMvIvmC1fdr9zQRW`yE-x<+kfm zCj(C}EF^O{lpo+1ZbDgOa{khOzX@TnQjhNAQx|nRvfHQgM_ES}7i!kkPyai1cZ;Lv zm!O2HQTwX#u#atgAe)`72CWvlo2K~cH5B@T#>4!S^GH$%d?u#PFV0`9G+hmEMxquh z`LwERHZ^N6IKnQ@|fw^H?Y+;HF8H4rO~%>sL^1?wsbhI2JNj@Awhl9 zd7((Cc36i45u3O(4S*AhQMTBuZEEgiFhkts`KUqb)wG1O!!GAt(o?1JTH<20Axyfv zaTaIfxY)oVX?o{x1t*{hR&N>;XdWmKVW6EVckt?S4g92P_?UF86Lo)pKs4gCD~tW~ z^h9UYC5{0es5_E6aK2*QvDwHaSASbgsiDVi3I-d9pcwXYVbv{acw<%@5FG2U>n)(--DMrfKg7X-&h-+4~4O zWp;{JLu@TqbZ7QovM-UZKK$-!te8+WFfz(!m90u5gFh9z?Zdn?xQA7Xm#fK$9l(3w zcK`kSaChZB3d`g9Lb&d6tL2Bg97(Q_|FbFbg?#(E$&%Ui>cEGX!8#zeUZAyRgE6Ut ztr>mY#h5EO02P0KN6t?Kr2qUq@jSy4Qw$NhbB8G-+jIs|@J#N)&2Ge1wagPzTz=fx zlM@#mXbgQ>{Lp#>xH4K(g}&1yXZ5@y!*Tx_3mZ8syCnm%VS1!~Uc5ena0b8+y5kZ! z`VLhl^uJ@sL<*lO{Q-icggG;5PTvF?t>Ux`V7v4Q4dN|(4@YN$%kDr19WFoWou^n8 zQzuL=+~$OVMhn=MOmIJNvVXJk<#9Uc0ubr2Sw1cz9J)JC082(h)ArsrSfM+;AH%We zzS$0qPjc*1z9UW4P2&l(K7>74MjO9(1XeW%HDhyo+(p)2~h zQ$dEye|EblC@3h(h3DZ{jmb=jVc$in^k@o8Q$g*C3w2a_+s}F|a69~}85XaY_EyRyI zkg3Z+Q93B#IBQS)FdvTZc|H-33^0593dgC{Yay|%tbB6}R=&7zVW2-fKb$3k3G(sb zn}UlH%d3aHVn8f#X`!cU6`iYWp}BZYTD)q{D}}g#-b#SmX%m#quSBpVK$u$W{2=7> znWwN5vO?A7oE-g2BsT~W=t6@`fA}r(DA|4DOT<{N(^21CoIZ7(9YbJI(E9G(y9qLE z5u?{VjnM$?YboA3mbR=co)<1ERpA}1`Jm-~J)KX0aHqLv+uj%qbYy2T9A?#_FGA&R zPuUL3_I2MS(w?!;kIxMngq3$=-)!~wl_7nRxsZ{g&`gA~fc_(&aa^{q1r$3yCS>0; zX5N>CO2hR{#(LSTg1>^e(1X1jrza6wBA3zne}TADH^l(D;^*gd60Hj-B1%`J(3*-v z16k3;sfFivOH*-WgM&pb6m+%-&HNE8;O6v$y(|5V;U_#1Trwt#EcpcJ?>&c+Uwv`v z?PkBH^)3GHBNaWcBfbbT0!Nq5I^V$|Do8;}bmoFW`J-W|*)dv~oSpqw*L0|RXd!x5 zEoJmoGZkwM{7*qy^8@u;aLGQ=UyE2!>__>%c zS=kr5^q*W$WBbR%kv0|sDsFNK!Yyhev8#TX6!Vn-TKuSdR52vrs=ojsAx68!Ti@p$ zRx8?CbEdTrb|$cE4|rR>*ANkv)JNT%(QJD4)3oAfGOHR*boC-! zI{Hg;E;Vj}?RNj*qHR!^gU?l%qM<3`*gA|#sr6ZKv8kG%cZOCZU{nJs^)+QMPa$1Y z$(=ldW_YhuR^~+go>+UgW^iI+0EnXKUg6p~6&)8E)5EKINp$7*^mNfVcQ%&`qVAp^ zQ{56l#+0!OO+OZE@(&xI*ABN>BC`4DOtVNNe|Q7NT`~3iQx`#4y;gb(Bx9_{p2eyu zM-#7o5OAI0!iG&6*W|-}cqj{i2LC$#iR40g;-<(nCy=)CPFcy;9{7R7VzDA3aNlK0 z5;3Avs+0@zUz*5}d{0yzC)KpbQlN>x(4@K*GSTu=rsCql{!Pbw?|{_wHYhCYs&~G; z=`oJjRU)xH=m(nk&hEv<#rb}Q*Ore4>CYJ%p6lk}g1;g|i4^b3SmY7$rB@ut7P+u4 zbJGbEueITF;WO`@g2+r&oD)38zdI}sT_IU+hT|MZQ_GcsJW;&bhBzSwI% zBt6wC=d{|aAcY;&7)9wVRdo!>&G6sD=ASJY{q}?^XyZM5yqt2zuHQ`!s)pI1nu>__ z;I(=Q5+#(oBSmleR|}?Sje0Gtent<2H2DPc5d6}$A$<5f|K0azx|XW8#xVCIJ6WsVRqpNDDu+3JaZ5tBp0Sq96rS}+=X1$_}|=rq&I znL2><+^BlDoll!6e75X(((dB1f^gul^3KG9LNJ#@qGj~2D&IfJ1tS{RzJ*lSk0r;L zCtoAnD$^5nwj6B*JBG_V%W{k`hhBO@R1Hkqb^#7Qg;^ zFEVl=d3>UDyoB;$i7x3cC3q}Wf{I}Fkjtnj3Ro^OVW};M_wP5G_R|3=%#!!&2s6t! z3VGrSjNY)N{t25&#_3sOZ~cgbwq3T^!eK%FC&GZQt>KSKokDR!Jem-5KtZH;z+i$< zQ&Y2%Gvrn==)rikk^bRhRy<-oE2VPj8%t;ZH`DY%%rC%xMlUs-C4lC%;UPZ=d5#cu z51j(PDfmoaB{`a8sx8=7Qr%G*jpQmV4Zk#`iGR6|@JC|CC*eQ@awU z;TjvUo`OF;8CZ#qSdZFG>U0!PX%vj+cBVx?@DEB_Fl|!*T9{JK$ul^2b95)q=URnG3eaVfJ()Hl6}R^k@(ja`SXQ9h z(^glJDTjQv6Mn4fH5pBN`a~}WEupUtbEcHeK?F-!FwyHLLi$rmU0w0hNAg4zHLAB) zdzanSt}b~a*A3gOY6xMOZ>yZYIg~Hqaf!dv%g*DamBy6r?nD0Z@LhtYFPY7Yh6+D^ zA<68pl!*6!Cb!uMUV}BS=Ic}|glW+t+Nj46)uoHiMQ~J!S8L-TMwejyhxV=gJ@V_3 zh5@`8TI-KZAQBNU_XOCfQkXOjJaQ@LP$IaS6BO51<^ETI~ z_wP=(_^IyqHC-Y4!S7;MqtmRSm@(?NRGUhVaJ_JYnr1}wrYJAJcn;A&T6W4(tvur(5cf*K?$q_<_Y z4uY(frqOd%0FoGx`HCc>5;YXtLoJj@nExWC_blgA3lY?pICMDG+zsWc(i&9AfjEvo z$13=UV^*q~o*|YbwGdCn&l@2Y-Nt|Yd0VNtfNzLJrCso#} zJ&a<1hFRHRCWSQTVccGqy)^$18|eo52vS_aTPUkK{m?YSt=KS%Q8(A zcZg|bvR(-vHqGZtqg#Ro`{Q103@MEb7^yV_)GJH?(HyFgyu}#5SX~NDx!~#T+NvLR z?ZyR~7}t0GUgQ#)tK!WTZ80>ZfV(TehD2XG1Ma8Ud6xOn=WY#vwKgF56qKj{kO)A0N zxe>;*`}PSYY6{^=4Z#vQeE@+XQ4Up0RmTs!aY+XFvIdb;*bwa#9N7qLYlILok=6rrxT7%vk(v~KlKm5yj}hMt&nHa3zV z(|OpJ0-X|>Nn0adtx1#A~RQFlwDo8y4nqX=wcNHobe%M~edA}gt?c#Fvo49s*pE8A4HEc9$oDAqF zEh8q3=Z_@YW(xTn14ZlVWb=b20r+%GEFI7=ntEj(8jiWqE~q{>_6ISuvri!N84Bas zlFn*AIW!P&;p#i0$!awN_rqB^j65^yKU~(o5eiu@ANy9Cd=Rt^>>o?wUw|V9&MS#i zJ7azX1!!w^B@Gw=Ytx>OrtJG0(n2MD`#Vez;H2_C5q5qTemai*pqBF=&TROHrIuB) z*CTfN6WW~rxofARqq#aE^k1 zb2!<*4lVr)P6a;5M!doFP4w;h6V>?ZzZJf+foI`F#{K_1%`4_+2M}V(AbdOigMt3N zY5<2~0e&dNj7Wv~FV^(W0CpiOGv(kvc>T?k{vZ1_)9UpH7A!W@|2zM~uSgyi?DN0w z7jQJ*wO829iq($h?_2oK34jlAgt}C>Pp}>AKke9mddK+pSo%e`Cr^AqjTrwEhI~Cn z524LGMtE*65iBM%Y*Enw1`f6r(*GTE9f7PHU(YTWbm;k#8}8N~PFvM|&xEc$7%>ft zDcd3tRsQeXz&zTJBNw)1^3BpSFhs}4`vYyl+Y>x5f^yLh@=5`Xwg{wf1-Z7$v{JZN&C_XEvjb3kuIXLp1?VWPdHxWwahd zb?^1Gz+&T->FPzN;$ynle)%WXPW!{c%duhT2w}nz zmxWgzfiLeEP^@yDa`A5u;8(d0^j4h)5LX><$$s(RQ8>MlKUFr$|6+C0Sskz_f;7&s z!n|nQeW&*)?dmp0jt;eWZlM-KBXxIv$~Cr3cr@kBnBUXx1HV@HNI0 z0ZZ;qBquta_r%Q(hu`IL0w#mnAsGt800nUQHs;|RR$6kJgu3E-EoMwWZ8N|)!vh7^ zy;2*e!FofQU${6@IsSbHyCZa&MniwT)Y&j|NcH$^I5x-p%z$xn!uH>g^FNU=uzZ-| zn?Sldl=Zx!8@b_8va5)2M0tfX|GSm z;URl{nF3HQfg=dSM1+T$YUd04@u9TSQGeyi^6e_WO&NFj?i2=kDo>u;(A>XSgUhYZ z%ly!t9>{SS5d0LYYcFN~vpRE|)nV92(@$}Q#*eY@k!52bJWT^1R{9U+llW!B$sQ8d zct#1524qvux1#w@fz6k>3&rJg3loRmc}#-@bs%+y4#^lcUlYYYUTGf&JlT>H%ac6f zMSzR}Xn3={Dv+V_BE0s>O(8I zLV6mAf3My?4EVAze1zB$$U}pp!(GkSn0nB#-h34~4W^4x>8WAHMjb&4rYxNwCDdWs zaL2kZe3{yO{mMrofwyeF*BwxY zG69&X{z;B}Ur3lyR5We|Bl$103~1KqG59Eg+bm%?7>rwVPryw_!h6tF$)&?0RdkG{6t z7Roq?bJtx`+X@9a^M0m<%}$T`Q|E+%2yf2# zA9=06&|dZC^oo0`-*bi371fI&$vjC6@yaOWz!R}z2?YF)+J+hC zeql+^G4~cyT~f$}_)DxQjUX{6eNq zIEKinXqi!fU5j7kV1Zcvedpbu(NyOlBw%dK*KT|^%7k&myG*F#EKbL7jVGgwPJ?>F zx?4Y`yF&6!7}yDarwgeo!JyetyxRzOtKK}FgrI(`17H6g9|I=~9#;Lf!wz1FTQ+c4 zvHBY*IW2Zd?EU`Ksxy>ux~N%``01ykx4Bm2C42iV+U?6q3H%9p@ON`onba+{7=^@` z(3@WxWzFm|drcsczEdKJ-XZhrzV-*^qJIZ+n4);>rUOZ)jNi2apG|6=-Tz1_UiVfe z{GUvzii;cs{Uhrs~fe}^)iONf*6 zq-jz(ssA+a{qaP}`n-1f*_=cDIn}RYb>su`h33pbm;XB^4Ck(_x#H6wj(barNn7#<8TLaJ;)PiME7WV!gVXp|#T|^=v!xFY z4_~bJ)*0PSoUXMXiCJ&89~GAvyf;q>(T^v^1F!XkKp1W)ygiu8dCaSM_RInq16=)s zm4-95g$@$*R0&Te@{H}*pxG7)u>)O9Ozh&D3M}4hOl@O|gc#c#92|UQ)iBP4(V|^g zHG6*=51cb3IJhV+6Mubh4G_P>aGbsW;8YbyN+fFAbGFh@F<#&H9B9Wv zdrQ|v=?P=DMH62Yr)x_C9OWZ`-Sc4u{*yZKdf?+F0B}b$NFKW!0=P%0L2qc&I6Ho- zO|o{hHZlGgcK~A-LoA#tS4ad;k|>RSZ|3$ix80P$E93ebPI2Pc>4mz2|L#BClz+v2 zKU;xhX}dM6eB-^L(P!QJi`^fLW<)1sD4ye#99~nQwvbpq)w`CcdsGeN?9rxtv z_XA%vJtLML8w#P8wbxP517!1Z*GlkeDN3hU2Y#}-0ax^sVz37gm-68xYu4~>CJ$UU z^#jTrhFa`Vwz=>LFb30`0SY(M!L?K_Vc`lSULhgBs@J6xwE`eS`tk9z$V*)fyZbj~ zm-QKyei<~BfCJs6clu{gwWc!|&&fy4Ul}KoXu08+3#%QE=OGEckjkVBD$eZDhi^0~ z`?#6)>j0@a=}+_2lDS8D%$oFXd_9;Bj@a3K3lTD0*Po0=f5_#O4b?Kbb8`74)oAm| z{;~`T3E`g%-u`jlowCSzZCxPKtMb>|h)M_e);XLkLVfV zm*^Y&&P^LUT3Upzt}aJ;9OG_qGXY);K1?K}O|c`7(Cx2o0umI_q~XqRvl2%ths#xPhV-?4fTFwM{g;3Hk9EX~yMGD1aXBdt$s= zv#(nK+5aW(eP|9V>gKN_1Rodz6EX(Ic6>|p_v4j}t#5SdDz%J3Nwq*J|9`vA37SZgHFVaHPgF(QtkUR&{TE-5CV#+c^7R=Msobl z@y3}x&%P$NA~-IB>25kem3p5d7kU5Nnqy)CCp7{R9(&0n6ZLe%hG&UKACRr)>dLjd z+cGeMFL;d`u{u&umAfD(r&HwB4G(8)m9z*l(^fjt-rtPM)$HldUx@{Aj|dyff>8IU zdnQg3E__r(mt*<0l7#vv`kfjt{bdk;QGCzHz^#`$a!Vk#vwK~=cuyeFu7=NkR(N6Y zUGANjng-ywG&L<=4(QcdZ=iV6ut@G)gXE{N-ZZH(Pm`%~?TdNIH}~EILDe`XF#1o& zkmMvwo8b1AmM~GlhNrNUD2js`w75X}Zu6K?=VEMhJyM@<*q%WxVWID@n zg&7AEwj|?gY;>A+pfjJE!4K_a6K7~UQ+^0jN6{HQJn9HE*tp^@;Wlh|W26|TlPEDp z%!H^yv}!1^On@bSaAgI47md=FE@0cusdkA_Cma)^DqzLoxF7T@&t8I9|WZH(B1LBfWLq5^5KFX zS+7o=Tr$^w=nR`(u{H&|m`oSz$Iqb#tR&ax4ns1*e!50gH|M3pS%}$MjPjroj>NF-f-YkwoY^DVYu6n*~9`ujp4OAM*w_!j_n5&)Z=2Vj;iKZrPhLaja- z0MT7uWTk1@PoR!rDS4!YY^xQjFq4CZ8Cq|quTKa6N=(^VR1Nbgu{-N{;hrzo(%75^ z^b_d}2BV<$_CY(XFc|#0h!XbhU7r{Fq_VY8-}C}muCB6UnOu&r{KFT3t^++fJaDqn z(Xqb_7-(hXA^8xj14_YxK#3e^A&gJIsJmJpxNup!cv)#d?j$RI@Y(KI8}o<-@0N;E zKmz|=Zx+9-USTFwl9^Y({&~XnJ0uzOR@dfIHZ?_InUY4C(#u@^@`y%nioz-4N4(pr zrKgTtW@Ki3AA?0PqnNXU%9a`i>vea}me_lM!TIoXHUgLlOv%<`rmHrDTNcsKYPnUr zn3sSA7(Mzm)o7yy37Is>$%~aX(^9+|&E-78FUnQi+>O|n(u!IxJe-dl={@I><(rN= zpHSmr3x-fjL{!E{|BKMZ#=6I3}pl zZ?1e%eWScZLP%Y{w_tsi@EsU7US_Pj$5LFoyErcC5s^U0yh`uENby&?S_jFRg6cBE z(t*9bx^?qo{i~`18WmdW_$ddjc_j|z>a18;u6jnVnO*(sWvA?_hIdN|6os@>>;NeV z)03xbS+|7KO^5R0WYOJjQ8Ofuv!V89fq68w`A|CLVKktSCb-{wT zxO4z#`!VyiWWb2;F5te*QFVmH16ymJx?z>zRS{BvQv8X6{i>_@cAa8sdakZatKIZI zL1E@_9#}0}M2%LfM47Et7YnTifsiS$zFzqRFMs}9>rP~%VLu@lWNnAH6;xr-lGTlf z>xt_|z6P5l4Bu0p2#8l?Qvb=(I_9*CdB2LP>jUz&@=Aprf~dOb^(pb=oyAZWR(4k`hAKLcW55r7820B7;7<9G5GwF9msG zhr(^F&`H@JS4L#q)LP8As6ViS7H8CN)93B`(Ty2v>(lMW*^Dy2QZHynw%kNmYUZq0 z)<>|T-+_)R#!l|D6X#0mwQmoQ4&gE%bPh~GatN-?o*qC;_Aq5d>(}(-0ll7pq}wYW z^DFmP9c~xP_!1q}iR&C~X$WPWg`Q@|V~nFb9g&HZ!7YZ81!HJYoHlz_UxwEis#_et%oMejBcq zbvmK<8?Y+G!gy!LoP0$w=wj(b!@eT~e%@gxWzjrtw;yQMpszuN5`5+!6i|bo=DhX# zF~p*Judsq?S7^8$S;*u(aEmF1ch(}?Bdw!|CQCHMP?1LEV#+z|@Lm!2(gr;}BOyE^Fy$D%&x==e zOlzk(j-^xcB5mz$)H4q0Ty66MouI}!cINqk8Ia%o`h3>L0#HaresoLLsn`haataMt zpQ>}59Mf=}q=t}!;5tF@y7NtHwb|rP;&id=p#s&_wM)=6^?Gyt?nQ>XJh~N*#If`g z9i({ZhM{GwaQsp#QC@m`^&KP6mP^x(`L_`59vX0T1HpR**Y4>HS5-(=B%F}()kCef^W0t$G+_i z*9CJ%!?N~j+u;z-hT@VOmUTI`vL%~NE>-~wQ z_lo=0TnC|T*@0_V*&DMHbCJf1h0f!WEhhLs^HC1+$y*b*|*u%&C%tt?;Ru*)Sj67m5*Ht z%XiJgZg=L6u8aAbi!?aaowwog8)XOAK{tx1>jH1yg11scrKC`fw67MH^GqlQ2Rzhg zH#VwX+yAouh;=&`fq{>R=`)Wr(`#fIE^$aT&|m*e2ZdKZfvZEk*}=5Nc-Zk~VcN}& zCiUFDbZU)w-}sbMX5PLpLuWryEoO2Iz2=n0 zky#RFbogEc7(Jr1+TaZZjF}u~maEkO0?`p6GI=1O)thF65iy<=d_y{LM4PJ4Og`V8 zSQ&1*1_IJ08{5o63@~_Tpao0(sy&lQKm=Q&F5jvub>MKDTq8K(87>5%AdjwAw6wuf z=?5PLRA1pX!#ZLvy+h#qvNv})c-IQlKIk^m_n;l7E1It9;DCpL`n8mH4;19axDKzy zkUoGTo(FUSWJrB^xwRNzr*ES*8JmnAkS{CJDc!RLIS(sm(>b5(UiR?r?(UvAec({e zv?3RQU}j=c0^OWoUQ#&v-?1K|UV6*ofk8SndUJEIIsH;)aB?;*1Xij>?MzB6i9TS_lb=f#z%2kCQN*C&Hv{r?dY`N?kT6BW`Ch;J>w92M z$=-epCxcBV0QMtDyubhHY=;3rmdWg@v#_{7zJ3EX1-7)bM1(Pg$0_pXAr>KR4izo1 z$lw3(uy4V$!9^Lfzc`2d@36pzhlDp36i%4;&w2j(i8s!>Y-1{Du7Xi`&bQz{LwNmZ zk`FAFL@MMy*^(He8AV!=WKUzi3oMaVhlWrj;!1a{=%O7G@z!JNxOwEF>9D!Vcm&C& z=FI~Mi%7wJGuvE{F2~g592GUSWqZA39dT58It>#OlaZQ*C6cQh{?_SGrK5A+{i=gA z40o#F}#l9@==B@2B|_YI|@%ctEc?`u6 z!_7EPGy4Eo)llif-tg7o3^9lKLN&G21{1_YE0xWZ5b97wa(}R&G-FI`>~4S3Os?0< zv-UdY(P?HU5LFuPjV4vsQA`J6Cq~oS?~O)Z!9u8rPXQC$i35H`7rIUxuO#frL&ZKd zI6NG)WPcV@TRS)u&Gl*fPQ%d9&3*UZrajU~ZIl}ei7 zUM-icC$&G7&ilQC|4LOMF~46?NpvU7fZwL1wb3B!lk!z`wN0_Xf=ojLN`hUAx7CpI zK|`cOvRBH1Z@-4oi-9A-W@kuQW%3cKaq zncKxd9Zw<*uInh!K@OGh%~`7mxXli5Z*|C~zay1P#Eo8YCNX*CFCnN=Lu$;I#=eI^ z39{;%)Gutu-@r9p{Dw8OA6lF1*K6!4c%SalkpSaKr`8{aj;z+eGu=(VFClFHebX5i zZY}#a5Xm;=(~Q<2fO$QvY#0D^o4sE*+@E@~f%jwx+(BXikletmbB05w@BKv?5*o^} zG+)gI%qQ$_CFWGizMG5gGF;=99~nWNjyI_m6nS|zq6yv zb?))nsaCU2MybZ=;OUPLsmm2n- zVv?a_ZKRT)e*kZTmMha?P4(TT$f#2W!@cfG`O@T*AM>KIH4^77tk=kkdgESkXhrh*Iqa00IyD9}GB{4C+0N~9?@(%tgxE*Wz zRALV;V|hpP>G~Pa8*Q-;XO;Yc+T=iVI1?YPS>OH?z3O(>MqnE)L4FzW;Q#o`7&&kM zXfLtFeX}k*c9@OfWug(`~fMxQk(Mj$Hcvdl!SP5nmloZ%R~GnR8#zU4~eVW$7D>SSou!$jP`+<0Oa`rEaQ-NKxRm{~;+^0{(8ofaJp4N4%f zU_icx&?ZHn&*W(YxbQJRNkP&99e`vS?mw!XT^?}xEQdg=)my0LupZUW^)9+qIb`=& zw1bKzQ(5J-oj2cK23lG#@C43w{RV8scT_q+@k=5HudRg}k8y$6;5d`{VBcyG6agq{Nn+DviWLOM74C zWhX)NMajj*!u85pSNam%b8{^Zg0utn;HiivhnI~FXR;Cxp?f!cZW;psct{QSz?#=~ zOpd%7cDQj`nOR~x+ygG#F@U$n2%wTBnFP3O(|a{sn`=qiZ@8qDI_sGv3T|im!qXcM zIf&Q7_hbHe~kh z$xM+t2i;?LJTM~xSp+U-wfQ3(qnGziLB6OM-cT6SW@atp&=di2s`2NlWyR3kGNg31F;+C%1ihhP%Q)sdzr9}Ebw1$Q1TD!B6?2ZMOE=h{6d}v%^dm$iZ@S%9 z4euiPs6rnwT)D!QaDQwT%3@{`xd^}}s`Jd)LBOP73w~R)TrcF10mpU3jpZsCL%~2& zNSL}seQa=iLqCLT=e;cOe&;|xGI83H!*Hd)YzyIj3=Nt%2!{n#DTIeyBLIE`HKRjW z7~vSdspzOhwpO8g)0@cPCSD+dO>K^ZN+1w6A(bdY@v~(Nk&ZulY@Ynp0nEdwDyBTC z%Uq)i(D|{hjNcRZtH4Z_bUT7eez@K`{`>dvqr1}aD_(N)lBka76D_t)h;5-;wJH6t zh2vq(N+OZuho;r%n}ItAzQUs7g~IU5)|pqzGeo6M(`I2;2BwKUE*g4HkJIEO$^aRr zsr6!*(he{SQ;&6C6?vPs+kW?WN$>gSJY%t;X$yq2aUIXs74r7IU+y0^UTAVeWa5Cn z?jLH7Ga2orQY=fKRV?Ud9A>zDS>9ivqhPPZO0$dYybu_xwlxvYE}Qy1DcQTff__UN zz%F5?)ax)WQJnv4?lprePv%7OSgKQGQ!bt?s)-5p$oM$(%oX~}GnW%KtcK%4qU0g{ zb(8|Sm8x_{{kpl82gu{N#{KBqII2he1V-tu`;d^4d^nbF+uYGWb~eEw;Nr#J7(tay zi$7O!ef8{1n6`@vt-x>ypXud##)Zyi_rv{W$=I$NiuA__ZRs<$D{jky^$SBH{ej1? z%|Kk5m*)#}1;09)Hh6}@i&96^j)VY{m8l$&6Xq00)GEumXq0Rdh!Ig*11$=4EpNjW z2Ogw0%`?4%P<9r*04|Uq>Zm<97NQ9VJLH-3^pGRB&!Ln2wK}M;=&awXMy{Y zEj_>N&AX#pq=Y-p_V!N_Om=p6(E|Z9?A|e)^db$bO38XpQ2MXIQ*s~t9wJ2T65;q| z7Ifk3^AV9vezgm=Jc}U?@$u7Gf)}XINeu5mzdC`{laj3sVz|{*VUAc?Lr{mK?7{hq zvjiTYDq%+JH4D1!s;zu<%vRa3g2n*&w4$3o4zs^&(g19SV|W|4N~5_K(jXR|{aJ@r z_Jhg6Q|FB}K(DkvOAIwy(|<;UC)32AnHvhe(2X#IJE3IJcKLopY2(j%BfC?mNJ`dB zEU2TAxjvm&}@|@KLb{x zp%>fYn8xG7(eXwO03;j8yY*d=JpedRk91!qkPz{JSG2lrm_&fkP&Usyk+Cm{J0Ym zY6wa#y2y29$f6(9)GybN3t@35XDMl?V_9t$j6l~U`+Q_K6l&$#^(jlkc6u5#+)CoX zQF@`VETcL?t?0q#u*LfF{Eetgm^jew_diRLU`Eyg1n9HSO0S9%`ET+fc`YSsjZjJ= z!j=Z`9w?)*Ut{iY)R@uf*hd@%Ai+_khfu1yeSQR2?n_lKl_Fl&X^a(xCuv@_-^@j& z@Dh03+QTJVh7!?7;OQxpNk@LX!XeH4ylW>6($v~YB@t~-aiYRjJHv==I^u^3l(&V~ zxp^h?x{hGZn_M+JV=6jv??l34MoX>i7DmfpL82aCGFLYO3`aZ4f6xB z+%t_#vh(uc9F4vU_H5eVNtkM5!@g9%K zaM?q*Z@W$xpIN#El&N-s*HGDbN0>QTDPw6Gn;Lk;cThA0F{nFX7N8YXR8pi3R?&Ov z@Q*4(4!Pf>0>-1w?v4Ti*w4>GQRb zDprv=d!udKCUd^rm<1062Oi_=0SVkATy8h3WurhA!8fc_a9IyKRrcPMO-p1=PNRX5 zk>$XX3IzJ)^>nPWXQ>r=peOUNm@seXa>R`zHSt5;u))B*k4OSL_aMtuvUE4a&0>hz zRr{Dhug}VwdurqY%SRPv@d=)(p~J)!x3<7hb;GN~P>JWrLulrS*M4O!nf>76T8S9s zwmSVh1sd0Q2(NeFPbpDxlQC~Vfos!iRub4aO)%*3{4sVtbA)k(eYE$1=lM4|J(=2d zMPW%iM#gaNoP)==BtPCJ#li%BuA{IHw~4pYv?mN~&bsZ2pURnM?B@_V4iU^R-Z++R z9Qe-Fb@c6lbj)2Im<+^7-y#$qAjLOe2T;(R67c@6q8N!DDv6>VW}=y zBrbT-lrBim$5(S`^WJu#(eI(TIH;F5n~xZVdsSMWGE8&GUB8ok!Y`eWn3+&{?mBYa z@nN$&rX6R&v>#vECN?y#JED~%8}a}pKVyT!1sy%Aai-mgi+O~a;*9e~{8BuL87k5# zXp4Id++1<(Q4_;@!I$JpJYfol_80zNdtVtAW!L?yhyh550s;~uh_rM`C#-!Skf?s%$Ln7XIfzUzoCK}s7c zkYXP|l@TA_b=o&~9{3ney7}6LFFHCL5{*}AFzs>23YhF0v4>97Tf!G50OO#D7jaiS zF63y9dz5<6%4fWjND358wRahSw~X3XqsCm&i1ttW2=zn}D%+tbwf&&UU50;-+Z(N~^*z5YGf;+KsVuZVR+>Ravb=R5Mx7GVn|&ix z(j-KDo4ZVW0JiU<*O4ze#!b@ib6Z+`JTf6Np63h80H}U_)_nTVCB|`52C`x(W;)Kc zb&lxZ$l?mtlL2~77*@1}Nw^VXjB}FPN-bemp2VJ0dD7#$G%7Q>bzJmwY;RHPe8M!* z<(sA1_CYj!(Ml0Fm8`AP_N&!M1f7CTkkvPUv}gwy#)hQ>G7aeg;nhZ)v01n*%$Il* z1Ny2+=3Ja>=zvn#z8gwo^&w55z8%D@%FZRM#7WA_P)!`QL6mcYMeguI>CF{gwLAb* z`QEI5^3dA##V}l7Bw;XdFc|WIHkWGt>wjrAH5(G4Me~;jq!?tC6j^!W^8ozH)^8jdUE2 z8U<66*&VmJF&CMo0^jO}h|jBGaXEaQ%jPXe6Eohk7$*B#hB(9nDXxf|E*9aaFj)R_ z#ADVc9C>a(mxC(p$+r17MT6y@MvS%^jFw1=hZ8MbzVFc;_=d3;!-7$J$WFV}?Of9l zabtB5C2wH2Qx3Pv4b|s3X4d2@s_>3LTzf!{N>`N_?tZy4#DKlJqllB%k9mzzN!j|u zm*4wRc)Ygzc=3B5v^y|}F>g124(c6N{}MH)fU>jCXCm%rx7hx~7ts4sop9@u113KJ z>Y{v~T-Vzr(@CoFzV6@$t4A0mZI#6@BPQcb;}^HLOVOEp!UJ-*#`ebQ5%0ChQFb;w ze7Qcl?x;gly1vDA`s2l#OXz2Zk4Qlq2x0F*ItQIR<;-g>gn5TEhD2}5SZu1JnB`Z< z@+WlMIC|s^uw}zk+oo3h^_&F~Bq*l0BE}QkjWPw7i)PFi-aaba-cI!>GBI2=grDI` z?zZ&Ueq0w)J2Uy6_c7a5lxxP|v59;ikZ*%%MspO)e9wWLB^XaoizzW6P{znO(5meS zq83V)V5m5++@lQmV6QCe!;RdUj>YTgxQ51@fbAjYs*FOOP!M8evr?&_xITR*BnBHk zK&vodnPxElOo1HbDi2K!aYC5{udgZ*ZslvHYMg3XSgo6F-ryRErX>1Va1H$|1 zS1rO_rpAiAuroOfUu)q*W>Tn~1GI1bH_k!m@Mn|5{#9#vaug1wd@FA^Z@Gdof63n4 z_HCgd*Mqu$dGHr6oc4Ch1TMItE%Uy5nXiBQ>$^oxbMf1ZLOM^PnZO6gPO~WT*w=k( z-4b0P04pz!a1clc0Do#!m7P5Ikvcfm5ki6IjJ{xX+WYb?N>XVOJdZasg%faj$3{Sy z@n?RpTBH4UB;jvIxPL6k2dl=9kp!3UM*ZYpBLDu7U;i~4op`%*eX(J{@nW0k=;E2( zIKF%dW{KS!s}$tzC-yJk1@8DP}ftB`#1vjy@H za*M;U$ryGxY~@LSE4>aeD3&+ zNoN*69(fCBipEo>HwUVGe$*O$Ny)j}t74o)4GF!NsK;DsZL%;fR(|o{@rUZtQ#^FW z5=XXo@SgvE0R%37C}-nsqqFr%;DW(Ngb^=rVM%Da+w(j_BJ%HO&6MtG-x=Eq-C&RF z6qo%qx4ZZ`0`5`BGPB4Aor4qN1ve<(R)IzN+3k#`Vr&RDf=rL@;Wkl)^z~0Rb&SPK zh>3}3Ydd0MDdTY~UyUo0Zk%Uu{;-EVg4U=#)#IBl-03KH!I;gEx;=1ruc}t8G7XWz zy{Lk=7pm6P1Oyow`*IHQ6X1y9e|thJpD5%?i#jbF>ynAjQi$Ug!!o`~%J4+d3R<+* z>cJ!}&OG8GSY}<@_2qNe8#Bz^(p!#XND%GV%Pwrg?oRTZpU)R`SYGywIv8Gnjk^rC z1t4As`YIdWE;jm<35;kxva1aHPfTp8%cL_IvBHMt>(4@!rn*gA!xR}g&U~AcDC2Cu z|LLxue5(J~IChD)=g=46I`4YuU-9!*D_M883&g&K*bBSfB4GLbn)}iEq>6<_hV~$; z4S0j+k~~+!=pAZ7CxDg_W3IKiOgPHdKFMxiVP0}_KLoh&?%8Ru_B>yH^N^qLDR&Vl z<fBOzEpc?u zx5Bp`R;MI%&4jAy#$&=t=k{dsuO-N1xe%H4JL21st3i`A;z5@>be5toO3mK{sq^UQ ziw1&EIhI3;j}Xfr~uVkS*AkJzoOn<5 z#kS{JSYZOKi^^Ldj9w$I^`y!enKwUo$yjtW%*v$AUz#f$zaNT2f1;(2)*`j2?#Z)u zU+GSvj`ow$=1zX62AiuZY_*PH8d-KK*?5UG>!ZnSGS#zgUhY-f5)g^^8KOuiQ75~#Fkx!U;egmv6!-W_)oa(e9-jD-H85GidU-deoL6V-s``kv0%mpR z(zg;bS&MYr;cB@p9bymDkuhBVfr-JPzRj`i*)Jn}F}mBArF02rI)`RpL>%E`buqR_ zkE_yt<`uu2zI0mg>;s`|Gs__R{%E_%{jL`Sl)rmf!PNBdo(5a10ypTz`w&$wl| z3<4n0r_Y>gEgiMjYFp;m_{N0meh*-T>msA0+s8{R+DMQxledj4{2l=?O?tDVz4iGz zLF64RkQ!n=(c9+|H1<7FGQGSQ!h0}`RP6}#aoR67hZ*#Hq;!5C&6aBu1m6uoD zM`WGReZ8%|)f`~{jJ3ISys{RJ&)8}gos1D5G-BW98)Hi+lFlwr5&co(P{-wd2xoDd z*n5_p^@t;40jFC4-|+L=9WvU7?Ze`n`;Oa|*rSwoZ|YqW(vDQVr^r zoE;M{$D8Qo?afdTlx7#fuecNLhO2n!u`OeueW=jV4=-cs{!Y*XKm6G!Fzf(w;m)RN zens%qKzrL)b?$#M;%pabbGI~tMwjs>=8$Bxzos#{b=tRVNzg@+woM#m)m*n%J{2FYvus@2#rwSdiFx#mz-=6Y=axPfUGzw#H!g-R+oTkHV<63oQ zHI5flguwb^z4i|x>O1b9PqIZ*F%^uK+1-(2ZU(Vo{&RN7nG>In{0)Icj0!Eqknt2c zx6rF26^pwkN3aTurI`o_z4aHk6ELZ=d zDp+cot==GN=e=!7q4bx$Y_#1?)@B;fpofW%csx{d0=?$W&o8vrAD1ae^N7j+C5{~^ zYq_hm6&09e6L`249HVB)nWh1^hv;at44Q1HR5^V~6nMPGy#AU6UeRS!FYKl@%*ZW( z;o4oE{OJ)l^o1a2J4YdLe{6K&rZhjLVs82Lp0iRr=>wxLD&Y^S)d&y{D!r0^+R;D)13bS2<~ov{!+e7E)vS*(sQlhKPq$47JlOM*aZRCv9W<)& z(0;MR5tMI>U_T`3dCS0@s+O0MY9%+M#+B0xB^@ve3Kd2Go1>FErYAq4N;~yN#Y>kP z-HazkL@FP-vfIun$idO}({eC-G-}n_HwUv>(-brpRe#iEL@n%#^Wxy);BSgWg`^FXS6IPE(R*nsLzhUnPF^b(}S_SI_>q?Y8^e z#OB=Oq_*(H&og=F z%Tc1@HLsJZk@)%WrXGhHj3~>K&9%;fxLwsnkJ^K$q3H z6ngO3fStZru_MfThOKIClX^EZebP3v?FW0CWI}nn#el&R()4g%>$*4Xt%x$nUKb{V z2^C#tW8RD8i%DUK>g|Q0Ho|pT0&tJhjtycnwe5TyTH%4RFVPInR`p5Xc?%dJ}#8JvRI3 zr7VWfOC_3{NF(-kvWwFovh0!Yk3`RAt4+=c)8P#BICmrgZi`YMH_z1N@N5fG!B46~ zI7 z7m;_(QJL)h!QvJQt5(J}4yzabwQ*@t^Te)ZsK$LS+UR}k*4Eh`t{I2x(KuIl;m-Eg zK>_RDv{)TI_RJs6!IyywrsX($9WN2fkNVcFTg*LEseZDS)N6szr{uYk?+H0OhvF)t z>`qb=Pp*c$7eI3<5^tfg%jD3%{B95&gveDhDVW`IGh?_iB1~ABmuAx#moE=yKV_3m zxx}T^ez)N@LGtriu7Xvse_bO_mMqOYBLxq<|MnQ7gK2G<}3uaVnCjZ015!Njvo2x7uHzaJqF z%i9hOC^|fqnOU=Gt!GFsZfoaf+qMwD`u0Srqm|OvZ*p{L=s}SyAw>~k9$f5VW|nuv zB%d@>OJHQGNohspoF;QV7Tt-9#AIPto>KX~uG$ozWhBdh1F! zh1*A0bFVQ24y>Y)ul>~%Qi&23Il#1pB+7ZqF9#>pdAQkj=}Y2Wqb^kH`bpCjkdjjU zA}*kCLk-Z>6Tu9^c&Ts=Wnk>jy#M!fi6UrfYPy#)-QKOqfp;OT<@yj4qnI*1zV^@w zZ+MJLHt3D#Gr6u`Nsr)!tmT~wd}Ar6*o5b(cwPv`{>=ODMVB<$yLbIRSiKN%)~3UA ziR=;s@fl%NDSD^>my6|udsd0N0ecPogT0KnWK*U`x-~(D@qe6NwI^eL=Kc4g3x}qW z5jRi(7fGY;{mzdDio)I99mqsdrhn*)I)YNbULyZsFC;PGL=k80YyaTH4}a$UH=~Qj z3Ch8Rz&Gr2is}DQP_nMBB0xud`=>4|0B+bnrpO=D>%THd|5v6GyW>Q@G`>(eb-IG+ zV*6gE*Zz(TkWM_e`_KQDME>8IWrGwf-?EJ2-$hgi%k{`V_?$WDNtq6Rp-GCT1SO(Q zC4Q0A5gWdWH#l}3XvPpRO%l8@FfmXelbD_U<*x`4v!9v&zz|R5{Aha-&x~K8VD5RYcrEKJ-dLhC@aSv3jtIu9 ziD_T}53jsEQ}!Qi4(gb+Kn;j<&huh^yvt0boS*zR21nqF{aw)F%n9Nv>Qw3?=YA9J zv>S-SRNf%#C-^<)uMTcqJ=tH|ntwmbJVgflBW{iU26$uL*?^$QdT~JkFU_5;SS&@^QYbaG8At;e#by7?U>Q7ie;<)v;>tgi# z$G3;j`*D|ky%N-0MH6m0rb|EGo%s}z4nPpgtI+_SA><^`1Nt;iqRl_X_w>lir7p6j z*4EalZ4dI$UHtv~E;K4X2BjaLIdjH4tTCUrKvlqO`KWzF#e_%hIEJq7p5o=;MXGgt z^MSBB#4k1Ri_1b(X{pdYa3hcO=Y%CB*c@0oC*Cef|NU-tV$f|wLcccE9HTyMN9(b> z!UHhf%C^CBf#FU9{28AA@d9NNu8mzn4qucZD!%;0{r z>hF(H15`3oR}T?iT5cL0&B)A5Ak5~esHpo{+`-Dv|2a^;rPkT5#9v)R9rU^hdH5v% z_oEk>i!=z9ds9AZ2%9~@<6?@nk3di?+*5ds$Ewfk{gzcSsrgKP;__49;J>8%Izc&Q zFi41Td0?*3fyc!cUdRErTkR!wC?0S6oz#Baq2lEX`pvI?qG0TQo@cw=^Qa6O)sI5O zlLm)|#@u~*E^a}!#UFWQl4R%1&+|j%MNE%n8hre)er~&GK6je^@>5-pHiuB-e~9x# z|8$j@_DaVeuT(Ot7ti~3Dg1|dWdQ;kB`LcL2R$C|@p1y0bN>v|;-vcg-#>OL4NxVb zI`Uts0)G$7(oliJm*Q_(f=?+35Ozw&?RZOk3L-9*>dCsqaWrqZKgSl4?xmRC|E4`X zqd?WfV;u=Qu(oW~sTk)N?azPt^7^H1nKQo@Jz3uQ?rB4rp}~G@(Cd5y#5LOgI!nS@ zXX+c+mmY2|WIiK|H`!R>(=rboks+IOm8>gj2lA}AQ7^jfILVN6QtDVhiEhXgrX3!Z zy*J~PK0_X(oTWZ@4a%+8w{;5|&*+ww>0x{IFX&BS-7F%HD-Sp0dTKu`qwj{M7-(+| z-8StTyk7Q^5feZewYKOu*nO{RTX-bf;snwGj~#|+tUObC%#1NISZxv8p-(>8)ggsd zThkg{Ua4IpaqO1U?3k19O`Ce2+pC6snW}MIpsa#gU&t3>#BUuQsjD3yXj*rSP`!h7 zF7q<`SU=@v;W0hpFsBz|+H>*=5ChJ^ELh&$O|@!W4d_(^PCew>=-EvW+QUuU=F`Aa zZL$qXCoGG0%?s;5!f$;en=sAbIf&Q`&nE_5uXD6{0iIRWM!VvyWD9HCyU>XkdItk$ za%nLYSPmsy%cPpf0jHVW!{pg*vfTMVi2JT-g3jr>w42Ea@BR{o4c1O}3{-GOehc~e zB)T5`y~1oyqv`GgCIgC0C2JQLA7oth6-Ryf|?V7%|)Um$ED&I>!~?E&vYGnxYr@P z86c349B!tVrVYI9auzu~%0tIC&CT&J_>$%Ei!^OJ9~DNAJ#qoNk*M%^y2uTl1h($f z80`$J0y84E19Mq**_`tHNKM`FSNDiuGyX4Uk-oT+D@>jM&&#grqgSJwPVq)q<7>H` zbQV^_0XB%}q*uw$EH06G9mKC>47Q8|X7^sn`{M zeA6VLr84)SM`|v^6CPobsvcIV8AW?J-9VXG^nv~@bqLHwU?!pkzL)>=)_58n2PfO3 zgeM9BU&W0cNgNZ)4~kld$}n@2g}%3B#10hEi9*@L>DlSup#5_Bw!?_*CfJSLhLI;L zVok=G7q1@Uao1x*=9@fp9?Jp8YXKXGYOVgu8h5VinYspc#`1qNO3{YsJUKAwjIGh` z9iUR{k%LQn_nT{Av`s_qgl*fmP735-<5oYQ-$5KKL{Wpj(-w;no8IKn!med8~{VGjgGuE<#6>l78DA$6ghbT&D54t&Fh zx!e7$EjwMQmGcDoS;IHKsnmcV9$HELTnHFoKlb7@B``FCjf9psIr#Wu9($uBeW$L& z782dsr=*EC#+;CC-*$O#=W^|`$G1FIi+;}_sY@**%?=4hcWq30@3yU)>;<@c9}z{Q zflxZ5$J)(Jk1w6Mv!FLu^wTzx!ivMbxzaxMh<&X>(ZcjG5N_l%a7A#O@A~G8ulfre+k>WjQZrpDpp5%Jq-)S208tLnGAqz-&^q}WZs?o z&6<3YW0aV-IQ>`Pf|83%*_g!cU3Zg#{db$q2}?)#cfABcTT_WLu!sC|YvymWJ_|`d zRxmD5XH_6u;c8(LS1{S{fDgO^$z#G6+`NG?37Ov`!VcYH0_GLTHo63G2E+Q0TV+vE zDFRgDGc|IvNoT`Q?;jXD^~;5TicrCM4sj{v@d`-gJcGNhcgif2V@CW3v*yT&I`i+( zLfcyX?qwET z(OKCwN$3ObRZn&i!+K+m~esCDJf_=GtJ z2Lz|ohBnvTzUzqkqnUW|4b-SZM-7wDtxN`id(>mF;KHiN zrPYmGy8AuN`1U8S%aI2=@3^bB6ras$gpS{&hiavDPv$2NEhALpoR^n3>g(&7_uYv| z`|{bxze<{~pAnpG{np%GWqJIF47(o6dK}w>8oh%T7@XofJsS9i#y|)_q}fOqC~Y52hk8`2!o~YMh8G|1_U#oK*pHN2XB@xHVZ^uO3a%6-T2*G; zmm7Cc?vFJwv{dlc$fz!Ag%0>mV?z9P=;Eul@Z(+3Qmq%VG z`onxu#uS0W1d!hKsK|o|gi0uQWTt0HQ+sq{ufLO@q*4w&3%&0V*>Gw}dhM!`;jRpa z_wKQFMzVoQ|D$P*h~R-Xfg=0Vi=>e%kGw3#XyG@`!}kTRMY zntelSf70_Sog` z9()h|=804_5W2(UDe_y^o;uxfa+pf3#HcTK_k9jLb&7;uN&c=jF`l++_}@PHXZ9~I z+HY$9p~)YbfCP#^XXkI(^5-=CISqeK!!J$y=QR8|4gbGR!_3d+t7JQGy* zQv}J7vJhy|)8D2)1V9OYZ4e>F5Y6e)81>~2Wqs=ZT+x96DNzB!nF}F&h9@<4|MpYK z27nl#^94z+`@b#BPfnm%&Ut08*yY!(6Sw$V@Nhs;2?TGU|MG=3Bzs=c*L$qoTy;+X zlz*+WKm&aDNBkBfc)lGgJ&=hx5|t2zpTsFlc;q7!qwW%{SrYZ@Y4Dy>I9UH*HFW>^ zq1EsG)P-iYP`t*~r5(0H^#1_$`%b(l|Ks>H&y#DCRe95^r@%j@`|9!q_a6WCKL9L2 Br4axC literal 0 HcmV?d00001 diff --git "a/docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\271\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\230\320\267\320\244\320\260\320\271\320\273\320\260.png" "b/docs/images/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265\320\222\320\275\320\265\321\210\320\275\320\265\320\271\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\230\320\267\320\244\320\260\320\271\320\273\320\260.png" new file mode 100644 index 0000000000000000000000000000000000000000..576da569f333a1e691d735e2345052ab43e454e1 GIT binary patch literal 43164 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

}mAB+ZDNBLwryzOP$hO4~Vz8m9pJ=v%6 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 literal 0 HcmV?d00001 diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 0b66a1ce..6e445d1a 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -235,7 +235,7 @@ Переходим к методам программного интерфейса, которые выполняют вызов к системе-корреспонденту 1. **Файловые обмены (через локальный и сетевой каталог)**: -* *Раздел будет дополнен позже по мере разработки новых функций* +* *Расширенный функционал программного интерфейса не предусмотрен* 2. **Файловые обмены через FTP / SFTP (реализовано в отдельном модуле "пбп_ИнтеграцииFTPSFTP")**: * ПараметрыСообщенияFTPSFTP - возвращает инициализированную структуру параметров сообщения обмена. Ключи: - Путь - локальный полный путь файла сообщения; @@ -252,9 +252,9 @@ Далее идут методы взаимодействия с SFTP-сервером. Так как в платформе нет встроенных функций общения с SFTP-серверами, обмен с ними был реализован с помощью утилит системы, взаимодействие с которыми выполняется посредством выполнения скриптов командной оболочки. Для взаимодействия с SFTP на ОС Linux используется одна из установленных утилит: - - curl ; - - sshpass; - - expect. + 1) curl - служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL; + 2) sshpass - утилита командной строки для автоматической передачи пароля SSH при подключении к удаленному хосту через SSH; + 3) expect - инструмент для автоматизации и тестирования в ОС 'nix. Скрипт может запустить командный интерпретатор, прочитать переменные окружения, выполнить набор команд Unix для получения информации, и после этого ввести в интерфейс командной строки необходимую информацию. Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. @@ -280,7 +280,7 @@ а также количество первых записей: если не равно 0, то будет выбрано указанное количество первых строк ("ПЕРВЫЕ <КоличествоПервых>"), и структура истории. Если в переданном интеграционном потоке заполнены параметры входа, то они будут добавлены в запрос как отдельные предопределенные условия; * ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника - возвращает инициализированную таблицу значений из таблицы внешнего источника по метаданным с типизированными колонками. Заполняется по имени внешнего источника, имени таблицы, и строке необходимых полей, заполненных через запятую (если не заполнено, то инициализируются все поля таблицы); 5. **COM**: -* *Раздел будет дополнен позже по мере разработки новых функций* +* *Расширенный функционал программного интерфейса не предусмотрен* 6. **REST API**: * ПолучитьЗапросТекстомИзСоответствияJSON - конвертирует тело HTTP-запроса из соответствия в строку. На вход подается Структура или Соответствие с телом JSON; * ПодготовитьТаблицуКодовОтветаHTTP - возвращает таблицу значений стандартных кодов ответа HTTP; @@ -289,7 +289,7 @@ 7. **SOAP**: * ОтформатироватьXMLЧерезDOM - форматирует XML запрос в строковом виде для удобного чтения. Если содержимое файла идет одной строкой, то оно будет преобразовано в многострочный файл. В параметрах функции передается исходная строка xml-текста и указатель использования отступов: если истина, то будут сформированы отступы в соответствии с правилами форматирования XML; 8. **Внешняя компонента**: -* *Раздел будет дополнен позже по мере разработки новых функций* +* *Расширенный функционал программного интерфейса не предусмотрен* 9. **Командная строка**: * *Раздел будет дополнен позже по мере разработки новых функций* 10. **Брокеры сообщений**: @@ -309,7 +309,8 @@ #### Локальный или сетевой каталог -*Раздел будет дополнен позже по мере разработки новых функций* +Отдельных методов для выгрузки / загрузки файлов в / из локального или сетевого каталога не реализовано. +Выгрузка в локальный или сетевой каталог ничем не отличается от других типов интеграций. В настройках интеграции необходимо указать каталог выгрузки / загрузки файла и выполнить его чтение и пост-обработку. Результаты и промежуточные логи должны сохраняться в историю интеграции. #### FTP @@ -551,7 +552,52 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 #### COM -*Раздел будет дополнен позже по мере разработки новых функций* +Отдельных методов для вызова COM-объектов не реализано, но подсистема сохраняет в себе данные наименования COM-объекта и строку подключения к нему. COM-объекты стоит избегать и использовать в крайних случаях, когда без них не обойтись. Например, для взаимодействия с Active Directory в семействе Windows. +Аналогично другим настройкам интеграций создаем предопределенное значение настройки: +```bsl +Процедура ПредопределенныеЗначенияНастройкиИнтеграции(Таблица) + + // Добавление + НоваяНастройка = Таблица.Добавить(); + НоваяНастройка.Наименование = "Active directory"; + НоваяНастройка.ИдентификаторНастройки = "ActiveDirectory"; + НоваяНастройка.СтрокаПодключения = "Provider=""ADsDSOObject"""; + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("ActiveDirectory"); + НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.COM; + НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; + НоваяНастройка.ИмяОбъекта = "ADODB.Connection"; + // КонецДобавления + +КонецПроцедуры +``` +В интеграционном потоке можно прописать функцию или запрос к COM-объекту. +Выполним обращение к COM-объекту Active Directory: +```bsl +// Объявление и заполнение структуры истории + +ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ПолучениеДанныхПользователейИзAD"); + +РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции, ТочкаВхода"); + +СтруктураНастроек = пбп_ИнтеграцииСлужебный.ПолучитьСтруктуруНастроекИнтеграции(РеквизитыПотока.НастройкаИнтеграции); + +// Подключаемся к объекту +Соединение = Новый COMОбъект(СтруктураНастроек.ИмяОбъекта); +Соединение.Provider = СтруктураНастроек.СтрокаПодключения; + +// Устанавливаем параметры аутентификации +Соединение.Properties("User ID").Value = <Домен> + "\" + СтруктураНастроек.Логин; +Соединение.Properties("Password").Value = СтруктураНастроек.Пароль; + +Запись = Новый COMОбъект("ADODB.recordset"); + +// В запросе "(&(objectCategory=person)(objectClass=user)); name, mail, telephoneNumber, displayName; subtree" +ТекстЗапроса = РеквизитыПотока.ТочкаВхода; +Запись.Open(ТекстЗапроса, Соединение, 0, 1); + +//... +``` #### REST API @@ -559,10 +605,49 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 #### Внешняя компонента -*Раздел будет дополнен позже по мере разработки новых функций* +Хранение данных и реализация вызова аналогична обращению к COM, за исключением того, что внешнюю компоненту можно загрузить в пользовательском интерфейсе в справочнике настройки интеграции через гиперссылку "Подключить внешнюю компоненту из файла": + +![image](images/ПодключениеВнешнейКомпонентыИзФайла.png) #### Командная строка +В настройках интеграции в поле "Исполняемый файл" необходимо заполнить путь к исполняемому файлу, от которого будет выполнена команда в оболочке (для Windows - CMD, для Linux и MacOS терминал BASH). Если это команда системы, зарегистрированная в переменных среды, то путь не указывается. В интеграционных потоках прописывается исполняемая команда, а в табличной части указываются предопределенные аргументы системы. +Попробуем открыть конфигуратор 1С в пакетном режиме. В настройках интеграции необходимо указать путь к исполняемому файлу 1С, если путь к ней не зарегистрирован в переменных среды. Если зарегистрирована, то указываем там "1cv8". Далее заполним интеграционный поток следующим образом: + +![image](images/ЗапускКонфигуратораВПакетномРежиме.png) + +Так же сюда можно добавить параметры аутентификации пользователя и прочие параметры запуска. +Код реализации вызова будет выглядеть так: +```bsl +// Объявление и заполнение структуры истории + +ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ЗапускКонфигуратораВПакетномРежиме"); + +// В строке подключения - путь к исполняемому файлу +РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции.СтрокаПодключения, ТочкаВхода"); + +СтрокаАтрибутов = ""; +// Получаем атрибуты из табличной части в структуре +АтрибутыИЗначения = Справочники.пбп_ИнтеграционныеПотоки.ПолучитьСтруктуруПараметровВхода(ИнтеграционныйПоток, Истина); +Для Каждого КлючИЗначение Из АтрибутыИЗначения Цикл + // Разделить для обозначения команды в строке может отличаться, например: "/", "-", "--" + Разделитель = ?(ПустаяСтрока(СтрокаАтрибутов), "/", " /"); + // Разделитель между именем атрибута и его значением может отличаться в зависимости от исполняемого файла / утилиты + СтрокаАтрибутов = СтрокаАтрибутов + Разделитель + КлючИЗначение.Ключ + " """ + КлючИЗначение.Значение + """"; +КонецЦикла; + +ИтоговаяКоманда = СтрШаблон("%1 %2 %3", РеквизитыПотока.НастройкаИнтеграцииСтрокаПодключения, РеквизитыПотока.ТочкаВхода, СтрокаАтрибутов); + +// Для вызова используем аналоги методов БСП для проверки безопасного запуска +ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); +ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + +НачалоВызова = ТекущаяДатаСеанса(); +Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); +СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; +``` + ### Брокеры сообщений *Раздел будет дополнен позже по мере разработки новых функций* \ No newline at end of file From f094b52881e4fa180c28c10613e2634b46a1d5c9 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 18:10:16 +0300 Subject: [PATCH 25/27] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D1=83=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\206\320\270\321\217\320\274\320\270.md" | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 6e445d1a..3a163426 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -623,29 +623,10 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ЗапускКонфигуратораВПакетномРежиме"); -// В строке подключения - путь к исполняемому файлу -РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( - ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции.СтрокаПодключения, ТочкаВхода"); - -СтрокаАтрибутов = ""; -// Получаем атрибуты из табличной части в структуре +// Получаем параметры и их значения из интеграционного потока или инициализируем сами АтрибутыИЗначения = Справочники.пбп_ИнтеграционныеПотоки.ПолучитьСтруктуруПараметровВхода(ИнтеграционныйПоток, Истина); -Для Каждого КлючИЗначение Из АтрибутыИЗначения Цикл - // Разделить для обозначения команды в строке может отличаться, например: "/", "-", "--" - Разделитель = ?(ПустаяСтрока(СтрокаАтрибутов), "/", " /"); - // Разделитель между именем атрибута и его значением может отличаться в зависимости от исполняемого файла / утилиты - СтрокаАтрибутов = СтрокаАтрибутов + Разделитель + КлючИЗначение.Ключ + " """ + КлючИЗначение.Значение + """"; -КонецЦикла; - -ИтоговаяКоманда = СтрШаблон("%1 %2 %3", РеквизитыПотока.НастройкаИнтеграцииСтрокаПодключения, РеквизитыПотока.ТочкаВхода, СтрокаАтрибутов); - -// Для вызова используем аналоги методов БСП для проверки безопасного запуска -ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); -ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; - -НачалоВызова = ТекущаяДатаСеанса(); -Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); -СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; + +Результат = пбп_ИнтеграцииСервер.ВыполнитьКомандуСистемы(ИнтеграционныйПоток, АтрибутыИЗначения, , , , СтруктураИстории); ``` ### Брокеры сообщений From c7210975725b9a56e6cdd452c85251a940a32c08 Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 19:22:20 +0300 Subject: [PATCH 26/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D1=8B?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=BC=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\222\320\244\320\260\320\271\320\273.png" | Bin 0 -> 106577 bytes ...0\237\320\276\321\202\320\276\320\272.png" | Bin 0 -> 49176 bytes ...1\200\320\260\321\206\320\270\320\270.png" | Bin 0 -> 46173 bytes ...21\206\320\270\321\217\320\274\320\270.md" | 67 ++++++++++++++++-- 4 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 "docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\270\320\222\320\244\320\260\320\271\320\273.png" create mode 100644 "docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\271\320\237\320\276\321\202\320\276\320\272.png" create mode 100644 "docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" diff --git "a/docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\270\320\222\320\244\320\260\320\271\320\273.png" "b/docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\222\321\213\320\263\321\200\321\203\320\267\320\272\320\270\320\222\320\244\320\260\320\271\320\273.png" new file mode 100644 index 0000000000000000000000000000000000000000..1db0c8c1601671b0652a110172a35f9a389f58dd GIT binary patch literal 106577 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≫})u(HU_$^G}f)iB|K*;&df6m))lIydsVqkloU~n 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 literal 0 HcmV?d00001 diff --git "a/docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" "b/docs/images/\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214\321\201\320\272\320\260\321\217\320\244\321\203\320\275\320\272\321\206\320\270\321\217\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..4ba3f5c3afcd8dee1324113d3de95b3f2546fc4c GIT binary patch literal 46173 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 A1^@s6 literal 0 HcmV?d00001 diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 3a163426..559c0a7d 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -61,7 +61,7 @@ ## Порядок взаимодействия Взаимодействие с подсистемой будет отличаться для разных типов интеграции, но можно выделить общие шаги для любого типа: -1. После определения типа интеграции, необходимо заполнить информацию о настройках в справочниках подсистемы. Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Создание не предопределенных потоков допускается только в случае файловых обменов при использовании пользовательских функций; +1. После определения типа интеграции, необходимо заполнить информацию о настройках в справочниках подсистемы. Для создания настроек интеграции необходимо создать предопределенные элементы справочников **пбп_ИнтегрируемыеСистемы**, **пбп_НастройкиИнтеграции**, **пбп_ИнтеграционныеПотоки** с помощью подсистемы предопределенных значений (см. [Предопределенные значения](docs/ПредопределенныеЗначения.md)). Создание не предопределенных потоков допускается только в случае файловых обменов при использовании пользовательских функций (см. [Использование пользовательских функций](#использование-пользовательских-функций-для-файловых-обменов)); 2. Если это "предопределенная" интеграция (без использования пользовательской функции), то вызов должен быть обернут в запись в справочник истории интеграции для хранения в нем логов; 3. Подбор и реализация вызова нужного метода интеграции в зависимости от ее типа; 4. Пост-обработка полученного в п.3 результата вызова; @@ -587,8 +587,8 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 Соединение.Provider = СтруктураНастроек.СтрокаПодключения; // Устанавливаем параметры аутентификации -Соединение.Properties("User ID").Value = <Домен> + "\" + СтруктураНастроек.Логин; -Соединение.Properties("Password").Value = СтруктураНастроек.Пароль; +Соединение.Properties("User ID").Value = <Домен> + "\" + СтруктураНастроек.Логин.Значение; +Соединение.Properties("Password").Value = СтруктураНастроек.Пароль.Значение; Запись = Новый COMОбъект("ADODB.recordset"); @@ -601,8 +601,48 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 #### REST API +Интеграция с HTTP-сервисами реализована через общий модуль "КоннекторHTTP". + +```bsl +// Объявление и заполнение структуры истории + +ИнтеграционныйПоток = пбп_ИнтеграцииСлужебный.ИнтеграционныйПоток("ПолучитьНоменклатуруИзСистемыN"); + +РеквизитыПотока = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции.ИнтегрируемаяСистема, НастройкаИнтеграции, ТочкаВхода"); + +НастройкиИнтеграции = ИнтеграцииСервер.ПолучитьСтруктуруНастроекИнтеграции( + РеквизитыПотока.НастройкиИнтеграции); + +Сессия = КоннекторHTTP.СоздатьСессию(); + +Аутентификация = Новый Структура; +Аутентификация.Вставить("Пользователь" , НастройкиИнтеграции.Логин.Значение); +Аутентификация.Вставить("Пароль" , НастройкиИнтеграции.Пароль.Значение); + +Сессия.Вставить("Аутентификация", Аутентификация); + +URL = НастройкиИнтеграции.СтрокаПодключения + РеквизитыПотока.ТочкаВхода; + +ОтветHTTP = КоннекторHTTP.Get(URL, , , Сессия); + +СтруктураИстории.ДлительностьВызова = ОтветHTTP.ВремяВыполнения / 1000; // переводим из миллисекунд +СтруктураИстории.ЗапросИсходящий = пбп_ИнтеграцииСервер.ПолучитьЗапросТекстомИзСоответствияJSON(ТелоЗапросаJSON); +СтруктураИстории.ЗапросВходящий = КоннекторHTTP.КакТекст(ОтветHTTP); + +Если ОтветHTTP.КодСостояния < 300 Тогда + СоответствиеJSON = КоннекторHTTP.КакJson(ОтветHTTP); +Иначе + ТекстСообщения = СтрШаблон("ru = 'Код состояния %1: %2'", ОтветHTTP.КодСостояния, + пбп_ИнтеграцииСервер.РасшифровкаКодаСостоянияHTTP(ОтветHTTP.КодСостояния)); + СтруктураОтвета.ОписаниеОшибки = НСтр(ТекстСообщения); +КонецЕсли; +``` + #### SOAP +Аналогично REST API, кроме того, что расшифровка ответа сервера должна быть выполнена с использованием XSD-схемы (xdto-объекта) с помощью функции КакXDTO общего модуля КоннекторHTTP. + #### Внешняя компонента Хранение данных и реализация вызова аналогична обращению к COM, за исключением того, что внешнюю компоненту можно загрузить в пользовательском интерфейсе в справочнике настройки интеграции через гиперссылку "Подключить внешнюю компоненту из файла": @@ -631,4 +671,23 @@ DRIVER={PostgreSQL Unicode}; Data Source=PostgreSQL35W; SERVER=localhost; PORT=5 ### Брокеры сообщений -*Раздел будет дополнен позже по мере разработки новых функций* \ No newline at end of file +*Раздел будет дополнен позже по мере разработки новых функций* + +## Использование пользовательских функций для файловых обменов + +Для использования пользовательских функций необходимо включить функциональную опцию пбп_ИспользоватьПользовательскиеФункции. После этого в интеграционных потоках для файловых обменов появится возможность указывать расписание выполнение обмена и пользовательскую функцию, которая будет выгружать / получать данные. +Напишем простую пользовательскую функцию сохранения текстового файла на диск. Для этого в пользовательском режиме необходимо создать настройку интеграции с указанием каталога выгрузки и поставить галку "Использовать пользовательские функции": + +![image](images/ПользовательскаяФункцияНастройкаИнтеграции.png) + +Необходимо создать пользовательскую функцию и указать ее в интеграционном потоке: + +![image](images/ПользовательскаяФункцияИнтеграционныйПоток.png) + +![image](images/ПользовательскаяФункцияВыгрузкиВФайл.png) + +По-умолчанию на пользовательскую функцию передается один параметр - ссылка на справочник настройки интеграции. + +## Использование подсистемы загрузки файлов через табличный документ + +Для файлов, представляющих таблицу (Excel-файлы, csv-файлы), возможно использование подсистемы [Загрузка файла через табличный документ](docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md). В этом случае парсинг файла и пост-обработка данных должны быть "обернуты" в структуру записи истории вместе с получением файла из сторонней системы. \ No newline at end of file From f545f85db034088956010e95b4a1215afd2be94f Mon Sep 17 00:00:00 2001 From: vladislav permichev Date: Fri, 15 Nov 2024 19:26:34 +0300 Subject: [PATCH 27/27] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=B4=D0=BE=D0=BA=D1=83=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8E-=D0=BE=D0=B1=D0=B5=D1=80=D1=82=D0=BA?= =?UTF-8?q?=D1=83=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" index 559c0a7d..a7f7256d 100644 --- "a/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" +++ "b/docs/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.md" @@ -291,7 +291,7 @@ 8. **Внешняя компонента**: * *Расширенный функционал программного интерфейса не предусмотрен* 9. **Командная строка**: -* *Раздел будет дополнен позже по мере разработки новых функций* +* ВыполнитьКомандуСистемы - выполняет указанную команду системы интеграционного потока. Команда выполняется в командной оболочке: либо CMD для ОС Windows, либо терминале BASH для ОС 'nix и MacOS; 10. **Брокеры сообщений**: * *Раздел будет дополнен позже по мере разработки новых функций* 11. **Прочие функции**: