Главная » Правописание слов » Как написать скрипт для иллюстратора

Слово Как написать скрипт для иллюстратора - однокоренные слова и морфемный разбор слова (приставка, корень, суффикс, окончание):


Морфемный разбор слова:

Однокоренные слова к слову:

Записки микростокового иллюстратора

Микростоки: рисуем и зарабатываем на своем творчестве

5 окт. 2015 г.

10 бесплатных скриптов для Adobe Illustrator специально для микростокеров


Представленные ниже скрипты для Adobe Illustrator помогают дизайнерам в самых разных задачах. Начиная от подготовки векторных файлов на микростоки и заканчивая авторисованием цветочков. Но если вам и этого мало, то в конце статьи есть ссылки на ещё целую кучу скриптов.

Чтобы установить скрипт на свой иллюстратор, нужно скопировать файл скрипта в папку со стандартными скриптами. Ищите её там, где установлен ваш иллюстратор.

Для винды это обычно: диск C > Program Files > Adobe > папка с вашей версией Adobe Illustrator > Стили (Presets) > en_GB или RU (там одна папка не промахнётесь) > Scripts.

Для маков: Applications > Adobe > ваша версия Adobe Illustrator > Presets > en_GB > Scripts.

Если стандартную папку никак не найти, то скрипты можно запускать в иллюстраторе без установки через File > Scripts > Other Script (Ctrl+F12).

Скрипт ищет и исправляет ошибки, которые не допустимы на микростоках. Векторный файл сканируется автоматически: скрипт находит открытые пути, контуры-призраки, неразобранные кисти, символы, растр и прочее. По ходу дела скрипт сразу предлагает исправить эти ошибки. Скачать бесплатно Free Stock Master можно на MAI Tools.

С помощью этого скрипта можно выборочно проверять наличие тех или иных объектов в векторном файле. Например, искать открытые пути, растр и т. п. Скачать скрипт можно на Arid Ocean. Зелёненькая кнопочка ExtendedSelect.zip там в самом верху.

Скрипт открывает многостраничный PDF целиком и полностью, а не по одной страничке, как это принято в иллюстраторе. В окошке скрипта указываем путь к PDF файлу, количество страниц, и он открывается в одном документе на нескольких артбордах.

Скрипт выравнивает выделенные объекты по пиксельной сетке. Работает аналогично опции Align to Pixel Grid.

Скрипт выворачивает выделенный объект, что он становится похожим на цветок или узор.

Скрипт проводит линии из угла в угол у фигур. Получаются геометрические узоры и пиктограммы.

Скрипт крутит узлы из объектов, получаются интересные узоры. У скрипта есть удобные настройки, которые сразу применяются к выделенной фигуре. Сразу видно, что получается на рабочей области.

Скрипт изменяет положение линий и точек так, что геометрически правильный рисунок становится более живым. Либо кривым, но это уже как играться с настройками.

Скрипт делает из отдельных однострочных текстов ровную колонку как на постерах.

Скрипт рисует случайные глаза.

Ещё больше скриптов здесь:

Если вы знаете, где ещё есть хорошие скрипты, то оставляйте ссылки в комментариях.

Подпишитесь на нашу рассылку, чтобы не пропустить ничего нового:

Источник

Как написать скрипт для иллюстратора

Adobe Illustrator Scripts

Instructions in other languages: English, Русский

This is a collection of JS scripts for Adobe Illustrator. All scripts created by me, sometimes used part of the code of other authors.

The descriptions for each file can be found in the file’s header text. Test environment: Illustrator CS6, CC 2021 (Windows), CC 2018-2021 (Mac OS).

? Alphabetical list of scripts

▶️ How to run scripts

Variant 1 — Install

Variant 2 — Drag & Drop

Drag and drop the script file (JS or JSX) into Adobe Illustrator Window

Variant 3 — Use extension

I recommend the Scripshon Trees or LAScripts panel. In it you can specify which folder your script files are stored in.

If you find this script helpful, you can buy me a coffee ☕️ via PayPal, ЮMoney or Donatty ?

Script to rotate 90 degrees an document artboards with all the objects on it.
Author: Alexander Ladygin. UI: Sergey Osokin.

Set the exact Opacity value of the selected objects. The plus or minus sign before a number will shift relative to the current value at each object. Inside Clipping Groups does not change the Opacity of the mask itself. But you can add masks if you change inclMask: false to true in the code.

