Волшебная сказка с лубочными картинками.
![](https://habrastorage.org/getpro/habr/upload_files/f36/0c6/332/f360c63329f2c0785d3db049edac0c02.png)
Далеко ли, близко ли, высоко ли, низко ли, а летает нонче в небе жар-птица павлин из самого из города Муничинска. И где перо она потеряет, там картинки лубочные множатся, да не на бересте, а на бумаге белёной, да все больше с девками грудастымя вида неблагонравного, да воинами суровыми из земель былинных. Вельми старательно те лубки выведены, хотя с перстами иногда и перебор случается. Смотрит народ на картинки те и только губами причмокивает, да крестятся православные на земные чудеса удивляючись.
Старожилам однако ведомо, что не трогала длань человечая тех листов с рисунками странными. Добрый дух вложили создатели в птицу-жар павлина заморского, да размаху не пожалеючи, пожелали чтоб кажнее пёрышко наделилося силою сказочной. Каждый может перо то волшебное подобрать на лугу или в заводи и сдружиться с тем духом загадочным, да с поклоном и с помощью техники рисовать те картинки лубочные.
А купцы-перекупы заморские, усладившись рисунками дивными, принялись ставить лавки на плошади. Будь ты вой или девица красная, да хочь кажний прохожий иль лапотник или даже дитё безответное, в лавке той на лубки ты подивишься или весть на перо то заветное. А добавишь коль денюжку малую, то пропустят и к духу из пёрышка и дозволят шепнуть ему ласково пару слов для тебя со значением. Да лубок со слов тех намалеванный, не отымут холопы на выходе.
Чудно в лавке той теплой и сказочной, да вот только варяги охранные перят взгляд свой и злой и прищуренный на купцов из лесов под Архангельском. Да все больше себе позволяючи начинают на ножны поглядывать, лишь кивка от старшого охранника, ждут чтобы вовсе прогнать их из города.
Дисклеймер: Не беспокойтесь. С Wednesday все в порядке. Пострадала только косичка и потом мы же с вами знаем что это не её кровь.
Для создания продвинутой артельной молотилки нам понадобится 8 перьев сокола, варенье из ромашек, две пчелы и половозрелый питон ростом не менее трёх аршин, 10 пядей и 6 вершков. Знатоки бают что не в чин гоняться за слишком матёрыми питонами и более 6-9 вершков в хвосте быть не должно. Если же отрок читающий сие и не охотник и не зверолов, то морёного питона можно взять вот в этом лабазе
https://www.python.org/downloads/release/python-3106/
Не забудьте пересчитать зубы у питона. Если вы и сами знатно улыбаетесь, то ищите чтобы было 64 зуба, а ежели улыбка ваша блёклая и неблестючая, то и беззубый вам будет бесполезен, бо с молотилкой и так и сяк незадача выйдет.
Всё сие колдунство нужно сложить в футляр от гитары вот отсюда
Поскольку наша сказочка пишется для самых мусипусеньких мышевозюнчиков, предположим что мы находимся в среде windows 10 с админскими правами. По тем же соображениями мы не будем писать собственные скрипты на питоне, а воспользуемся готовым решением от AUTOMATIC 1111
Непосредственный конкурент stable-diffusion-webui от cmdr2 stable-diffusion-ui беднее по возможностям и хотя и у него есть некоторые плюсы, рассматривать в нашей сказочке мы его не будем.
Перво-наперво проверяем есть ли у нашей системы 16Гб, а у видеокарты 4Гб памяти и если есть, переходим ко второму хоралу святочных песнопений. Если памяти не хватает, то в принципе это не приговор, но тогда наша сказочка превратится в былину и этот вариант пока оставим за сараем.
Фигура вторая.
Ежели ура и с памятью все хорошо, устанавливаем гит и пайтон в формате инсталлера. Некоторые инструкции советуют поставить еще и взрослую Анаконду или ее дочку, но у меня и без лишних хвостатых все сработало. Ставить Python с установками по умолчанию, куда-то в аппдату я бы не стал.. Поперек то заветам завещанным, часто отроками отвергаемым. Я б не стал гневать духов-хранителей и поставил бы в папку в отдельную - без пробелов куда-нибудь в C:\Python\ . Кроме пути никаких особых настроек установщики не требуют, но не забудьте проверить галочку насчёт добавки Python в системный путь и перезагрузиться.
После перезагрузки нажимаем Win+R и вводим cmd. От админа запускать командную строку совершенно излишне.
Проверяем установки и говорим в командной строке
git -v
если git установлен правильно должно ругнуться номером версии и сказать что-то типа
git version 2.39.0.windows.2
после этого говорим
python -V
Если Python добавлен в системный путь, то он ответит номером версии типа
Python 3.10.6
В случае ошибок гит лучше переустановить, а пайтона можно оставить как есть - мы потом в конфиге путь к нему укажем.
Фигура третья.
Чудны дела заморские и перед началом установки интерфейса нужно позаботиться о модели. Предлагаю особо не замахиваться прямо со старта и не брать сразу 2.1 . Для тренировки вполне хватит какой-нибудь стандартной 1.5 модели. Забираем по ссылке файл v1-5-pruned-emaonly.ckpt и откладываем его пока в прохладное место. Еще нам наверняка понадобится файл vae-ft-mse-840000-ema-pruned.ckpt - возьмем и его тоже.
Прежде чем приступать к установке, нужно определиться со свободным местом на диске. Хотя на SSD дисках все шевелится, конечно, как-то побыстрее, но это не так чтобы уж прямо очень критично. Плюс ко всему, неизбежно руки будут тянуться скачивать все новые и новые модели (у меня сейчас вот только папка с моделями разрослась до 90Гиг) и всегда нужно рассчитывать что места будет потрачено очень много. Кроме того новые 2.1 модели скачивают в папку профайла на системном диске нужные им дополнительные файлы и она тоже может превысить гиг 5-10. А еще нежелательно выбирать диск с форматом отличным от NTFS иначе задолбаетесь потом говорить git config --global --add safe.directory для каждой папки после каждой ошибки.
Предположим что установка будет производиться на диск E: в папку Ai
возвращаемся в открытое окошко командной строки или открываем новое и говорим
E:
и
cd Ai
Дальше все по инструкции с гитхаба. Говорим
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
через пару минут в папке E:\Ai у нас появится папка stable-diffusion-webui
Не закрывая командное окошко, откроем ее в проводнике и найдем в ней файл webui-user.bat
Перед началом установки его нужно открыть в блокноте и отредактировать
Если на этапе проверки пайтона, он не нашелся в системном пути, то в третьей строке впишем полный путь и получится что-то типа
set PYTHON=С:\Python\python.exe
если пайтон нашелся, то эту строчку не трогаем. Шестую строку обязательно редактируем следующим образом
set COMMANDLINE_ARGS= --disable-safe-unpickle --no-half
здесь параметр disable-safe-unpickle разрешает загрузку небезопасных моделей, а no-half понадобится для свежих 2.1 моделей. Перед вызовом интерфейса не помешает обновить скрипты, поэтому последние 2 строчки должны выглядеть вот так
git pull
call webui.bat
Пока открыт блокнот, перетащим в его окошко еще и файл launch.py, хотя возможно нам повезет и редактировать его не понадобится. Сохраняем webui-user.bat и запускаем. Установка может занять прилично по времени и зависит от скорости вашего соединения. Давайте разберем две наиболее частые ошибки чтобы не отвлекаться на гугл.
Вечно висит Installing torch and torchvision и больше ничего не происходит
Под вечностью следуют понимать максимальное время, за которое могут скачаться эти 2 пакета (в сумме около 2.5 гиг) - т.е. раньше чем через полчаса начинать расстраиваться рано :) Еще можно с какой-то периодичностью проверять размеры папок E:\Ai\stable-diffusion-webui\ и AppData\Local\pip\ в папке профиля - если размер стоит на месте это верный признак неудачи.
В этом случае все печально. Скорее всего у вас слишком древняя видеокарта. Если это Nvidia можно попытаться отдельно установить CUDA без установки драйвера, а потом скачать и поставить последний драйвер.
Ошибка выглядит как-то так
окно с ошибкой webui-user.bat Такое возникает если при скачивании одной из зависимостей (в данном случае это taming-transformers), она обновилась и ее хеш перестал совпадать с заданным в файле launch.py (не зря же мы его открывали). Чтобы победить ошибку заходим в папку со скаченным пакетом.
У нас это будет E:\Ai\stable-diffusion-webui\repositories\taming-transformers говоря
cd stable-diffusion-webui\repositories\taming-transformers
путь можно скопировать или вбить вручную помогая кнопкой Tab и находясь в этой папке говорим
git rev-parse --verify HEAD
в результате в последней строке высветится хеш скаченного пакета
В нашем случае это 3ba01b241669f5ade541ce990f7650a3b8f65318 Копируем хеш выделив его левой кнопкой мыши и щелкнув по выделению правой. И переходим в launch.py - находим в нем строчку
taming_transformers_commit_hash = os.environ.get
и прописываем в ней новый хеш
Сохраняем, закрываем окно с ошибкой и заново запускаем webui-user.bat
Возможно этот шаг придется повторить несколько раз для разных скаченных пакетов. Если нам повезет и все пройдет удачно, в конце мы увидим что-то типа
Это уже практически ура
Осталось переместить файл v1-5-pruned-emaonly.ckpt в папку E:\AI\stable-diffusion-webui\models\Stable-diffusion
а файл vae-ft-mse-840000-ema-pruned.ckpt в папку E:\AI\stable-diffusion-webui\models\VAE
и снова запустить webui-user.bat
Загрузка модели может занять довольно продолжительное время, но в результате увидим что-то типа
![](https://habrastorage.org/getpro/habr/upload_files/5e8/adc/ec9/5e8adcec9073562830e9096d5847c2fa.png)
Как видим на картинке, загрузка нашей модели заняла 57 секунд, запустился и работает вебсервер и он доступен по адресу http://127.0.0.1:7860
Фигура финальная.
Откроем браузер и вставим в строку адреса http://127.0.0.1:7860 чтобы открыть основной интерфейс WEBUI (имея в виду что в фаерфоксе глючит!)
![](https://habrastorage.org/getpro/habr/upload_files/f3a/22d/7e0/f3a22d7e0c6d57d45f585bfc7d69ec4e.png)
В верхнем селекте можно увидеть название выбранной модели, если их несколько, то там же можно переключить.
Sampling steps показывает сколько шагов будет делать скрипт во время генерации. Если число шагов увеличить, то время обработки увеличится. Считается что чем больше шагов, тем качественнее изображение. Мне больше всего нравится 30-40 шагов, но можно поставить хоть 100.
Width и Height определяют ширину и высоту сгенерированной картинки. Практически все 1.5 модели обучены именно на квадратах 512 на 512, но для удобоваримости лучше в зависимости от ситуации выбирать 512 на 768 (вертикальная картинка) или 768 на 512 (горизонтальная). Хотя конечно, можно выбрать любое значение, но чем дальше от 512, тем больше вероятность увидеть 2 головы или 15 человеческих пальцев у котенка.
Batch count показывает сколько картинок генерится за раз. Чтобы оценить размах мысли нейросети нужно минимум 16, а лучше 128, но это очень долго, процент брака будет немыслимым и вероятность что именно на 128-м шаге получится гениальная картинка минимальна. Поэтому чаще всего используют 4-6.
Batch size сколько процессов будет идти в параллель (у меня любые значение выше 1 приводят к необратимому многоручеству, но если у вас очень мощный комп, поэкспериментируйте).
CFG Scale - интересный параметр, который регулирует условное свободомыслие модели. Чем меньше поставить, тем глубже в дебри машинной логики он будет погружаться и тем меньше будет обращать внимания на слова в запросе. Рекомендуют 7-10, но я иногда ставлю и и 4 и 30 - местами получается интересно.
В принципе уже можно начинать играть с параметрами и словами в полях ввода, но сначала не помешает почитать о формате слов в запросе и понять зачем нужны скобки (на самом деле для усиления значимости части фраз) или даже двойные квадратные (для не очень сильной значимости) и т.д. И ознакомиться с примерами удачных генераций где-нибудь на https://prompthero.com/stable-diffusion-prompts или поискать уже готовые генерации по фразе на https://openart.ai или https://lexica.art/
Не стоит ожидать что у вас сразу начнут получаться такие художественные результаты (многие художники используют кастомные модели, тренируют свои и т.д.), но давайте попробуем сгенерить первую попавшуюся Эльзу.
Поле запроса (верхнее): Elsa, d & d, fantasy, intricate, elegant, highly detailed, digital painting, artstation, concept art, matte, sharp focus, illustration, hearthstone, art by artgerm and greg rutkowski and alphonse mucha, 8k
Поле отрицания (в нем мы перечисляем все что не хотим увидеть на картинке): deformed, cripple, ugly, additional arms, additional legs, additional head, two heads, multiple people, group of people
50 шагов, CFG Scale 11, 6 картинок в 1 поток. Нажимаем Generate и чтобы было не слишком скучно смотрим как идет процесс в командном окошке
![](https://habrastorage.org/getpro/habr/upload_files/3c9/524/380/3c95243804f5cdeca110279f3f917322.png)
В результате Эльза конечно получилась, но не сказать чтобы прям супер-супер
![](https://habrastorage.org/getpro/habr/upload_files/b7d/727/896/b7d72789662689c2f0834fb7e6b57719.png)
Покрупнее картинки можно посмотреть если покликать на превьюшки или в папке, куда WebUI все по умолчанию сохраняет - вон кнопка с желтенькой иконкой. Можно попробовать поставить галочку Restore Faces (рекомендую алгоритм CodeFormer - его можно выбрать в настройках). Пример его работы на картинке
![](https://habrastorage.org/getpro/habr/upload_files/033/15b/75d/03315b75d9f1c3c04b5a5d21b42a134d.png)
Но и это помогает не особо.. Давайте попробуем добавить к запросу слова frozen и smile, увеличить число шагов до 150, а число картинок до 40 чтобы было время сбегать попить чайку. Прямо вижу немой вопрос у вас в глазах после того как весь чай выпит, а ни одного дельного результата среди 40 картинок не нашлось. Самое лучшее что у меня нагенерило выглядит странновато
![](https://habrastorage.org/getpro/habr/upload_files/be9/3ba/410/be93ba4104291611c2fab2770a4a8879.png)
В взгляде написано "Как же так? Ведь должно было получиться намного лучше..". И тут мы уже вплотную подошли к проблеме правильному составления запросов. Но даже если использовать все возможности по максимуму, для разных целей будут нужны разные модели. Источников в сети множество, но тема сравнительно новая и часто бывает что накачав 70 гиг моделей почти без описания, через полчаса в них разочаровываешься и сносишь нафиг с диска. Хороший сайт по этой теме https://civitai.com/ - все модели там бесплатные, а для регистрации нужна только почта. Там живет одна из моих любимых моделей Moistmix. Она, конечно немного мультяшная и NSFW, но все равно давайте попробуем ее качнуть. Обратите внимания на селектор на кнопке скачать. Кроме основного файла moistmixV1_moistmixV1.safetensors (который конечно же нужно положить в папку E:\AI\stable-diffusion-webui\models\Stable-diffusion), автор озаботился еще и кастомным VAE файлом (а это явный признак качества), который нужно положить в папку E:\AI\stable-diffusion-webui\models\VAE
Для верности перезапустим консоль. Закроем консольное окошко и браузер и снова запустим webui-user.bat
По умолчанию подхватится последняя использованная модель и это большой минус webui.. В том же ui от cmdr2 загрузка модели происходит в момент нажатия кнопки Generate, а здесь сначала грузится прошлая, потом мы в селекте выбираем другую и она перегружается. Обладателям огромных объемов памяти это не критично, но если комп сравнительно слабенький, то консоль webui-user.bat частенько падает при смене модели. Возможно старшие товарищи меня поправят и можно как-то не грузить модель при запуске, но я пока не придумал как.. Но в любом случае давайте попробуем. После перезапуска в селекте у нас появились 2 модели
![](https://habrastorage.org/getpro/habr/upload_files/29e/bff/df4/29ebffdf49686401fc9b5d820a3282e5.png)
Выбираем мостмикс и повторяем запрос. В этот раз ограничимся 40 шагами и 6 картинками.
В результате получаем несколько более мультяшных вариаций типа.
![](https://habrastorage.org/getpro/habr/upload_files/90f/e97/87b/90fe9787be21978c6f540f0046841ebf.png)
но в целом, по-моему выглядит уже поприличнее даже без использования модификаторов в запросе. Кроме моделей WebUI (в отличие от просто ui) понимает еще и Textual Inversion текстовые модификаторы. Это такие маленькие модели, которые создаются при тренировке на небольшом числе изображений и применяются поверх уже существующей большой. Инверсии скачиваются в формате .pt или .bin и складываются в папку E:\AI\stable-diffusion-webui\embeddings
На том же сайте есть несколько интересных модификаторов, например Империя. Ну или можно посмотреть большой список вот тут.
Для его активации нужно опять перезагрузить систему закрыв консольное окошко и браузер и запустив заново. Если модификаторы загрузились, это будет видно
![Отгадайте с каким модификатором создавалась обложка поста :) Отгадайте с каким модификатором создавалась обложка поста :)](https://habrastorage.org/getpro/habr/upload_files/7e9/924/2c2/7e99242c29b1d340df1ce3913cd88da7.png)
Теперь оставляя тот же запрос, добавляем Style-Empire. В результате получается что-то вроде
![](https://habrastorage.org/getpro/habr/upload_files/b6e/c91/734/b6ec91734968cf4439e8a0a541ccb9a7.png)
И это из-за мелкого файлика весом в 10кб!
Обратите внимание, что на странице скачивания моделей и модификаторов на картинках обычно присутствует значок i - если на него нажать,то отобразятся конкретные запросы с которыми была сгенерирована эта картинка.
В заключение давайте быстренько попробуем загрузить свежую 2.1 модель. На странице загрузки на выбор предлагают на выбор 4 варианта
![по состоянию на середину января 2023 по состоянию на середину января 2023](https://habrastorage.org/getpro/habr/upload_files/42c/1c3/e5e/42c1c3e5e4c84f7b08a441571b43000c.png)
Если максимально упростить, то Ema модели содержат метаданные после обучения и их проще дообучать и создавать слияния (merge), а из nonema вычищен лишний мусор и они внимательнее воспринимают ключевые слова запроса. Ну и считается что SafeTensor модели работают быстрее (хотя я не замечал..) и что переключение с одной SafeTensor модели на другую реже сопровождается крашами. Поэтому давайте возьмем самый нижний v2-1_768-nonema-pruned.safetensors файл. Кроме самой модели нам понадобится VAE файл (помните в какие папки из нужно разложить?) и yaml файл с настройками.
![](https://habrastorage.org/getpro/habr/upload_files/699/c3c/a25/699c3ca259dc60be5b48ed4f1c282234.png)
Буква v в названии означает что настройки предназначены для модели обученной на квадратах со стороной 768 точек (мы именно такую и скачали). Без буквы v обучены на 512 точках и ее нужно пробовать только при вылетах из-за проблем с памятью. Пока ничего не качаем и открываем папку E:\AI\stable-diffusion-webui\models\Stable-diffusion
![выделяем файл и нажимаем F2 выделяем файл и нажимаем F2](https://habrastorage.org/getpro/habr/upload_files/c68/fbb/658/c68fbb658720a7ee99427fadc95b2056.png)
Теперь нужно создать текстовый документ рядом с файлом v2-1_768-nonema-pruned.safetensors - он создастся как новый текстовый документ.txt
Переименовываем его в v2-1_768-nonema-pruned.yaml и открываем в блокноте.
![Обратите внимание на кодировку - 1251 не подойдет Обратите внимание на кодировку - 1251 не подойдет](https://habrastorage.org/getpro/habr/upload_files/5e5/16a/c3a/5e516ac3aa57c222bf8d93fb997b18cb.png)
Теперь щелкаем по v2-inference-v.yaml и нажимаем кнопку RAW
![](https://habrastorage.org/getpro/habr/upload_files/1f2/5a5/c63/1f25a5c634748a247e5eaf5a60028395.png)
Откроется простое текстовое содержание файла где можно сделать Ctrl+A и Ctrl+C. Вставляем текст в окошко блокнота и сохраняем. Теперь запускаем webui-user.bat и пробуем вбить запрос и сменить модель.
![](https://habrastorage.org/getpro/habr/upload_files/4bd/d27/1a7/4bdd271a752094b2ab2e6111e12fc28a.png)
Если все пойдет хорошо, то 2.1 при первом запуске создаст папку .cache в папке профиля на системном диске и докачает туда пару гиг нужных для работы модели.
Обратите внимание, что не все текстовые инверсии совместимы с любыми моделями.
![](https://habrastorage.org/getpro/habr/upload_files/cf3/340/8f8/cf33408f8c477c3a6ec4284d88c88007.png)
В результате у меня получилось что-то вот такое по запросу female rock legend
![](https://habrastorage.org/getpro/habr/upload_files/6a7/7b8/ad4/6a77b8ad4a87bced5082c8ecc7933d05.png)
И вот такая статуэтка при использовании инверсии FloralMarble
![statue of grace kelly, art by FloralMarble-300, rose flower petals, water flow, rear window style statue of grace kelly, art by FloralMarble-300, rose flower petals, water flow, rear window style](https://habrastorage.org/getpro/habr/upload_files/27a/cd9/725/27acd97258fd41f102c3b390e7142864.png)
Напоследок хочу пожелать всем начинающим не опускать руки после первых средних результатов. Не забывайте что почти все витринные картинки из интернетов сделаны опытными художниками, которые не просто генерируют картинку, но еще и долго обрабатывают ее в графических редакторах и используют разные сторонние программы типа Topaz Gigapixel. Если в ней проапскейлить картинку, а потом в фотошопе опять уменьшить с хорошим алгоритмом, то изображение будет выглядеть чётче. Но в этом посте из соображений повторяемости никакая постобработка ни к одной картинке не применялась.
На этом разрешите откланяться и уступить дорогу новому поколению оптимизаторов запросов (а оно, я уверен, будет). Экспериментируйте, двигайте слайдеры, срисовываете приемы у лучших и пусть на этом пути вас неизбежно настигнет удача :)
PS И уж совсем на посошок тяжелый спойлер для тех кому интересно как Wednesday с первой картинки будет выглядеть в разном возрасте. По мнению нейросети конечно же :)
Textual inversion W3DDDN3SD4Y
![Wednesday 6, она еще совсем кроха. Wednesday 6, она еще совсем кроха.](https://habrastorage.org/getpro/habr/upload_files/36b/84c/bee/36b84cbeefe80869e8807f8f9528523d.png)
![10 лет - уже немного подросла 10 лет - уже немного подросла](https://habrastorage.org/getpro/habr/upload_files/4d8/22f/478/4d822f4788f0a2c2af7466c75c8dd982.png)
![13 - эксперименты с косичками продолжаются 13 - эксперименты с косичками продолжаются](https://habrastorage.org/getpro/habr/upload_files/eba/fe6/6b5/ebafe66b511925d5299126cfac6f6b18.png)
![14 лет - уже с рюкзачком 14 лет - уже с рюкзачком](https://habrastorage.org/getpro/habr/upload_files/578/0c5/735/5780c573567b625f3fa2a3b565582f82.png)
![15 лет - в поисках собственного стиля. 15 лет - в поисках собственного стиля.](https://habrastorage.org/getpro/habr/upload_files/874/598/029/874598029533582b3097932f029b9daf.png)
![16 - стиль найден 16 - стиль найден](https://habrastorage.org/getpro/habr/upload_files/802/138/b55/802138b551a5552e9993d459327122ca.png)
![16 лет - жизнь сложная штука, а выживание еще сложнее 16 лет - жизнь сложная штука, а выживание еще сложнее](https://habrastorage.org/getpro/habr/upload_files/e81/e42/ba8/e81e42ba8616567109da24a60d78d1a2.png)
![16 - это не её кровь 16 - это не её кровь](https://habrastorage.org/getpro/habr/upload_files/584/a70/f1d/584a70f1d028ee6ae7a20fb06e11bb9d.png)
![17 - взгляд все жестче 17 - взгляд все жестче](https://habrastorage.org/getpro/habr/upload_files/710/315/92f/71031592fc8748cfff06191d55a93d0c.png)
![25 лет - пропала аллергия на цвета 25 лет - пропала аллергия на цвета](https://habrastorage.org/getpro/habr/upload_files/e07/b72/be2/e07b72be29b9c2bcc1fb08ec8d41af30.jpg)
![30 лет - врагов все больше 30 лет - врагов все больше](https://habrastorage.org/getpro/habr/upload_files/ac5/2e3/0ac/ac52e30ac1b5c2bdb6dcad88fefb6251.jpg)
![40 лет - все больше опасностей на пути 40 лет - все больше опасностей на пути](https://habrastorage.org/getpro/habr/upload_files/502/8bb/5ec/5028bb5ec7e8e6ff5c9415f7f3f9f987.jpg)
![50 - все еще не сдаемся! 50 - все еще не сдаемся!](https://habrastorage.org/getpro/habr/upload_files/7a5/581/399/7a5581399046ec2ace74e1f22eb1bee4.jpg)