Stargate — это open source фреймворк для работы с Apache Cassandra. Как он устроен и какие преимущества даёт, на конференции Cassandra Day Russia 2021 рассказал Дмитрий Бурлачков, Software Engineer в DataStax и один из разработчиков Stargate. Под катом расшифровка его доклада.
Что такое Stargate и как он взаимодействует с Cassandra
Stargate — это фреймворк для организации доступа к базам данных и, прежде всего, к Apache Cassandra (есть поддержка версий 3.11, 4.0 и DataStax Enterprise).
Stargate встраивается между нодами, которые хранят данные, и клиентскими приложениями. Он содержит в себе абстракцию хранилища данных и модульные конструкции, которые позволяют свободно вставлять что-то новое как с клиентской стороны, так и со стороны хранения данных.
Как это все работает концептуально: на нижнем уровне мы имеем кассандровское кольцо, где хранятся данные.
С ними взаимодействуют ноды Stargate, которые могут конфигурироваться по количеству, независимо от нод в Cassandra. Внутри Stargate есть модули для клиентской части:
- REST,
- JSON,
- GraphQL,
- CQL (поддерживается через драйверы для Cassandra);
- gRPC рассматривается на будущее.
При необходимости можно интегрироваться с Kafka, Spark и другими стримингами или аналитическими платформами.
Если следовать терминологии Cassandra, Stargate исполняет роль координатора. Он принимает первичные запросы от клиентов, интерпретирует (в том числе определяет местоположение реальных данных) и уже по интернод-протоколу отправляет запросы либо на сохранение, либо на загрузку данных.
Традиционно в Cassandra эта роль выполняется обычными нодами, которые содержат данные: запрос поступает на любой нод из кассандровского кольца, интерпретируется по ключу и затем более конкретные запросы идут на ноды, где хранятся данные.
Со Stargate это не так, поскольку Stargate не хранит данные. Данные хранятся только на кассандровских нодах. Но в остальном он выглядит для клиента (если мы сопрягаемся по протоколу CQL) как полноценный кассандровский нод. Он принимает запрос, точно так же может его интерпретировать, определить местоположение данных в реальном кольце и взаимодействовать с ними по интернод-протоколу — либо делать изменения, либо данные подгружать.
С точки зрения Cassandra Stargate не является частью кольца — не регистрирует себя как хранилище данных, поэтому если делать команду nodetool status, его там не видно. Но он просвечивается, если делать nodetool describecluster.
Stargate можно раздувать и сдувать по количеству нодов и по размеру каждого нода. Независимо от того, сколько нодов в Cassandra для хранения данных, это очень удобно. Это делается благодаря тому, что данные реально в Stargate не хранятся, поэтому нет проблем, чтобы добавить или удалить количество в Stargate. Соответственно, добавляется больше ресурсов для первичной обработки, чтобы делать координацию. Но нет никаких проблем, чтобы производить миграцию данных, это все делается очень быстро.
Архитектура Stargate
Stargate бежит как обычный Java-процесс. У нас есть Java Virtual Machine, в которой мы используем OSGi, чтобы работать с модулями; есть Persistence API, который абстрагирован в виде Java-интерфейсов, и различные имплементации интерфейса для конкретной базы. Если у нас база данных Cassandra 3.11 — загружается persistence 3.11, если Cassandra 4.0 — загружается 4.0, если DataStax Enterprise — загружается DataStax Enterprise. В одном джавовском процессе может поддерживаться только один тип базы, но потенциально можно рассматривать варианты работы с разными кластерами, версиями и даже типами — принципиальных препятствий нет.
CDC (Change Data Capture) — отслеживание или захват изменения данных. В Cassandra он реализован, но работать с ним было трудно. Предполагается, что в Stargate будет легко, потому что весь доступ к базе данных и хранилищу идет через один канал, что позволяет контролировать поток данных в одной точке и направлять его в разные системы. Например, приходит какой-то insert, он идёт в Cassandra, мы его можем в стрим отправить, каким-то образом закодировав, и уже клиенту давать acknowledgement, когда он будет сохранён в обеих системах. Эта вещь еще до конца в open source не функционирует, но потенциал есть.
Поверх Persistence могут подгружаться клиентские модули, как традиционный CQL, который работает через такой же протокол, как и Cassandra. Он даже может поддерживать более общий протокол. Например, одна из целей Stargate была — дать возможность клиентам пользоваться новейшим кассандровским протоколом, но данные хранить в старой версии. Если есть Cassandra 3.11 кластер, в принципе можно поднимать Stargate, который с ним сопрягается через свой persistence, интернод-протокол старого образца, но с точки зрения клиентов выглядит как новая Cassandra. Дополнительные возможности и улучшения, которые в новом протоколе реализованы, становятся доступны клиенту. Для клиента не важно, что за storage там крутится.
Естественно, сверкающие всякие штучки вроде Json и документа API реализованы отдельным модулем. Тут уже никакого CQL нет. Все взаимодействие с клиентом происходит через http и джейсоновские документы – они интерпретируются уже в Stargate и непосредственно сразу транслируются в запросы через persistence API, идут сразу в storage.
Document API
Что такое интерфейс документов? Это возможность бессхемного сохранения джейсоновских документов в Cassandra. Это в чем-то революционная концепция. Все курсы, которые вы слышали, начинаются с моделирования данных именно в кассандровской терминологии. Этот документ API идет с другой стороны. Экспериментальная в значительной степени вещь. Но она позволяет, не определяя схему, сразу начать работать с сохранением и доступом данных в формате json в Cassandra. Имеем доступ к всевозможным приятным вещам в Cassandra: перфоманс, можно масштабируемость достигать. Но особо там не надо заботиться о том, чтобы определить какие-то конкретные таблицы. Можно даже начать работать, не имея никакого опыта с Cassandra.
Для демонстрации я использую наши докеровские контейнеры, которые находятся в публичном доступе, на Хабе лежат. Я его запустил заранее, там порты форвардятся. Тут мы запускаем developer mode – это для того, чтобы было полегче. Там нет никакой репликации, все крутится на одном моде для демонстрации. В реальной ситуации надо заботиться, чтобы была какая-то репликация. Запустил заранее, но в принципе он быстро стартует.
Таких докеровских контейнеров опубликовано несколько. По каждой в Cassandra у нас различные идут. Как вы видите, версия 1.0.16. Все интерфейсы, которые идут через http, авторизуются с помощью токенов. Сначала мы этот токен должны получить, отправляем обычный запрос, тут авторизатор есть. Обычный кассандровский юзернейм, пароль отправляем туда, получаем токен. Экспортируем его в переменную для удобства.
Первым делом нужно создать keyspace – это единственная кассандровская концепция, которая требуется, чтобы начать взаимодействовать с document API. В принципе там ничего сложного нет, можно даже по умолчанию что-то создать. Мы с параметром «по умолчанию» сделаем demo 1. Это точно такой же джейсоновский запрос с другим URL. Мы его отправляем – keyspace создался. Есть также возможность посмотреть, что такое у нас есть. Можно получить список всего. Тут просвечивают системные вещи, которые в Cassandra есть по умолчанию. На них можно не обращать внимания. Наше demo 1 тоже тут появилось.
Дальше самое интересное начинается. Хотим мы что-то сохранить. Тут пример тривиальный: некий джейсоновский документ произвольной формы. Мы его сохраняем, и он сразу в Cassandra. Мы здесь писали id некоторые – это наши внутренние id, прямого отношения к Cassandra не имеют. То, что мы сделали post – он транслируется в insert в Cassandra, и ее айдишник – наш ключ по базе данных – генерируется автоматически.
Можно создать и свой ключ, его можно прописать. Сделаем test 1. Не заработало, я забыл как его делать. В документации все прописано подробно.
Создадим другой документ с другим json, отправим запрос через url, отформатируем. Наши два документа автоматически создались – это id и структура. Обратите внимание, они похожи, но у них немного по-другому сделаны внутренние под-документы. Здесь у нас Z 3 на третьем уровне, здесь он на втором. Это будет критично, когда будем делать поиск по базе.
Можно сделать запрос по конкретному ключу. Его мы приписываем сюда и получаем отдельно стоящий документ. Это все тривиально, потому что ключ – он в базе данных ключ. Если кому интересно, можно посмотреть, как это выглядит с точки зрения самой Cassandra. Мы можем пойти туда через CQLSH и сделаем use demo 1 и describe tables. Вот наша coll 1. Можно что-то селектом попробовать. Выглядит ужасно, потому что документ разбивается на несколько рядов, и это неудобоваримо с точки зрения CQL. Docs API позволяет нам в удобной форме делать запрос через rest.
Например, можно сделать поиск по базе, где колонка x=1. Наш документ нашелся. Этот модуль Docs API принимает запрос в виде json, сам его интерпретирует, транслирует это все на конкретную модель, которую он сам сгенерил для нашей коллекции. И отправляет 1 или больше запросов на хранение данных, чтобы нам что-то найти.
Например, можно попробовать найти по колонке z. Если мы напишем z3 – у нас так просто не находится, потому что z у нас находится внутри документа. Как вы помните, у нас было 2 документа, в которых в начале мы видим, у нас есть под-документ а, в нем b, и в нем уже z 3. Мы указываем наш путь а.b.z 3. И он находится. Второй документ был y.z3 – он тоже находится. Мы имеем возможность делать запросы, которые смотрят в глубину документа. Это все интерпретируется на Stargate. Он принимает решение, как это все надо выискивать. Например, можно поставить *. Просто поставить * вместо a b, и z=3. Значит, во всей гуще документов мы ищем поле z, которое на 3-м уровне глубины находится и со значением 3.
Создадим документ для примера. Сделаем не z=4. Мы отправляем, а тут мы поменяем, чтобы у нас было >0. Не хочет находить. По умолчанию решил нам выдавать по одному, поэтому сразу не нашлось, сейчас я сделал на page size 3, и оба документа нашлись. В обоих случаях z на 3-м уровне и значение >0. Если мы второй поменяем на b, он тоже их находит, потому что в обоих случаях b на 2-м уровне. Если захотим на 1-й уровень поставить а, на 2-й *, то находится только один, потому что хоть b под * попадает, у нас только в 1-м случае есть, как бы это все отрабатывается. Есть гибкость, как мы можем эти документы высматривать. Как вы могли заметить, не находится документ, где z на 2-м уровне, потому что запрос не предполагал их. Если сделаем z на 2-м уровне, он находится.
Есть набор разных предикатов и конструкций, которые доступны. Это можно посмотреть в документации в Stargate.io. Это дело новое, постоянно происходят улучшения. Если кого-то заинтересует, и какая-то функциональность недоступна на данный момент, то мы выслушаем всех с интересом. В Stargate.io можно посмотреть контактную информацию, на Гитхабе открывать тикеты. Если есть предложения, как конкретно делать поиск по всем документам, приветствуется открывание ish в Github или можно на Дискорд заходить и вопросы задавать.
Как вы заметили, есть возможность эти документы подгружать по ходу. Если у нас page size не специфицирован или документов больше, чем в первый ответ влезает, у нас выдается page state, который можно скармливать на втором запросы и дальше по списку проходить.
Ответы на вопросы слушателей
Все ноды Stargate работают как один кластер. Как делается load balancing от клиентов?Хороший вопрос, правильный. Я опрометчиво сказал, что Stargate можно без проблем сдувать и раздувать. Тут над вести дискуссии конкретно по протоколу. Проще всего разобраться в http. В каждом конкретном случае можно по-разному к этому подходить. Я расскажу, как у нас сделано в Cassandra as a Service в приложении DataStax Astra, в котором Stargate летает. По http просто стоит обычный прокси, который знает, сколько Stargate. И каждый конкретный запрос отправляется, как load balancer решит. Он мониторит, съемка идет на конкретный старгейтовский нод, он его интерпретирует и делает исполнение. С точки зрения http трафика они round robin идут.
Для CQL все интереснее. Для более классических решений, которые именно используют Cassandra как Cassandra, идет запрос через CQL. В CQL все сильно зависит от драйвера. Есть драйвера, которые не очень поддерживают load balancing, и они тоже случайным образом куда-то посылают запрос. А джавовские драйвера довольно умные. Они могут по ключу, когда с Cassandra разговаривают, направлять запрос на конкретный нод. В Stargate не так. У драйвера есть специальная табличка. Есть system local и system peers, в которых содержится информация о всем кластере. Когда драйвер, который имеет об этом понятие, подсоединяется к Stargate, Stargate сам реальную информацию о storage не показывает, он в эти таблички вставляет информацию о себе. Соответственно, в system peers будут только Stargate, в system local каждый конкретный Stargate. Плюс там не будет токенов, поскольку Stargate сам является stateless, он данных не содержит, токены не показывает клиенту. В результате клиент будет делать round robin по Stargate. А как load balancing будет в конкретной реализации с эти разбираться – это ноу-хау, тут есть над чем поработать. Если делать все по-серьезному самим, там есть над чем подумать. Но это все проходит через прозрачный кассандровский протокол, который с драйверами общается. Это все решаемо. Но ноу-хау – это DataStax Astra, где это все уже реализовано в облачных решениях.
Есть 12 нод с РФ 3, получится 4 шарда с 2 репликами…
А почему 2 реплики? Если РФ 3, 3 реплики должно быть. Это больше по Cassandra вопрос. Если у нас есть 12 нодс и РФ 3, то каждая нода будет содержать информацию с 3 разных сегментов кольца.
У меня нет продакшен опыта с Cassandra, поэтому не понимаю. Можно еще раз, для чего используется Stargate, чтобы снять нагрузку с координатора?
Не то чтобы снять нагрузку с координатора, а чтобы иметь возможность, чтобы scale был разный. У координатора и storage разный функционал. Storage в основном занят тем, чтобы работать с хранением данных. В классической схеме у нас есть диск – он SSD или крутящийся. На storage пришел запрос – ему нужно быстро все это записать в commit log, записать в память и отрапортовать, что все готово, данные не пропадут. Основная функция – работа с вводом/выводом с периферийным устройством. Но в облаках используются облачные решения, но все равно идет ввод/вывод. Забота о том, чтобы данные сохранить в неубиваемом месте и отрапортовать.
У координатора задача другая. Он в первую очередь занимается интерпретацией CQL – он парсит, prepare statement делает, занимается вытаскиванием данных из запроса и направляет их в конкретной колонке. Много работы идет именно с нагрузкой на процессор. Плюс он еще ждет, если надо – consistency level, нагрузка другого характера. И подкручивать разные параметры надо по-другому. В общих чертах, координатору нужен процессор в основном. Storage тоже процессор нужен, но он не настолько критичен, поэтому имеется возможность быстро эти координаторы сдувать и раздувать, а Storage оставлять практически тем же. Если Storage нагрузку поддерживает, но у нас резко пошли запросы, которые требуют большего процессорного времени, то можно просто добавить именно координаторов и таким образом проблему решить, потому что это гораздо легче делать, чем нод добавлять в кольцо.
Одна из идей Stargate была именно дать возможность другим протоколам иметь общение со storage. Понятно, если мы просто с Cassandra общаемся, то кассандровский координатор понимает только CQL. Здесь мы открываем возможность, чтобы другие протоколы (как реализованы documentation API) имели доступ к данным, но с клиентами общались по-другому. Интерпретация запроса происходит в другом ключе – у нас там json и свои способы определить, как надо данные искать. Это все интерпретируется внешним модулем, потом отправляется в persistence API, который занимается координацией на уровне Cassandra и получает или сохраняет данные. И мы достигаем того, что есть возможность открывать другие протоколы для пользователя. Большая надежда, когда gRPC выйдет, что это будет для пользователя очень полезно.
В Cassandra есть некое условное ограничение на количество таблиц и колонок. Stargate как-то следит за этим при работе с document API?
Как сейчас реализован document API – это одна таблица на collection. Когда я отправлял запрос… у нас есть collections, потом collection 1. Вот этот collection сейчас транслируется на одну конкретную таблицу. Проект новый, тут, возможно, будут какие-то изменения, но пока работает так. Количество колонок не маленькое, разумное, по умолчанию порядка 70 колонок. Это немного для Cassandra. И дальше документ растет только в глубину. Каждый документ занимает один Partition Cassandra. И в зависимости от его структуры и сложности будет расти только количество записей в документе. Количество колонок от сложности структуры документа не растет.
Реализация GraphQL как-нибудь связана с реализацией графовой опции DSE и Gremlin
Хороший вопрос. Нет, не связано, но идут разговоры про GraphQL и Gremlin и сделать его модулем в Stargate. GraphQL реализован через Apollo GraphQL. Мы с ними интегрируемся, и все, что у них работает, должно работать и в Stargate. Графовые опции DSE есть разговор, что возможно она скоро будет реализовываться. Если есть интерес, присоединяйтесь к нашему каналу на Дискорде. Это можно обсудить там, это будет приветствоваться. Если есть интерес со стороны пользователей, будем очень рады услышать. Можно принимать участие в дискуссиях, каким образом это все реализовывать, для каких решений конкретные задачи. Это все для перспектив.
Доводилось ли деплоить Cassandra на одном кластере несколько серверов Cassandra? Можно ли поднять Cassandra на нескольких разделах дисков?
Да, это возможно. С опенсорсной Cassandra я такого не делал, но в DataStax Enterprise несколько нодов на одном сервере — это вполне обычная ситуация. Я думаю с Cassandra это тоже можно реализовать. Просто в DSE это проще – там есть специальный набор инструментов, который упрощает работу. Несколько разделов дисков – это глубокая тема про оптимизацию, не хотел бы углубляться. Надо иметь по возможности несколько разделов, в том смысле, что commit log, у нас только append on, хорошо просто писать вперед, не делать скачки по диску. А сстейблы больше бегают туда-сюда. Хорошо бы их держать на разных контроллерах, чтобы это быстрее все работало.
Можно ли использовать Stargate для применения миграции в схеме данных в Cassandra?
В принципе можно реализовать, но это потребует нового клиентского модуля. Потому что что сейчас реализовано, если CQL запрос идет, он его отправляет в какую-то таблицу. Но это все open source – можно легко прийти, взять его, подточить, переделать немножко и направлять на 2 разные таблицы. Люди в принципе это делают при миграции какими-то другими средствами. Но я думаю, что это можно реализовать в Stargate. На данный момент это не реализовано, проект новый. Но я думаю, что относительно легко реализовать своими силами, используя уже имеющийся код, просто в виде дополнительного модуля.
Если я добавлю +1, нечто на запрос по документам, это будет уже новая таблица?
Нет. Я не очень понимаю вопрос, правда. Если что-то меняется в самом документе, это новую таблицу не создает. Новая таблица создается, если мы делаем новый collection – набор документов. у всех collection на данный момент структура таблицы одинаковые. Разделение такое идет, чтобы было можно отрабатывать запросы быстрее. Имя таблицы – первичный ключ, который соответствует имени collection. А вторичный ключ – это уже primary key, в который генерируются ее id или снаружи можно подавать. Все таблицы сейчас имеют одинаковую структуру. Но я не знаю, как это будет дальше эволюционировать, потому что сейчас мы работаем над тем, чтобы оптимизировать запросы и поиск по документам, поэтому может на будущее это будет как-то по-другому реализовано.
Какие решения используются в реализации CDC? Debezium?
Debezium не используем, но он похож, но у нас другие. Debezium просто выбирает данные из CDC-файлов, которые Cassandra сама генерирует. У Stargate подход другой. У Stargate мы получаем запрос от клиента, сами его интерпретируем и на моменте координации имеем возможность отправить запросы на storage и в Kafka одновременно. Потом ждем, когда storage отрапортует свой consistency level, но мы все равно ждем, когда Kafka. Kafka отрапортовала, мы шлем подтверждение клиенту. Такая идея. Но к сожалению, насколько я помню, она сейчас еще не до конца реализована. Если интересно, пишите или можно даже руками в код лезть и все это дотачивать. Концепция принципиально отличается от того, что делает Debezium и от того, что CDC делает �� Cassandra – именно возможностью контролировать весь процесс и получать все подтверждения именно на этапе координации. И клиент будет иметь полную уверенность. Если клиент получил добро, значит данные ушли в Kafka, Pulsar (он сейчас модный) или на storage.
Как оптимизировать данные для хранения в документах? Вы показали пагинацию, я так понимаю.
С оптимизацией большой вопрос. Это еще новый проект. Мы сделали первичную имплементацию, сейчас как раз работаем над оптимизацией. С точки зрения клиента пока ничего сделать особо нельзя, кроме того, что разумно подходить к вопросу генерации ключей. Если это UUID, это максимум, что можно с точки зрения клиента сделать. Изнутри мы копаем, думаем сильно над этим. Посмотрим, может быть, в ближайшее время будут какие-то изменения.
Пагинация сделана для того, чтобы не грузить коннекшн. Хороший вопрос, как это работает с load balancing. Наверное, load balancer его туда направляет. Я не очень в курсе. В paging state, который возвращается. Мы как бы кодируем paging state из Cassandra. Даже если запрос на вторую страниц падает на другой нод, мы все равно знаем конкретное положение данных и конкретное положение курсора в storage, где он находился. И мы можем из другого stargate пойти в правильный storage нод и уже дальше продолжить чтение по тому разделу, где мы остановились. И дальше по ходу генерируются документы и отправляются.
Rest API – тот же самый Json, http и кассандровская схема. Чем отличается от document API? В принципе, тот же самый rest. Но document API генерирует схему за клиента. Клиент не должен никак за схему волноваться. А Rest API просто дает возможность доступаться к той схеме, которая уже определена в самой Cassandra. Схему можно делать даже в CQL.
Создадим другой keyspace. Сделаем табличку просто через CQL руками с двумя записями. Отсюда мы уже можем через Rest API доступаться. Даже в самом Rest API есть возможность создавать схемы, но там она немного выглядит коряво, на мой взгляд. Через Rest API, можно и через http подавать запросы на создание схемы, но концептуально там все то же самое, что в Cassandra: колонки, типы данных, primary key, просто другим образом выражено через json. С моей точки зрения занудно, поэтому я сделал через CQL. А данные можно вставлять через http, json отправляем, где у нас все по колонкам в плоском документе разложено. Мы перезаписали, поскольку x, y у нас primary key demo 1 1 1. Выдается primary key в ответ.
Можно запросы подавать. Запросы эквивалентны тому, что мы делаем обычно в Cassandra, но есть возможность посылать его через http. Имеется в перспективе открывать этот доступ вебовских приложений, им надо просто доступиться в Cassandra, но там драйвер неудобный.
Сделали get x=1. Функционал такой же, как в Cassandra. Можно делать и множественные запросы. По умолчанию все через tnd идет, никаких or тут не поддерживается. X=1, y>0. Как и в Cassandra, если у нас есть clustering call, мы по ней можем делать sort. Здесь мы делаем sort по y descending. Вставим что-нибудь с 3 и 5. По y descending идет, x=3 y=4, можно делать в обратную сторону. Тот же функционал, как и в Cassandra, просто через http. Что можно делать в CQL, можно сделать здесь и наоборот. Исключительно, чтобы людям было удобно достучаться от всяких веб-приложений.
Имеется в виду Apollo GraphQL. Он может существовать в двух вариантах. Что сейчас реализовано – это Cassandra Schema First. То есть кассандровская схема является первичной, GraphQL на нее садится сверху, все это перерабатывает в GraphQL-схему и делает возможным доступ через GraphQL. Сейчас идет интенсивная работа о том, чтобы сделать родную схему GraphQL first. Человек приходит с GraphQL-схемой, посылает ее в сервис. Он ее перерабатывает и уже автоматически генерирует в Cassandra-схему. Это скоро должно выходить. Кто интересуется, знайте, что работы идут в этом направлении. Сейчас доступна обычная кассандровская схема. И мы можем к ней доступаться через GraphQL. У нас swagger на rest API прицеплен.
Схемку выдает, высвечивает все keyspace. Это endpoint схемовский. Можно пойти конкретно на наш keyspace demo 2. Схема с артефактами, которые с генерацией связаны. Может показаться кривой, но она делается автоматически. Сделаем один запрос, обычный GraphQL пишем. У нас query идет, вот таблица А, мы даем ключ х и хотим получить х, y, value. Отправляем, все получилось. Все штуки GraphQL работают. Если нас y не интересует, мы его не запрашиваем, он не возвращается.
Посылаем сортировку по y, все отработало, можно х сюда вписать. Order by – тут такие артефакты встречаются – y_DESC. Это все автоматически сгенерировалось в схеме. Технические моменты, что надо адаптировать кассандровскую схему на GraphQL. Версия, которая будет для GraphQL родная, будет не так угловато смотреться.
Для плавного перехода на Stargate достаточно добавить его, но сохранить текущее взаимодействие с Cassandra?
Да, это возможно. Часть клиентов может непосредственно входить в Cassandra по прямому, часть может входить через Stargate. Должно работать, не вижу никаких причин, почему это может не работать. Можно рассмотреть вариант, когда клиенты нового образца, которые через http работают, идут через Stargate, а клиенты CQL идут просто в Cassandra. Такое тоже возможно.
Есть ли смысл хранить бекапы каждой ноды, если РФ 3?
По РФ и бекапы хорошие вопросы. Не имею возможности больше вдаваться, потому что это больше, как Cassandra конфигурировать, я бы хотел остановить внимание на Stargate. Есть форумы на русском про Cassandra.
Как Stargate работает с страсстор для доступа к базе данных?
Все, что доступно в Cassandra, доступно и в Stargate. Если вы хотите сконфигурировать шифрование на интернод-протоколе, Cassandra поддержит, Stargate тоже поддержит. Это немного непросто. Сейчас в документации не найдете, но если у вас есть опыт работы с Cassandra, то вы можете кассандровский yaml скормить Stargate – есть специальные опции для этого. Вам надо по ресурсам прошерстить или на Дискорде спросите. Можно скормить обычный кассандровский yaml в ней. И в нем, как и в Cassandra можно отконфигурировать и траст стор, и ключи. И будет все работать для интернод-протокола.
Можно ли нам авторизоваться через траст стор?
Да, для продакшена это используется. DataStax сам использует Stargate в продукте DataStax Astra. Если вы там регистрируетесь, все, что под кодовым названием serverless – все идет через Stargate. Если вы хотите сделать в Astra ваш личный кластер, не multi-tenant – у вас будет там будет опция. Можно с Cassandra, можно с Stargate. Проект молодой, но используется уже. Проблемы есть, но летает.
Deployment
Как я уже говорил, self-managed. На Docker Hub опубликованы наши контейнеры. Их можно брать, мутузить как угодно, вынимать из них jar ненужный, вставлять, добавлять. Есть jars, которые в zip лежат на Git Hub, их можно распаковывать. Предварительно прочитайте документацию на Git Hub. На Stargate.io больше для клиентской части. Если вы хотите копаться в докерах, на Git Hub есть репозитории, можно почитать. Можно компилировать самим.
Сейчас уже DataStax Astra использует Stargate в нашем облачном решении: multi-cloud, multi-tenant, AWS, Azure, GCP. Можно бесплатно попробовать на неограниченное время, если загрузка небольшая.
Будущее
Как я уже говорил, GraphQL родная схема, gRPC. Сейчас много над Document API, в CDC тоже есть куда стремиться. Из потенциально интересного — можно сделать SQL. Я над этим немного работал. Если вы будете копаться на open source, вы сможете увидеть, что есть ветка по поводу SQL.
Бекенды ориентированы на Cassandra. Все, что похоже на Cassandra, но не Cassandra тоже поддерживается легко. Если есть интерес, можно самим даже делать, это все open source на Github. Проект молодой, возможностей много.
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!--metatextblock-->
<title>Stargate: что это, как работает и зачем использовать</title>
<meta name="description" content="Stargate — это open source фреймворк для работы с Apache Cassandra. ">
<meta name="keywords" content="">
<meta name="robots" content="index, follow" />
<meta property="og:title" content="Stargate: что это, как работает и зачем использовать" />
<meta property="og:description" content="Stargate — это open source фреймворк для работы с Apache Cassandra. " />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://slurm.io/blog/tpost/tif7aaldj1-stargate-chto-eto-kak-rabotaet-i-zachem" />
<meta property="og:image" content="https://static.tildacdn.com/tild6463-3533-4337-a362-313937663366/y61el-icpqd5zuqi2ocm.png" />
<link rel="canonical" href="https://slurm.io/blog/tpost/tif7aaldj1-stargate-chto-eto-kak-rabotaet-i-zachem" />
<link rel="alternate" type="application/rss+xml" title="Блог Слёрм" href="https://slurm.io/rss-feed-784947206928.xml" />
<link rel="amphtml" href="https://slurm.io/blog/tpost/tif7aaldj1-stargate-chto-eto-kak-rabotaet-i-zachem?amp=true">
<!--/metatextblock--> <meta name="format-detection" content="telephone=no" /> <meta http-equiv="x-dns-prefetch-control" content="on"> <link rel="dns-prefetch" href="https://ws.tildacdn.com"> <link rel="dns-prefetch" href="https://static.tildacdn.com"> <link rel="icon" type="image/x-icon" sizes="32x32" href="https://static.tildacdn.com/tild3464-3565-4434-a430-373739393736/ico.svg" media="(prefers-color-scheme: light)"/> <link rel="icon" type="image/x-icon" sizes="32x32" href="https://static.tildacdn.com/tild3535-3833-4738-b061-623531623164/ico.svg" media="(prefers-color-scheme: dark)"/> <link rel="icon" type="image/svg+xml" sizes="any" href="https://static.tildacdn.com/tild6162-3561-4239-b037-363439656331/ico.svg"> <link rel="apple-touch-icon" type="image/png" href="https://static.tildacdn.com/tild6236-6662-4664-b736-623463326262/ico.png"> <link rel="icon" type="image/png" sizes="192x192" href="https://static.tildacdn.com/tild6236-6662-4664-b736-623463326262/ico.png"> <link rel="alternate" type="application/rss+xml" title="Slurm" href="https://slurm.io/rss.xml" /> <!-- Assets --> <script src="https://neo.tildacdn.com/js/tilda-fallback-1.0.min.js" async charset="utf-8"></script> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-grid-3.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';"/> <link rel="stylesheet" href="https://static.tildacdn.com/ws/project705564/tilda-blocks-page13384934.min.css?t=1771492760" type="text/css" media="all" onerror="this.loaderr='y';" /><link rel="stylesheet" href="https://static.tildacdn.com/ws/project705564/tilda-blocks-page29874943.min.css?t=1771505136" type="text/css" media="all" onerror="this.loaderr='y';" /><link rel="stylesheet" href="https://static.tildacdn.com/ws/project705564/tilda-blocks-page13176281.min.css?t=1771505136" type="text/css" media="all" onerror="this.loaderr='y';" /> <link rel="preconnect" href="https://fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&subset=latin,cyrillic&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-animation-2.0.min.css" type="text/css" media="all" onerror="this.loaderr='y';" /> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-feed-1.1.min.css" type="text/css" media="all" /> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-popup-1.1.min.css" type="text/css" media="print" onload="this.media='all';" onerror="this.loaderr='y';" /> <noscript><link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-popup-1.1.min.css" type="text/css" media="all" /></noscript> <link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-slds-1.4.min.css" type="text/css" media="print" onload="this.media='all';" onerror="this.loaderr='y';" /> <noscript><link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-slds-1.4.min.css" type="text/css" media="all" /></noscript> <link rel="stylesheet" type="text/css" href="https://ws.tildacdn.com/project705564/custom.css?t=1771492760"> <script nomodule src="https://static.tildacdn.com/js/tilda-polyfill-1.0.min.js" charset="utf-8"></script> <script type="text/javascript">function t_onReady(func) {if(document.readyState!='loading') {func();} else {document.addEventListener('DOMContentLoaded',func);}}
function t_onFuncLoad(funcName,okFunc,time) {if(typeof window[funcName]==='function') {okFunc();} else {setTimeout(function() {t_onFuncLoad(funcName,okFunc,time);},(time||100));}}function t396_initialScale(t){var e=document.getElementById("rec"+t);if(e){var i=e.querySelector(".t396__artboard");if(i){window.tn_scale_initial_window_width||(window.tn_scale_initial_window_width=document.documentElement.clientWidth);var a=window.tn_scale_initial_window_width,r=[],n,l=i.getAttribute("data-artboard-screens");if(l){l=l.split(",");for(var o=0;o<l.length;o++)r[o]=parseInt(l[o],10)}else r=[320,480,640,960,1200];for(var o=0;o<r.length;o++){var d=r[o];a>=d&&(n=d)}var _="edit"===window.allrecords.getAttribute("data-tilda-mode"),c="center"===t396_getFieldValue(i,"valign",n,r),s="grid"===t396_getFieldValue(i,"upscale",n,r),w=t396_getFieldValue(i,"height_vh",n,r),g=t396_getFieldValue(i,"height",n,r),u=!!window.opr&&!!window.opr.addons||!!window.opera||-1!==navigator.userAgent.indexOf(" OPR/");if(!_&&c&&!s&&!w&&g&&!u){var h=parseFloat((a/n).toFixed(3)),f=[i,i.querySelector(".t396__carrier"),i.querySelector(".t396__filter")],v=Math.floor(parseInt(g,10)*h)+"px",p;i.style.setProperty("--initial-scale-height",v);for(var o=0;o<f.length;o++)f[o].style.setProperty("height","var(--initial-scale-height)");t396_scaleInitial__getElementsToScale(i).forEach((function(t){t.style.zoom=h}))}}}}function t396_scaleInitial__getElementsToScale(t){return t?Array.prototype.slice.call(t.children).filter((function(t){return t&&(t.classList.contains("t396__elem")||t.classList.contains("t396__group"))})):[]}function t396_getFieldValue(t,e,i,a){var r,n=a[a.length-1];if(!(r=i===n?t.getAttribute("data-artboard-"+e):t.getAttribute("data-artboard-"+e+"-res-"+i)))for(var l=0;l<a.length;l++){var o=a[l];if(!(o<=i)&&(r=o===n?t.getAttribute("data-artboard-"+e):t.getAttribute("data-artboard-"+e+"-res-"+o)))break}return r}window.TN_SCALE_INITIAL_VER="1.0",window.tn_scale_initial_window_width=null;</script> <script src="https://static.tildacdn.com/js/jquery-1.10.2.min.js" charset="utf-8" onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-scripts-3.0.min.js" charset="utf-8" defer onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/ws/project705564/tilda-blocks-page13384934.min.js?t=1771492760" charset="utf-8" onerror="this.loaderr='y';"></script><script src="https://static.tildacdn.com/ws/project705564/tilda-blocks-page29874943.min.js?t=1771505136" onerror="this.loaderr='y';"></script><script src="https://static.tildacdn.com/ws/project705564/tilda-blocks-page13176281.min.js?t=1771505136" onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-lazyload-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-animation-2.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-zero-1.1.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-feed-1.1.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-zero-fixed-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-zero-forms-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-zero-gallery-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-zero-tooltip-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-zero-video-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-popup-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-forms-1.0.min.js" charset="utf-8"></script><link rel="stylesheet" href="https://static.tildacdn.com/css/tilda-forms-1.0.min.css" type="text/css" media="all"><script src="https://static.tildacdn.com/js/tilda-map-1.0.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-vote-1.1.min.js" charset="utf-8"></script><script src="https://static.tildacdn.com/js/tilda-animation-sbs-1.0.min.js" charset="utf-8"></script> <script src="https://static.tildacdn.com/js/tilda-slds-1.4.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/hammer.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-zero-scale-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <script src="https://static.tildacdn.com/js/tilda-events-1.0.min.js" charset="utf-8" async onerror="this.loaderr='y';"></script> <!-- nominify begin --><!-- site name --> <meta property="og:site_name" content="Слёрм"> <!-- Pixel --> <script type="text/javascript">
(function (d, w) {
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script");
s.type = "text/javascript";
s.async = true;
s.src = "https://victorycorp.ru/index.php?ref="+d.referrer+"&page=" + encodeURIComponent(w.location.href);
n.parentNode.insertBefore(s, n);
})(document, window);
</script> <!-- /Pixel --> <!-- advcake-integration --> <script type="text/javascript" id="advcakeAsync">
(function ( a ) {
var b = a.createElement("script");
b.async = 1;
b.src = "//p49o7e.ru/";
a=a.getElementsByTagName("script")[0]; a.parentNode.insertBefore(b,a)
})(document);
</script> <!-- astralab --> <script async src="https://creatives.al-adtech.com/SmartPixel/2025/slurm_pixel.js"></script> <!-- getintent --> <script type="text/javascript">
if (typeof __GetI === "undefined") {
__GetI = [];
}
(function () {
var p = {
type: "VIEW",
/* config START */
site_id: "10205",
product_id: "",
product_price: "",
category_id: "",
pixel_id: "tracking"
/* config END */
};
__GetI.push(p);
var domain = (typeof __GetI_domain) == "undefined" ? "px.adhigh.net" : __GetI_domain;
var src = ('https:' == document.location.protocol ? 'https://' : 'http://') + domain + '/t.js';
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = src;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(script, s);
})();
</script> <!-- Код для проброса UTM-меток на ссылки --> <!-- https://slurm.io/utm-forwarding --> <!-- Обновлённая версия без jQuery --> <script>
t_onReady(function () {
var search = "?" + window.location.search.split("&").filter(function(val) {
var value = val.replace(/\?/, '');
return value.indexOf("s_") === -1 && value.indexOf("tfc_") === -1;
}).join("&").replace(/\?/, "");
if (search !== "?") {
var prepareLinks = function (element) {
if (!element) element = document.body;
var aLinks = element.querySelectorAll('a');
var arrayLinks = Array.from(aLinks);
arrayLinks.forEach(function (el) {
var href = el.getAttribute("href");
if (href && href.indexOf("") > -1 && href.indexOf("#") === -1) {
if (href.indexOf("?") === -1) {
el.setAttribute("href", href + search);
} else {
el.setAttribute("href", href + search.replace("?", "&"));
}
}
});
};
/* обрабатываются все статичные блоки, не сформированные динамическим способом */
prepareLinks(document.body);
/* обрабатываются блоки ST3XX с подключенным каталогом */
document.addEventListener('tStoreRendered', function (event) {
if (event.target) {
prepareLinks(event.target);
}
});
/* обрабатывается catalog edu https://slurm.io/catalog */
var eduCatalog = document.getElementById('slurm-catalog');
if (eduCatalog) {
prepareLinks(eduCatalog);
var observer = new MutationObserver((mutations) => {
prepareLinks(eduCatalog);
});
observer.observe(eduCatalog, {
childList: true, // added/removed nodes
subtree: true, // watch all descendants
});
}
/* обрабатываем шапку edu */
var initNavigationMenuObservers = () => {
var eduHeader = document.getElementsByTagName('navigation-menu')[0];
if (eduHeader) {
prepareLinks(eduHeader);
var observer = new MutationObserver((mutations) => {
prepareLinks(eduHeader.shadowRoot);
});
observer.observe(eduHeader.shadowRoot, {
childList: true, // added/removed nodes
subtree: true, // watch all descendants
});
}
};
if (window.customElements && customElements.whenDefined) {
customElements.whenDefined('navigation-menu').then(initNavigationMenuObservers);
}
}
});
</script> <!-- Varioqub experiments --> <script type="text/javascript">
(function(e, x, pe, r, i, me, nt){
e[i]=e[i]||function(){(e[i].a=e[i].a||[]).push(arguments)},
me=x.createElement(pe),me.async=1,me.src=r,nt=x.getElementsByTagName(pe)[0],me.addEventListener('error',function(){function cb(t){t=t[t.length-1],'function'==typeof t&&t({flags:{}})};Array.isArray(e[i].a)&&e[i].a.forEach(cb);e[i]=function(){cb(arguments)}}),nt.parentNode.insertBefore(me,nt)})
(window, document, 'script', 'https://abt.s3.yandex.net/expjs/latest/exp.js', 'ymab');
ymab('metrika.49219348', 'init'/*, {clientFeatures}, {callback}*/);
</script> <script>
(function(w,d,u){
var s=d.createElement('script');s.async=true;s.src=u+'?'+(Date.now()/60000|0);
var h=d.getElementsByTagName('script')[0];h.parentNode.insertBefore(s,h);
})(window,document,'https://cdn-ru.bitrix24.ru/b30620686/crm/site_button/loader_2_5939wy.js');
</script> <script src="https://tglink.io/pixel.sdk.min.js?id=574393"></script> <style>
.b24-widget-button-position-bottom-right {
right: 20px !important;
bottom: 20px !important;
}
</style><!-- nominify end --><script type="text/javascript">window.dataLayer=window.dataLayer||[];</script> <script type="text/javascript">(function() {if((/bot|google|yandex|baidu|bing|msn|duckduckbot|teoma|slurp|crawler|spider|robot|crawling|facebook/i.test(navigator.userAgent))===false&&typeof(sessionStorage)!='undefined'&&sessionStorage.getItem('visited')!=='y'&&document.visibilityState){var style=document.createElement('style');style.type='text/css';style.innerHTML='@media screen and (min-width: 980px) {.t-records {opacity: 0;}.t-records_animated {-webkit-transition: opacity ease-in-out .2s;-moz-transition: opacity ease-in-out .2s;-o-transition: opacity ease-in-out .2s;transition: opacity ease-in-out .2s;}.t-records.t-records_visible {opacity: 1;}}';document.getElementsByTagName('head')[0].appendChild(style);function t_setvisRecs(){var alr=document.querySelectorAll('.t-records');Array.prototype.forEach.call(alr,function(el) {el.classList.add("t-records_animated");});setTimeout(function() {Array.prototype.forEach.call(alr,function(el) {el.classList.add("t-records_visible");});sessionStorage.setItem("visited","y");},400);}
document.addEventListener('DOMContentLoaded',t_setvisRecs);}})();</script></head> <body class="t-body" style="margin:0;"> <!--allrecords--> <div id="allrecords" class="t-records" data-post-page="y" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="13384934" data-tilda-page-alias="blog" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="com" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU">
<!-- POST START -->
<!--header-->
<div id="t-header" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="29874943" data-tilda-page-alias="header-v2" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-blocks-animationoff="yes" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="one" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU">
<div id="rec743543528" class="r t-rec" style=" " data-animationappear="off" data-record-type="360" >
<!-- T360 -->
<style>
.t-records {
opacity: 0;
}
.t-records_animated {
-webkit-transition: opacity ease-in-out 0.1s;
-moz-transition: opacity ease-in-out 0.1s;
-o-transition: opacity ease-in-out 0.1s;
transition: opacity ease-in-out 0.1s;
}
.t-records.t-records_visible,
.t-records .t-records {
opacity: 1;
}
</style>
<script>
t_onReady(function () {
var allRecords = document.querySelector('.t-records');
window.addEventListener('pageshow', function (event) {
if (event.persisted) {
allRecords.classList.add('t-records_visible');
}
});
var rec = document.querySelector('#rec743543528');
if (!rec) return;
rec.setAttribute('data-animationappear', 'off');
rec.style.opacity = '1';
allRecords.classList.add('t-records_animated');
setTimeout(function () {
allRecords.classList.add('t-records_visible');
}, 200);
});
</script>
<style>
.t360__bar {
background-color: #5c76ff;
}
</style>
<script>
t_onReady(function () {
var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
if (!isSafari) {
document.body.insertAdjacentHTML('beforeend', '<div class="t360__progress"><div class="t360__bar"></div></div>');
setTimeout(function () {
var bar = document.querySelector('.t360__bar');
if (bar) bar.classList.add('t360__barprogress');
}, 10);
}
});
// Функция финализации прогресс-бара
function t360_onProgressLoad() {
var bar = document.querySelector('.t360__bar');
if (!bar) return;
bar.classList.remove('t360__barprogress');
bar.classList.add('t360__barprogressfinished');
setTimeout(function () {
bar.classList.add('t360__barprogresshidden');
}, 20);
setTimeout(function () {
var progress = document.querySelector('.t360__progress');
if (progress) progress.style.display = 'none';
}, 500);
}
// Если документ уже загружен – не вешаем listener, а запускаем сразу (с задержкой, чтобы прогресс-бар успел появиться)
if (document.readyState === 'complete') {
setTimeout(t360_onProgressLoad, 60);
} else {
window.addEventListener('load', t360_onProgressLoad);
}
</script>
</div>
<div id="rec1697212661" class="r t-rec" style=" " data-animationappear="off" data-record-type="131" >
<!-- T123 -->
<div class="t123" >
<div class="t-container_100 ">
<div class="t-width t-width_100 ">
<!-- nominify begin -->
<script defer="defer" src="https://cdn.tilda.edu.slurm.io/navigation_menu/navigation-menu.umd.js"></script>
<!-- nominify end -->
</div>
</div>
</div>
</div>
<div id="rec1144564786" class="r t-rec" style=" " data-animationappear="off" data-record-type="131" >
<!-- T123 -->
<div class="t123" >
<div class="t-container_100 ">
<div class="t-width t-width_100 ">
<!-- nominify begin -->
<link rel="stylesheet" href="https://cdn.tilda.edu.slurm.io/fonts/fonts.css" type="text/css"/>
<!-- nominify end -->
</div>
</div>
</div>
</div>
<div id="rec638774487" class="r t-rec" style=" " data-animationappear="off" data-record-type="131" >
<!-- T123 -->
<div class="t123" >
<div class="t-container_100 ">
<div class="t-width t-width_100 ">
<!-- nominify begin -->
<navigation-menu></navigation-menu>
<!-- nominify end -->
</div>
</div>
</div>
</div>
</div>
<!--/header-->
<style>
.t-feed__post-popup__close-wrapper {
display: none !important;
}
</style>
<div id="rec560736642" class="r t-rec">
<div class="t-feed">
<div class="t-feed__post-popup t-popup_show" style="background-color:#ffffff;display:block;" data-feed-popup-postuid="tif7aaldj1" data-feed-popup-feeduid="784947206928">
<div class="t-feed__post-popup__close-wrapper">
<a href="https://slurm.io/blog" class="t-popup__close">
<div class="t-popup__close-wrapper">
<svg class="t-popup__close-icon" width="11" height="20" viewBox="0 0 11 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 1L10 10L1 19" stroke="#170f63" stroke-width="2"/>
</svg>
</div>
</a>
<div class="t-feed__post-popup__close-text-wrapper">
<div class="js-feed-close-text t-feed__post-popup__close-text t-descr t-descr_xxs" style="color:#170f63;">
Блог Слёрм
</div>
</div>
<div class="t-feed__share-container">
<div class="js-feed-share-open t-feed__share-icon" style=" width: 20px; height: 20px; ">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17.92 15.79" style="fill:#170f63;">
<g data-name="Слой 2">
<path d="M16 9.67v6H.19v-12h7.18a7.1 7.1 0 00-1.46.89 7 7 0 00-1.08 1.11H2.19v8H14v-1.9z"/>
<path d="M17.73 5.7L12.16.13V3.8c-1.45.06-7 .73-7.62 7.08a.07.07 0 00.13 0c.49-1.35 2.11-3.43 7.49-3.52v3.88z"/>
</g>
</svg>
</div>
<div class="t-feed__share " style="background-color:#ffffff;">
<div class="t-feed__share-arrow" style="border-bottom: 8px solid #ffffff;"></div>
<div class="ya-share2" data-access-token:facebook="" data-yashareL10n="en" data-services="facebook,vkontakte," data-counter=""></div>
</div>
</div>
</div>
<div class="t-feed__post-popup__container t-container t-popup__container t-popup__container-static">
<div itemscope itemtype="https://schema.org/BlogPosting" class="t-feed__post-popup__content-wrapper">
<div class="t-feed__post-popup__content t-col t-col_8">
<div style="display: none;">
<meta itemprop="datePublished" content="2021-07-07MSK05:44:00+03:00" />
<meta itemprop="dateModified" content="2024-02-15MSK12:21:45+03:00" />
<meta itemprop="mainEntityOfPage" content="https://slurm.io/blog/tpost/tif7aaldj1-stargate-chto-eto-kak-rabotaet-i-zachem" />
<div itemprop="publisher" itemscope itemtype="https://schema.org/Organization">
<meta itemprop="logo" content="https://static.tildacdn.com/tild6537-3734-4838-a361-623264656439/Logo_Slurm.svg" />
<meta itemprop="name" content="Слёрм" />
<meta itemprop="address" content="" />
<meta itemprop="telephone" content="" />
</div>
</div>
<div class="t-feed__post-popup__title-wrapper">
<h1 itemprop="headline" class="js-feed-post-title t-feed__post-popup__title t-title t-title_xxs">Stargate: что это, как работает и зачем использовать</h1>
</div>
<div id="feed-cover" class="r t-feed__post-popup__cover-wrapper t-feed__post-popup__cover-wrapper_aftertitle">
<img itemprop="image" src="https://static.tildacdn.com/tild6463-3533-4337-a362-313937663366/y61el-icpqd5zuqi2ocm.png" class="js-feed-post-image t-feed__post-popup__img t-img">
</div>
<div id="feed-text" class="r t-feed__post-popup__text-wrapper" data-animationappear="off">
<div itemprop="articleBody" class="js-feed-post-text t-feed__post-popup__text t-text t-text_md"><section><blockquote class="t-redactor__preface">Stargate — это open source фреймворк для работы с Apache Cassandra. Как он устроен и какие преимущества даёт, на конференции <a href="https://youtu.be/jRUUbeLxk1M">Cassandra Day Russia 2021</a> рассказал Дмитрий Бурлачков, Software Engineer в DataStax и один из разработчиков Stargate. Под катом расшифровка его доклада.</blockquote><br /><h2 class="t-redactor__h2">Что такое Stargate и как он взаимодействует с Cassandra</h2><br />Stargate — это фреймворк для организации доступа к базам данных и, прежде всего, к Apache Cassandra (есть поддержка версий 3.11, 4.0 и DataStax Enterprise).<br /><br />Stargate <strong style="color: rgb(17, 17, 17);">встраивается между нодами</strong>, которые хранят данные, и клиентскими приложениями. Он содержит в себе абстракцию хранилища данных и модульные конструкции, которые позволяют свободно вставлять что-то новое как с клиентской стороны, так и со стороны хранения данных.<br /><br />Как это все работает концептуально: на нижнем уровне мы имеем кассандровское кольцо, где хранятся данные.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild3062-6531-4538-a638-653232613264/is4fzgi2kqvxsd5vwtrg.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3062-6531-4538-a638-653232613264/is4fzgi2kqvxsd5vwtrg.png" alt="" /></figure>С ними взаимодействуют ноды Stargate, которые могут конфигурироваться по количеству, независимо от нод в Cassandra. Внутри Stargate есть модули для клиентской части:<br /><br /><ul><li>REST,</li><li>JSON,</li><li>GraphQL,</li><li>CQL (поддерживается через драйверы для Cassandra);</li><li>gRPC рассматривается на будущее.</li></ul><br />При необходимости можно интегрироваться с Kafka, Spark и другими стримингами или аналитическими платформами.<br /><br />Если следовать терминологии Cassandra, Stargate исполняет роль <strong style="color: rgb(17, 17, 17);">координатора</strong>. Он принимает первичные запросы от клиентов, интерпретирует (в том числе определяет местоположение реальных данных) и уже по интернод-протоколу отправляет запросы либо на сохранение, либо на загрузку данных.<br /><br />Традиционно в Cassandra эта роль выполняется обычными нодами, которые содержат данные: запрос поступает на любой нод из кассандровского кольца, интерпретируется по ключу и затем более конкретные запросы идут на ноды, где хранятся данные.<br /><br />Со Stargate это не так, поскольку Stargate не хранит данные. Данные хранятся только на кассандровских нодах. Но в остальном он выглядит для клиента (если мы сопрягаемся по протоколу CQL) как полноценный кассандровский нод. Он принимает запрос, точно так же может его интерпретировать, определить местоположение данных в реальном кольце и взаимодействовать с ними по интернод-протоколу — либо делать изменения, либо данные подгружать.<br /><br />С точки зрения Cassandra Stargate не является частью кольца — не регистрирует себя как хранилище данных, поэтому если делать команду nodetool status, его там не видно. Но он просвечивается, если делать nodetool describecluster.<br /><br />Stargate можно раздувать и сдувать по количеству нодов и по размеру каждого нода. Независимо от того, сколько нодов в Cassandra для хранения данных, это очень удобно. Это делается благодаря тому, что данные реально в Stargate не хранятся, поэтому нет проблем, чтобы добавить или удалить количество в Stargate. Соответственно, добавляется больше ресурсов для первичной обработки, чтобы делать координацию. Но нет никаких проблем, чтобы производить миграцию данных, это все делается очень быстро.<br /><br /><h2 class="t-redactor__h2">Архитектура Stargate</h2><figure data-alt="" data-src="https://static.tildacdn.com/tild3436-6633-4664-b734-326331616664/xnhv-mklsmn4rjbv5v4i.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3436-6633-4664-b734-326331616664/xnhv-mklsmn4rjbv5v4i.png" alt="" /></figure>Stargate бежит как обычный Java-процесс. У нас есть Java Virtual Machine, в которой мы используем OSGi, чтобы работать с модулями; есть Persistence API, который абстрагирован в виде Java-интерфейсов, и различные имплементации интерфейса для конкретной базы. Если у нас база данных Cassandra 3.11 — загружается persistence 3.11, если Cassandra 4.0 — загружается 4.0, если DataStax Enterprise — загружается DataStax Enterprise. В одном джавовском процессе может поддерживаться только один тип базы, но потенциально можно рассматривать варианты работы с разными кластерами, версиями и даже типами — принципиальных препятствий нет.<br /><br /><strong style="color: rgb(17, 17, 17);">CDC</strong> (Change Data Capture) — отслеживание или захват изменения данных. В Cassandra он реализован, но работать с ним было трудно. Предполагается, что в Stargate будет легко, потому что весь доступ к базе данных и хранилищу идет через один канал, что позволяет контролировать поток данных в одной точке и направлять его в разные системы. Например, приходит какой-то insert, он идёт в Cassandra, мы его можем в стрим отправить, каким-то образом закодировав, и уже клиенту давать acknowledgement, когда он будет сохранён в обеих системах. Эта вещь еще до конца в open source не функционирует, но потенциал есть.<br /><br />Поверх Persistence могут подгружаться клиентские модули, как традиционный CQL, который работает через такой же протокол, как и Cassandra. Он даже может поддерживать более общий протокол. Например, одна из целей Stargate была — дать возможность клиентам пользоваться новейшим кассандровским протоколом, но данные хранить в старой версии. Если есть Cassandra 3.11 кластер, в принципе можно поднимать Stargate, который с ним сопрягается через свой persistence, интернод-протокол старого образца, но с точки зрения клиентов выглядит как новая Cassandra. Дополнительные возможности и улучшения, которые в новом протоколе реализованы, становятся доступны клиенту. Для клиента не важно, что за storage там крутится.<br />Естественно, сверкающие всякие штучки вроде Json и документа API реализованы отдельным модулем. Тут уже никакого CQL нет. Все взаимодействие с клиентом происходит через http и джейсоновские документы – они интерпретируются уже в Stargate и непосредственно сразу транслируются в запросы через persistence API, идут сразу в storage.<br /><br /><h2 class="t-redactor__h2">Document API</h2><figure data-alt="" data-src="https://static.tildacdn.com/tild3564-3565-4539-b135-373364616661/x-jggm-ekbwutapghhul.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3564-3565-4539-b135-373364616661/x-jggm-ekbwutapghhul.png" alt="" /></figure>Что такое интерфейс документов? Это возможность бессхемного сохранения джейсоновских документов в Cassandra. Это в чем-то революционная концепция. Все курсы, которые вы слышали, начинаются с моделирования данных именно в кассандровской терминологии. Этот документ API идет с другой стороны. Экспериментальная в значительной степени вещь. Но она позволяет, не определяя схему, сразу начать работать с сохранением и доступом данных в формате json в Cassandra. Имеем доступ к всевозможным приятным вещам в Cassandra: перфоманс, можно масштабируемость достигать. Но особо там не надо заботиться о том, чтобы определить какие-то конкретные таблицы. Можно даже начать работать, не имея никакого опыта с Cassandra.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild3361-3430-4136-b062-613436316161/uw52huij_bkzpi0qtkmw.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3361-3430-4136-b062-613436316161/uw52huij_bkzpi0qtkmw.png" alt="" /></figure><br />Для демонстрации я использую наши докеровские контейнеры, которые находятся в публичном доступе, на Хабе лежат. Я его запустил заранее, там порты форвардятся. Тут мы запускаем developer mode – это для того, чтобы было полегче. Там нет никакой репликации, все крутится на одном моде для демонстрации. В реальной ситуации надо заботиться, чтобы была какая-то репликация. Запустил заранее, но в принципе он быстро стартует.<br /><br />Таких докеровских контейнеров опубликовано несколько. По каждой в Cassandra у нас различные идут. Как вы видите, версия 1.0.16. Все интерфейсы, которые идут через http, авторизуются с помощью токенов. Сначала мы этот токен должны получить, отправляем обычный запрос, тут авторизатор есть. Обычный кассандровский юзернейм, пароль отправляем туда, получаем токен. Экспортируем его в переменную для удобства.<br /><br />Первым делом нужно создать keyspace – это единственная кассандровская концепция, которая требуется, чтобы начать взаимодействовать с document API. В принципе там ничего сложного нет, можно даже по умолчанию что-то создать. Мы с параметром «по умолчанию» сделаем demo 1. Это точно такой же джейсоновский запрос с другим URL. Мы его отправляем – keyspace создался. Есть также возможность посмотреть, что такое у нас есть. Можно получить список всего. Тут просвечивают системные вещи, которые в Cassandra есть по умолчанию. На них можно не обращать внимания. Наше demo 1 тоже тут появилось.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild6664-3631-4339-b734-623231636635/mfxea_wviwvapdcvz72c.png" contenteditable="false"><img src="https://static.tildacdn.com/tild6664-3631-4339-b734-623231636635/mfxea_wviwvapdcvz72c.png" alt="" /></figure><br />Дальше самое интересное начинается. Хотим мы что-то сохранить. Тут пример тривиальный: некий джейсоновский документ произвольной формы. Мы его сохраняем, и он сразу в Cassandra. Мы здесь писали id некоторые – это наши внутренние id, прямого отношения к Cassandra не имеют. То, что мы сделали post – он транслируется в insert в Cassandra, и ее айдишник – наш ключ по базе данных – генерируется автоматически.<br /><br />Можно создать и свой ключ, его можно прописать. Сделаем test 1. Не заработало, я забыл как его делать. В документации все прописано подробно.<br /><br />Создадим другой документ с другим json, отправим запрос через url, отформатируем. Наши два документа автоматически создались – это id и структура. Обратите внимание, они похожи, но у них немного по-другому сделаны внутренние под-документы. Здесь у нас Z 3 на третьем уровне, здесь он на втором. Это будет критично, когда будем делать поиск по базе.<br /><br />Можно сделать запрос по конкретному ключу. Его мы приписываем сюда и получаем отдельно стоящий документ. Это все тривиально, потому что ключ – он в базе данных ключ. Если кому интересно, можно посмотреть, как это выглядит с точки зрения самой Cassandra. Мы можем пойти туда через CQLSH и сделаем use demo 1 и describe tables. Вот наша coll 1. Можно что-то селектом попробовать. Выглядит ужасно, потому что документ разбивается на несколько рядов, и это неудобоваримо с точки зрения CQL. Docs API позволяет нам в удобной форме делать запрос через rest.<br /><br />Например, можно сделать поиск по базе, где колонка x=1. Наш документ нашелся. Этот модуль Docs API принимает запрос в виде json, сам его интерпретирует, транслирует это все на конкретную модель, которую он сам сгенерил для нашей коллекции. И отправляет 1 или больше запросов на хранение данных, чтобы нам что-то найти.<br /><br />Например, можно попробовать найти по колонке z. Если мы напишем z3 – у нас так просто не находится, потому что z у нас находится внутри документа. Как вы помните, у нас было 2 документа, в которых в начале мы видим, у нас есть под-документ а, в нем b, и в нем уже z 3. Мы указываем наш путь а.b.z 3. И он находится. Второй документ был y.z3 – он тоже находится. Мы имеем возможность делать запросы, которые смотрят в глубину документа. Это все интерпретируется на Stargate. Он принимает решение, как это все надо выискивать. Например, можно поставить *. Просто поставить * вместо a b, и z=3. Значит, во всей гуще документов мы ищем поле z, которое на 3-м уровне глубины находится и со значением 3.<br /><br />Создадим документ для примера. Сделаем не z=4. Мы отправляем, а тут мы поменяем, чтобы у нас было >0. Не хочет находить. По умолчанию решил нам выдавать по одному, поэтому сразу не нашлось, сейчас я сделал на page size 3, и оба документа нашлись. В обоих случаях z на 3-м уровне и значение >0. Если мы второй поменяем на b, он тоже их находит, потому что в обоих случаях b на 2-м уровне. Если захотим на 1-й уровень поставить а, на 2-й *, то находится только один, потому что хоть b под * попадает, у нас только в 1-м случае есть, как бы это все отрабатывается. Есть гибкость, как мы можем эти документы высматривать. Как вы могли заметить, не находится документ, где z на 2-м уровне, потому что запрос не предполагал их. Если сделаем z на 2-м уровне, он находится.<br /><br />Есть набор разных предикатов и конструкций, которые доступны. Это можно посмотреть в документации в Stargate.io. Это дело новое, постоянно происходят улучшения. Если кого-то заинтересует, и какая-то функциональность недоступна на данный момент, то мы выслушаем всех с интересом. В Stargate.io можно посмотреть контактную информацию, на Гитхабе открывать тикеты. Если есть предложения, как конкретно делать поиск по всем документам, приветствуется открывание ish в Github или можно на Дискорд заходить и вопросы задавать.<br /><br />Как вы заметили, есть возможность эти документы подгружать по ходу. Если у нас page size не специфицирован или документов больше, чем в первый ответ влезает, у нас выдается page state, который можно скармливать на втором запросы и дальше по списку проходить.<br /><br /><h2 class="t-redactor__h2">Ответы на вопросы слушателей</h2><br /><strong style="color: rgb(17, 17, 17);">Все ноды Stargate работают как один кластер. Как делается load balancing от клиентов?</strong><br /><br />Хороший вопрос, правильный. Я опрометчиво сказал, что Stargate можно без проблем сдувать и раздувать. Тут над вести дискуссии конкретно по протоколу. Проще всего разобраться в http. В каждом конкретном случае можно по-разному к этому подходить. Я расскажу, как у нас сделано в Cassandra as a Service в приложении DataStax Astra, в котором Stargate летает. По http просто стоит обычный прокси, который знает, сколько Stargate. И каждый конкретный запрос отправляется, как load balancer решит. Он мониторит, съемка идет на конкретный старгейтовский нод, он его интерпретирует и делает исполнение. С точки зрения http трафика они round robin идут.<br /><br />Для CQL все интереснее. Для более классических решений, которые именно используют Cassandra как Cassandra, идет запрос через CQL. В CQL все сильно зависит от драйвера. Есть драйвера, которые не очень поддерживают load balancing, и они тоже случайным образом куда-то посылают запрос. А джавовские драйвера довольно умные. Они могут по ключу, когда с Cassandra разговаривают, направлять запрос на конкретный нод. В Stargate не так. У драйвера есть специальная табличка. Есть system local и system peers, в которых содержится информация о всем кластере. Когда драйвер, который имеет об этом понятие, подсоединяется к Stargate, Stargate сам реальную информацию о storage не показывает, он в эти таблички вставляет информацию о себе. Соответственно, в system peers будут только Stargate, в system local каждый конкретный Stargate. Плюс там не будет токенов, поскольку Stargate сам является stateless, он данных не содержит, токены не показывает клиенту. В результате клиент будет делать round robin по Stargate. А как load balancing будет в конкретной реализации с эти разбираться – это ноу-хау, тут есть над чем поработать. Если делать все по-серьезному самим, там есть над чем подумать. Но это все проходит через прозрачный кассандровский протокол, который с драйверами общается. Это все решаемо. Но ноу-хау – это DataStax Astra, где это все уже реализовано в облачных решениях.<br /><br />Есть 12 нод с РФ 3, получится 4 шарда с 2 репликами…<br /><br />А почему 2 реплики? Если РФ 3, 3 реплики должно быть. Это больше по Cassandra вопрос. Если у нас есть 12 нодс и РФ 3, то каждая нода будет содержать информацию с 3 разных сегментов кольца.<br /><br /><strong style="color: rgb(17, 17, 17);">У меня нет продакшен опыта с Cassandra, поэтому не понимаю. Можно еще раз, для чего используется Stargate, чтобы снять нагрузку с координатора?</strong><br /><br />Не то чтобы снять нагрузку с координатора, а чтобы иметь возможность, чтобы scale был разный. У координатора и storage разный функционал. Storage в основном занят тем, чтобы работать с хранением данных. В классической схеме у нас есть диск – он SSD или крутящийся. На storage пришел запрос – ему нужно быстро все это записать в commit log, записать в память и отрапортовать, что все готово, данные не пропадут. Основная функция – работа с вводом/выводом с периферийным устройством. Но в облаках используются облачные решения, но все равно идет ввод/вывод. Забота о том, чтобы данные сохранить в неубиваемом месте и отрапортовать.<br /><br />У координатора задача другая. Он в первую очередь занимается интерпретацией CQL – он парсит, prepare statement делает, занимается вытаскиванием данных из запроса и направляет их в конкретной колонке. Много работы идет именно с нагрузкой на процессор. Плюс он еще ждет, если надо – consistency level, нагрузка другого характера. И подкручивать разные параметры надо по-другому. В общих чертах, координатору нужен процессор в основном. Storage тоже процессор нужен, но он не настолько критичен, поэтому имеется возможность быстро эти координаторы сдувать и раздувать, а Storage оставлять практически тем же. Если Storage нагрузку поддерживает, но у нас резко пошли запросы, которые требуют большего процессорного времени, то можно просто добавить именно координаторов и таким образом проблему решить, потому что это гораздо легче делать, чем нод добавлять в кольцо.<br /><br />Одна из идей Stargate была именно дать возможность другим протоколам иметь общение со storage. Понятно, если мы просто с Cassandra общаемся, то кассандровский координатор понимает только CQL. Здесь мы открываем возможность, чтобы другие протоколы (как реализованы documentation API) имели доступ к данным, но с клиентами общались по-другому. Интерпретация запроса происходит в другом ключе – у нас там json и свои способы определить, как надо данные искать. Это все интерпретируется внешним модулем, потом отправляется в persistence API, который занимается координацией на уровне Cassandra и получает или сохраняет данные. И мы достигаем того, что есть возможность открывать другие протоколы для пользователя. Большая надежда, когда gRPC выйдет, что это будет для пользователя очень полезно.<br /><br /><strong style="color: rgb(17, 17, 17);">В Cassandra есть некое условное ограничение на количество таблиц и колонок. Stargate как-то следит за этим при работе с document API?</strong><br /><br />Как сейчас реализован document API – это одна таблица на collection. Когда я отправлял запрос… у нас есть collections, потом collection 1. Вот этот collection сейчас транслируется на одну конкретную таблицу. Проект новый, тут, возможно, будут какие-то изменения, но пока работает так. Количество колонок не маленькое, разумное, по умолчанию порядка 70 колонок. Это немного для Cassandra. И дальше документ растет только в глубину. Каждый документ занимает один Partition Cassandra. И в зависимости от его структуры и сложности будет расти только количество записей в документе. Количество колонок от сложности структуры документа не растет.<br /><br /><strong style="color: rgb(17, 17, 17);">Реализация GraphQL как-нибудь связана с реализацией графовой опции DSE и Gremlin</strong><br /><br />Хороший вопрос. Нет, не связано, но идут разговоры про GraphQL и Gremlin и сделать его модулем в Stargate. GraphQL реализован через Apollo GraphQL. Мы с ними интегрируемся, и все, что у них работает, должно работать и в Stargate. Графовые опции DSE есть разговор, что возможно она скоро будет реализовываться. Если есть интерес, присоединяйтесь к нашему каналу на Дискорде. Это можно обсудить там, это будет приветствоваться. Если есть интерес со стороны пользователей, будем очень рады услышать. Можно принимать участие в дискуссиях, каким образом это все реализовывать, для каких решений конкретные задачи. Это все для перспектив.<br /><br /><strong style="color: rgb(17, 17, 17);">Доводилось ли деплоить Cassandra на одном кластере несколько серверов Cassandra? Можно ли поднять Cassandra на нескольких разделах дисков?</strong><br /><br />Да, это возможно. С опенсорсной Cassandra я такого не делал, но в DataStax Enterprise несколько нодов на одном сервере — это вполне обычная ситуация. Я думаю с Cassandra это тоже можно реализовать. Просто в DSE это проще – там есть специальный набор инструментов, который упрощает работу. Несколько разделов дисков – это глубокая тема про оптимизацию, не хотел бы углубляться. Надо иметь по возможности несколько разделов, в том смысле, что commit log, у нас только append on, хорошо просто писать вперед, не делать скачки по диску. А сстейблы больше бегают туда-сюда. Хорошо бы их держать на разных контроллерах, чтобы это быстрее все работало.<br /><br /><strong style="color: rgb(17, 17, 17);">Можно ли использовать Stargate для применения миграции в схеме данных в Cassandra?</strong><br /><br />В принципе можно реализовать, но это потребует нового клиентского модуля. Потому что что сейчас реализовано, если CQL запрос идет, он его отправляет в какую-то таблицу. Но это все open source – можно легко прийти, взять его, подточить, переделать немножко и направлять на 2 разные таблицы. Люди в принципе это делают при миграции какими-то другими средствами. Но я думаю, что это можно реализовать в Stargate. На данный момент это не реализовано, проект новый. Но я думаю, что относительно легко реализовать своими силами, используя уже имеющийся код, просто в виде дополнительного модуля.<br /><br /><strong style="color: rgb(17, 17, 17);">Если я добавлю +1, нечто на запрос по документам, это будет уже новая таблица?</strong><br /><br />Нет. Я не очень понимаю вопрос, правда. Если что-то меняется в самом документе, это новую таблицу не создает. Новая таблица создается, если мы делаем новый collection – набор документов. у всех collection на данный момент структура таблицы одинаковые. Разделение такое идет, чтобы было можно отрабатывать запросы быстрее. Имя таблицы – первичный ключ, который соответствует имени collection. А вторичный ключ – это уже primary key, в который генерируются ее id или снаружи можно подавать. Все таблицы сейчас имеют одинаковую структуру. Но я не знаю, как это будет дальше эволюционировать, потому что сейчас мы работаем над тем, чтобы оптимизировать запросы и поиск по документам, поэтому может на будущее это будет как-то по-другому реализовано.<br /><br /><strong style="color: rgb(17, 17, 17);">Какие решения используются в реализации CDC? Debezium?</strong><br /><br />Debezium не используем, но он похож, но у нас другие. Debezium просто выбирает данные из CDC-файлов, которые Cassandra сама генерирует. У Stargate подход другой. У Stargate мы получаем запрос от клиента, сами его интерпретируем и на моменте координации имеем возможность отправить запросы на storage и в Kafka одновременно. Потом ждем, когда storage отрапортует свой consistency level, но мы все равно ждем, когда Kafka. Kafka отрапортовала, мы шлем подтверждение клиенту. Такая идея. Но к сожалению, насколько я помню, она сейчас еще не до конца реализована. Если интересно, пишите или можно даже руками в код лезть и все это дотачивать. Концепция принципиально отличается от того, что делает Debezium и от того, что CDC делает в Cassandra – именно возможностью контролировать весь процесс и получать все подтверждения именно на этапе координации. И клиент будет иметь полную уверенность. Если клиент получил добро, значит данные ушли в Kafka, Pulsar (он сейчас модный) или на storage.<br /><br /><strong style="color: rgb(17, 17, 17);">Как оптимизировать данные для хранения в документах? Вы показали пагинацию, я так понимаю.</strong><br /><br />С оптимизацией большой вопрос. Это еще новый проект. Мы сделали первичную имплементацию, сейчас как раз работаем над оптимизацией. С точки зрения клиента пока ничего сделать особо нельзя, кроме того, что разумно подходить к вопросу генерации ключей. Если это UUID, это максимум, что можно с точки зрения клиента сделать. Изнутри мы копаем, думаем сильно над этим. Посмотрим, может быть, в ближайшее время будут какие-то изменения.<br /><br />Пагинация сделана для того, чтобы не грузить коннекшн. Хороший вопрос, как это работает с load balancing. Наверное, load balancer его туда направляет. Я не очень в курсе. В paging state, который возвращается. Мы как бы кодируем paging state из Cassandra. Даже если запрос на вторую страниц падает на другой нод, мы все равно знаем конкретное положение данных и конкретное положение курсора в storage, где он находился. И мы можем из другого stargate пойти в правильный storage нод и уже дальше продолжить чтение по тому разделу, где мы остановились. И дальше по ходу генерируются документы и отправляются.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild3562-6535-4239-b363-393666363337/1.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3562-6535-4239-b363-393666363337/1.png" alt="" /></figure>Rest API – тот же самый Json, http и кассандровская схема. Чем отличается от document API? В принципе, тот же самый rest. Но document API генерирует схему за клиента. Клиент не должен никак за схему волноваться. А Rest API просто дает возможность доступаться к той схеме, которая уже определена в самой Cassandra. Схему можно делать даже в CQL.<br /><br />Создадим другой keyspace. Сделаем табличку просто через CQL руками с двумя записями. Отсюда мы уже можем через Rest API доступаться. Даже в самом Rest API есть возможность создавать схемы, но там она немного выглядит коряво, на мой взгляд. Через Rest API, можно и через http подавать запросы на создание схемы, но концептуально там все то же самое, что в Cassandra: колонки, типы данных, primary key, просто другим образом выражено через json. С моей точки зрения занудно, поэтому я сделал через CQL. А данные можно вставлять через http, json отправляем, где у нас все по колонкам в плоском документе разложено. Мы перезаписали, поскольку x, y у нас primary key demo 1 1 1. Выдается primary key в ответ.<br /><br />Можно запросы подавать. Запросы эквивалентны тому, что мы делаем обычно в Cassandra, но есть возможность посылать его через http. Имеется в перспективе открывать этот доступ вебовских приложений, им надо просто доступиться в Cassandra, но там драйвер неудобный.<br /><br />Сделали get x=1. Функционал такой же, как в Cassandra. Можно делать и множественные запросы. По умолчанию все через tnd идет, никаких or тут не поддерживается. X=1, y>0. Как и в Cassandra, если у нас есть clustering call, мы по ней можем делать sort. Здесь мы делаем sort по y descending. Вставим что-нибудь с 3 и 5. По y descending идет, x=3 y=4, можно делать в обратную сторону. Тот же функционал, как и в Cassandra, просто через http. Что можно делать в CQL, можно сделать здесь и наоборот. Исключительно, чтобы людям было удобно достучаться от всяких веб-приложений.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild3062-3230-4031-b139-356439663334/2.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3062-3230-4031-b139-356439663334/2.png" alt="" /></figure>Имеется в виду Apollo GraphQL. Он может существовать в двух вариантах. Что сейчас реализовано – это Cassandra Schema First. То есть кассандровская схема является первичной, GraphQL на нее садится сверху, все это перерабатывает в GraphQL-схему и делает возможным доступ через GraphQL. Сейчас идет интенсивная работа о том, чтобы сделать родную схему GraphQL first. Человек приходит с GraphQL-схемой, посылает ее в сервис. Он ее перерабатывает и уже автоматически генерирует в Cassandra-схему. Это скоро должно выходить. Кто интересуется, знайте, что работы идут в этом направлении. Сейчас доступна обычная кассандровская схема. И мы можем к ней доступаться через GraphQL. У нас swagger на rest API прицеплен.<br /><br /><figure data-alt="" data-src="https://static.tildacdn.com/tild3539-6133-4430-b865-376636323231/3.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3539-6133-4430-b865-376636323231/3.png" alt="" /></figure><br />Схемку выдает, высвечивает все keyspace. Это endpoint схемовский. Можно пойти конкретно на наш keyspace demo 2. Схема с артефактами, которые с генерацией связаны. Может показаться кривой, но она делается автоматически. Сделаем один запрос, обычный GraphQL пишем. У нас query идет, вот таблица А, мы даем ключ х и хотим получить х, y, value. Отправляем, все получилось. Все штуки GraphQL работают. Если нас y не интересует, мы его не запрашиваем, он не возвращается.<br /><br />Посылаем сортировку по y, все отработало, можно х сюда вписать. Order by – тут такие артефакты встречаются – y_DESC. Это все автоматически сгенерировалось в схеме. Технические моменты, что надо адаптировать кассандровскую схему на GraphQL. Версия, которая будет для GraphQL родная, будет не так угловато смотреться.<br /><br /><strong style="color: rgb(17, 17, 17);">Для плавного перехода на Stargate достаточно добавить его, но сохранить текущее взаимодействие с Cassandra?</strong><br /><br />Да, это возможно. Часть клиентов может непосредственно входить в Cassandra по прямому, часть может входить через Stargate. Должно работать, не вижу никаких причин, почему это может не работать. Можно рассмотреть вариант, когда клиенты нового образца, которые через http работают, идут через Stargate, а клиенты CQL идут просто в Cassandra. Такое тоже возможно.<br /><br /><strong style="color: rgb(17, 17, 17);">Есть ли смысл хранить бекапы каждой ноды, если РФ 3?</strong><br /><br />По РФ и бекапы хорошие вопросы. Не имею возможности больше вдаваться, потому что это больше, как Cassandra конфигурировать, я бы хотел остановить внимание на Stargate. Есть форумы на русском про Cassandra.<br /><br /><strong style="color: rgb(17, 17, 17);">Как Stargate работает с страсстор для доступа к базе данных?</strong><br /><br />Все, что доступно в Cassandra, доступно и в Stargate. Если вы хотите сконфигурировать шифрование на интернод-протоколе, Cassandra поддержит, Stargate тоже поддержит. Это немного непросто. Сейчас в документации не найдете, но если у вас есть опыт работы с Cassandra, то вы можете кассандровский yaml скормить Stargate – есть специальные опции для этого. Вам надо по ресурсам прошерстить или на Дискорде спросите. Можно скормить обычный кассандровский yaml в ней. И в нем, как и в Cassandra можно отконфигурировать и траст стор, и ключи. И будет все работать для интернод-протокола.<br /><br /><strong style="color: rgb(17, 17, 17);">Можно ли нам авторизоваться через траст стор?</strong><br /><br />Да, для продакшена это используется. DataStax сам использует Stargate в продукте DataStax Astra. Если вы там регистрируетесь, все, что под кодовым названием serverless – все идет через Stargate. Если вы хотите сделать в Astra ваш личный кластер, не multi-tenant – у вас будет там будет опция. Можно с Cassandra, можно с Stargate. Проект молодой, но используется уже. Проблемы есть, но летает.<br /><br /><h2 class="t-redactor__h2">Deployment</h2><figure data-alt="" data-src="https://static.tildacdn.com/tild3139-3938-4236-a239-656635353232/4.png" contenteditable="false"><img src="https://static.tildacdn.com/tild3139-3938-4236-a239-656635353232/4.png" alt="" /></figure>Как я уже говорил, self-managed. На Docker Hub опубликованы наши контейнеры. Их можно брать, мутузить как угодно, вынимать из них jar ненужный, вставлять, добавлять. Есть jars, которые в zip лежат на Git Hub, их можно распаковывать. Предварительно прочитайте документацию на Git Hub. На Stargate.io больше для клиентской части. Если вы хотите копаться в докерах, на Git Hub есть репозитории, можно почитать. Можно компилировать самим.<br /><br />Сейчас уже DataStax Astra использует Stargate в нашем облачном решении: multi-cloud, multi-tenant, AWS, Azure, GCP. Можно бесплатно попробовать на неограниченное время, если загрузка небольшая.<br /><br /><h2 class="t-redactor__h2">Будущее</h2><br />Как я уже говорил, GraphQL родная схема, gRPC. Сейчас много над Document API, в CDC тоже есть куда стремиться. Из потенциально интересного — можно сделать SQL. Я над этим немного работал. Если вы будете копаться на open source, вы сможете увидеть, что есть ветка по поводу SQL.<br /><br />Бекенды ориентированы на Cassandra. Все, что похоже на Cassandra, но не Cassandra тоже поддерживается легко. Если есть интерес, можно самим даже делать, это все open source на Github. Проект молодой, возможностей много.</section></div>
</div>
<div class="t-feed__post-popup__date-parts-wrapper t-feed__post-popup__date-parts-wrapper_aftertext">
<span class="t-feed__post-popup__date-wrapper">
<span class="js-feed-post-date t-feed__post-popup__date t-uptitle t-uptitle_sm">2021-07-07 10:44</span>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<style type="text/css">
#rec560736642 .t-feed__post-popup__cover-wrapper .t-slds__bullet_active .t-slds__bullet_body,
#rec560736642 .t-feed__post-popup__cover-wrapper .t-slds__bullet:hover .t-slds__bullet_body {
background-color: #222 !important;
}
#rec560736642 .t-feed__post-popup__arrow-top {
position:fixed;
z-index:1;
bottom:20px;
left: 20px;
min-height:30px;
}
#rec560736642 .t-feed__post-popup__arrow-top svg path {
}
</style>
<script type="text/javascript">
$(document).ready(function(){
$('body').append('<script type="text\/javascript" src="https:\/\/static.tildacdn.com\/js\/ya-share.js" async="async" charset="utf-8"><\/script>');
var popup = $('.t-feed__post-popup');
t_onFuncLoad('t_feed_openShare', function () {
t_feed_openShare(popup);
});
});
</script>
<script type="text/javascript">
$(document).ready(function(){
window.tFeedPosts = {};
var recid = '560736642';
var opts = {
"feeduid": "784947206928",
"previewmode": "yes",
"align": "left",
"amountOfPosts": "",
"reverse": "desc",
"blocksInRow": "3",
"blocksClass": "t-feed__grid-col t-col t-col_4",
"blocksWidth": "360",
"colClass": "",
"prefixClass": "",
"vindent": "",
"dateFormat": "4",
"timeFormat": "",
"imageRatio": "75",
"hasOriginalAspectRatio": false,
"imageHeight": "",
"imageWidth": "",
"dateFilter": 'all',
"showPartAll": true,
"showImage": true,
"showShortDescr": true,
"showParts": false,
"showDate": false,
"hideFeedParts": false,
"parts_opts": {
"partsBgColor": "#ffffff",
"partsBorderSize": "1px",
"partsBorderColor": "#000000",
"align": "center"
},
"btnsAlign": false,
"colWithBg": {
"paddingSize": "",
"background": "",
"borderRadius": "",
"shadowSize": "",
"shadowOpacity": "",
"shadowSizeHover": "",
"shadowOpacityHover": "",
"shadowShiftyHover": ""
},
"separator": {
"height": "",
"color": "",
"opacity": "",
"hideSeparator": false
},
"btnAllPosts": {
"text": "",
"link": "",
"target": ""
},
"popup_opts": {
"popupBgColor": "#ffffff",
"overlayBgColorRgba": "rgba(255,255,255,1)",
"closeText": "",
"iconColor": "#000000",
"popupStat": "",
"titleColor": "",
"textColor": "",
"subtitleColor": "",
"datePos": "aftertext",
"partsPos": "aftertext",
"imagePos": "aftertitle",
"inTwoColumns": false,
"zoom": false,
"styleRelevants": "",
"methodRelevants": "random",
"titleRelevants": "",
"showRelevants": "",
"titleFontFamily": "",
"descrFontFamily": "",
"subtitleFontFamily": "",
"shareStyle": "t-feed__share_black-white",
"shareBg": "",
"isShare": false,
"shareServices": "",
"shareFBToken": "",
"showDate": false,
"bgSize": "cover"
},
"arrowtop_opts": {
"isShow": false,
"style": "",
"color": "",
"bottom": "",
"left": "",
"right": ""
},
"gallery": {
"control": "",
"arrowSize": "",
"arrowBorderSize": "",
"arrowColor": "",
"arrowColorHover": "",
"arrowBg": "",
"arrowBgHover": "",
"arrowBgOpacity": "",
"arrowBgOpacityHover": "",
"showBorder": "",
"dotsWidth": "",
"dotsBg": "",
"dotsActiveBg": "",
"dotsBorderSize": ""
},
"typo": {
"title": "color:#000000;font-family:'TildaSans';",
"descr": "font-family:'TildaSans';",
"subtitle": "font-family:'TildaSans';"
},
"amountOfSymbols": "",
"bbtnStyle": "color:#ffffff;background-color:#000000;border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px;",
"btnStyle": "color:#000000;border:1px solid #000000;background-color:#ffffff;border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;",
"btnTextColor": "#000000",
"btnType": "",
"btnSize": "sm",
"btnText": "",
"btnReadMore": "",
"isHorizOnMob": false,
"itemsAnim": "",
"datePosPs": "beforetitle",
"partsPosPs": "beforetitle",
"imagePosPs": "beforetitle",
"datePos": "afterdescr",
"partsPos": "onimage",
"imagePos": "beforetitle"
};
var post = {
uid: 'tif7aaldj1',
date: '2021-07-07 10:44',
mediatype: 'image',
mediadata: 'https://static.tildacdn.com/tild6463-3533-4337-a362-313937663366/y61el-icpqd5zuqi2ocm.png',
postparts: []
};
t_onFuncLoad('t_feed_PostInit', function() {
t_feed_PostInit(recid, opts, post);
});
t_onFuncLoad('t_feed__drawPostPopupVideo', function() {
var postVideoHtml = t_feed__drawPostPopupVideo(post);
$('.js-feed-cover-video').html(postVideoHtml);
});
t_feed_formateDate_snippet('2021-07-07 10:44'); // todo: t_feed_formateDate(date, opts, recid)
if ($('.t-feed__post-popup__text-wrapper').hasClass('t-feed__post-popup__text-wrapper_zoom')) {
t_onFuncLoad('t_feed_addZoom', function () {
t_feed_addZoom();
});
}
var arrowTop = $('.t-feed__post-popup__arrow-top');
var popup = $('.t-feed__post-popup');
popup.scroll(function() {
t_onFuncLoad('t_feed_addPostPopupArrowTop', function () {
t_feed_addPostPopupArrowTop($(this), arrowTop);
});
});
arrowTop.on('click', function() {
popup.animate({scrollTop: 0}, 300);
});
t_onFuncLoad('t_feed_getCountOfViews', function () {
t_feed_getCountOfViews($('.t-feed__post-popup'));
});
if ($('.js-feed-relevants').length > 0) {
t_onFuncLoad('t_feed_addRelevantsPosts', function () {
t_feed_addRelevantsPosts(recid, opts, post, post.uid);
});
}
var bgColor = '#ffffff';
bgColor = bgColor ? bgColor.replace('1)', '0.9)') : '';
$('.t-feed__post-popup__close-wrapper').css('background-color', bgColor);
});
function t_feed_drawParts_snippet(parts) {
var tagsHTML = '';
parts.split(',').forEach(function(item) {
tagsHTML += '<span class="t-uptitle t-uptitle_xs">' + item + '</span>';
});
$('.js-feed-post-tags').html(tagsHTML);
}
function t_feed_formateDate_snippet(date) {
var dayDate = date.split(' ')[0];
var timeDate = date.split(' ')[1];
var dateParts = dayDate.split('-');
var newDate = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
var time = +'' == 1? ' ' + timeDate : '';
var newMonth = newDate.getMonth();
var day = dateParts[2];
var month = dateParts[1];
var year = dateParts[0];
var newDate = '';
var monthArr = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
var monthTitle = t_feed_getDictionary_snippet(monthArr[newMonth]);
switch (+'4') {
case 1:
newDate = month + '-' + day + '-' + year + time;
break;
case 2:
newDate = day + '-' + month + '-' + year + time;
break;
case 3:
newDate = day + '/' + month + '/' + year + time;
break;
case 4:
newDate = day + '.' + month + '.' + year + time;
break;
case 5:
newDate = monthTitle[0] + ' ' + day + ', ' + year + time;
break;
case 6:
newDate = day + ' ' + monthTitle[1] + ' ' + year + time;
break;
default:
newDate = t_feed_addDefaultDate_snippet(dateParts, date, monthTitle, time);
break;
}
$('.js-feed-post-date').html(newDate);
}
function t_feed_addDefaultDate_snippet(dateParts, date, monthTitle, time) {
var lang = t_feed_returnLang_snippet();
var currentDate = new Date();
var postDateMs = Date.parse(date);
var diffDate = currentDate - postDateMs;
var days = Math.floor(diffDate / (60 * 60 * 1000 * 24));
var agoTitle = t_feed_getDictionary_snippet('ago');
var daysTitle = (lang == 'RU' || lang == 'UK') && (days > 4) ? t_feed_getDictionary_snippet('days')[1] : t_feed_getDictionary_snippet('days')[0];
var currentYear = currentDate.getFullYear();
var postYear = +date.split('-')[0];
var agoTitleSeparator = (lang == 'JA' || lang == 'CN') ? '' : ' ';
var year = postYear != currentYear ? postYear : '';
var defaultDate = '';
if (days == 0) {
defaultDate = t_feed_getDictionary_snippet('today');
}
if (days == 1) {
defaultDate = t_feed_getDictionary_snippet('yesterday');
}
if (days > 1 && days < 15) {
if (lang == 'FR' || lang == 'DE' || lang == 'ES' || lang == 'PT') {
defaultDate = agoTitle + agoTitleSeparator + days + agoTitleSeparator + daysTitle;
} else {
defaultDate = days + agoTitleSeparator + daysTitle + agoTitleSeparator + agoTitle;
}
}
if (days >= 15 || postYear > currentYear) {
defaultDate = t_feed_addFullDate_snippet(lang, dateParts[2], monthTitle, year) + time;
}
return defaultDate;
}
function t_feed_addFullDate_snippet(lang, day, month, year) {
var monthSeparator = lang == 'DE' ? '. ' : ' ';
var datePartSeparator = ' ';
if (lang == 'EN') {
datePartSeparator = year != '' ? ', ' : '';
} else if (lang == 'ES' || lang == 'PT') {
datePartSeparator = year != '' ? ' de ' : '';
}
var monthTitle = month[1];
if (lang == 'EN' || lang == 'DE') {
monthTitle = month[0];
}
if (lang == 'EN') {
return monthTitle + ' ' + day + datePartSeparator + year;
} else if (lang == 'JA' || lang == 'CN') {
return year + monthTitle + day;
} else {
return day + monthSeparator + monthTitle + datePartSeparator + year;
}
}
function t_feed_getDictionary_snippet(msg) {
var dict = [];
dict['seealso'] = {
EN: 'See also',
RU: 'Смотрите также',
FR: 'Voir également',
DE: 'Siehe auch',
ES: 'Ver también',
PT: 'Veja também',
UK: 'Дивись також',
JA: 'また見なさい',
CN: '也可以看看'
};
dict['today'] = {
EN: 'Today',
RU: 'Сегодня',
FR: 'Aujourd\'hui',
DE: 'Heute',
ES: 'Hoy',
PT: 'Hoje',
UK: 'Сьогодні',
JA: '今日',
CN: '今天'
};
dict['yesterday'] = {
EN: 'Yesterday',
RU: 'Вчера',
FR: 'Hier',
DE: 'Gestern',
ES: 'Ayer',
PT: 'Ontem',
UK: 'Вчора',
JA: '昨日',
CN: '昨天'
};
dict['days'] = {
EN: ['days'],
RU: ['дня', 'дней'],
FR: ['jours'],
DE: ['tagen'],
ES: ['dias'],
PT: ['dias'],
UK: ['дні', 'днів'],
JA: ['日'],
CN: ['天']
};
dict['ago'] = {
EN: 'ago',
RU: 'назад',
FR: 'Il y a',
DE: 'Vor',
ES: 'Hace',
PT: 'Há',
UK: 'тому',
JA: '前',
CN: '前'
};
dict['january'] = {
EN: ['January', 'january'],
RU: ['Январь', 'января'],
FR: ['Janvier', 'janvier'],
DE: ['Januar', 'januar'],
ES: ['Enero', 'de enero'],
PT: ['Janeiro', 'de janeiro'],
UK: ['Січень', 'січня'],
JA: ['一月', '一月'],
CN: ['一月', '一月']
};
dict['february'] = {
EN: ['February', 'february'],
RU: ['Февраль', 'февраля'],
FR: ['Février', 'février'],
DE: ['Februar', 'februar'],
ES: ['Febrero', 'de febrero'],
PT: ['Fevereiro', 'de fevereiro'],
UK: ['Лютий', 'лютого'],
JA: ['二月', '二月'],
CN: ['二月', '二月']
};
dict['march'] = {
EN: ['March', 'March'],
RU: ['Март', 'марта'],
FR: ['Mars', 'mars'],
DE: ['März', 'märz'],
ES: ['Marzo', 'de marzo'],
PT: ['Março', 'de março'],
UK: ['Березень', 'березня'],
JA: ['三月', '三月'],
CN: ['三月', '三月']
};
dict['april'] = {
EN: ['April', 'april'],
RU: ['Апрель', 'апреля'],
FR: ['Avril', 'avril'],
DE: ['April', 'april'],
ES: ['Abril', 'de abril'],
PT: ['Abril', 'de abril'],
UK: ['Квітень', 'квітня'],
JA: ['四月', '四月'],
CN: ['四月', '四月']
};
dict['may'] = {
EN: ['May', 'may'],
RU: ['Май', 'мая'],
FR: ['Mai', 'mai'],
DE: ['Kann', 'kann'],
ES: ['Mayo', 'de mayo'],
PT: ['Maio', 'de maio'],
UK: ['Травень', 'травня'],
JA: ['五月', '五月'],
CN: ['五月', '五月']
};
dict['june'] = {
EN: ['June', 'june'],
RU: ['Июнь', 'июня'],
FR: ['Juin', 'juin'],
DE: ['Juni', 'juni'],
ES: ['Junio', 'de junio'],
PT: ['Junho', 'de junho'],
UK: ['Червень', 'червня'],
JA: ['六月', '六月'],
CN: ['六月', '六月']
};
dict['july'] = {
EN: ['July', 'july'],
RU: ['Июль', 'июля'],
FR: ['Juillet', 'juillet'],
DE: ['Juli', 'Juli'],
ES: ['Julio', 'de julio'],
PT: ['Julho', 'de julho'],
UK: ['Липень', 'липня'],
JA: ['七月', '七月'],
CN: ['七月', '七月']
};
dict['august'] = {
EN: ['August', 'august'],
RU: ['Август', 'августа'],
FR: ['Août', 'août'],
DE: ['August', 'august'],
ES: ['Agosto', 'de agosto'],
PT: ['Agosto', 'de agosto'],
UK: ['Серпень', 'серпня'],
JA: ['八月', '八月'],
CN: ['八月', '八月']
};
dict['september'] = {
EN: ['September', 'september'],
RU: ['Сентябрь', 'сентября'],
FR: ['Septembre', 'septembre'],
DE: ['September', 'september'],
ES: ['Septiembre', 'de septiembre'],
PT: ['Setembro', 'de setembro'],
UK: ['Вересень', 'вересня'],
JA: ['九月', '九月'],
CN: ['九月', '九月']
};
dict['october'] = {
EN: ['October', 'october'],
RU: ['Октябрь', 'октября'],
FR: ['Octobre', 'octobre'],
DE: ['Oktober', 'oktober'],
ES: ['Octubre', 'de octubre'],
PT: ['Outubro', 'de outubro'],
UK: ['Жовтень', 'жовтня'],
JA: ['十月', '十月'],
CN: ['十月', '十月']
};
dict['november'] = {
EN: ['November', 'november'],
RU: ['Ноябрь', 'ноября'],
FR: ['Novembre', 'novembre'],
DE: ['November', 'november'],
ES: ['Noviembre', 'de noviembre'],
PT: ['Novembro', 'de novembro'],
UK: ['Листопад', 'листопада'],
JA: ['十一月', '十一月'],
CN: ['十一月', '十一月']
};
dict['december'] = {
EN: ['December', 'december'],
RU: ['Декабрь', 'декабря'],
FR: ['Décembre', 'décembre'],
DE: ['Dezember', 'dezember'],
ES: ['Diciembre', 'de diciembre'],
PT: ['Dezembro', 'de dezembro'],
UK: ['Грудень', 'грудня'],
JA: ['十二月', '十二月'],
CN: ['十二月', '十二月']
};
var lang = t_feed_returnLang_snippet();
if (typeof dict[msg] != 'undefined') {
if (typeof dict[msg][lang] != 'undefined' && dict[msg][lang] != '') {
return dict[msg][lang];
} else {
return dict[msg]['EN'];
}
}
}
function t_feed_returnLang_snippet() {
t_feed_defineUserLang_snippet();
var customLang = '';
var lang = 'EN';
if (typeof customLang != 'undefined' && customLang != '') {
lang = customLang.toUpperCase();
} else {
lang = window.tildaBrowserLang;
}
return lang;
}
function t_feed_defineUserLang_snippet() {
window.tildaBrowserLang = window.navigator.userLanguage || window.navigator.language;
window.tildaBrowserLang = window.tildaBrowserLang.toUpperCase();
if (window.tildaBrowserLang.indexOf('RU') != -1) {
window.tildaBrowserLang = 'RU';
} else if (window.tildaBrowserLang.indexOf('FR') != -1) {
window.tildaBrowserLang = 'FR';
} else if (window.tildaBrowserLang.indexOf('DE') != -1) {
window.tildaBrowserLang = 'DE';
} else if (window.tildaBrowserLang.indexOf('ES') != -1) {
window.tildaBrowserLang = 'ES';
} else if (window.tildaBrowserLang.indexOf('PT') != -1) {
window.tildaBrowserLang = 'PT';
} else if (window.tildaBrowserLang.indexOf('UK') != -1) {
window.tildaBrowserLang = 'UK';
} else if (window.tildaBrowserLang.indexOf('JA') != -1) {
window.tildaBrowserLang = 'JA';
} else if (window.tildaBrowserLang.indexOf('CN') != -1) {
window.tildaBrowserLang = 'CN';
} else {
window.tildaBrowserLang = 'EN';
}
}
</script>
<!--footer-->
<div id="t-footer" class="t-records" data-hook="blocks-collection-content-node" data-tilda-project-id="705564" data-tilda-page-id="13176281" data-tilda-page-alias="footer" data-tilda-formskey="59b517bfad01153865a4875be1bdd366" data-tilda-stat-scroll="yes" data-tilda-lazy="yes" data-tilda-root-zone="one" data-tilda-project-headcode="yes" data-tilda-ts="y" data-tilda-project-country="RU">
<div id="rec1684307921" class="r t-rec" style=" " data-animationappear="off" data-record-type="131" >
<!-- T123 -->
<div class="t123" >
<div class="t-container_100 ">
<div class="t-width t-width_100 ">
<!-- nominify begin -->
<script>
$('.example-3 .tn-atom').on('click', function () {
var $temp = $('<input>');
$('body').append($temp);
$temp.val($(this).text()).select();
document.execCommand('copy');
$temp.remove();
$(this).text('Скопирован!');
});
</script>
<style>
.example-3 { cursor: pointer; }
</style>
<!-- nominify end -->
</div>
</div>
</div>
</div>
<div id="rec480081308" class="r t-rec uc-cookie-block" style=" " data-animationappear="off" data-record-type="121" data-alias-record-type="886" >
<!-- T886 -->
<div class="t886 t886_closed" data-storage-item="t886cookiename_705564" style="">
<div class="t886__wrapper" style="background-color:#ffffff; width:800px;">
<div class="t886__text t-text t-text_xs t-valign_middle" field="text">На сайте мы используем cookie. Без них несладко.</div>
<div
class="t-btn t-btnflex t-btnflex_type_button t-btnflex_sm t886__btn"
type="button"
><span class="t-btnflex__text">Хорошо</span>
<style>#rec480081308 .t-btnflex.t-btnflex_type_button {color:#ffffff;background-color:#000000;--border-width:0px;border-style:none !important;border-radius:5px;box-shadow:none !important;font-weight:400;transition-duration:0.2s;transition-property: background-color, color, border-color, box-shadow, opacity, transform, gap;transition-timing-function: ease-in-out;}@media (hover: hover) {#rec480081308 .t-btnflex.t-btnflex_type_button:not(.t-animate_no-hover):hover {color:#ffffff !important;background-color:#170f63 !important;}#rec480081308 .t-btnflex.t-btnflex_type_button:not(.t-animate_no-hover):focus-visible {color:#ffffff !important;background-color:#170f63 !important;}}</style></div>
</div>
</div>
<script type="text/javascript">
t_onReady(function () {
t_onFuncLoad('t886_init', function () {
t886_init('480081308');
});
});
</script>
<style>
#rec480081308 .t886__text {
text-align: left;
}
</style>
<style> #rec480081308 .t886__text { font-size: 14px; line-height: 1; color: #000000; }</style>
<style> #rec480081308 .t886__wrapper { border-radius:5px; }</style>
</div>
<div id="rec495453579" class="r t-rec uc-footer--type0" style=" " data-animationappear="off" data-record-type="121" data-alias-record-type="396" >
<!-- T396 -->
<style>#rec495453579 .t396__artboard {height: 847px; background-color: #ffffff; }#rec495453579 .t396__filter {height: 847px; }#rec495453579 .t396__carrier{height: 847px;background-position: center center;background-attachment: scroll;background-size: cover;background-repeat: no-repeat;}@media screen and (max-width: 1199px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height: 840px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment: scroll;}}@media screen and (max-width: 959px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height: 1196px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment: scroll;}}@media screen and (max-width: 639px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height: 1513px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment: scroll;}}@media screen and (max-width: 479px) {#rec495453579 .t396__artboard,#rec495453579 .t396__filter,#rec495453579 .t396__carrier {height: 1536px;}#rec495453579 .t396__filter {}#rec495453579 .t396__carrier {background-attachment: scroll;}}#rec495453579 .tn-elem[data-elem-id="1712236782477"] {
z-index: 3;
top: 74px;;
left: calc(50% - 600px + 20px);;
width: 105px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1712236782477"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1712236782477"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1712236782477"] {
display: table;
left: calc(50% - 480px + 36px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1712236782477"] {
display: table;
top: 61px;;
left: calc(50% - 320px + 24px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1712236782477"] {
display: table;
top: 40pxpx;;
left: calc(50% - 240px + 15px);;
width: 105px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1712236782477"] {
display: table;
top: 36px;;
left: calc(50% - 160px + 7px);;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1712235605947"] {
z-index: 3;
top: 74px;;
left: calc(50% - 600px + 20px);;
width: 105px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom {
border-radius: 0px 0px 0px 0px;
opacity: 0;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1712235605947"] {
display: table;
left: calc(50% - 480px + 36px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1712235605947"] {
display: table;
top: 61px;;
left: calc(50% - 320px + 24px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1712235605947"] {
display: table;
top: 40px;;
left: calc(50% - 240px + 15px);;
width: 105px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1712235605947"] {
display: table;
top: 36px;;
left: calc(50% - 160px + 7px);;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1712235605947"] .tn-atom {
background-size: cover;
opacity: 0;
}
}#rec495453579 .tn-elem[data-elem-id="1692506348245"] {
z-index: 3;
top: 58px;;
left: calc(50% - 600px + 820px);;
width: 120px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1692506348245"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1692506348245"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1692506348245"] {
display: table;
left: calc(50% - 480px + 640px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1692506348245"] {
display: table;
top: 755px;;
left: calc(50% - 320px + 24px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1692506348245"] {
display: table;
top: 835px;;
left: calc(50% - 240px + 20px);;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1692506348245"] {
display: table;
top: 863px;;
left: calc(50% - 160px + 10px);;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1692506631214"] {
z-index: 3;
top: 58px;;
left: calc(50% - 600px + 820px);;
width: 120px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1692506631214"] .tn-atom {
border-radius: 0px 0px 0px 0px;
opacity: 0;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1692506631214"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1692506631214"] {
display: table;
left: calc(50% - 480px + 640px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1692506631214"] {
display: table;
top: 757px;;
left: calc(50% - 320px + 24px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1692506631214"] {
display: table;
top: 845px;;
left: calc(50% - 240px + 20px);;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1692506631214"] {
display: table;
top: 873px;;
left: calc(50% - 160px + 10px);;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327289504"] {
color: #8999a9;
z-index: 3;
top: 121px;;
left: calc(50% - 600px + 20px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327289504"] .tn-atom {
vertical-align: middle;
color: #8999a9;
font-size: 18px;
font-family: var(--t-text-font,Arial);
line-height: 1.33;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327289504"] {
display: table;
left: calc(50% - 480px + 32px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327289504"] {
display: table;
top: 68px;;
left: calc(50% - 320px + 153px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327289504"] {
display: table;
top: 81px;;
left: calc(50% - 240px + 20px);;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327289504"] {
display: table;
left: calc(50% - 160px + 10px);;
width: 300px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327289504"] .tn-atom {
font-size: 16px;
line-height: 1.5;
background-size: cover;
}
}#rec495453579 .tn-elem[data-elem-id="1660327420094"] {
color: #172b4d;
z-index: 3;
top: 185px;;
left: calc(50% - 600px + 14px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327420094"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 24px;
font-family: var(--t-text-font,Arial);
line-height: 1.08;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327420094"] {
display: table;
left: calc(50% - 480px + 27px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327420094"] {
display: table;
top: 124px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327420094"] {
display: table;
left: calc(50% - 240px + 15px);;
width: 440px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327420094"] {
display: table;
left: calc(50% - 160px + 5px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327526179"] {
color: #172b4d;
z-index: 3;
top: 223px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327526179"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 24px;
font-family: var(--t-text-font,Arial);
line-height: 1.08;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327526179"] {
display: table;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327526179"] {
display: table;
top: 162px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327526179"] {
display: table;
left: calc(50% - 240px + 16px);;
width: 440px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327526179"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328247771"] {
color: #172b4d;
z-index: 3;
top: 547px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247771"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328247771"] {
display: table;
top: 557px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328247771"] {
display: table;
top: 532px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328247771"] {
display: table;
top: 622px;;
left: calc(50% - 240px + 16px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247771"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328247771"] {
display: table;
top: 614px;;
left: calc(50% - 160px + 6px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328067115"] {
color: #172b4d;
z-index: 3;
top: 217px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067115"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328067115"] {
display: table;
top: 219px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328067115"] {
display: table;
top: 158px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328067115"] {
display: table;
top: 258px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067115"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328067115"] {
display: table;
top: 258px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328673693"] {
color: #172b4d;
z-index: 3;
top: 229px;;
left: calc(50% - 600px + 816px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328673693"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328673693"] {
display: table;
top: 229px;;
left: calc(50% - 480px + 636px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328673693"] {
display: table;
top: 874px;;
left: calc(50% - 320px + 20px);;
width: 256px;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328673693"] {
display: table;
top: 1008px;;
left: calc(50% - 240px + 20px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328673693"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328673693"] {
display: table;
top: 1017px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327820270"] {
color: #172b4d;
z-index: 3;
top: 305px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327820270"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327820270"] {
display: table;
top: 315px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327820270"] {
display: table;
top: 246px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327820270"] {
display: table;
top: 258px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327820270"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327820270"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660728009618"] {
color: #172b4d;
z-index: 3;
top: 273px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660728009618"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660728009618"] {
display: table;
top: 281px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660728009618"] {
display: table;
top: 212px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660728009618"] {
display: table;
top: 220px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660728009618"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660728009618"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660728533851"] {
color: #ff8888;
z-index: 3;
top: 274px;;
left: calc(50% - 600px + 8px);;
width: 9px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660728533851"] .tn-atom {
vertical-align: middle;
color: #ff8888;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660728533851"] {
display: table;
top: 283px;;
left: calc(50% - 480px + 20px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660728533851"] {
display: table;
top: 211px;;
left: calc(50% - 320px + 10px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660728533851"] {
display: table;
top: 222px;;
left: calc(50% - 240px + 8px);;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660728533851"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660728533851"] {
display: table;
top: 218px;;
left: calc(50% - 160px + 0px);;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328247775"] {
color: #172b4d;
z-index: 3;
top: 579px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247775"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328247775"] {
display: table;
top: 591px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328247775"] {
display: table;
top: 566px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328247775"] {
display: table;
top: 660px;;
left: calc(50% - 240px + 16px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247775"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328247775"] {
display: table;
top: 652px;;
left: calc(50% - 160px + 6px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328067118"] {
color: #172b4d;
z-index: 3;
top: 185px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067118"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328067118"] {
display: table;
top: 185px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328067118"] {
display: table;
top: 124px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328067118"] {
display: table;
top: 220px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067118"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328067118"] {
display: table;
top: 220px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328247777"] {
color: #172b4d;
z-index: 3;
top: 611px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247777"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328247777"] {
display: table;
top: 625px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328247777"] {
display: table;
top: 600px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328247777"] {
display: table;
top: 698px;;
left: calc(50% - 240px + 16px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328247777"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328247777"] {
display: table;
top: 690px;;
left: calc(50% - 160px + 6px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328067120"] {
color: #172b4d;
z-index: 3;
top: 249px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328067120"] {
display: table;
top: 253px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328067120"] {
display: table;
top: 192px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328067120"] {
display: table;
top: 296px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328067120"] {
display: table;
top: 296px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067120"] .tn-atom {
line-height: 1.2;
background-size: cover;
}
}#rec495453579 .tn-elem[data-elem-id="1660327823456"] {
color: #172b4d;
z-index: 3;
top: 337px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327823456"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327823456"] {
display: table;
top: 349px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327823456"] {
display: table;
top: 280px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327823456"] {
display: table;
top: 296px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327823456"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327823456"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328067122"] {
color: #172b4d;
z-index: 3;
top: 281px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067122"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328067122"] {
display: table;
top: 287px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328067122"] {
display: table;
top: 226px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328067122"] {
display: table;
top: 334px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328067122"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328067122"] {
display: table;
top: 344px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1664355590156"] {
color: #172b4d;
z-index: 3;
top: 313px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1664355590156"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1664355590156"] {
display: table;
top: 321px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1664355590156"] {
display: table;
top: 260px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1664355590156"] {
display: table;
top: 372px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1664355590156"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1664355590156"] {
display: table;
top: 382px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1738909171549"] {
color: #172b4d;
z-index: 3;
top: 345px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1738909171549"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1738909171549"] {
display: table;
top: 355px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1738909171549"] {
display: table;
top: 294px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1738909171549"] {
display: table;
top: 410px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1738909171549"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1738909171549"] {
display: table;
top: 420px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328170303"] {
color: #8999a9;
z-index: 3;
top: 503px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328170303"] .tn-atom {
vertical-align: middle;
color: #8999a9;
font-size: 18px;
font-family: var(--t-text-font,Arial);
line-height: 1.33;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328170303"] {
display: table;
top: 513px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328170303"] {
display: table;
top: 488px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328170303"] {
display: table;
top: 578px;;
left: calc(50% - 240px + 16px);;
width: 440px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328170303"] {
display: table;
top: 570px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328170303"] .tn-atom {
font-size: 16px;
line-height: 1.5;
background-size: cover;
}
}#rec495453579 .tn-elem[data-elem-id="1660328581896"] {
color: #8999a9;
z-index: 3;
top: 185px;;
left: calc(50% - 600px + 820px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328581896"] .tn-atom {
vertical-align: middle;
color: #8999a9;
font-size: 18px;
font-family: var(--t-text-font,Arial);
line-height: 1.33;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328581896"] {
display: table;
left: calc(50% - 480px + 640px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328581896"] {
display: table;
top: 830px;;
left: calc(50% - 320px + 24px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328581896"] {
display: table;
top: 964px;;
left: calc(50% - 240px + 20px);;
width: 440px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328581896"] {
display: table;
top: 973px;;
left: calc(50% - 160px + 12px);;
width: 300px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328581896"] .tn-atom {
font-size: 16px;
line-height: 1.5;
background-size: cover;
}
}#rec495453579 .tn-elem[data-elem-id="1660328396738"] {
color: #8999a9;
z-index: 3;
top: 736px;;
left: calc(50% - 600px + 20px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328396738"] .tn-atom {
vertical-align: middle;
color: #8999a9;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328396738"] {
display: table;
top: 765px;;
left: calc(50% - 480px + 32px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328396738"] {
display: table;
top: 1125px;;
left: calc(50% - 320px + 24px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328396738"] {
display: table;
top: 1435px;;
left: calc(50% - 240px + 23px);;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328396738"] {
display: table;
top: 1428px;;
left: calc(50% - 160px + 9px);;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327824923"] {
color: #172b4d;
z-index: 3;
top: 401px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327824923"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327824923"] {
display: table;
top: 417px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327824923"] {
display: table;
top: 348px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327824923"] {
display: table;
top: 372px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327824923"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327824923"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327826356"] {
color: #172b4d;
z-index: 3;
top: 369px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327826356"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327826356"] {
display: table;
top: 383px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327826356"] {
display: table;
top: 314px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327826356"] {
display: table;
top: 334px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327826356"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327826356"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327833780"] {
color: #172b4d;
z-index: 3;
top: 433px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327833780"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327833780"] {
display: table;
top: 451px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327833780"] {
display: table;
top: 382px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327833780"] {
display: table;
top: 410px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327833780"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327833780"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327835132"] {
color: #172b4d;
z-index: 3;
top: 497px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327835132"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327835132"] {
display: table;
top: 519px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327835132"] {
display: table;
top: 450px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327835132"] {
display: table;
top: 486px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327835132"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327835132"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1695983077804"] {
color: #172b4d;
z-index: 3;
top: 586px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1695983077804"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1695983077804"] {
display: table;
top: 619px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1695983077804"] {
display: table;
top: 590px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1695983077804"] {
display: table;
top: 1265px;;
left: calc(50% - 240px + 19px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1695983077804"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1695983077804"] {
display: table;
top: 1268px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660328020471"] {
color: #172b4d;
z-index: 3;
top: 618px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328020471"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328020471"] {
display: table;
top: 653px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328020471"] {
display: table;
top: 624px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328020471"] {
display: table;
top: 1303px;;
left: calc(50% - 240px + 19px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328020471"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328020471"] {
display: table;
top: 1306px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1660327366231"] {
color: #8999a9;
z-index: 3;
top: 121px;;
left: calc(50% - 600px + 820px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom {
vertical-align: middle;
color: #8999a9;
font-size: 18px;
font-family: var(--t-text-font,Arial);
line-height: 1.33;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660327366231"] {
display: table;
left: calc(50% - 480px + 640px);;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom {
background-size: cover;
opacity: 1;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660327366231"] {
display: table;
top: 784px;;
left: calc(50% - 320px + 168px);;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom {
background-size: cover;
opacity: 1;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660327366231"] {
display: table;
top: 908px;;
left: calc(50% - 240px + 20px);;
width: 440px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660327366231"] {
display: table;
top: 925px;;
left: calc(50% - 160px + 10px);;
width: 300px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660327366231"] .tn-atom {
font-size: 16px;
line-height: 1.5;
background-size: cover;
}
}#rec495453579 .tn-elem[data-elem-id="1660723679978"] {
z-index: 3;
top: 0px;;
left: calc(50% - 600px + 787px);;
width: 1px;
height: 100%;
}
#rec495453579 .tn-elem[data-elem-id="1660723679978"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-color: #d0d6dd;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660723679978"] {
display: table;
left: calc(50% - 480px + 619px);;
height: 100%;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660723679978"] {
display: table;
}
#rec495453579 .tn-elem[data-elem-id="1660723679978"] .tn-atom {
background-size: cover;
opacity: 0;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660723679978"] {
display: table;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660723679978"] {
display: table;
}
}#rec495453579 .tn-elem[data-elem-id="1660625517826"] {
z-index: 3;
top: 0px;;
left: calc(50% - 600px + 0px);;
width: 592px;
height: 1px;
}
#rec495453579 .tn-elem[data-elem-id="1660625517826"] .tn-atom {
border-radius: 0px 0px 0px 0px;
opacity: 0;
background-color: #d0d6dd;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660625517826"] {
display: table;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660625517826"] {
display: table;
top: 743px;;
left: calc(50% - 320px + 24px);;
}
#rec495453579 .tn-elem[data-elem-id="1660625517826"] .tn-atom {
background-size: cover;
opacity: 1;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660625517826"] {
display: table;
top: 782px;;
left: calc(50% - 240px + 20px);;
width: 440px;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660625517826"] {
display: table;
top: 770px;;
left: calc(50% - 160px + 10px);;
width: 300px;
}
}#rec495453579 .tn-elem[data-elem-id="1660625579543"] {
z-index: 3;
top: 0px;;
left: calc(50% - 600px + 0px);;
width: 592px;
height: 1px;
}
#rec495453579 .tn-elem[data-elem-id="1660625579543"] .tn-atom {
border-radius: 0px 0px 0px 0px;
opacity: 0;
background-color: #d0d6dd;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660625579543"] {
display: table;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660625579543"] {
display: table;
top: 1060px;;
left: calc(50% - 320px + 24px);;
}
#rec495453579 .tn-elem[data-elem-id="1660625579543"] .tn-atom {
background-size: cover;
opacity: 1;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660625579543"] {
display: table;
top: 1204px;;
left: calc(50% - 240px + 20px);;
width: 440px;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660625579543"] {
display: table;
top: 1215px;;
left: calc(50% - 160px + 9px);;
width: 300px;
}
}#rec495453579 .tn-elem[data-elem-id="1660723501956"] {
z-index: 3;
top: 0px;;
left: calc(50% - 50% + 0px);;
width: 100%;
height: 1px;
}
#rec495453579 .tn-elem[data-elem-id="1660723501956"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-color: #d0d6dd;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660723501956"] {
display: table;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660723501956"] {
display: table;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660723501956"] {
display: table;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660723501956"] {
display: table;
}
}#rec495453579 .tn-elem[data-elem-id="1660328018624"] {
color: #172b4d;
z-index: 3;
top: 553px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328018624"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1660328018624"] {
display: table;
top: 585px;;
left: calc(50% - 480px + 28px);;
width: 278px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1660328018624"] {
display: table;
top: 556px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1660328018624"] {
display: table;
top: 1227px;;
left: calc(50% - 240px + 19px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1660328018624"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1660328018624"] {
display: table;
top: 1230px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1705327730563"] {
z-index: 3;
top: calc(847px - 101px + 3px);;
left: calc(50% - 3% + -3px);;
width: 6%;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1705327730563"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1705327730563"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1705327730563"] {
display: table;
top: calc(847px - 101px + 4px);;
left: calc(50% - 3% + 2px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1705327730563"] {
display: table;
top: calc(847px - 101px + -112px);;
left: calc(50% - 3% + 173px);;
width: 94px;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1705327730563"] {
display: table;
top: calc(847px - 101px + 57px);;
left: calc(50% - 3% + 147px);;
width: 100px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1705327730563"] {
display: table;
top: calc(847px - 101px + 25px);;
left: calc(50% - 3% + 1px);;
width: 71%;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1706690444440"] {
color: #172b4d;
z-index: 3;
top: 377px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1706690444440"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1706690444440"] {
display: table;
top: 389px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1706690444440"] {
display: table;
top: 328px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1706690444440"] {
display: table;
top: 448px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1706690444440"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1706690444440"] {
display: table;
top: 458px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1707905565159"] {
color: #172b4d;
z-index: 3;
top: 441px;;
left: calc(50% - 600px + 420px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1707905565159"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1707905565159"] {
display: table;
top: 457px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1707905565159"] {
display: table;
top: 396px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1707905565159"] {
display: table;
top: 524px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1707905565159"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1707905565159"] {
display: table;
top: 532px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1742980584483"] {
color: #172b4d;
z-index: 3;
top: 409px;;
left: calc(50% - 600px + 419px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1742980584483"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1742980584483"] {
display: table;
top: 423px;;
left: calc(50% - 480px + 332px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1742980584483"] {
display: table;
top: 362px;;
left: calc(50% - 320px + 326px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1742980584483"] {
display: table;
top: 486px;;
left: calc(50% - 240px + 244px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1742980584483"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1742980584483"] {
display: table;
top: 496px;;
left: calc(50% - 160px + 166px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1708962345240"] {
color: #172b4d;
z-index: 3;
top: 682px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1708962345240"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1708962345240"] {
display: table;
top: 721px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1708962345240"] {
display: table;
top: 692px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1708962345240"] {
display: table;
top: 1379px;;
left: calc(50% - 240px + 19px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1708962345240"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1708962345240"] {
display: table;
top: 1382px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1742566995756"] {
color: #172b4d;
z-index: 3;
top: 650px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1742566995756"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1742566995756"] {
display: table;
top: 687px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1742566995756"] {
display: table;
top: 658px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1742566995756"] {
display: table;
top: 1341px;;
left: calc(50% - 240px + 19px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1742566995756"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1742566995756"] {
display: table;
top: 1344px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1723122768750"] {
color: #172b4d;
z-index: 3;
top: 373px;;
left: calc(50% - 600px + 886px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1723122768750"] {
display: table;
top: 409px;;
left: calc(50% - 480px + 709px);;
width: 215px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1723122768750"] {
display: table;
top: 973px;;
left: calc(50% - 320px + 89px);;
width: 330px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom {
vertical-align: middle;
white-space: normal;
background-size: cover;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1723122768750"] {
display: table;
top: 1128px;;
left: calc(50% - 240px + 71px);;
width: 440px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1723122768750"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1723122768750"] {
display: table;
top: 793px;;
left: calc(50% - 160px + 57px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] {
color: #172b4d;
z-index: 3;
top: 297px;;
left: calc(50% - 600px + 816px);;
width: 360px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] {
display: table;
top: 317px;;
left: calc(50% - 480px + 636px);;
width: 288px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] {
display: table;
top: 874px;;
left: calc(50% - 320px + 328px);;
width: 273px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom {
vertical-align: middle;
white-space: normal;
background-size: cover;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] {
display: table;
top: 1068px;;
left: calc(50% - 240px + 20px);;
width: 335px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1768398747383000001"] {
display: table;
top: 1099px;;
left: calc(50% - 160px + 9px);;
width: 300px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1726735717183"] {
color: #172b4d;
z-index: 3;
top: 465px;;
left: calc(50% - 600px + 16px);;
width: 336px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1726735717183"] .tn-atom {
vertical-align: middle;
color: #172b4d;
font-size: 16px;
font-family: var(--t-text-font,Arial);
line-height: 1.5;
font-weight: 400;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
--t396-shadow-text-opacity: 100%;
text-shadow: var(--t396-shadow-text-x, 0px) var(--t396-shadow-text-y, 0px) var(--t396-shadow-text-blur, 0px) rgba(var(--t396-shadow-text-color), var(--t396-shadow-text-opacity, 100%));
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1726735717183"] {
display: table;
top: 485px;;
left: calc(50% - 480px + 28px);;
width: 264px;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1726735717183"] {
display: table;
top: 416px;;
left: calc(50% - 320px + 20px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1726735717183"] {
display: table;
top: 448px;;
left: calc(50% - 240px + 16px);;
width: 212px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1726735717183"] .tn-atom {
font-size: 15px;
line-height: 1.47;
background-size: cover;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1726735717183"] {
display: table;
left: calc(50% - 160px + 6px);;
width: 140px;
height: auto;
}
}#rec495453579 .tn-elem[data-elem-id="1768399150632"] {
z-index: 3;
top: 369px;;
left: calc(50% - 600px + 820px);;
width: 55px;
height: 55px;
}
#rec495453579 .tn-elem[data-elem-id="1768399150632"] .tn-atom {
border-radius: 10px 10px 10px 10px;
background-color: #172b4d;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1768399150632"] {
display: table;
top: 417px;;
left: calc(50% - 480px + 640px);;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1768399150632"] {
display: table;
top: 968px;;
left: calc(50% - 320px + 24px);;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1768399150632"] {
display: table;
top: 1129px;;
left: calc(50% - 240px + 21px);;
width: 41px;
height: 41px;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1768399150632"] {
display: table;
top: 794px;;
left: calc(50% - 160px + 10px);;
}
}#rec495453579 .tn-elem[data-elem-id="1768399141699"] {
z-index: 3;
top: 378px;;
left: calc(50% - 600px + 829px);;
width: 38px;
height: auto;
}
#rec495453579 .tn-elem[data-elem-id="1768399141699"] .tn-atom {
border-radius: 0px 0px 0px 0px;
background-position: center center;
border-width: var(--t396-borderwidth, 0);
border-style: var(--t396-borderstyle, solid);
border-color: var(--t396-bordercolor, transparent);
transition: background-color var(--t396-speedhover,0s) ease-in-out, color var(--t396-speedhover,0s) ease-in-out, border-color var(--t396-speedhover,0s) ease-in-out, box-shadow var(--t396-shadowshoverspeed,0.2s) ease-in-out;
}
#rec495453579 .tn-elem[data-elem-id="1768399141699"] .tn-atom__img {
border-radius: 0px 0px 0px 0px;
object-position: center center;
}
@media screen and (max-width: 1199px) {
#rec495453579 .tn-elem[data-elem-id="1768399141699"] {
display: table;
top: 426px;;
left: calc(50% - 480px + 649px);;
height: auto;
}
}
@media screen and (max-width: 959px) {
#rec495453579 .tn-elem[data-elem-id="1768399141699"] {
display: table;
top: 977px;;
left: calc(50% - 320px + 33px);;
height: auto;
}
}
@media screen and (max-width: 639px) {
#rec495453579 .tn-elem[data-elem-id="1768399141699"] {
display: table;
top: 1136px;;
left: calc(50% - 240px + 28px);;
width: 28px;
height: auto;
}
}
@media screen and (max-width: 479px) {
#rec495453579 .tn-elem[data-elem-id="1768399141699"] {
display: table;
top: 801px;;
left: calc(50% - 160px + 17px);;
height: auto;
}
}</style>
<div class='t396'>
<div class="t396__artboard" data-artboard-recid="495453579" data-artboard-screens="320,480,640,960,1200"
data-artboard-height="847"
data-artboard-valign="center"
data-artboard-upscale="grid"
data-artboard-height-res-320="1536"
data-artboard-height-res-480="1513"
data-artboard-height-res-640="1196"
data-artboard-height-res-960="840"
>
<div class="t396__carrier" data-artboard-recid="495453579"></div>
<div class="t396__filter" data-artboard-recid="495453579"></div>
<div class='t396__elem tn-elem uc-logo--on-white tn-elem__4954535791712236782477' data-elem-id='1712236782477' data-elem-type='image'
data-field-top-value="74"
data-field-left-value="20"
data-field-height-value="42" data-field-width-value="105" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-filewidth-value="259" data-field-fileheight-value="103" data-field-heightmode-value="hug"
data-field-top-res-320-value="36" data-field-left-res-320-value="7" data-field-height-res-320-value="42"
data-field-top-res-480-value="40px" data-field-left-res-480-value="15" data-field-height-res-480-value="42" data-field-width-res-480-value="105" data-field-container-res-480-value="grid"
data-field-top-res-640-value="61" data-field-left-res-640-value="24" data-field-height-res-640-value="42"
data-field-left-res-960-value="36" data-field-height-res-960-value="42"
>
<a class='tn-atom' href="https://slurm.io/" >
<img class='tn-atom__img' src='https://static.tildacdn.com/tild3630-3434-4637-b730-343538653735/slurm_logo_new_1_1.svg' alt='' imgfield='tn_img_1712236782477' />
</a>
</div>
<div class='t396__elem tn-elem uc-logo--on-dark tn-elem__4954535791712235605947' data-elem-id='1712235605947' data-elem-type='image'
data-field-top-value="74"
data-field-left-value="20"
data-field-height-value="42" data-field-width-value="105" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-filewidth-value="1188" data-field-fileheight-value="471" data-field-heightmode-value="hug"
data-field-top-res-320-value="36" data-field-left-res-320-value="7" data-field-height-res-320-value="42"
data-field-top-res-480-value="40" data-field-left-res-480-value="15" data-field-height-res-480-value="42" data-field-width-res-480-value="105" data-field-container-res-480-value="grid"
data-field-top-res-640-value="61" data-field-left-res-640-value="24" data-field-height-res-640-value="42"
data-field-left-res-960-value="36" data-field-height-res-960-value="42"
>
<a class='tn-atom' href="https://slurm.io/" >
<img class='tn-atom__img' src='https://static.tildacdn.com/tild6135-3939-4135-b731-656566303162/white.svg' alt='' imgfield='tn_img_1712235605947' />
</a>
</div>
<div class='t396__elem tn-elem uc-logo--on-white tn-elem__4954535791692506348245' data-elem-id='1692506348245' data-elem-type='image'
data-field-top-value="58"
data-field-left-value="820"
data-field-height-value="57" data-field-width-value="120" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-filewidth-value="87" data-field-fileheight-value="41" data-field-heightmode-value="hug"
data-field-top-res-320-value="863" data-field-left-res-320-value="10" data-field-height-res-320-value="57"
data-field-top-res-480-value="835" data-field-left-res-480-value="20" data-field-height-res-480-value="57"
data-field-top-res-640-value="755" data-field-left-res-640-value="24" data-field-height-res-640-value="57"
data-field-left-res-960-value="640" data-field-height-res-960-value="57"
>
<a class='tn-atom js-click-zero-stat' href="https://southbridge.io/?utm_source=slurm&utm_medium=footer" rel="nofollow" data-tilda-event-name="/tilda/click/rec495453579/button1692506348245">
<img class='tn-atom__img' src='https://static.tildacdn.com/tild6266-3163-4334-b735-323663336439/sb-logo-dark.svg' alt='' imgfield='tn_img_1692506348245' />
</a>
</div>
<div class='t396__elem tn-elem uc-logo--on-dark tn-elem__4954535791692506631214' data-elem-id='1692506631214' data-elem-type='image'
data-field-top-value="58"
data-field-left-value="820"
data-field-height-value="56" data-field-width-value="120" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-filewidth-value="86" data-field-fileheight-value="40" data-field-heightmode-value="hug"
data-field-top-res-320-value="873" data-field-left-res-320-value="10" data-field-height-res-320-value="56"
data-field-top-res-480-value="845" data-field-left-res-480-value="20" data-field-height-res-480-value="56"
data-field-top-res-640-value="757" data-field-left-res-640-value="24" data-field-height-res-640-value="56"
data-field-left-res-960-value="640" data-field-height-res-960-value="56"
>
<a class='tn-atom js-click-zero-stat' href="https://southbridge.io/?utm_source=slurm&utm_medium=footer" rel="nofollow" data-tilda-event-name="/tilda/click/rec495453579/button1692506631214">
<img class='tn-atom__img' src='https://static.tildacdn.com/tild3438-6232-4636-b961-366339386263/sb-logo-light.svg' alt='' imgfield='tn_img_1692506631214' />
</a>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660327289504' data-elem-id='1660327289504' data-elem-type='text'
data-field-top-value="121"
data-field-left-value="20"
data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="18"
data-field-left-res-320-value="10" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16"
data-field-top-res-480-value="81" data-field-left-res-480-value="20"
data-field-top-res-640-value="68" data-field-left-res-640-value="153"
data-field-left-res-960-value="32" data-field-width-res-960-value="288"
>
<div class='tn-atom'field='tn_text_1660327289504'>Обучение ИТ-профессионалов</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327420094' data-elem-id='1660327420094' data-elem-type='text'
data-field-top-value="185"
data-field-left-value="14"
data-field-height-value="26" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="24"
data-field-left-res-320-value="5" data-field-width-res-320-value="300"
data-field-left-res-480-value="15" data-field-width-res-480-value="440"
data-field-top-res-640-value="124" data-field-left-res-640-value="20"
data-field-left-res-960-value="27" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="tel:+74952480580"rel="nofollow"style="color: inherit">+7 (495) 248-05-80</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327526179' data-elem-id='1660327526179' data-elem-type='text'
data-field-top-value="223"
data-field-left-value="16"
data-field-height-value="26" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="24"
data-field-left-res-320-value="6" data-field-width-res-320-value="300"
data-field-left-res-480-value="16" data-field-width-res-480-value="440"
data-field-top-res-640-value="162" data-field-left-res-640-value="20"
data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="mailto:ask@slurm.io"rel="nofollow"style="color: inherit">ask@slurm.io</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247771' data-elem-id='1660328247771' data-elem-type='text'
data-field-top-value="547"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="614" data-field-left-res-320-value="6" data-field-width-res-320-value="300"
data-field-top-res-480-value="622" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="532" data-field-left-res-640-value="326"
data-field-top-res-960-value="557" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/corporate"style="color: inherit">Корпоративное обучение</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067115' data-elem-id='1660328067115' data-elem-type='text'
data-field-top-value="217"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="258" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="258" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="158" data-field-left-res-640-value="326"
data-field-top-res-960-value="219" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/calendar"style="color: inherit">Календарь</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791660328673693' data-elem-id='1660328673693' data-elem-type='text'
data-field-top-value="229"
data-field-left-value="816"
data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1017" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1008" data-field-left-res-480-value="20" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="874" data-field-left-res-640-value="20" data-field-width-res-640-value="256"
data-field-top-res-960-value="229" data-field-left-res-960-value="636" data-field-width-res-960-value="288"
>
<div class='tn-atom'><a href="https://southbridge.io/?utm_source=slurm&utm_medium=footer"rel="nofollow"style="color: inherit"><span style="font-weight: 700;">Southbridge.</span> DevOps-аутсорсер, поддержка высоконагруженных проектов.</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327820270' data-elem-id='1660327820270' data-elem-type='text'
data-field-top-value="305"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="258" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="246" data-field-left-res-640-value="20"
data-field-top-res-960-value="315" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://habr.com/ru/companies/slurm/articles/"rel="nofollow"style="color: inherit">Хабр</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu--podcast tn-elem__4954535791660728009618' data-elem-id='1660728009618' data-elem-type='text'
data-field-top-value="273"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="220" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="212" data-field-left-res-640-value="20"
data-field-top-res-960-value="281" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://slurm.mave.digital/"rel="nofollow"style="color: inherit">Подкаст</a></div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660728533851' data-elem-id='1660728533851' data-elem-type='text'
data-field-top-value="274"
data-field-left-value="8"
data-field-height-value="24" data-field-width-value="9" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="218" data-field-left-res-320-value="0"
data-field-top-res-480-value="222" data-field-left-res-480-value="8" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="211" data-field-left-res-640-value="10"
data-field-top-res-960-value="283" data-field-left-res-960-value="20"
>
<div class='tn-atom'field='tn_text_1660728533851'>•</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247775' data-elem-id='1660328247775' data-elem-type='text'
data-field-top-value="579"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="652" data-field-left-res-320-value="6" data-field-width-res-320-value="300"
data-field-top-res-480-value="660" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="566" data-field-left-res-640-value="326"
data-field-top-res-960-value="591" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/universal-tickets"style="color: inherit">Универсальные доступы</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067118' data-elem-id='1660328067118' data-elem-type='text'
data-field-top-value="185"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="220" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="220" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="124" data-field-left-res-640-value="326"
data-field-top-res-960-value="185" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/catalog"style="color: inherit">Все курсы</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328247777' data-elem-id='1660328247777' data-elem-type='text'
data-field-top-value="611"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="690" data-field-left-res-320-value="6" data-field-width-res-320-value="300"
data-field-top-res-480-value="698" data-field-left-res-480-value="16" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="600" data-field-left-res-640-value="326"
data-field-top-res-960-value="625" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/faq-for-oformitel"style="color: inherit">Оплата курса от компании</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067120' data-elem-id='1660328067120' data-elem-type='text'
data-field-top-value="249"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="296" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="296" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="192" data-field-left-res-640-value="326"
data-field-top-res-960-value="253" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/free"style="color: inherit">Бесплатные материалы</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327823456' data-elem-id='1660327823456' data-elem-type='text'
data-field-top-value="337"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="296" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="280" data-field-left-res-640-value="20"
data-field-top-res-960-value="349" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://t.me/slurmnews"style="color: inherit">Telegram</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328067122' data-elem-id='1660328067122' data-elem-type='text'
data-field-top-value="281"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="344" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="334" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="226" data-field-left-res-640-value="326"
data-field-top-res-960-value="287" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/speaker"style="color: inherit">Спикеры</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791664355590156' data-elem-id='1664355590156' data-elem-type='text'
data-field-top-value="313"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="382" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="372" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="260" data-field-left-res-640-value="326"
data-field-top-res-960-value="321" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/for-speakers"style="color: inherit">Для спикеров</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791738909171549' data-elem-id='1738909171549' data-elem-type='text'
data-field-top-value="345"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="420" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="410" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="294" data-field-left-res-640-value="326"
data-field-top-res-960-value="355" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://slurm.io/careers"style="color: inherit">Работа в Слёрме</a></div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660328170303' data-elem-id='1660328170303' data-elem-type='text'
data-field-top-value="503"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="18"
data-field-top-res-320-value="570" data-field-left-res-320-value="9" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16"
data-field-top-res-480-value="578" data-field-left-res-480-value="16" data-field-width-res-480-value="440"
data-field-top-res-640-value="488" data-field-left-res-640-value="326"
data-field-top-res-960-value="513" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'field='tn_text_1660328170303'>Корпоративным клиентам</div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660328581896' data-elem-id='1660328581896' data-elem-type='text'
data-field-top-value="185"
data-field-left-value="820"
data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="18"
data-field-top-res-320-value="973" data-field-left-res-320-value="12" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16"
data-field-top-res-480-value="964" data-field-left-res-480-value="20" data-field-width-res-480-value="440"
data-field-top-res-640-value="830" data-field-left-res-640-value="24" data-field-width-res-640-value="288"
data-field-left-res-960-value="640" data-field-width-res-960-value="288"
>
<div class='tn-atom'field='tn_text_1660328581896'>Партнёры</div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660328396738' data-elem-id='1660328396738' data-elem-type='text'
data-field-top-value="736"
data-field-left-value="20"
data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1428" data-field-left-res-320-value="9"
data-field-top-res-480-value="1435" data-field-left-res-480-value="23"
data-field-top-res-640-value="1125" data-field-left-res-640-value="24"
data-field-top-res-960-value="765" data-field-left-res-960-value="32" data-field-width-res-960-value="288"
>
<div class='tn-atom'field='tn_text_1660328396738'>© 2018—2025 ООО «Слёрм»</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327824923' data-elem-id='1660327824923' data-elem-type='text'
data-field-top-value="401"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="372" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="348" data-field-left-res-640-value="20"
data-field-top-res-960-value="417" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://vk.com/slurm_io"rel="nofollow"style="color: inherit">VK</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327826356' data-elem-id='1660327826356' data-elem-type='text'
data-field-top-value="369"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="334" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="314" data-field-left-res-640-value="20"
data-field-top-res-960-value="383" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://www.youtube.com/c/slurm_io"rel="nofollow"style="color: inherit">YouTube</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327833780' data-elem-id='1660327833780' data-elem-type='text'
data-field-top-value="433"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="410" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="382" data-field-left-res-640-value="20"
data-field-top-res-960-value="451" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://dzen.ru/slurm"rel="nofollow"style="color: inherit">Дзен</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660327835132' data-elem-id='1660327835132' data-elem-type='text'
data-field-top-value="497"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="486" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="450" data-field-left-res-640-value="20"
data-field-top-res-960-value="519" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://www.linkedin.com/company/slurm"rel="nofollow"style="color: inherit">LinkedIn</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791695983077804' data-elem-id='1695983077804' data-elem-type='text'
data-field-top-value="586"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1268" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1265" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="590" data-field-left-res-640-value="20"
data-field-top-res-960-value="619" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/privacy"style="color: inherit">Политика конфиденциальности</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328020471' data-elem-id='1660328020471' data-elem-type='text'
data-field-top-value="618"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1306" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1303" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="624" data-field-left-res-640-value="20"
data-field-top-res-960-value="653" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/oferta-slurm"style="color: inherit">Публичная оферта</a></div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791660327366231' data-elem-id='1660327366231' data-elem-type='text'
data-field-top-value="121"
data-field-left-value="820"
data-field-height-value="24" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="18"
data-field-top-res-320-value="925" data-field-left-res-320-value="10" data-field-width-res-320-value="300" data-field-fontsize-res-320-value="16"
data-field-top-res-480-value="908" data-field-left-res-480-value="20" data-field-width-res-480-value="440"
data-field-top-res-640-value="784" data-field-left-res-640-value="168"
data-field-left-res-960-value="640"
>
<div class='tn-atom'field='tn_text_1660327366231'>Генеральный партнёр Слёрм</div>
</div>
<div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660723679978' data-elem-id='1660723679978' data-elem-type='shape'
data-field-top-value="0"
data-field-left-value="787"
data-field-height-value="100" data-field-width-value="1" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="%"
data-field-widthunits-value="px"
data-field-left-res-960-value="619" data-field-height-res-960-value="100"
>
<div class='tn-atom' >
</div>
</div>
<div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660625517826' data-elem-id='1660625517826' data-elem-type='shape'
data-field-top-value="0"
data-field-left-value="0"
data-field-height-value="1" data-field-width-value="592" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-top-res-320-value="770" data-field-left-res-320-value="10" data-field-width-res-320-value="300"
data-field-top-res-480-value="782" data-field-left-res-480-value="20" data-field-width-res-480-value="440"
data-field-top-res-640-value="743" data-field-left-res-640-value="24"
>
<div class='tn-atom' >
</div>
</div>
<div class='t396__elem tn-elem uc-footer-line tn-elem__4954535791660625579543' data-elem-id='1660625579543' data-elem-type='shape'
data-field-top-value="0"
data-field-left-value="0"
data-field-height-value="1" data-field-width-value="592" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-top-res-320-value="1215" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1204" data-field-left-res-480-value="20" data-field-width-res-480-value="440"
data-field-top-res-640-value="1060" data-field-left-res-640-value="24"
>
<div class='tn-atom' >
</div>
</div>
<div class='t396__elem tn-elem uc-footer-line--top tn-elem__4954535791660723501956' data-elem-id='1660723501956' data-elem-type='shape'
data-field-top-value="0"
data-field-left-value="0"
data-field-height-value="1" data-field-width-value="100" data-field-axisy-value="top"
data-field-axisx-value="center"
data-field-container-value="window"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="%"
>
<div class='tn-atom' >
</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791660328018624' data-elem-id='1660328018624' data-elem-type='text'
data-field-top-value="553"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1230" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1227" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="556" data-field-left-res-640-value="20"
data-field-top-res-960-value="585" data-field-left-res-960-value="28" data-field-width-res-960-value="278"
>
<div class='tn-atom'><a href="https://api.edu.slurm.io/uploads/license_dpo.pdf"target="_blank"style="color: inherit">Лицензия №ДЛ-1368 от 22.08.2019</a></div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791705327730563' data-elem-id='1705327730563' data-elem-type='image'
data-field-top-value="3"
data-field-left-value="-3"
data-field-height-value="101" data-field-width-value="6" data-field-axisy-value="bottom"
data-field-axisx-value="center"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="%"
data-field-filewidth-value="600" data-field-fileheight-value="840" data-field-heightmode-value="hug"
data-field-top-res-320-value="25" data-field-left-res-320-value="1" data-field-height-res-320-value="99" data-field-width-res-320-value="71"
data-field-top-res-480-value="57" data-field-left-res-480-value="147" data-field-height-res-480-value="140" data-field-width-res-480-value="100" data-field-widthunits-res-480-value="px"
data-field-top-res-640-value="-112" data-field-left-res-640-value="173" data-field-height-res-640-value="132" data-field-width-res-640-value="94" data-field-widthunits-res-640-value="px"
data-field-top-res-960-value="4" data-field-left-res-960-value="2" data-field-height-res-960-value="81"
>
<div class='tn-atom' >
<img class='tn-atom__img' src='https://static.tildacdn.com/tild6562-3736-4663-b362-303664366334/idle-anim3_green_lin.gif' alt='' imgfield='tn_img_1705327730563' />
</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791706690444440' data-elem-id='1706690444440' data-elem-type='text'
data-field-top-value="377"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="458" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="448" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="328" data-field-left-res-640-value="326"
data-field-top-res-960-value="389" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/reviews"style="color: inherit">Отзывы</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791707905565159' data-elem-id='1707905565159' data-elem-type='text'
data-field-top-value="441"
data-field-left-value="420"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="532" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="524" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="396" data-field-left-res-640-value="326"
data-field-top-res-960-value="457" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/blog"style="color: inherit"><strong>Блог</strong></a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791742980584483' data-elem-id='1742980584483' data-elem-type='text'
data-field-top-value="409"
data-field-left-value="419"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="496" data-field-left-res-320-value="166" data-field-width-res-320-value="140"
data-field-top-res-480-value="486" data-field-left-res-480-value="244" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="362" data-field-left-res-640-value="326"
data-field-top-res-960-value="423" data-field-left-res-960-value="332" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="/about_us"style="color: inherit">О нас</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791708962345240' data-elem-id='1708962345240' data-elem-type='text'
data-field-top-value="682"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1382" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1379" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="692" data-field-left-res-640-value="20"
data-field-top-res-960-value="721" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://slurm.io/info"style="color: inherit">Юридическая информация</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791742566995756' data-elem-id='1742566995756' data-elem-type='text'
data-field-top-value="650"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1344" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1341" data-field-left-res-480-value="19" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="658" data-field-left-res-640-value="20"
data-field-top-res-960-value="687" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://slurm.io/newsletter"style="color: inherit">Согласие на рассылку</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791723122768750' data-elem-id='1723122768750' data-elem-type='text'
data-field-top-value="373"
data-field-left-value="886"
data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="793" data-field-left-res-320-value="57" data-field-width-res-320-value="300"
data-field-top-res-480-value="1128" data-field-left-res-480-value="71" data-field-width-res-480-value="440" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="973" data-field-left-res-640-value="89" data-field-height-res-640-value="48" data-field-width-res-640-value="330" data-field-container-res-640-value="grid" data-field-heightunits-res-640-value="px" data-field-textfit-res-640-value="autoheight"
data-field-top-res-960-value="409" data-field-left-res-960-value="709" data-field-width-res-960-value="215"
>
<div class='tn-atom'field='tn_text_1723122768750'><strong style="font-weight: 700;">СДЕЛАНО В РОССИИ</strong><br>Входим в реестр Российского ПО</div>
</div>
<div class='t396__elem tn-elem uc-footer-menu--partner tn-elem__4954535791768398747383000001' data-elem-id='1768398747383000001' data-elem-type='text'
data-field-top-value="297"
data-field-left-value="816"
data-field-height-value="48" data-field-width-value="360" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-top-res-320-value="1099" data-field-left-res-320-value="9" data-field-width-res-320-value="300"
data-field-top-res-480-value="1068" data-field-left-res-480-value="20" data-field-width-res-480-value="335" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="874" data-field-left-res-640-value="328" data-field-height-res-640-value="48" data-field-width-res-640-value="273" data-field-container-res-640-value="grid" data-field-heightunits-res-640-value="px" data-field-textfit-res-640-value="autoheight"
data-field-top-res-960-value="317" data-field-left-res-960-value="636" data-field-width-res-960-value="288"
>
<div class='tn-atom'><a href="https://core247.io/"rel="nofollow"style="color: inherit"><strong style="font-weight: 700;">CORE 24/7.</strong> Официальный представитель Слёрма в Казахстане.</a></div>
</div>
<div class='t396__elem tn-elem uc-footer-menu tn-elem__4954535791726735717183' data-elem-id='1726735717183' data-elem-type='text'
data-field-top-value="465"
data-field-left-value="16"
data-field-height-value="24" data-field-width-value="336" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-textfit-value="autoheight" data-field-fontsize-value="16"
data-field-left-res-320-value="6" data-field-width-res-320-value="140"
data-field-top-res-480-value="448" data-field-left-res-480-value="16" data-field-width-res-480-value="212" data-field-fontsize-res-480-value="15"
data-field-top-res-640-value="416" data-field-left-res-640-value="20"
data-field-top-res-960-value="485" data-field-left-res-960-value="28" data-field-width-res-960-value="264"
>
<div class='tn-atom'><a href="https://rutube.ru/channel/39652890/"rel="nofollow"style="color: inherit">Rutube</a></div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791768399150632' data-elem-id='1768399150632' data-elem-type='shape'
data-field-top-value="369"
data-field-left-value="820"
data-field-height-value="55" data-field-width-value="55" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-top-res-320-value="794" data-field-left-res-320-value="10"
data-field-top-res-480-value="1129" data-field-left-res-480-value="21" data-field-height-res-480-value="41" data-field-width-res-480-value="41"
data-field-top-res-640-value="968" data-field-left-res-640-value="24"
data-field-top-res-960-value="417" data-field-left-res-960-value="640"
>
<div class='tn-atom' >
</div>
</div>
<div class='t396__elem tn-elem tn-elem__4954535791768399141699' data-elem-id='1768399141699' data-elem-type='image'
data-field-top-value="378"
data-field-left-value="829"
data-field-height-value="38" data-field-width-value="38" data-field-axisy-value="top"
data-field-axisx-value="left"
data-field-container-value="grid"
data-field-topunits-value="px"
data-field-leftunits-value="px"
data-field-heightunits-value="px"
data-field-widthunits-value="px"
data-field-filewidth-value="512" data-field-fileheight-value="512" data-field-heightmode-value="hug"
data-field-top-res-320-value="801" data-field-left-res-320-value="17" data-field-height-res-320-value="28"
data-field-top-res-480-value="1136" data-field-left-res-480-value="28" data-field-height-res-480-value="28" data-field-width-res-480-value="28"
data-field-top-res-640-value="977" data-field-left-res-640-value="33" data-field-height-res-640-value="38"
data-field-top-res-960-value="426" data-field-left-res-960-value="649" data-field-height-res-960-value="38"
>
<div class='tn-atom' >
<img class='tn-atom__img' src='https://static.tildacdn.com/tild6664-3637-4833-b338-393633633963/coat-of-arms_3.svg' alt='' imgfield='tn_img_1768399141699' />
</div>
</div>
</div>
</div>
<script>
t_onReady(function () {
t_onFuncLoad('t396_init', function () {
t396_init('495453579');
});
});
</script>
<!-- /T396 -->
</div>
<div id="rec825799301" class="r t-rec" style=" " data-animationappear="off" data-record-type="131" >
<!-- T123 -->
<div class="t123" >
<div class="t-container_100 ">
<div class="t-width t-width_100 ">
<!-- nominify begin -->
<style>
/*Добавляем скругления углов у карточек стандартных блоков*/
.t-popup__container{ /*Сюда вставляем класс блока из таблицы выше*/
border-radius: 16px !important; /*Радиус скругления у блока*/
overflow: hidden; /*Используется для некоторых блоков, к которым не применяется скругление*/
/*Если нужно скруглить углы, каждый по отдельности, то используйте вместо одного значения четыре,
написав их через пробел, например 20px 30px 10px 50px*/
}
</style>
<style>
/*Размытие фона*/
.t-popup.t-popup_show {
-webkit-backdrop-filter: blur(5px);
backdrop-filter: blur(5px);
}
</style>
<!-- nominify end -->
</div>
</div>
</div>
</div>
</div>
<!--/footer-->
<!-- POST END -->
</div>
<!--/allrecords--> <!-- Stat --> <!-- Yandex.Metrika counter 49219348 --> <script type="text/javascript" data-tilda-cookie-type="analytics">setTimeout(function(){(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");window.mainMetrikaId='49219348';ym(window.mainMetrikaId,"init",{clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true,params:{__ym:{"ymCms":{"cms":"tilda","cmsVersion":"1.0","cmsCatalog":"1"}}},ecommerce:"dataLayer"});},2000);</script> <noscript><div><img src="https://mc.yandex.ru/watch/49219348" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script type="text/javascript">if(!window.mainTracker) {window.mainTracker='tilda';}
window.tildastatscroll='yes';setTimeout(function(){(function(d,w,k,o,g) {var n=d.getElementsByTagName(o)[0],s=d.createElement(o),f=function(){n.parentNode.insertBefore(s,n);};s.type="text/javascript";s.async=true;s.key=k;s.id="tildastatscript";s.src=g;if(w.opera=="[object Opera]") {d.addEventListener("DOMContentLoaded",f,false);} else {f();}})(document,window,'3ca9b9471ab76a4a58118835b5fb250d','script','https://static.tildacdn.com/js/tilda-stat-1.0.min.js');},2000);</script> <!-- Rating Mail.ru counter --> <script type="text/javascript" data-tilda-cookie-type="analytics">setTimeout(function(){var _tmr=window._tmr||(window._tmr=[]);_tmr.push({id:"3557140",type:"pageView",start:(new Date()).getTime()});window.mainMailruId='3557140';(function(d,w,id) {if(d.getElementById(id)) {return;}
var ts=d.createElement("script");ts.type="text/javascript";ts.async=true;ts.id=id;ts.src="https://top-fwz1.mail.ru/js/code.js";var f=function() {var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(ts,s);};if(w.opera=="[object Opera]") {d.addEventListener("DOMContentLoaded",f,false);} else {f();}})(document,window,"topmailru-code");},2000);</script> <noscript><img src="https://top-fwz1.mail.ru/counter?id=3557140;js=na" style="border:0;position:absolute;left:-9999px;width:1px;height:1px" alt="Top.Mail.Ru" /></noscript> <!-- //Rating Mail.ru counter --> </body> </html>