Convert a flat process color into a matching gradient.
What’s new: The script now works with the RGB and CMYK document profile, Spot & Gray colors. Processes compound paths and groups of items.
Based on original script by Saurabh Sharma, 2010.

Swaps the fill and stroke colors of the selected objects in order they have in the Layers panel. Preserves the weight of the strokes, but if an object has no stroke, the script copies one from another object. If your selected objects are in non-consecutive order, you may think that the Forward and Backward buttons move colors randomly. The Revert button doesn’t return custom brushes and dash settings applied to strokes, but you You can use the native command Undo after closing the dialog box.

Script for copying the selected Artboard with his artwork. The Pro version with more options is available at Gumroad

Export selection as AI

Exports all selected objects to AI files.
Based on Layers to SVG 0.1 by Anton Ball.

This script is сan be easily custom ungrouping to all group items & releasing clipping masks in the document.
Based on original script by Jiwoong Song & modification by John Wundes.

Convert a gradient to an interpolated solid color.

The script inserts the SVG code as an object from the clipboard into the Adobe Illustrator CC 2014+. Adobe Illustrator CC 2018 v.22.1 (march, 2018) can insert SVG graphics without a script.
Author: Alexander Ladygin. Code refactoring: Sergey Osokin.

Named Items Finder

Search items in the document by name and zoom to them contents. Inspired by Photoshop CC 2020 features.

Points Move Random

The script moves randomly in numeric ranges horizontally and vertically selected points or all points on objects.

Creates random paths with a specified number of points. These can be random straight lines from 2 points or complex shapes that imitate scribbles. The points do not go beyond the bounds of the active artboard. If many shapes are first selected in the document, the script will generate individual paths with points into their bounding box.

Script to batch rename selected items with many options or simple rename one selected item / active layer.

Automatic scaling of objects to the desired size. If you draw a line on top with the length or height of the desired object, ‘Old Size’ will be filled automatically. Units associated with «Document Setup».

Adobe Illustrator has a Transform panel, but you cannot use it to transform several selected objects to a specified value. It also has problems with the accuracy of the result. The script can transform selected objects with 100% accuracy, depending on the selected side: width, height or automatically the larger side. Units associated with «Document Setup». Quick access with Alt + underlined key or digit.

After using the Lasso tool or Direct Selection Tool, both Points and Path segments are selected.

Selects points on the selected paths according to their type. Does the thing that even Astute Graphics plugins can’t do 🙂
Select View → Hide Bounding Box to see active points in real time.

Powerfull script for subtract shapes from paths. Pathfinder panel in Adobe Illustrator does not do it.

Setting the Stroke color of object based on an his solid or gradient fill. The option to automatically add an stroke is not available for Mac OS users with an Illustrator older than CC 2020.

Zooms active view to selection or to all object(s) in a document.
Based on original script by John Wundes.

Don’t forget sharing link with a friend ?

You can view all the scripts that are not included in this collection in another repository

Found a bug? Please submit a new issues on GitHub.

All scripts is licensed under the MIT licence.
See the included LICENSE file for more details.

About

Some powerfull JSX scripts for extending Adobe Illustrator

Источник

Скрипты под Illustrator: долой рутину!

Обычно, если речь идёт о программах для дизайнеров, первостепенное внимание уделяется художественным возможностям приложений — инструментам рисования, фильтрам и т. п. Но в повседневной жизни приходится заниматься и рутиной. К счастью, ПО от Adobe (в т. ч. Illustrator) стало поддерживать написание сценариев (скриптов), позволяющих переложить монотонный труд на плечи машины. И вы уже не работаете в Illustrator — вы им управляете, а это, как говорят в Одессе, две большие разницы!

Отдавая отчёт, что подавляющая часть пользователей Illustrator — художники и дизайнеры, не сталкивавшиеся с программированием, постараюсь построить обзор функциональности сценариев так, чтобы у читателей не сложилось впечатления, будто для этого занятия нужны какой-то «особый» склад мышления и длительное спецобразование. Одновременно приношу извинения профессионалам за некоторые упрощения в формулировках в угоду доступности материала. Сам автор когда-то был в подобной ситуации и поначалу не считал эту сферу своей епархией. Но потратил на изучение менее двух недель и теперь утверждаю: имея минимальные представления о программировании, освоить скрипты — задача вполне посильная.

