Автоматическая верификация и оптимизация потоков работ Каленкова А. А., научный руководитель : доктор физ.- мат. наук, проф. Серебряков Владимир Алексеевич ( ВЦ РАН )
Потоки работ. Системы управления потоками работ Поток работ (Workflow) – это полная или частичная автоматизация некоторого производственного процесса, при которой документы, информация и задания передаются для выполнения от одного участника к другому в соответствии с набором процедурных правил *. Система управления потоками работ (Workflow Management System) - это система, которая позволяет описывать, создавать и управлять выполнением потока работ при помощи программного обеспечения, которое способно интерпретировать описание процесса, взаимодействовать с участниками потока работ и, при необходимости, вызывать соответствующие приложения и инструменты *. Системы управления потоками работ могут быть предназначены для описания и исполнения произвольных процессов интеграции географически распределенных данных и приложений. * WFMC ( Workflow Management Coalition )
Архитектура системы управления потоками работ Уровень определения Данный уровень представлен набором функций, задача которых заключается в декларативном определении бизнес - процесса. Уровень создания и выполнения На этапе выполнения происходит анализ определения процесса специальным программным обеспечением, которое отвечает за создание и управление экземплярами потоков работ. Уровень взаимодействия с пользователями и приложениями
Задачи верификации и оптимизации потоков работ Проверка сбалансированного использования элементов « И - распараллеливание », « И - синхронизация », « ИЛИ - выбор », « ИЛИ - синхронизация » при описании потока работ - верификация потока работ. Известны различные эффективные методы верификации потоков работ. Известны работы, посвященные оптимизации ( распараллеливанию ) потоков работ. Например полуавтоматический метод оптимизации, который позволяет запускать независящие по данным действия потока работ параллельно. Также известны методы распараллеливания потоков работ основанные на применении шаблонных преобразований, но они также не учитывают наличие вершин выбора и циклов и во многих распространенных случаях могут быть неприменимы. Интерес представляет задача автоматической оптимизации потоков работ в более « общем » случае. Особое внимание должно быть уделено оптимизации блочных языков описания потоков работ ( например BPEL)
Промежуточные графовые представления потоков работ (1) Существуют различные языки описания потоков работ (BPMN, XPDL, BPEL), тем не менее, в их основе лежит один и тот же базис ( последовательный и параллельный запуск заданий, выбор, « И / ИЛИ - синхронизация »). Для того чтобы анализировать поток работ : находить структурные ошибки потока управления, избыточные зависимости по управлению и, наконец, применить алгоритм оптимизирующих преобразований, который позволит организовать параллельное исполнение действий потока работ, необходимо графовое представление потока работ.
Сети потоков работ (WF-nets) Определение ( сеть Петри )*. Сеть Петри – это тройка (P, T, F): P – это конечный набор позиций ( мест ), T – это конечный набор переходов, F - это набор дуг ( отношения потока ). В любой момент времени позиция содержит ноль или более фишек. Количество фишек может меняться во время выполнения сети. Определение ( сеть потока работ )*. Сеть Петри PN = (P,T,F) называется сетью потока работ – WF-net, если выполняются следующие условия : существует только одна исходная позиция, такая что, у нее нет входящих дуг. существует только одна конечная позиция, такая что, у нее нет исходящих дуг. каждый узел расположен на пути от к. * Aalst W.M.P., Hirnschall A., Verbeek H.M.W. An Alternative Way to Analyze Workflow Graphs // Electronic Commerce Research – – V.2,.3 – P. 195– 231.
Графы потоков работ (Workflow graphs)* Поток управления определяет порядок выполнения работ. Задание - единичная работа, направленная на достижение цели, используется для построения разветвителя и синхронизатора. Последовательность ( последовательное выполнение ) состоит из вершины, которая имеет входящий и исходящий поток управления. Разветвитель позволяет разбить входной поток управления на независимые параллельно исполняющиеся потоки управления. Синхронизатор применяется для объединения параллельных потоков управления в один. Выбор имеет два и более исходящих потока управления и моделирует взаимно исключающие альтернативные пути. Координатор слияния имеет несколько входящих потоков управления и объединяет взаимно исключающие альтернативные пути в один путь. * Aalst W.M.P., Hirnschall A., Verbeek H.M.W. An Alternative Way to Analyze Workflow Graphs // Electronic Commerce Research – – V.2,.3 – P. 195–231.
Размеченные графы анализа потоков работ Как и сеть Петри, граф анализа потока работ обладает не только статической, но и динамической составляющей – дуги ( поток управления ) графа могут содержать некоторое количество фишек или не содержать их вовсе. Задание одновременно синхронизирует и разветвляет поток управления : ожидается появление фишек на всех входящих дугах, по одной фишке забирается с каждой дуги, далее выполняется задание и добавляется фишка на каждую исходящую дугу. При выборе ожидается появление фишек на всех входящих дугах, забираются фишки с входящих дуг, и добавляется по фишке на дуги с пометками true или на дуги с пометками false ( вершина выбора имеет по крайней мере одну исходящую дугу с пометкой true и одну с пометкой false). При слиянии забирается фишка с одной из входящих дуг ( если фишки есть на нескольких дугах, выбор недетерминирован ) и передается фишка на исходящую дугу. В Размеченных графах анализа потоков работ дополнительно указаны названия заданий, имена входных и выходных параметров, пометки для исходящих дуг вершин выбора, названия дуг, условия в вершинах выбора.
Формальный язык описания потоков работ (1) Формальный язык описания потоков работ дает возможность создавать универсальные алгоритмы анализа блочных структур потоков работ без привязки к конкретному блочно - графовому языку ( например языку BPEL). Поток работ, заданный с помощью Формального языка описания потоков работ, определяется шестеркой : Множество - множество всех локальных генерируемых в процессе выполнения потока работ событий. Множество действий состоит из множества составных и простых действий, для которых определены формулы. Начальное действие. Действие, с которого начинается выполнение потока работ. Множество переменных, определенных уровне экземпляра потока работ. Множество предикатов. Предикаты являются функциями, принимающими значение булевского типа, они используются в логических выражениях условных конструкций потока работ. Множество формул, описывающих структуру действий потока работ. Каждая из формул этого множества определяет структуру простого или составного действия, идентификатор которого указан в ее левой части.
Формальный язык описания потоков работ (2) Действия потока работ могут быть простыми и составными. Составное действие строится из действий потока работ с использованием правил активации вложенных действий : параллельной ( ) и последовательной активации ( ). Составное действие также может быть специальным составным действием : условным выбором ( ) или циклом ( ). В формулах потока работ для простых действий указываются их имена, входные и выходные параметры ( переменные потока работ ). К простым действиям также относятся несколько специальных системных действий : генерация события ( ), ожидание события с одновременным удалением информации о нем ( ), пустое действие ( ), не выполняющее никакой работы. Поток работ завершает свое выполнение, когда ни одно его действие не может быть активировано.
Алгоритмы отображения между Формальным описанием потоков работ и Размеченными графами анализа потоков работ (1) Эти алгоритмы необходимы для анализа и преобразования потоков работ, определенных с помощью блочно - графовых языков представления потоков работ Создан алгоритм ( Алгоритм 1) построения Размеченного графа анализа потока работ по Формальному описанию потока работ. На Формальный язык описания потоков работ накладываются дополнительно ограничения ( например действие по ожиданию события с заданным именем имеет строго одно вхождение в формулы потока работ ). «Промежуточная» вершина A соответствует составному действию WHILE (a,B)
Алгоритмы отображения между Формальным описанием потоков работ и Размеченными графами анализа потоков работ (2) Создан алгоритм ( Алгоритм 2) получения Формального описания потока работ по Размеченному графу анализа потока работ. Он также может быть использован для доказательства того, что по графу не может быть получена блочная структура потока работ. Утверждение 1. Пусть по Формальному описанию потока работ с помощью Алгоритма 1 построен Размеченный граф анализа потока работ. Тогда, если к этому Размеченному графу анализа потока работ применить Алгоритм 2, то результатом его работы стает некоторое Формальное описание потока работ.
Сопоставление промежуточных представлений потоков работ (1) Промежуточные представления потоков работ сопоставляются на основе шаблонов потока управления, сформированных практикой использования систем управления потоками работ *. Определение. Сеть Петри ( Сеть потока работ ) является Сетью свободного выбора, если для любых двух переходов, имеющих общую входную позицию, множества входных позиций совпадают. Сетью потока работ может быть промоделирован любой Граф потока работ, при этом она является Сетью свободного выбора, поэтому Сети потоков работ обладают большей выразительной мощностью, чем Графы потоков работ. * N. Russell, A.H.M. ter Hofstede, W.M.P. van der Aalst, and N. Mulyar. Workflow Control-Flow Patterns: A Revised View // BPM Center Report BPM-06-22, BPMcenter.org, 2006.
Сопоставление промежуточных представлений потоков работ (2) На Формальном языке описания потоков работ может быть задан поток работ, поток управления которого не может быть формализован с помощью Сети свободного выбора. Граф потока работ и Размеченный граф анализа потока работ обладают одинаковыми возможностями описания потока управления и сводятся к Сетям свободного выбора. Потоки работ, которые не могут быть промоделированы Сетью свободного выбора плохо поддаются верификации (известный алгоритм верификации имеет экспоненциальную вычислительную сложность).
Сопоставление промежуточных представлений потоков работ (3) Размеченный граф анализа потока работ реализует некоторые конструкции потока управления более компактно, чем Граф потока работ, в силу того, что задания и вершины выбора одновременно распараллеливают и синхронизируют поток управления. Шаблон исключающего выбора – выбор одной из нескольких ветвей исполнения потока работ, реализуется в Размеченных графах анализа потоков работ не с помощью одной вершины выбора, как это делается в Графах потоков работ, а с помощью нескольких вершин выбора. В Размеченных графах анализа потоков работ не предусмотрена конструкция для явного завершения потока работ. Внесение завершающей вершины требует проведение предварительной верификации потока работ, так как необходимо, чтобы вершина была корректно соединена со своими предшественниками. Формальный язык описания потоков работ не позволяет создавать произвольные циклы.
Структурные конфликты в Размеченных графах анализа без ориентированных циклов Конфликт типа « тупик » возникает в том случае, если лишь некоторые из входящих дуг синхронизирующей вершины активированы, и синхронизирующая вершина будет бесконечно долго ожидать активации других входящих дуг. Конфликт типа « недостаток синхронизации » произойдет в ациклическом Размеченном графе анализа потока работ, если вершина слияния была активирована несколько раз вследствие активации различных входящих дуг.
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (1) Рассмотрим, некоторый Размеченный граф анализа потока работ. Поставим каждой вершине выбора в соответствие уникальный идентификатор. Построим алгоритм определения условий выполнения вершин и активации дуг. В ходе работы этого алгоритма будет проведен модифицированный поиск в ширину, для каждой вершины и для каждой дуги будет определено условие выполнения и условие активации соответственно, являющиеся булевыми функциями над множеством идентификаторов вершин выбора. Если не выполнено условие Cf=Cf`=Cf``, возможен случай, когда будет активирована только часть входящих дуг, и возникнет конфликт типа « тупик ».
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (2) Если условия активации входящих дуг являются попарно взаимоисключающими : Cf&Cf`=false, Cf`&Cf``= false, Cf``&Cf=false, то при выполнении потока работ может быть активировано не более одной входящей дуги вершины слияния, иначе возникнет конфликт типа « недостаток синхронизации ». Было доказано утверждение о том, что подобный алгоритм позволяет находить структурный конфликт в некоторой вершине Размеченного графа анализа потока работ без ориентированных циклов, если все предшествующие ей вершины не имели конфликта типа « недостаток синхронизации ».
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (3) В общем случае операции построения и сравнения булевых функций, которые выполняются в ходе работы АБВ для графов без циклов, имеют экспоненциальную вычислительную сложность. Однако условия выполнения вершин и условия активации дуг могут быть представлены в виде дизъюнктивных нормальных форм ( ДНФ ) идентификаторов вершин выбора или их отрицаний. При этом в каждой конъюнкции первым указан идентификатор ( или его отрицание ) той вершины выбора, которая была раскрыта последней. Этот идентификатор или его отрицание называется ключевым фактором конъюнкции.
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (4) При слиянии потоков управления все дизъюнкты,…,,,…, заменяются на,…, для сокращения представления условия выполнения вершины. После получения новых дизъюнктов должна быть проведена попытка повторного сокращения представления условия активации и так до тех пор, пока сокращение не сможет быть выполнено. Такие представления условий выполнения вершин и активации дуг называются сокращенными. Теорема 1. Пусть дан Размеченный граф анализа потока работ без ориентированных циклов, не содержащий структурных конфликтов. В ходе работы АБВ были вычислены условия выполнения вершин. Условия выполнения вершин совпадают тогда и только тогда, когда совпадают множества ключевых факторов дизъюнктов сокращенных представлений этих условий. Теорема 2. Пусть дан Размеченный граф анализа потока работ без ориентированных циклов, не содержащий структурных конфликтов. В ходе работы АБВ были вычислены условия активации входящих дуг некоторой вершины. Рассмотрим и - произвольные дизъюнкты представлений одного и другого условий соответственно. Пусть, и или, или такое, что.. Тогда дизъюнкты и не являются взаимоисключающими.
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (5) Количество дизъюнктов при каждом новом слиянии может расти экспоненциально, поэтому вводятся ключевое и табличное представления условий выполнения вершин и активации дуг. Ключевое представление определяется как дизъюнкция ключевых факторов соответствующего сокращенного представления условия выполнения вершины или активации дуги. Табличное представление условия выполнения вершины или активации дуги – это таблица, каждая строка которой будет соответствовать некоторой вершине выбора графа, а точнее ее идентификатору.
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ без ориентированных циклов (6) В таблице три столбца : в первом столбце будет указана вершина выбора ( ее идентификатор ), во втором столбце ( обозначим его «+») - идентификаторы вершин выбора, участвующих в формировании заданного условия, в которые можно перейти из этой вершины выбора по дугам с пометками Lcond=true. В третьем столбце ( обозначим его «-») - идентификаторы вершин выбора, участвующих в формировании заданного условия, в которые можно перейти из этой вершины выбора по дугам с пометками Lcond=false. +- С2С2 С2С2 С1С1 С1С1 С2С2
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ с ориентированными циклами (1) Определение. Управляющий граф ( граф с выделенной начальной вершиной ) называется сводимым ( приводимым ), если его дуги можно разделить на две непересекающиеся группы : Прямые дуги, образующие ациклический граф, в котором из начальной вершины может быть достигнута любая вершина. Обратные дуги – дуги, у которых конец доминируют над началом. То есть любой путь из начальной вершины управляющего графа в начало дуги проходит через ее конец. Определение. Пусть дан некоторый сводимый управляющий граф, цикл программы L(x,y), соответствующий обратной дуге (x,y), определяется как y плюс множество вершин v таких, что существует путь из v в x, для каждой вершины z которого справедливо, что z является потомком y в дереве поиска в глубину. Определение. Управляющий граф представляет собой иерархию вложенных циклов, если Он является сводимыми. В нем нет циклов программы, которые пересекаются, и не содержатся один в другом. В нем нет циклов программы, обладающих, по крайней мере, двумя выходами ( двумя вершинами, соединенными исходящими дугами с внешними по отношению к циклу программы вершинами ). АБВ для графов без ориентированных циклов выполняется на каждом уровне вложенности.
Алгоритм булевой верификации ( АБВ ) для Размеченных графов анализа потоков работ с ориентированными циклами (2) В ходе работы АБВ с Размеченным графом анализа потоков работ, содержащим ориентированные циклы, выделяются циклы программы, каждому циклу программы соответствует некоторая вершина его инициирующая, а также вершина выхода из цикла программы. Если вершина инициирующая цикл программы является заданием или вершиной выбора, определяется конфликт « мертвый цикл ». Если же цикл программы инициирует вершина слияния, то конфликта « мертвый цикл » не возникнет. Если вершиной выхода из цикла программы является задание, то возникнет « бесконечный цикл », при этом также будет определен конфликт « ветвящийся цикл ». Если вершиной выхода из цикла программы является вершина выбора и есть исходящие дуги, одна их которых соединяет эту вершину с внешней по отношению к циклу программы вершиной, а другая с внутренней вершиной цикла программы, имеющие одинаковые значения пометок, то определяется конфликт « ветвящийся цикл ». Если есть исходящие дуги, соединяющие с внутренними вершинами цикла программы, имеющие разные значения пометок, то определяется конфликт « бесконечный цикл ».
Сопоставление алгоритмов верификации Графов потоков работ Сети ПетриРедукция графа Логика высказываний Экземплярный подход Булева верификация (АБВ) Произвольные перекрывающиеся конструкции графа Циклы +- Простые циклы Вложенные циклы Вычислительная сложность или Работа без конечного задания потока работ Возможность использовать данные, полученные в ходе верификации, для структурной оптимизации потока работ ----+
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (1) Определение. Две вершины Размеченного графа анализа зависят по данным, если выполняются условия : 1. Существует переменная, название которой указано в списке входных или выходных параметров вершин ( или ), при этом хотя бы у одной вершины имя этой переменной присутствует в списке выходных параметров ( ). 2. Существует путь из одной вершины в другую. Определение. Путь Размеченного графа анализа называется избыточным, если его начальная вершина – это задание, а конечная вершина – задание или вершина выбора, они не зависят по данными, при этом, если есть промежуточные вершины, то это вершины слияния или задания с пометкой. Алгоритм автоматической оптимизации Размеченного графа анализа преобразует граф, не содержащий структурных конфликтов, удаляя потоки управления, формирующие избыточные пути, и сохраняя зависимости по данным и управлению ( условия выполнения вершин и активации дуг ).
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (2) Для каждого цикла программы или всего потока работ : 1. Если рассматривается некоторый цикл программы, то создаются ( при условии, что таких вершин нет ) дополнительные вершины : цикловая вершина, начальная вершина цикла программы и конечная вершина цикла программы. 2. Определяются зависимости по данным. Если анализируется некоторый цикл программы, то все входные и выходные параметры вершин также становятся входными и соответственно выходными параметрами цикловой вершины, которая при анализе на верхнем уровне вложенности будет представлять весь рассматриваемый цикл программы как некоторое задание. При проверке графа на сводимость первыми рассматриваются вложенные ориентированные циклы.
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (3) Для каждой вершины удаляются входящие потоки управления, образующие избыточные пути. Если у вершины не осталось входящих потоков управления, она соединяется с другими вершинами ( начальным заданием или вершинами выбора ) так, что условие ее выполнения будет восстановлено, при этом этот новый поток управления помечается как тривиальный. 4. Вершины рассматриваются в порядке модифицированного обхода в ширину ( при этом вершина не раскрывается до тех пор, пока не будут раскрыты все вершины, от которых она зависела по данным ). Для каждой вершины восстанавливаются потерянные зависимости по данным ( соединение происходит так, что учитываются условия выполнения вершин ). Если для вершины восстанавливается зависимость по данным, удаляются возможные входящие тривиальные потоки управления. 5. Если у некоторых вершин выбора нет исходящих потоков управления с некоторым значением пометки, они создаются и соединяют вершину выбора с некоторым новым заданием с пометкой. Если вершина принадлежит некоторому циклу программы и не имеет исходящих потоков управления, она соединяется с конечной вершиной цикла программы, не нарушая условий выполнения вершин.
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (4)
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (5)
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (6) Также был предложен алгоритм преобразующий Размеченный граф анализа потоков работ, полученный по Формальному описанию потока работ, так, что по нему может быть построено Формальное описание потока работ. Вычислительная сложность алгоритмов оптимизации составляет :, где - количество вершин, - количество вершин выбора, а - количество переменных, используемых в качестве входных и выходных параметров вершин графа.
Алгоритм структурной оптимизации Размеченных графов анализа потоков работ (7) Определение. Размеченный граф анализа потоков работ, не содержащий структурных конфликтов, называется детерминированным, если для любой пары вершин v, w, таких что : Условия их выполнения не являются взаимоисключающими. Существует переменная, название которой указано в списке входных или выходных параметров вершин ( или ), и хотя бы у одной вершины имя этой переменной присутствует в списке выходных параметров ( ). существует путь из вершины v в вершину w. На основе Размеченных графов анализа потоков работ была представлена операционная семантика потоков работ и было формально доказано, что оптимизирующие преобразования не изменяют « функциональность » детерминированных Размеченных графов анализа потоков работ.
BPEL (Business Process Execution Language) BPEL является блочно - графовым языком : структура потока работ описывается вложенными блоками, однако некоторые действия могут быть связаны дополнительными потоками управления. BPEL- процесс может быть представлен как композиция веб - сервисов и быть полностью автоматизированным. Рассматриваются следующие действия BPEL- процессов : вызов операции некоторого Web- сервиса ( ), ожидание внешнего вызова операции WSDL- интерфейса процесса ( ), генерация ответа на запрос ( ), копирование данных из одной переменной в другую ( ), пустое действие ( ). Эти примитивные действия могут комбинироваться в более сложные. К таким действиям относятся определение упорядоченной последовательности действий ( ), условных выборов ( ), циклов (, ), определение параллельно выполняющихся действий ( ). При параллельном исполнении действий можно регулировать порядок их активации посредством использования элементов. Для каждого составного действия может быть определена секция, в которой будут перечислены имена связей, используемых для синхронизации на любом уровне вложенности в пределах этого составного действия. Для каждого вложенного действия, если это необходимо, указываются входящие связи ( ) и исходящие ( ).
BPEL (Business Process Execution Language) Были созданы XML – представление Формального языка описания потоков работ, алгоритмы отображения между Формальным языком описания потоков работ и BPEL. Элементы и атрибуты BPEL сохраняются для восстановления исполняемого BPEL - процесса.
Система автоматической верификации и оптимизации потоков работ (1) Была разработана Система автоматической верификации и оптимизации Размеченных графов анализа потоков работ, которая позволяет : Создавать и редактировать Размеченные графы анализа потоков работ. Загружать и выгружать XML- описание Размеченных графов анализа потоков работ. Проводить верификацию и оптимизацию потоков работ в соответствии с представленными алгоритмами. Созданы модули конвертации между Размеченными графами анализа потоков работ, Формальными описаниями потоков работ и BPEL- процессами.
Система автоматической верификации и оптимизации потоков работ (2)
Система управления электронной библиотекой « Научное наследие России » (1) Электронная библиотека « Научное наследие России » изначально ориентирована на распределенную архитектуру, в которой источники данных ( хранилища электронных книг и метаданных ) могут быть распределены территориально. Основные архитектурные составляющие системы представлены : серверами, обеспечивающими хранение метаданных ; серверами, обеспечивающими хранение оцифрованных данных ; центральным Web- порталом Электронной Библиотеки « Научное наследие России »; центрами оцифровки данных.
Система управления электронной библиотекой « Научное наследие России » (2)
Система управления электронной библиотекой « Научное наследие России » (3) На базе системы с открытым кодом Apache ODE был создан прототип Системы управления электронной библиотекой « Научное наследие России ». Эта система исполняет BPEL- процессы, тем самым координируя работу участников, также она имеет Web- интерфейс и предоставляет функции просмотра информации о BPEL- процессах и исполняющихся экземплярах. Были созданы BPEL- описания процессов публикации книги, изменения метаданных и удаления книги. Часть задач, таких как ввод метаданных и сканирование книги должны быть выполнены человеком и не могут быть полностью автоматизированы. Сообщения о выполнении неавтоматизированных задач могут создаваться автоматически информационными системами серверов подготовки данных и метаданных. Также возможно введение информации участником процесса о том, что задача была выполнена, с помощью Web- интерфейса Системы управления электронной библиотекой « Научное наследие России ».
Система управления электронной библиотекой « Научное наследие России » (4)
Пример (1) … … $deletedFromEheritage and $deletedFromUpload..
Пример (2)
Пример (3)
Пример (4)
Спасибо !