Открыть изображение »
Как определить монтаж на фото
Разоблачаем фейки, фотошоп и ретушь
02 апреля 2017 :: 33 комментария :: 26914 просмотров :: 4587 слов
В 1855 году пионер портретной фотографии Оскар Рейландер сфотографировал себя несколько раз и наложил негативы друг на друга при печати. Получившееся двойное селфи считается первым фотомонтажом в истории. Наверное лайков тогда собрал, уух...

Теперь же каждый подросток с фотошопом, смартфоном и интернетом сможет даже лучше. Правда чаще всего эти коллажи неимоверно доставляют. А вот профессионалы научились скрывать свою работу весьма качественно. Это был вызов.

Совокупность методов анализа модифицированных изображений назвали Image Forensics, что можно перевести как «криминалистика изображений». В интернете существует куча сервисов, заявляющих, что они за два клика помогут определить подлинность фото. Особенно доставляют самые тупые, которые идут смотреть EXIF и если там нет оригинальных метаданных камеры начинают громко вопить «вероятно фото было модифицировано». И про них даже в New York Times пишут (а про тебя нет).

Я пересмотрел около десятка сервисов и остановился на одном: Forensically. В нём реализовано большинство описанных в статье алгоритмов, я буду часто на него ссылаться. Все описанные методы названы оригинальными английскими названиями, чтобы не было путаницы.

Однако возможность загрузить свою фотку в какой-то сервис и посмотреть на красивые шумы не сделает из вас сыщика. Поначалу может быть трудно и непонятно, а первые эксперименты точно окажутся неудачными. У меня так же было. Тут как в спорте — нужен намётанный глаз и опыт как должно и не должно быть. Умение не просто смотреть на шумные картинки, а видеть еле заметные искажения в них.

Не существует 100% метода, позволяющего определить фейк. Но есть человеческие ошибки.

Наблюдение и цветокоррекция

Найдет самые глупые косяки

Главный инструмент — наши глаза. Так что первым делом стоит открыть фото в любимом графическом редакторе или просмотрщике, поставить зум в 1000% внимательно втыкать в предположительное место монтажа. С этого начинается любой анализ. Чем более неопытный монтажер попался — тем проще будет найти косяки, артефакты и склейки. Иногда фейки настолько кривые, что можно нагуглить оригинал используя поиск по изображениям или заметив несоответствия в EXIF.
Иногда фейк палится без глубокого анализа. Как например фотография с акции феминисток 8 марта, датированная в EXIF вечером 7 марта. Ну и дождевой слив под баннером забыли прифотошопить. Хотя по другим параметрам фейк сделан вполне неплохо.
Помимо этого, в любом уважающем себя редакторе есть инструменты для цветокоррекции. В Preview.app на маке они спрятаны в меню Tools > Adjust Color... Вытягивание различных ползунков поможет лучше разглядеть детали.

Brightness and contrast. Сделать темные области ярче, а яркие темнее. Теоретически поможет лучше разглядеть артефакты, склейки и другие места, которые неопытный фотошопер просто замазюкал темненьким и посчитал, что не заметят.

Color adjustment. Увеличивая насыщенность или яркость разных цветов, можно заметить неестественные переливы и границы склейки.

Иногда фейк палится игрой с уровнями и контрастом
Invert. Часто помогает увидеть скрытую информацию в однотонных объектах.

Sharpen and blur. Добавление резкости поможет прочитать надписи на табличках, есть целые сервисы, которые могут побороть заблюренные области.

Normalization and histograms. Работа с гистограммой по сути объединяет сразу несколько методов в один. Если вы прошарены в графике — гистограммы будут серьезным оружием.

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

Noise Level Analysis

Найдет свежую кисть, деформацию, клонирование и вставку чужеродных частей

Реальные фотографии полны шума. От матрицы камеры или фотосканера, от алгоритмов сжатия или по естественным природным причинам. Графические редакторы же этот шум не создают, их инструменты живут в «идеальном мире», потому чаще всего «размазывают» шум оригинального изображения. Кроме того, два изображения чаще всего обладают разной степенью зашумленности.
Глаз не видит разницы на оригинале, но шумы приклеенных изображений отличаются уж очень очевидно
Заметить шум глазом не так-то просто, но можно взять любой инструмент Noise Reduction и инвертировать его действие, оставив от фотографии только шум. Хорошо работает для свежеобработанных изображений и в случаях, когда автор решил, что нашел очень подходящие на вид изображения. Но легко обманывается, если знать как.