Сценарии под Illustrator можно писать на любом языке: JavaScript, Visual Basic (Windows) и AppleScript (Mac OS). Поскольку с первым знакомо большинство читателей (многие дизайнеры для полиграфии успешно справляются и с созданием интернет-страниц, в которых он используется), опираться будем именно на него. К тому же JavaScript платформенно-независим: написанные на нём скрипты будут работать в обеих ОС — Windows и Mac OS. Способ обращения к элементам — объектно-ориентированный: чтобы узнать, например, толщину окантовки у второго векторного элемента на первом слое, нужно написать следующую конструкцию:

Это можно интерпретировать так: сначала указывается объект наивысшего уровня в иерархии Illustrator (app — приложение, сокращённо от application), и далее выбор постепенно сужается до конкретного элемента (в активном документе работать на первом слое; затем в указанном слое выбрать второй по глубине залегания векторный объект и узнать у него толщину окантовки). Подобный метод обращения к элементам весьма удобен, поскольку позволяет легко ориентироваться во всём многообразии их типов, существующих в редакторе. С полной моделью взаимосвязей можно познакомиться по хорошо составленному описанию (входит в комплект Illustartor).

Квадратные скобки говорят о том, что элемент — часть массива. Массив — совокупность нескольких объектов, объединённых определённым признаком. Например, Layers, pathItems, RasterItems, GroupItems, Selection и т. д. — массивы, состоящие из однотипных объектов (слоёв документа, векторных контуров, растровых изображений, групп и т. п.). В скобках указывается индекс (порядковый номер) требуемого элемента в массиве. Так, запись Layer[0] обозначает первый слой, поскольку первый индекс всегда «0».

К объектам можно обращаться и по названиям Layer[«Сhart»]. Для этого элемент нужно явно назвать — вручную, используя палитру Layers (двойной щелчок на названии объекта открывает окно с его свойствами), либо из скрипта. Чтобы не писать каждый раз громоздкую конструкцию с перечислением всей «родословной», используйте ссылки (references):

Тогда вышеприведённый участок кода будет иметь вид: pI[1].strokeWidth.

К слою как к объекту допускается не обращаться каждый раз, если все операции происходят на одном и том же активном слое. И учтите, что в названиях переменных имеет значение регистр: если первый раз написать pI, а второй — pi, то скрипт выдаст ошибку и работать не будет.

В объектно-ориентированной модели существуют: само приложение, классы (типы объектов, или, используя более привычное понятие, существительные: слои, векторные объекты, группы и т. п.), методы (способы взаимодействия с ними — глаголы: move, duplicate и т. п.) и свойства (прилагательные: strokeWidth, fillColor, selected и т. п.). Чтобы легче ориентироваться, представьте, что приложение — это дом, в котором есть различные предметы — аналог классов (окна, двери), обладающие некоторыми свойствами (пластиковые, деревянные), с которыми выполняют определённые действия — методы (открывают, закрывают). Понимая суть подобной иерархии, гораздо проще разобраться в скриптинге.

На самом верхнем уровне находится приложение, и, буквально следуя правилу подчинённости объектов, его пришлось бы указывать при любом действии. В целях упрощения ссылку на приложение можно опускать — кроме тех случаев, когда действительно требуется узнать какие-то его свойства (например, доступные шрифты — app.fonts).

Классы Layer, Group, Text могут содержать объекты того же класса, у которых также могут иметься дочерние. Полезная возможность объектного подхода — наследование свойств. Так, все векторные контуры (pathItems) являются дочерними для более общего класса — элементов страницы (pageItems). Следовательно, назначив определённые свойства pageItems, мы автоматически назначаем его и pathItems.

Несмотря на похожесть, классы Layers и Layer всё же различны. Первый — коллекция всех слоёв в документе, второй — только какой-то определённый, соответственно отличаются их методы и свойства. К первому можно применять методы add, removeAll, а ко второму — все операции, доступные для отдельного слоя. Непосредственно к объекту обращаются как к элементу соответствующего массива — в нашем случае через Layers[1], Layers[2] и т. д.

Выделенному элементу соответствует отдельный класс — selection, который также является массивом (выделена может быть группа объектов). На особом счету в Illustrator классы pluginItems, Colors, Views. Первый имеет множество ограничений, связанных с тем, что объекты такого типа «не родные» для Illustrator. К ним относятся элементы Blend, Envelope, Mesh и аналогичные. Особенности остальных будем рассматривать по мере их использования.

Чтобы скрипт был «виден», его размещают в папке Presets•Scripts, расположенной в той, где установлено приложение. Рассматривать будем реальные примеры (это позволит сразу почувствовать полезность сценариев), а писать их под Illustrator CS, поскольку его скриптинг гибче предыдущих версий.

Пример 1: объединение объектов

Начнём с самого простого — напишем скрипт, соединяющий линиями подчинённые объекты с основным (нередкая задача при создании блок-схем, технической документации и аналогичных работах). И коснёмся таких базовых вопросов, как работа с выделенными объектами, создание новых слоёв, размещение объектов, изменение их порядка, создание и включение кривых в сложный путь (compound path).

Работа с такого рода документами предполагает широкое использование символов (symbols) — внесение изменений в них автоматически обновляет все созданные копии. Однако с такими элементами Illustrator работает не всегда корректно: бывает, что не считывает названия у объектов, являющихся копиями символов. В результате их отбор по имени невыполним. Обработка же всех элементов данного типа в текущем слое практической пользы не имеет. В итоге, я склонился в пользу альтернативного варианта, при котором сначала необходимо выделить требуемые объекты (проще всего — выбором одного символа и поиском его копий через командой Select•Same Instances), а затем выделить опорный элемент, с которым они будут соединяться.