Поиграть самому можно здесь.

Как обмануть

Добавить своего шума. Самый очевидный вариант. Хочешь скрыть свои косяки — навали на фото столько шума, чтобы забить оригинальный.

Пережать JPEG. Уменьшение качества изображение в два раза делает шумы неразличимыми (вот исследование).
Возьмем любезно предоставленное Настенькой селфи и попробуем сделать модные большие губы для инстаграма (хотя куда уж больше) с помощью инструмента Liquify. Сверху — оригинальное фото, снизу — боевой штурмовик после Liquify и его уровни шума. Даже на такой небольшой модификации уже заметно, как шумы «расползлись» в направлении увеличения.

Error Level Analysis

Найдет свежие артефакты наложения изображений или текста

Каждый раз при сохранении картинки ваш редактор заново прогоняет её через кучу преобразований — конвертирует цвета, делит на блоки, усредняет значения пикселей, и.т.д. Он занимается этим даже если вы выбрали 100% качество при сохранении, так уж устроен алгоритм JPEG. Интересующиеся могут почитать про него глубокую статью полную косинусных преобразований.

Так как JPEG — формат сжатия с потерями, то при каждом сохранении растет количество математических усреднений, ошибок или более популярный термин — «артефактов». Два сохранения с 90% сжатием примерно эквивалентно одному с 81% по количеству этих самых артефактов. На практике это может принести пользу. Даже если зоркий глаз не видит разницы между 80% и 85% сжатием, то наверное есть инструменты, которые наглядно покажут это различие? Да, Error Level Analysis или ELA.

Фейки с наложениями чаще всего делают подыскав нужные изображения где-нибудь в гугле. Вероятность, что найденные изображения будут с одинаковым уровнем артефактов, ну, крайне мала. Социальные сети или даже специализированные хранилища фотографий всё равно пережимают изображения под себя при загрузке, чтобы не платить за хранение гигабайтов ваших селфи из отпуска. Обратное тоже верно — если вы накладываете на найденное в интернете изображение свежую фотографию со своей камеры, она будет заметно выделяться по качеству. Заметно не для глаза, а для ELA — он покажет разительно меньше артефактов на вашей новой фотографии.
ELA определил вклейку надписи на футболку. Таким результатам можно доверять сразу.
Простота и известность делает ELA самым популярным методом работы мамкиных интернет-сыщиков, от чего его начинают пихать везде, где только могут. Как будто других методов просто не существует и ELA может объяснить всё. Тот же Bellingcat использует его чуть ли не в каждом втором своём расследовании. Хотелось немного остудить пыл всех услышавших новую умную аббревиатуру.

ELA — не панацея. Сфотографируйте летящую чайку на фоне ровного синего неба (ага, особенно в Москве), сохраните её в jpg и прогоните через анализатор ошибок. Результат покажет просто огромное количество артефактов на чайке и их полное отсутствие на фоне, из чего начинающие сразу сделают вывод — чайка прифотошоплена. Да что там начинающие, сама команда Bellingcat с этим бывало глупо и по-детски наёбывалась. Алгоритм JPEG достаточно чисто работает на ровных цветовых областях и градиентах, и куда больше ошибается на резких переходах — отсюда такой результат, а не из-за ваших домыслов.
Нет, Bellingcat. Это не significantly different error levels, а всего-лишь однотонно залитая область, которую JPEG сжимает без ошибок. На любой фотографии неба или облаков, будут такие же отличия. Таким макаром можно и до автобуса докопаться.
Из-за растущей популярности Error Level Analysis я уже слышал призывы запретить и не принимать его всерьез. Не буду столь категоричен, лишь посоветую не бежать писать разоблачения, если ELA показал вам какие-то шумы на краях. ОН НЕ ТАК РАБОТАЕТ. Думайте головой и помните как JPEG устроен внутри. Вот если ELA очертил четкий квадрат там, где его не должно быть, либо заметил разительную разницу в шумах при неотличимости на глаз — наверное стоит задуматься. Не уверены — проверяйте другими методами.

Поиграть с ELA можно тут.

Как обмануть

Много раз пересохранить. Все свои манипуляции алгоритм JPEG делает внутри блоков максимум 8x8 пикселей. В теории нужно 64 раза пересохранить изображение, чтобы уровни ошибок стали неотличимы друг от друга. На практике же это происходит гораздо раньше, достаточно пересохранить картинку раз 10 и ELA, да и некоторые другие методы, больше не увидят ничего полезного.

Изменить размер. Чтобы не напрягаться с пересохранением можно поступить еще проще — отресайзить изображение на какой-нибудь коэффициент не кратный степени двойки. То есть в 2 раза (50%) уменьшить не подойдет, а вот что-нибудь типа на 83% — уже всё, никакой ELA больше не поможет.

Смонтировать из одного источника или из lossless-формата. Вы сфотографировали двух людей на свой фотоаппарат, или скачали фотографии из какого-нибудь блога, где автор скорее всего пересохранял их всего раз-два. Либо наложили друг на друга две PNG'шки. Во всех этих случаях ELA не покажет ничего интересного.
Монтаж, который я сделал за 1,5 минуты в фотошопе для прошлого выпуска рассылки. На первом сохранении вклеенный омоновец и наложенный текст светятся артефактами как гирлянды. Через 5 пережатий JPEG шумы начинают покрывать всю картинку и артефакты омоновца начинают сливаться с шумами других объектов. Но всё равно не до конца, тут уж нарочито очевидный монтаж.

Luminance Gradient Analysis

Найдет ретушь, компьютерную графику, хромакей, Liquify, Blur

В жизни свет никогда не падает на объекты абсолютно равномерно. Области ближе к источнику всегда ярче, дальше — темнее. Никакого расизма, только физика. Если разбить изображения на небольшие блоки, скажем 3x3 пикселя, то внутри каждого можно будет заметить переход от более темных пикселей к светлым. Примерно так:
Разбив картинку на блоки 3x3 можно нарисовать примерное направление к источнику света
Направление этого перехода так и называется — градиент освещенности. Можно попробовать нарисовать кучу маленьких стрелочек на изображении и понаблюдать за их направлением.
Мысленно нарисуем кучу маленьких стрелочек к источнику света
На первом изображении свет падает сверху и стрелочки направлены хаотически — это характеризует рассеянный свет. Второе изображение — компьютерная графика, на ней свет падает слишком идеально, никаких шумов и отклонений как на настоящем фото. Третье изображение — фотография с резким переходом, в центре стрелочки массово смотрят в самую яркую сторону, а на фоне — рассеяны так же, как на первом фото.

Рисовать стрелочки хоть и наглядно, но мы физически не сможем изобразить все градиенты освещенности для каждого блока поверх картинки. Стрелочки займут всё изображение и мы не увидим ничего. Потому для большей наглядности придумали не рисовать их, а использовать цветовое кодирование. Для направления вектора понадобится две координаты, и еще одна для его длины — а у нас как раз есть для этого три цветовых компоненты — R, G, B. В итоге получатся вот такие карты освещенности.
Вместо стрелочек наглянее изобразить направление света с помощью цветового кодирования. Некоторые вещи становятся нагляднее: например на компьютерной графике (по центру) видны четкие границы объектов и целые плоскости ровной освещенности. На реальных фото такого не бывает.
В реальной жизни нас окружает ограниченное число источников света. В помещении это лампы, вспышки, окна. В ясный день на улице чаще всего источник света только один — это Иисус, спаситель наш солнце. Если на карте освещенности находящиеся рядом объекты сильно отличаются по направлению падения света — у нас есть главный кандидат на монтаж.
Рука ковбоя с рекламы Kenwood даже на глаз выглядит не очень натурально. Если посмотреть на карту освещенности (по центру), она и правда отличается по характеру освещения. ELA справа тоже намекает, что рука прифотошоплена. Как выяснится потом не только рука, но еще и голова и шляпа.
Но еще лучше карты освещенности справляются с определением ретуши. Surface Blur, Liquify, Clone Stamp и другие любимые инструменты фотографов начинают светиться на картах освещенности как урановые ломы тихой весенней ночью. Нагляднее всего выглядит анализ фотографий из журналов или рекламных плакатов — там ретушеры не жалеют блюра и морфинга, а это непаханное поле для практики.

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

Как обмануть

Не знаю. Говорят помогает изменение яркости и насыщенности цветов по отдельности, но на бытовых фотографиях такие вещи всегда будут заметны глазу. Если вы знаете простой и действующий метод — расскажите в комментах под этим абзацем, всем будет интересно.
Сиськи всегда лучший пример. Рекламный плакат PETA. Крест явно был прифотошоплен (вот блин), ретушер оставил тени под руками, но не добавил их под крестом — косяк. Зато полностью перерисовал «кожу» модели, её карта освещенности выглядит как у компьютерного рендера выше. ELA явно показывает фейковость креста и задаёт вопросы по поводу реальности крыльев. А я уже поверил, что это настоящий ангел! Везде обман!
Пример из онлайн-магазина Ralph Lauren. Палится Liquify на обоих руках модели, замазанная какуля на плече, ремень нарисован почти заново, а вся кожа лица и рук подверглась сильному блюру. Силуэт на стене передаёт привет ретушеру и фотографу — кто-то косячит со светом :)

Principal Component Analysis

Найдет копипаст, вытягивание и несоотвествие цветов, Healing Brush, Clone Stamp

Метод PCA или на русском «метод главных компонент». Чтобы ко мне не придрались, мол, слишком просто всё рассказываешь и наверное не шаришь, вот описание PCA для рептилоидов.
Метод главных компонент осуществляет переход к новой системе координат y1,...,ур в исходном пространстве признаков x1,...,xp которая является системой ортонормированных линейных комбинаций. Линейные комбинации выбираются таким образом, что среди всех возможных линейных нормированных комбинаций исходных признаков первая главная компонента обладает наибольшей дисперсией. Геометрически это выглядит как ориентация новой координатной оси у1 вдоль направления наибольшей вытянутости эллипсоида рассеивания объектов исследуемой выборки в пространстве признаков x1,...,xp. Вторая главная компонента имеет наибольшую дисперсию среди всех оставшихся линейных преобразований, некоррелированных с первой главной компонентой. Она интерпретируется как направление наибольшей вытянутости эллипсоида рассеивания, перпендикулярное первой главной компоненте. Следующие главные компоненты определяются по аналогичной схеме.


А теперь для людей: представьте, что цветовые компоненты R, G и B мы взяли как оси координат — каждая от 0 до 255. И на этом трехмерном графике точками отметили все пиксели, которые есть на нашем изображении. Получится что-то похожее на картинку ниже.
Линия вдоль и поперек колбасятины и есть главные компоненты этой колбасятины
Можно заметить, что наши пиксели не рассосались по графику равномерно, а вытянулись в округлую колбасятину. Все реальные изображения так устроены, потому что science, bitches. Теперь мы можем построить новые оси — вдоль колбасятины (это самая главная) и две поперек — это и будут те самые «главные компоненты». Для каждого изображения набор цветов будет разным, колбасятина и главные компоненты будут направлены по-своему.

Так что вся эта математика нам дает? Дело в том, что если какие-то цвета на изображении стоят «не на своих местах» — они будут сильно выделяться из этого облака пикселей, то есть на карте PCA начнут светиться ярким белым цветом. Это может означать локальную цветокоррекцию или же полную вклейку. Диаграммы PCA может построить тот же Forensically. На них будет изображено расстояние от каждого пикселя картинки до плоскости 1, 2 и 3 главной компоненты. Так как расстояние — это число, то изображения будут черно-белыми.
PCA против Healing Brush. На фотографии действительно была замазана муха и даже несмотря на пережаты JPEG это место ярко видно на диаграмме.
Но еще более полезным свойством PCA является то, что он превращает JPEG-артефакты в очень заметные «квадраты». Даже если вы обманули ELA из предыдущего пункта пережатиями и ресайзом, то PCA этим не проведешь — он работает с цветом. Иногда артефакты сразу видно, например если исходное изображение увеличивали для вклейки. В других случаях сматриваться придется чуть более внимательно, чтобы заметить разницу в квадратах на изображении.

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

Самому поиграться можно здесь.

Как обмануть

Заблюрить. Любой блюр смазывает соседние цвета и делает «колбасятину» более округлой. Хороший блюр сильно затруднит исследование по методу PCA.

Еще хитрее изменить размер. Хотя PCA и более устойчив к изменение размеров изображения, говорят можно попробовать подобрать такой процент, чтобы обмануть даже его.
Белые полоски на флаге США подозрительно отличаются от остальных белых частей. Синяя и красная штучки на скафандре тоже были сильно изменены. Но это еще не всё — если присмотреться на артефакты, то на фоне и в отражении в шлеме их меньше, чем на самом скафандре. Автор впоследствии подтвердил, что фон и шлем были добавлены уже после рендеринга.

Discrete Wavelet Transformation

Найдет различия в резкости, отклонения в фокусе, ресайз

Дискретное вейвлет-преобразование очень чувствительно к резкости объектов в кадре. Если фотографии сняты на разные объективы, использовался зум или просто немного отличалась точка фокусировки — после DWT эти отличия будут намного виднее. То же самое произойдет, если у какого-то объекта в кадре изменяли размер — резкость таких частей будет заметно ниже.

Без лишних погружений в теорию сигналов, вейвлет — это такая простенькая волнушка, как на картинке ниже.
Их придумали лет 100 назад, чтобы приблизительно описывать аналоговые сигналы. Одну большую длинную волну представляли набором мелких вейвлетов, тогда некоторые её характеристики внезапно становилось проще анализировать, да и места чтобы хранить надо было меньше. На вейвлет-сжатии например был построен формат JPEG-2000, который к нашему времени (к счастью) сдох.

Картинка — это тоже двухмерный сигнал из цветных пикселей, а значит её можно разложить на вейвлеты. Для достаточно точного приближения изображения 800x600 требуется до 480000 вейвлетов на цветовой канал. Если уменьшать это количество — будет сильно падать резкость и цветопередача. Но что это даёт, кроме сжатия?

А вот что: вейвлеты приближают области с разной резкостью по-разному. Чем плавнее переходы — тем проще плавному по своей природе вейвлету его воспроизвести, а чтобы приблизить резкий переход — надо больше вейвлетов. Это как пытаться сделать из кучи шариков идеальный куб.
Вейвлет-сжатие на динозаврах. Верхняя левая — оригинал. На правой использовался лишь 1% вейвлетов. Критические цвета, как черный и белый, очень сложно передать таким количеством. Левый нижний — 5% вейвлетов, средний динозавр становится более резким, чем уменьшенный (он четкий на 3%) и увеличенный (он на 8%). Больше 10% ставить не имеет смысла, вейвлеты начинают приближать цвета, а не резкость. Последняя картинка тому доказательство, на ней использовано 20% вейвлетов.
Если части изображения были смонтированы с изначально разной резкостью — это можно будет заметить. Увеличили картинку — проиграли в резкости, уменьшили — наоборот всё стало слишком резким. Даже если взять две фотографии снятые на камеру с автофокусом из одной точки — они будут отличаться по резкости из-за погрешности автофокуса. DWT устойчив даже перед блюром, ведь редакторы ничего не знают про резкость исходных частей изображения.

На практике полезно рассматривать приближения с помощью 1%, 3% или 5% вейвлетов. На этом количестве перепады в резкости становятся достаточно заметны глазу, как видно на примере одного из участников соревнования по фотомонтажу, который не определяется другими методами, но заметен при вейвлет-преобразовании.
Фотошоп с Клинтон с одного из контестов по монтажу, который не палится большинством методов. Приненив 5% вейвлет-преобразование можно заметить небольшую разницу в резкости: торс становится резким, а лицо всё еще размытым. Объектив камеры не мог дать такого сильного смещения плоскости фокуса, так что скорее всего лицо не отсюда.

Как обмануть

Сделать фотографии с одной точки, одним объективом с фиксированным фокусом и сразу обработать в RAW. Редкие студийные условия, но всё может быть. Сколько вон лет разбирали всякие видео с Усамой Бен-Ладеном, целые книги писали.

Изображение очень маленькое. Чем меньше изображение — тем сложнее его анализировать вейвлетами. Картинки меньше 200х200 пикселей можно даже не пытаться прогонять через DWT.

Заключение

Погружаясь в тему Image Forensics начинаешь понимать, что любой из методов можно обмануть. Одни легко обходятся с помощью пережатых до 10 шакалов JPEG'ов, другие цветокоррекцией, блюром, ресайзом или поворотом изображения на произвольные углы. Оцифровка журнала или TV-сигнала тоже добавляет ошибок в исходник, усложняя анализ. И тут вы начинаете понимать:

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

Но это не значит, что занятие полностью бесполезно. Здесь как в криптографии: пока те, кто делает фейки не знают матчасти так же глубоко — сила на стороне знаний, математики и анализа.

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




Ну а чтобы стимулировать новые посты, подпишитесь на рассылку или пошарьте этот пост у себя. Специльно сделал удобные кнопочки чуть ниже. Так я буду видеть, что всё это хоть кому-то интересно.
Еще? Тогда вот
Комментарии
12
.,_ ⸬ 03 апреля 2017, 18:29 ⸬ RU ⸬ Apple лог
#
10 ебучих шакалов из 10! Великолепная статья!
1
vas3k ⸬ 03 апреля 2017, 18:33 ⸬ LT ⸬ Apple лог
#
.,_, спасибо! Ты редко меня хвалишь, значит точно неплохо вышло :)
7
Рома ⸬ 04 апреля 2017, 08:35 ⸬ Saint Petersburg, RU ⸬ Apple лог
#
Бля, Вастрик, ты такой умный оказывается. Как ты успеваешь и все это знать, и работать, и путешествовать(( тож так хочу
3
Сергей ⸬ 09 апреля 2017, 13:16 ⸬ Saint Petersburg, RU ⸬ Linux лог
#
Это. Было. Чертовски. Круто. Читал на одном дыхании. Спасибо.
1
Лида ⸬ 10 апреля 2017, 06:23 ⸬ Tomsk, RU ⸬ Windows лог
#
Сейчас модно писать в гоп-стоп манере? )))))))) За "поиграться" надо в тюрьму садить мне кажется )))
3
vas3k ⸬ 10 апреля 2017, 06:44 ⸬ Vilnius, LT ⸬ Apple лог
#
Лида, )))0)))0)) ))) ) ))

Челом бью, сударыня. Писание сие бесовское — «Толковый словарь современного русского языка. Т. Ф. Ефремова. – М.: Русский язык, 2000» разум совсем избыло мне божевольному. Внемлет оно, что:

Поигра́ться
сов. разг.-сниж.
Позабавиться, порезвиться.


И про заточение в темницу хладную утаило совсем оно. Вот и посоромился я. Бес попутал, не иначе. Негоже так.

1
Input! ⸬ 10 апреля 2017, 08:53 ⸬ Moscow, RU ⸬ Linux лог
#
Лида, не садить, а сажать, быдло
0
Димуля Гесс ⸬ 24 мая 2017, 10:24 ⸬ Yekaterinburg, RU ⸬ Windows лог
#
Хорошо, что не стал тратить время на чтение статьи, а сразу промотал и наткнулся на цель её написания: вбросить ссылочку на англоязычную статью, что расследования Беллингкат не расследования, не стоит им доверять. Браво. Кремлёвский хлебушек отработан.
3
vas3k ⸬ 24 мая 2017, 10:31 ⸬ Moscow, RU ⸬ Apple лог
#
Димуля Гесс, боже, какой ты больной. Когда ты пришел сюда, средний уровень IQ аудитории упал в два раза
0
леша ⸬ 04 августа 2017, 20:19 ⸬ Rostov-on-Don, RU ⸬ Windows лог
#
(не заполняйте это поле)

me@vas3k.ru :: telegram :: twitter :: instagram :: facebook :: github