Итак, начинаем. Для сокращения введём переменную sel, к которой будем обращаться, когда нужно провести какие-либо действия над выделенным объектом. Затем проверим, сколько элементов выделено (хотя к массиву selection также относятся и любые выделенные символы текста, проверять, что выделен не текст, не будем). Запись if (sel.length alert (“Not enough objects to proceed! \nSelect at least 2 objects and the last — target object!”) >
else <

Alert — стандартная функция JavaScript, которая выводит окно с заданным текстом и кнопкой ОК. «\n» означает переход на новую строку и используется, чтобы размеры окна оставались небольшими. Текст, выводимый в окне, должен быть заключён в кавычки.

Подготовительный этап

Получим координаты центра опорного объекта. Поскольку мы условились, что он — самый верхний, его номер (индекс) — «0» (sel[0]). Для вычисления координат будем использовать такие свойства объекта, как position (положение), width и height (высота и ширина). Значения position хранятся в массиве, состоящем из пары значений — координат по оси Х и Y, соответственно. Следовательно, к каждому нужно обращаться как position[0] и position[1].

refObj_x = sel[0].position[0] + (sel[0].width/2);
refObj_y = sel[0].position[1] — (sel[0].height/2);

Мы получили координаты центра опорного объекта и присвоили их двум переменным для дальнейшего использования. Во второй строке стоит знак «—», т. к. за точку отсчёта в Illustrator принят левый нижний угол документа, а position выдаёт координаты верхнего левого угла элемента.

Поскольку при работе с документом не последнюю роль играет удобство, позаботимся, чтобы создаваемые линии были на отдельном слое — такая структурированность поможет поддерживать порядок в макете различной сложности.

Создаём новый слой — он, как и любой элемент Illustrator, создаётся методом add(), применённым к соответствующему классу объектов. В скобках можно конкретизировать параметры действия: указать объект-назначение (им может быть, например, слой или даже новый документ, а также положение в месте назначения). В отличие от большинства методов, для add дополнительных параметров не предусмотрено, поэтому для переноса на самый верхний уровень воспользуемся специальным методом — zOrder, которому в качестве параметра укажем BRINGTOFRONT (зарезервированная константа, полный список которых приведён в документации). В принципе, если в документе всего один слой, специально указывать положение нового не требуется, поскольку Illustrator всегда располагает его выше текущего. Если же соединяемые объекты расположены не на самом верхнем уровне, вторая строчка будет нужна.

newlayer = activeDocument.layers.add();
newlayer.ZOrder(ZOrderMethod.BRINGTOFRONT);

Первую строку можно прочитать так: создать новый элемент путём увеличения (add) числа объектов требуемого типа (layers) и ссылку на только что созданный элемент присвоить переменной newlayer. В начальный момент слой пуст, т. к. в него ещё ничего не помещено. Для упрощения ориентации в сложном макете дадим слою название «Connectors» (методом name) — как видите, названия методов чётко говорят о выполняемых действиях.

В учебных целях создадим не разрозненные соединительные линии, а объединённые в объект типа Compound Path — для удобства редактирования. Создание такого объекта повторяет уже известную процедуру, на этот раз применённую к классу compoundPathItems:

Поскольку в прошлом шаге мы создали новый слой, он является активным — соответственно, создаваемые объекты будут располагаться на нём, и необходимости специально указывать его (activeDocument.newlayer) нет.

Определение координат подчинённых элементов

Этот процесс объединим с выводом самих соединительных линий, поскольку их количество должно соответствовать количеству объектов. Поочередно начинаем перебирать все выделенные элементы («i++» означает приращение на единицу) и считываем их координаты. Поиск начнём не с самого первого объекта из массива Selection (как вы помните, им выступает опорный объект), а со второго (sel[1]). Следующие строки нам уже знакомы:

Переходим к основной части сценария. Сознательно не рассматриваем ситуацию, когда выделены несколько объектов, — ведь для задания толщины окантовки достаточно выбрать лишь один. Да и какое значение использовать, если оно у элементов окажется разным? Как мы уже знаем, единственно выделенный объект будет иметь индекс «0», а для получения толщины окантовки у Illustrator существует свойство strokeWidth. Учтём, что в принципе, selection может содержать не только отдельные элементы, но и часть текста (например, выделенную случайно), что не входит в наши планы, поэтому перед началом работы проверим возможностями JavaScript тип выделенного элемента на принадлежность именно массиву:

if (sel[0] isArray) <
weight = sel[0].strokeWidth;

Поскольку мы условились выделять только изменённые объекты, с самого опорного выделение нужно снять (обращаемся к его свойству selected):

Теперь мы полностью готовы к выполнению основной задачи сценария — поиска объектов: значение, которое будет использоваться в качестве минимально допустимой толщины, хранится в переменной wei.

Обстоятельства

Сравним его с аналогичным свойством у всех объектов в документе. Можно сразу перейти к поиску, но использование скрипта в повседневной работе потребовало учёта дополнительных обстоятельств — в макетах часто бывают как заблокированные слои, так и отдельные объекты. Следовательно, хоть в них поиск и работает, но вносить изменения нельзя. Чтобы обеспечить тотальную проверку, добавим в скрипт несколько операций: проверяя элементы на соответствие заданному критерию, одновременно разблокируем их, если это необходимо, и запомним индекс, чтобы после завершения проверки вернуть их в прежнее состояние. Вводим две переменные: первую для сокращённого доступа ко всем слоям в документе, а при помощи второй получим доступ только к заблокированным. Хранить порядковые номера последних будем в массиве, который создадим функцией JavaScript — new Array().

var dL = activeDocument.layers;
var blokedLayers = new Array();

Затем просмотрим все слои и у заблокированных (свойство locked=true) порядковый номер занесём в массив blokedLayers (при помощи функции push из JavaScript), после чего разрешим их редактирование (locked=false).

if (go == true) <
for (i=0; i if (dL[i].locked == true) <
blokedLayers.push(i);
dL[i].locked = false;Раньше мы условились исправленные объекты выделять, но после завершения работы скрипта на заблокированных слоях этого сделать не сможем — нужно вывести соответствующее предупреждение. Для этого используем признак lockedPresence, который установим, если хотя бы один слой заблокирован.

То же повторим и с отдельными заблокированными элементами. В простейшем случае достаточно проверить все векторные элементы (класс pathItems), в которые как подкласс входят compound pathes, — чтобы ничто не ускользнуло от всевидящего глаза скрипта.

Подводные камни

Кроме рассмотренной ситуации с заблокированностью, существует ещё один «подводный камень». Как уже отмечалось, некоторые элементы (в частности, Blend Group и Envelope) не являются «родными» для Illustrator, они принадлежат специальному типу рluginItem. При этом доступ к таким объектам в Illustrator не предусмотрен, они — «вещь в себе». «Достучаться» до них можно только через класс более высокого уровня — pageItems, через который мы сможем хотя бы определить их присутствие и вывести в конце соответствующее предупреждение. Оно будет говорить, что, запустив скрипт ещё раз и указав в качестве второго параметра в поле ввода «2», он выделит эти «черные ящики».

Для хранения индексов заблокированных объектов создадим массив blokedPathes, а для подсчёта количества изменённых введём переменную corrected.

bloсkedPathes = new Array();
corrected = 0;

Для всех объектов выполним проверку на принадлежность типу PluginItem (свойство typename): если таковые присутствуют, установим признак pluginItemExist (его состояние будет определять вывод предупреждения о наличии таких элементов). В случае же повторной проверки (когда второй параметр в поле ввода равен «2») будем их выделять:

for( i=0; i 0) <
retrievedPathes = blokedPathes.shift();
pI[retrievedPathes].locked = true;> >

Затем аналогичные действия предпримем в отношении слоёв:

for (i=0; i if (blokedLayers.length >0) <
retrieved = blokedLayers.shift();
dL[retrieved].locked = true; > >Вообще-то, для однотипных операций гораздо удобнее пользоваться функциями. Их преимущество в том, что единожды описав определённые действия, можно повторять их в полном объёме, просто вызывая в нужных местах функцию; так достигается компактность и читабельность сценария. Для повышения гибкости функции передают используемые в ней значения (параметры). Если же не хотите использовать функции, пропустите следующие два абзаца.

Составим две функции: первую — для разблокировки слоёв и объектов, вторую — для восстановления их атрибутов. Меняться в них будут только типы объектов (класс Layers и pageItems) и массивы для записи интересующих нас элементов (blokedLayers и blokedPathes) — они-то и будут фигурировать в качестве параметров функции. Первую запишем так:

function unlock(array, itemType)
if (itemType[i].locked == true) <
array.push(i);
itemType[i].locked = false;
locked = false;
>

Вместо array будем подставлять массив, вместо itemType — необходимый класс. Тогда получим два вызова — unlock (blockedLayers, dL) и unlock (blokedPathes, pgI). Аналогично запишем функцию для восстановления статуса:

function restore (array, itemType)
if (array.length > 0) <
retrieved = array.shift();
itemType[retrieved].locked = true;
>

Вывод информации о результатах проверки

Это последний этап работы скрипта. Сначала определим условие вывода сообщения, если выбран поиск нередактируемых объектов, затем условие появления предупреждения о том, что такие объекты были обнаружены:

if (type == “2”) < b = “\nCheck selected!” >
if (pluginItemExist == true) <
alert ( “Due to scripting restrictions some objects can’t be affected” + b ) >

Логика выдачи предостережения о том, что не все исправленные могут быть выделены, такова:

if ( (lockedPresence == true ) && (pluginItemExist == false) ) <
warning= “\nBecause some of them are locked they can’t be showed as selected” >

После чего выводим окончательные результаты:

alert ( “Number of corrected objects are: “ + corrected + warning)

Вот, собственно, и весь скрипт. Как видите, эти несколько строчек выполняют колоссальный объём работы, на которую вручную вряд ли кто-то отважится. Сценарий же выполняется моментально (в масштабных проектах, при количестве элементов порядка нескольких тысяч, начинает сказываться производительность процессора). От вас требуется только выбрать его из списка имеющихся (можно даже этого не делать — Illustrator позволяет скриптам назначать «горячие клавиши») командой Edit•Keyboard shortcuts•Menu commands•Scripts. Но учтите: названия скриптов сортируются в алфавитном порядке, поэтому добавление новых или удаление старых может привести к переназначению клавиш соседним сценариям. Вывод: после изменений в папке Presets\Scripts проверяйте соответствие клавиш.

Мы постарались сделать скрипт универсальным, что сказалось на его объёме. В самом же примитивном варианте (без учёта описанных выше особенностей и подводных камней) он занимает буквально пару строчек:

Источник

Теперь вы знаете какие однокоренные слова подходят к слову Как написать скрипт для иллюстратора, а так же какой у него корень, приставка, суффикс и окончание. Вы можете дополнить список однокоренных слов к слову "Как написать скрипт для иллюстратора", предложив свой вариант в комментариях ниже, а также выразить свое несогласие проведенным с морфемным разбором.

Какие вы еще знаете однокоренные слова к слову Как написать скрипт для иллюстратора:



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *