<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://esymeo.mybb.ru/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Тестовый форум для дизайнов</title>
		<link>http://esymeo.mybb.ru/</link>
		<description>Тестовый форум для дизайнов</description>
		<language>ru-ru</language>
		<lastBuildDate>Thu, 20 Mar 2025 14:17:34 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>RPG CULT Grimoire | Гримуар РПГ Секты</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=87#p87</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/9d/37/2/893316.gif&quot; alt=&quot;https://upforme.ru/uploads/001b/9d/37/2/893316.gif&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;a href=&quot;https://t.me/rpg_grimoire&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;RPG CULT Grimoire&lt;/a&gt; – это таинственный сборник знаний для любителей ролевых игр.&lt;/p&gt;
						&lt;p&gt;Здесь собран концентрат опыта и полезных материалов, которые прокачают твоего внутреннего ролевика и облегчат жизнь в мире игр: &lt;/p&gt;&lt;ul style=&quot;list-style: disc&quot;&gt;&lt;li&gt;&lt;p&gt;Анализ игровых механик, разборы ролевых систем, конспекты собраний и эксперименты.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Полезные материалы для ведущих, администраторов и организаторов ролевых проектов.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Проработка персонажей, архетипов, сюжетов и нарратива.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ссылки, генераторы, программы и другие штуки, облегчающие жизнь мастерам и игрокам.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;Поможем тайному знанию распространиться!&lt;/span&gt;&lt;br /&gt;Если тебе близка идея Гримуара, размести наш баннер в подписи, на своём сайте или форуме. Пусть больше людей узнают о наших материалах и смогут стать частью ролевого сообщества!&lt;/p&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;a href=&quot;https://t.me/rpg_grimoire&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://forumstatic.ru/files/001b/9d/37/38926.gif&quot; alt=&quot;https://forumstatic.ru/files/001b/9d/37/38926.gif&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;a href=&quot;https://t.me/rpg_grimoire&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://forumstatic.ru/files/001b/9d/37/98216.gif&quot; alt=&quot;https://forumstatic.ru/files/001b/9d/37/98216.gif&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;[url=https://t.me/rpg_grimoire][img]https://forumstatic.ru/files/001b/9d/37/38926.gif[/img][/url]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;[url=https://t.me/rpg_grimoire][img]https://forumstatic.ru/files/001b/9d/37/98216.gif[/img][/url]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;&amp;lt;a href=&#039;https://t.me/rpg_grimoire&#039; target=&#039;blank&#039; title=&amp;quot;RPG CULT Grimoire — хранилище ролевых знаний&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://forumstatic.ru/files/001b/9d/37/38926.gif&amp;quot; border=&amp;quot;0&amp;quot; width=&amp;quot;88&amp;quot; height=&amp;quot;31&amp;quot; &amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;&amp;lt;a href=&#039;https://t.me/rpg_grimoire&#039; target=&#039;blank&#039; title=&amp;quot;RPG CULT Grimoire — хранилище ролевых знаний&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://forumstatic.ru/files/001b/9d/37/98216.gif&amp;quot; border=&amp;quot;0&amp;quot; width=&amp;quot;88&amp;quot; height=&amp;quot;31&amp;quot; &amp;gt;&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Thu, 20 Mar 2025 14:17:34 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=87#p87</guid>
		</item>
		<item>
			<title>Тест кода вкладок</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=86#p86</link>
			<description>&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;tabone&quot;&gt;&lt;p&gt;ЭТО НАЗВАНИЕ ПЕРВОЙ ВКЛАДКИ&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;tabtwo&quot;&gt;&lt;p&gt;А ЭТО НАЗВАНИЕ ВТОРОЙ (ДЕФОЛТНАЯ)&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;tabthree&quot;&gt;&lt;p&gt;ВОТ НАЗВАНИЕ ТРЕТЬЕЙ&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;tabfour&quot;&gt;&lt;p&gt;И ЧЕТВЁРТОЙ!!!&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;tabone&quot;&gt;&lt;p&gt;Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности играет важную роль в формировании новых предложений. Идейные соображения высшего порядка, а также укрепление и развитие структуры играет важную роль в формировании направлений прогрессивного развития. Значимость этих проблем настолько очевидна, что укрепление и развитие структуры позволяет оценить значение соответствующий условий активизации. Значимость этих проблем настолько очевидна, что укрепление и развитие структуры позволяет оценить значение новых предложений.&lt;/p&gt;
						&lt;p&gt;Значимость этих проблем настолько очевидна, что рамки и место обучения кадров способствует подготовки и реализации дальнейших направлений развития. Равным образом рамки и место обучения кадров позволяет оценить значение форм развития.&lt;/p&gt;
						&lt;p&gt;С другой стороны консультация с широким активом обеспечивает широкому кругу (специалистов) участие в формировании дальнейших направлений развития. Идейные соображения высшего порядка, а также рамки и место обучения кадров играет важную роль в формировании форм развития. Повседневная практика показывает, что рамки и место обучения кадров требуют определения и уточнения соответствующий условий активизации.&lt;/p&gt;
						&lt;p&gt;Товарищи! рамки и место обучения кадров требуют определения и уточнения систем массового участия. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности представляет собой интересный эксперимент проверки существенных финансовых и административных условий. Идейные соображения высшего порядка, а также рамки и место обучения кадров влечет за собой процесс внедрения и модернизации систем массового участия. С другой стороны новая модель организационной деятельности играет важную роль в формировании дальнейших направлений развития. Идейные соображения высшего порядка, а также консультация с широким активом играет важную роль в формировании дальнейших направлений развития.&lt;/p&gt;
						&lt;p&gt;Не следует, однако забывать, что консультация с широким активом влечет за собой процесс внедрения и модернизации направлений прогрессивного развития. Разнообразный и богатый опыт постоянный количественный рост и сфера нашей активности представляет собой интересный эксперимент проверки форм развития. С другой стороны рамки и место обучения кадров позволяет оценить значение системы обучения кадров, соответствует насущным потребностям. Товарищи! укрепление и развитие структуры играет важную роль в формировании существенных финансовых и административных условий. Не следует, однако забывать, что постоянное информационно-пропагандистское обеспечение нашей деятельности требуют от нас анализа дальнейших направлений развития. Товарищи! укрепление и развитие структуры играет важную роль в формировании соответствующий условий активизации.&lt;/p&gt;
						&lt;p&gt;Повседневная практика показывает, что дальнейшее развитие различных форм деятельности позволяет оценить значение системы обучения кадров, соответствует насущным потребностям. Идейные соображения высшего порядка, а также реализация намеченных плановых заданий влечет за собой процесс внедрения и модернизации системы обучения кадров, соответствует насущным потребностям. Не следует, однако забывать, что начало повседневной работы по формированию позиции представляет собой интересный эксперимент проверки соответствующий условий активизации.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;tabtwo&quot;&gt;&lt;div class=&quot;custom_tag custom_tag_tabdefault&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://i.gyazo.com/2ccebd657a0869464ade7b2a8415847d.jpg&quot; alt=&quot;https://i.gyazo.com/2ccebd657a0869464ade7b2a8415847d.jpg&quot; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;Повседневная практика показывает, что сложившаяся структура организации требуют определения и уточнения позиций, занимаемых участниками в отношении поставленных задач. С другой стороны дальнейшее развитие различных форм деятельности обеспечивает широкому кругу (специалистов) участие в формировании соответствующий условий активизации. Повседневная практика показывает, что укрепление и развитие структуры позволяет выполнять важные задания по разработке модели развития.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;tabthree&quot;&gt;&lt;table style=&quot;table-layout:fixed;width:100%&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;Разнообразный и богатый опыт новая модель организационной деятельности позволяет выполнять важные задания по разработке направлений прогрессивного развития. Товарищи! рамки и место обучения кадров способствует подготовки и реализации системы обучения кадров, соответствует насущным потребностям. Задача организации, в особенности же сложившаяся структура организации представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач. Задача организации, в особенности же укрепление и развитие структуры в значительной степени обуславливает создание позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт укрепление и развитие структуры играет важную роль в формировании систем массового участия. Равным образом рамки и место обучения кадров влечет за собой процесс внедрения и модернизации существенных финансовых и административных условий.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Разнообразный и богатый опыт новая модель организационной деятельности позволяет выполнять важные задания по разработке направлений прогрессивного развития. Товарищи! рамки и место обучения кадров способствует подготовки и реализации системы обучения кадров, соответствует насущным потребностям. Задача организации, в особенности же сложившаяся структура организации представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач. Задача организации, в особенности же укрепление и развитие структуры в значительной степени обуславливает создание позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт укрепление и развитие структуры играет важную роль в формировании систем массового участия. Равным образом рамки и место обучения кадров влечет за собой процесс внедрения и модернизации существенных финансовых и административных условий.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;tabfour&quot;&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Спойлер 1&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Разнообразный и богатый опыт новая модель организационной деятельности позволяет выполнять важные задания по разработке направлений прогрессивного развития. Товарищи! рамки и место обучения кадров способствует подготовки и реализации системы обучения кадров, соответствует насущным потребностям. Задача организации, в особенности же сложившаяся структура организации представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач. Задача организации, в особенности же укрепление и развитие структуры в значительной степени обуславливает создание позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт укрепление и развитие структуры играет важную роль в формировании систем массового участия. Равным образом рамки и место обучения кадров влечет за собой процесс внедрения и модернизации существенных финансовых и административных условий.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Спойлер 2&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Разнообразный и богатый опыт новая модель организационной деятельности позволяет выполнять важные задания по разработке направлений прогрессивного развития. Товарищи! рамки и место обучения кадров способствует подготовки и реализации системы обучения кадров, соответствует насущным потребностям. Задача организации, в особенности же сложившаяся структура организации представляет собой интересный эксперимент проверки позиций, занимаемых участниками в отношении поставленных задач. Задача организации, в особенности же укрепление и развитие структуры в значительной степени обуславливает создание позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт укрепление и развитие структуры играет важную роль в формировании систем массового участия. Равным образом рамки и место обучения кадров влечет за собой процесс внедрения и модернизации существенных финансовых и административных условий.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Mon, 03 Jun 2024 20:37:35 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=86#p86</guid>
		</item>
		<item>
			<title>Test form script</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=85#p85</link>
			<description>&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;azaza&quot;&gt;&lt;p&gt;tab 1&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tabtitle&quot; data-tabname=&quot;ololo&quot;&gt;&lt;p&gt;tab 2&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;azaza&quot;&gt;&lt;p&gt;tab 1 content&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;custom_tag custom_tag_tab&quot; data-tabname=&quot;ololo&quot;&gt;&lt;div class=&quot;custom_tag custom_tag_tabdefault&quot;&gt;&lt;/div&gt;&lt;p&gt;tab 2 content&lt;/p&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Mon, 22 Apr 2024 16:09:42 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=85#p85</guid>
		</item>
		<item>
			<title>Тестовая тема 1</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=81#p81</link>
			<description>&lt;p&gt;[html]&lt;br /&gt;&amp;lt;style&amp;gt;&lt;/p&gt;
						&lt;p&gt;#container {&lt;br /&gt;&amp;#160; margin: 0;&lt;br /&gt;&amp;#160; padding: 0;&lt;br /&gt;&amp;#160; display: flex;&lt;br /&gt;&amp;#160; flex-direction: column;&lt;br /&gt;&amp;#160; justify-content: center;&lt;br /&gt;&amp;#160; align-items: center;&lt;br /&gt;&amp;#160; width: 100%;&lt;br /&gt;&amp;#160; height: 800px;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.a-title {&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; color: transparent;&lt;br /&gt;&amp;#160; -webkit-background-clip: text;&lt;br /&gt;&amp;#160; -webkit-text-fill-color: transparent;&lt;br /&gt;&amp;#160; background-image: conic-gradient(#ed0101, blue);&lt;br /&gt;&amp;#160; pointer-events: none;&lt;br /&gt;&amp;#160; mix-blend-mode: difference;&lt;br /&gt;&amp;#160; filter: drop-shadow(2px 4px 6px black);&lt;br /&gt;}&lt;br /&gt;.a-second-title {&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; margin-top: 25vh;&lt;br /&gt;&amp;#160; pointer-events: none;&lt;br /&gt;&amp;#160; -webkit-text-stroke: 1.3px white;&lt;br /&gt;&amp;#160; letter-spacing: 1.125px;&lt;br /&gt;&amp;#160; font-size: -webkit-xxx-large;&lt;br /&gt;&amp;#160; font-weight: 900;&lt;br /&gt;&amp;#160; mix-blend-mode: color-dodge;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;canvas {&lt;br /&gt;&amp;#160; width: 100%;&lt;br /&gt;&amp;#160; height: 100%;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;&#039;use strict&#039;;&lt;/p&gt;
						&lt;p&gt;const canvas = document.getElementsByTagName(&#039;canvas&#039;)[0];&lt;br /&gt;canvas.width = canvas.clientWidth;&lt;br /&gt;canvas.height = canvas.clientHeight;&lt;/p&gt;
						&lt;p&gt;let config = {&lt;br /&gt;&amp;#160; TEXTURE_DOWNSAMPLE: 1,&lt;br /&gt;&amp;#160; DENSITY_DISSIPATION: 0.98,&lt;br /&gt;&amp;#160; VELOCITY_DISSIPATION: 0.99,&lt;br /&gt;&amp;#160; PRESSURE_DISSIPATION: 0.8,&lt;br /&gt;&amp;#160; PRESSURE_ITERATIONS: 25,&lt;br /&gt;&amp;#160; CURL: 28,&lt;br /&gt;&amp;#160; SPLAT_RADIUS: 0.004 };&lt;/p&gt;
						&lt;p&gt;let pointers = [];&lt;br /&gt;let splatStack = [];&lt;/p&gt;
						&lt;p&gt;const { gl, ext } = getWebGLContext(canvas);&lt;/p&gt;
						&lt;p&gt;function getWebGLContext(canvas) {&lt;br /&gt;&amp;#160; const params = { alpha: false, depth: false, stencil: false, antialias: false };&lt;/p&gt;
						&lt;p&gt;&amp;#160; let gl = canvas.getContext(&#039;webgl2&#039;, params);&lt;br /&gt;&amp;#160; const isWebGL2 = !!gl;&lt;br /&gt;&amp;#160; if (!isWebGL2)&lt;br /&gt;&amp;#160; gl = canvas.getContext(&#039;webgl&#039;, params) || canvas.getContext(&#039;experimental-webgl&#039;, params);&lt;/p&gt;
						&lt;p&gt;&amp;#160; let halfFloat;&lt;br /&gt;&amp;#160; let supportLinearFiltering;&lt;br /&gt;&amp;#160; if (isWebGL2) {&lt;br /&gt;&amp;#160; &amp;#160; gl.getExtension(&#039;EXT_color_buffer_float&#039;);&lt;br /&gt;&amp;#160; &amp;#160; supportLinearFiltering = gl.getExtension(&#039;OES_texture_float_linear&#039;);&lt;br /&gt;&amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; halfFloat = gl.getExtension(&#039;OES_texture_half_float&#039;);&lt;br /&gt;&amp;#160; &amp;#160; supportLinearFiltering = gl.getExtension(&#039;OES_texture_half_float_linear&#039;);&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; gl.clearColor(0.0, 0.0, 0.0, 1.0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; const halfFloatTexType = isWebGL2 ? gl.HALF_FLOAT : halfFloat.HALF_FLOAT_OES;&lt;br /&gt;&amp;#160; let formatRGBA;&lt;br /&gt;&amp;#160; let formatRG;&lt;br /&gt;&amp;#160; let formatR;&lt;/p&gt;
						&lt;p&gt;&amp;#160; if (isWebGL2)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160; formatRGBA = getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, halfFloatTexType);&lt;br /&gt;&amp;#160; &amp;#160; formatRG = getSupportedFormat(gl, gl.RG16F, gl.RG, halfFloatTexType);&lt;br /&gt;&amp;#160; &amp;#160; formatR = getSupportedFormat(gl, gl.R16F, gl.RED, halfFloatTexType);&lt;br /&gt;&amp;#160; } else&lt;/p&gt;
						&lt;p&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160; formatRGBA = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType);&lt;br /&gt;&amp;#160; &amp;#160; formatRG = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType);&lt;br /&gt;&amp;#160; &amp;#160; formatR = getSupportedFormat(gl, gl.RGBA, gl.RGBA, halfFloatTexType);&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; return {&lt;br /&gt;&amp;#160; &amp;#160; gl,&lt;br /&gt;&amp;#160; &amp;#160; ext: {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; formatRGBA,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; formatRG,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; formatR,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; halfFloatTexType,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; supportLinearFiltering } };&lt;/p&gt;
						&lt;p&gt;}&lt;/p&gt;
						&lt;p&gt;function getSupportedFormat(gl, internalFormat, format, type)&lt;br /&gt;{&lt;br /&gt;&amp;#160; if (!supportRenderTextureFormat(gl, internalFormat, format, type))&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160; switch (internalFormat) {&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; case gl.R16F:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return getSupportedFormat(gl, gl.RG16F, gl.RG, type);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; case gl.RG16F:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return getSupportedFormat(gl, gl.RGBA16F, gl.RGBA, type);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; default:&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return null;}&lt;/p&gt;
						&lt;p&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; return {&lt;br /&gt;&amp;#160; &amp;#160; internalFormat,&lt;br /&gt;&amp;#160; &amp;#160; format };&lt;/p&gt;
						&lt;p&gt;}&lt;/p&gt;
						&lt;p&gt;function supportRenderTextureFormat(gl, internalFormat, format, type) {&lt;br /&gt;&amp;#160; let texture = gl.createTexture();&lt;br /&gt;&amp;#160; gl.bindTexture(gl.TEXTURE_2D, texture);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);&lt;br /&gt;&amp;#160; gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, 4, 4, 0, format, type, null);&lt;/p&gt;
						&lt;p&gt;&amp;#160; let fbo = gl.createFramebuffer();&lt;br /&gt;&amp;#160; gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);&lt;br /&gt;&amp;#160; gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);&lt;br /&gt;&amp;#160; if (status != gl.FRAMEBUFFER_COMPLETE)&lt;br /&gt;&amp;#160; return false;&lt;br /&gt;&amp;#160; return true;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function pointerPrototype() {&lt;br /&gt;&amp;#160; this.id = -1;&lt;br /&gt;&amp;#160; this.x = 0;&lt;br /&gt;&amp;#160; this.y = 0;&lt;br /&gt;&amp;#160; this.dx = 0;&lt;br /&gt;&amp;#160; this.dy = 0;&lt;br /&gt;&amp;#160; this.down = false;&lt;br /&gt;&amp;#160; this.moved = false;&lt;br /&gt;&amp;#160; this.color = [30, 0, 300];&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;pointers.push(new pointerPrototype());&lt;/p&gt;
						&lt;p&gt;class GLProgram {&lt;br /&gt;&amp;#160; constructor(vertexShader, fragmentShader) {&lt;br /&gt;&amp;#160; &amp;#160; this.uniforms = {};&lt;br /&gt;&amp;#160; &amp;#160; this.program = gl.createProgram();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; gl.attachShader(this.program, vertexShader);&lt;br /&gt;&amp;#160; &amp;#160; gl.attachShader(this.program, fragmentShader);&lt;br /&gt;&amp;#160; &amp;#160; gl.linkProgram(this.program);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))&lt;br /&gt;&amp;#160; &amp;#160; throw gl.getProgramInfoLog(this.program);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const uniformCount = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);&lt;br /&gt;&amp;#160; &amp;#160; for (let i = 0; i &amp;lt; uniformCount; i++) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; const uniformName = gl.getActiveUniform(this.program, i).name;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.uniforms[uniformName] = gl.getUniformLocation(this.program, uniformName);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; bind() {&lt;br /&gt;&amp;#160; &amp;#160; gl.useProgram(this.program);&lt;br /&gt;&amp;#160; }}&lt;/p&gt;
						&lt;p&gt;function compileShader(type, source) {&lt;br /&gt;&amp;#160; const shader = gl.createShader(type);&lt;br /&gt;&amp;#160; gl.shaderSource(shader, source);&lt;br /&gt;&amp;#160; gl.compileShader(shader);&lt;/p&gt;
						&lt;p&gt;&amp;#160; if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))&lt;br /&gt;&amp;#160; throw gl.getShaderInfoLog(shader);&lt;/p&gt;
						&lt;p&gt;&amp;#160; return shader;&lt;br /&gt;};&lt;/p&gt;
						&lt;p&gt;const baseVertexShader = compileShader(gl.VERTEX_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; attribute vec2 aPosition;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vL;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vR;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform vec2 texelSize;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vUv = aPosition * 0.5 + 0.5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vL = vUv - vec2(texelSize.x, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vR = vUv + vec2(texelSize.x, 0.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vT = vUv + vec2(0.0, texelSize.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vB = vUv - vec2(0.0, texelSize.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_Position = vec4(aPosition, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const clearShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uTexture;&lt;br /&gt;&amp;#160; &amp;#160; uniform float value;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = value * texture2D(uTexture, vUv);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const displayShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uTexture;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = texture2D(uTexture, vUv);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const splatShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uTarget;&lt;br /&gt;&amp;#160; &amp;#160; uniform float aspectRatio;&lt;br /&gt;&amp;#160; &amp;#160; uniform vec3 color;&lt;br /&gt;&amp;#160; &amp;#160; uniform vec2 point;&lt;br /&gt;&amp;#160; &amp;#160; uniform float radius;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 p = vUv - point.xy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; p.x *= aspectRatio;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 splat = exp(-dot(p, p) / radius) * color;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec3 base = texture2D(uTarget, vUv).xyz;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(base + splat, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const advectionManualFilteringShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uSource;&lt;br /&gt;&amp;#160; &amp;#160; uniform vec2 texelSize;&lt;br /&gt;&amp;#160; &amp;#160; uniform float dt;&lt;br /&gt;&amp;#160; &amp;#160; uniform float dissipation;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; vec4 bilerp (in sampler2D sam, in vec2 p) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 st;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; st.xy = floor(p - 0.5) + 0.5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; st.zw = st.xy + 1.0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 uv = st * texelSize.xyxy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 a = texture2D(sam, uv.xy);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 b = texture2D(sam, uv.zy);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 c = texture2D(sam, uv.xw);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec4 d = texture2D(sam, uv.zw);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 f = p - st.xy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 coord = gl_FragCoord.xy - dt * texture2D(uVelocity, vUv).xy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = dissipation * bilerp(uSource, coord);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor.a = 1.0;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const advectionShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uSource;&lt;br /&gt;&amp;#160; &amp;#160; uniform vec2 texelSize;&lt;br /&gt;&amp;#160; &amp;#160; uniform float dt;&lt;br /&gt;&amp;#160; &amp;#160; uniform float dissipation;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = dissipation * texture2D(uSource, coord);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor.a = 1.0;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const divergenceShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vL;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vR;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; vec2 sampleVelocity (in vec2 uv) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 multiplier = vec2(1.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (uv.x &amp;lt; 0.0) { uv.x = 0.0; multiplier.x = -1.0; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (uv.x &amp;gt; 1.0) { uv.x = 1.0; multiplier.x = -1.0; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (uv.y &amp;lt; 0.0) { uv.y = 0.0; multiplier.y = -1.0; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (uv.y &amp;gt; 1.0) { uv.y = 1.0; multiplier.y = -1.0; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return multiplier * texture2D(uVelocity, uv).xy;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float L = sampleVelocity(vL).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float R = sampleVelocity(vR).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float T = sampleVelocity(vT).y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float B = sampleVelocity(vB).y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float div = 0.5 * (R - L + T - B);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(div, 0.0, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const curlShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vL;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vR;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float L = texture2D(uVelocity, vL).y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float R = texture2D(uVelocity, vR).y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float T = texture2D(uVelocity, vT).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float B = texture2D(uVelocity, vB).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float vorticity = R - L - T + B;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const vorticityShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uCurl;&lt;br /&gt;&amp;#160; &amp;#160; uniform float curl;&lt;br /&gt;&amp;#160; &amp;#160; uniform float dt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float T = texture2D(uCurl, vT).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float B = texture2D(uCurl, vB).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float C = texture2D(uCurl, vUv).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 force = vec2(abs(T) - abs(B), 0.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; force *= 1.0 / length(force + 0.00001) * curl * C;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 vel = texture2D(uVelocity, vUv).xy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(vel + force * dt, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const pressureShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vL;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vR;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uPressure;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uDivergence;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; vec2 boundary (in vec2 uv) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uv = min(max(uv, 0.0), 1.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return uv;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float L = texture2D(uPressure, boundary(vL)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float R = texture2D(uPressure, boundary(vR)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float T = texture2D(uPressure, boundary(vT)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float B = texture2D(uPressure, boundary(vB)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float C = texture2D(uPressure, vUv).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float divergence = texture2D(uDivergence, vUv).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float pressure = (L + R + B + T - divergence) * 0.25;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;const gradientSubtractShader = compileShader(gl.FRAGMENT_SHADER, `&lt;br /&gt;&amp;#160; &amp;#160; precision highp float;&lt;br /&gt;&amp;#160; &amp;#160; precision mediump sampler2D;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; varying vec2 vUv;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vL;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vR;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vT;&lt;br /&gt;&amp;#160; &amp;#160; varying vec2 vB;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uPressure;&lt;br /&gt;&amp;#160; &amp;#160; uniform sampler2D uVelocity;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; vec2 boundary (in vec2 uv) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; uv = min(max(uv, 0.0), 1.0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return uv;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; void main () {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float L = texture2D(uPressure, boundary(vL)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float R = texture2D(uPressure, boundary(vR)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float T = texture2D(uPressure, boundary(vT)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; float B = texture2D(uPressure, boundary(vB)).x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; vec2 velocity = texture2D(uVelocity, vUv).xy;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; velocity.xy -= vec2(R - L, T - B);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; gl_FragColor = vec4(velocity, 0.0, 1.0);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;`);&lt;/p&gt;
						&lt;p&gt;let textureWidth;&lt;br /&gt;let textureHeight;&lt;br /&gt;let density;&lt;br /&gt;let velocity;&lt;br /&gt;let divergence;&lt;br /&gt;let curl;&lt;br /&gt;let pressure;&lt;br /&gt;initFramebuffers();&lt;/p&gt;
						&lt;p&gt;const clearProgram = new GLProgram(baseVertexShader, clearShader);&lt;br /&gt;const displayProgram = new GLProgram(baseVertexShader, displayShader);&lt;br /&gt;const splatProgram = new GLProgram(baseVertexShader, splatShader);&lt;br /&gt;const advectionProgram = new GLProgram(baseVertexShader, ext.supportLinearFiltering ? advectionShader : advectionManualFilteringShader);&lt;br /&gt;const divergenceProgram = new GLProgram(baseVertexShader, divergenceShader);&lt;br /&gt;const curlProgram = new GLProgram(baseVertexShader, curlShader);&lt;br /&gt;const vorticityProgram = new GLProgram(baseVertexShader, vorticityShader);&lt;br /&gt;const pressureProgram = new GLProgram(baseVertexShader, pressureShader);&lt;br /&gt;const gradienSubtractProgram = new GLProgram(baseVertexShader, gradientSubtractShader);&lt;/p&gt;
						&lt;p&gt;function initFramebuffers() {&lt;br /&gt;&amp;#160; textureWidth = gl.drawingBufferWidth &amp;gt;&amp;gt; config.TEXTURE_DOWNSAMPLE;&lt;br /&gt;&amp;#160; textureHeight = gl.drawingBufferHeight &amp;gt;&amp;gt; config.TEXTURE_DOWNSAMPLE;&lt;/p&gt;
						&lt;p&gt;&amp;#160; const texType = ext.halfFloatTexType;&lt;br /&gt;&amp;#160; const rgba = ext.formatRGBA;&lt;br /&gt;&amp;#160; const rg = ext.formatRG;&lt;br /&gt;&amp;#160; const r = ext.formatR;&lt;/p&gt;
						&lt;p&gt;&amp;#160; density = createDoubleFBO(2, textureWidth, textureHeight, rgba.internalFormat, rgba.format, texType, ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST);&lt;br /&gt;&amp;#160; velocity = createDoubleFBO(0, textureWidth, textureHeight, rg.internalFormat, rg.format, texType, ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST);&lt;br /&gt;&amp;#160; divergence = createFBO(4, textureWidth, textureHeight, r.internalFormat, r.format, texType, gl.NEAREST);&lt;br /&gt;&amp;#160; curl = createFBO(5, textureWidth, textureHeight, r.internalFormat, r.format, texType, gl.NEAREST);&lt;br /&gt;&amp;#160; pressure = createDoubleFBO(6, textureWidth, textureHeight, r.internalFormat, r.format, texType, gl.NEAREST);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function createFBO(texId, w, h, internalFormat, format, type, param) {&lt;br /&gt;&amp;#160; gl.activeTexture(gl.TEXTURE0 + texId);&lt;br /&gt;&amp;#160; let texture = gl.createTexture();&lt;br /&gt;&amp;#160; gl.bindTexture(gl.TEXTURE_2D, texture);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, param);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, param);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);&lt;br /&gt;&amp;#160; gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);&lt;br /&gt;&amp;#160; gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, w, h, 0, format, type, null);&lt;/p&gt;
						&lt;p&gt;&amp;#160; let fbo = gl.createFramebuffer();&lt;br /&gt;&amp;#160; gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);&lt;br /&gt;&amp;#160; gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);&lt;br /&gt;&amp;#160; gl.viewport(0, 0, w, h);&lt;br /&gt;&amp;#160; gl.clear(gl.COLOR_BUFFER_BIT);&lt;/p&gt;
						&lt;p&gt;&amp;#160; return [texture, fbo, texId];&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function createDoubleFBO(texId, w, h, internalFormat, format, type, param) {&lt;br /&gt;&amp;#160; let fbo1 = createFBO(texId, w, h, internalFormat, format, type, param);&lt;br /&gt;&amp;#160; let fbo2 = createFBO(texId + 1, w, h, internalFormat, format, type, param);&lt;/p&gt;
						&lt;p&gt;&amp;#160; return {&lt;br /&gt;&amp;#160; &amp;#160; get read() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; return fbo1;&lt;br /&gt;&amp;#160; &amp;#160; },&lt;br /&gt;&amp;#160; &amp;#160; get write() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; return fbo2;&lt;br /&gt;&amp;#160; &amp;#160; },&lt;br /&gt;&amp;#160; &amp;#160; swap() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; let temp = fbo1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; fbo1 = fbo2;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; fbo2 = temp;&lt;br /&gt;&amp;#160; &amp;#160; } };&lt;/p&gt;
						&lt;p&gt;}&lt;/p&gt;
						&lt;p&gt;const blit = (() =&amp;gt; {&lt;br /&gt;&amp;#160; gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());&lt;br /&gt;&amp;#160; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, -1, 1, 1, 1, 1, -1]), gl.STATIC_DRAW);&lt;br /&gt;&amp;#160; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer());&lt;br /&gt;&amp;#160; gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 0, 2, 3]), gl.STATIC_DRAW);&lt;br /&gt;&amp;#160; gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);&lt;br /&gt;&amp;#160; gl.enableVertexAttribArray(0);&lt;/p&gt;
						&lt;p&gt;&amp;#160; return destination =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; gl.bindFramebuffer(gl.FRAMEBUFFER, destination);&lt;br /&gt;&amp;#160; &amp;#160; gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);&lt;br /&gt;&amp;#160; };&lt;br /&gt;})();&lt;/p&gt;
						&lt;p&gt;let lastTime = Date.now();&lt;br /&gt;multipleSplats(parseInt(Math.random() * 20) + 5);&lt;br /&gt;update();&lt;/p&gt;
						&lt;p&gt;function update() {&lt;br /&gt;&amp;#160; resizeCanvas();&lt;/p&gt;
						&lt;p&gt;&amp;#160; const dt = Math.min((Date.now() - lastTime) / 1000, 0.016);&lt;br /&gt;&amp;#160; lastTime = Date.now();&lt;/p&gt;
						&lt;p&gt;&amp;#160; gl.viewport(0, 0, textureWidth, textureHeight);&lt;/p&gt;
						&lt;p&gt;&amp;#160; if (splatStack.length &amp;gt; 0)&lt;br /&gt;&amp;#160; multipleSplats(splatStack.pop());&lt;/p&gt;
						&lt;p&gt;&amp;#160; advectionProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(advectionProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1i(advectionProgram.uniforms.uSource, velocity.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1f(advectionProgram.uniforms.dt, dt);&lt;br /&gt;&amp;#160; gl.uniform1f(advectionProgram.uniforms.dissipation, config.VELOCITY_DISSIPATION);&lt;br /&gt;&amp;#160; blit(velocity.write[1]);&lt;br /&gt;&amp;#160; velocity.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1i(advectionProgram.uniforms.uSource, density.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1f(advectionProgram.uniforms.dissipation, config.DENSITY_DISSIPATION);&lt;br /&gt;&amp;#160; blit(density.write[1]);&lt;br /&gt;&amp;#160; density.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; for (let i = 0; i &amp;lt; pointers.length; i++) {&lt;br /&gt;&amp;#160; &amp;#160; const pointer = pointers[i];&lt;br /&gt;&amp;#160; &amp;#160; if (pointer.moved) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; splat(pointer.x, pointer.y, pointer.dx, pointer.dy, pointer.color);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; pointer.moved = false;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; curlProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(curlProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(curlProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; blit(curl[1]);&lt;/p&gt;
						&lt;p&gt;&amp;#160; vorticityProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(vorticityProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(vorticityProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1i(vorticityProgram.uniforms.uCurl, curl[2]);&lt;br /&gt;&amp;#160; gl.uniform1f(vorticityProgram.uniforms.curl, config.CURL);&lt;br /&gt;&amp;#160; gl.uniform1f(vorticityProgram.uniforms.dt, dt);&lt;br /&gt;&amp;#160; blit(velocity.write[1]);&lt;br /&gt;&amp;#160; velocity.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; divergenceProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(divergenceProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(divergenceProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; blit(divergence[1]);&lt;/p&gt;
						&lt;p&gt;&amp;#160; clearProgram.bind();&lt;br /&gt;&amp;#160; let pressureTexId = pressure.read[2];&lt;br /&gt;&amp;#160; gl.activeTexture(gl.TEXTURE0 + pressureTexId);&lt;br /&gt;&amp;#160; gl.bindTexture(gl.TEXTURE_2D, pressure.read[0]);&lt;br /&gt;&amp;#160; gl.uniform1i(clearProgram.uniforms.uTexture, pressureTexId);&lt;br /&gt;&amp;#160; gl.uniform1f(clearProgram.uniforms.value, config.PRESSURE_DISSIPATION);&lt;br /&gt;&amp;#160; blit(pressure.write[1]);&lt;br /&gt;&amp;#160; pressure.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; pressureProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(pressureProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(pressureProgram.uniforms.uDivergence, divergence[2]);&lt;br /&gt;&amp;#160; pressureTexId = pressure.read[2];&lt;br /&gt;&amp;#160; gl.uniform1i(pressureProgram.uniforms.uPressure, pressureTexId);&lt;br /&gt;&amp;#160; gl.activeTexture(gl.TEXTURE0 + pressureTexId);&lt;br /&gt;&amp;#160; for (let i = 0; i &amp;lt; config.PRESSURE_ITERATIONS; i++) {&lt;br /&gt;&amp;#160; &amp;#160; gl.bindTexture(gl.TEXTURE_2D, pressure.read[0]);&lt;br /&gt;&amp;#160; &amp;#160; blit(pressure.write[1]);&lt;br /&gt;&amp;#160; &amp;#160; pressure.swap();&lt;br /&gt;&amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; gradienSubtractProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform2f(gradienSubtractProgram.uniforms.texelSize, 1.0 / textureWidth, 1.0 / textureHeight);&lt;br /&gt;&amp;#160; gl.uniform1i(gradienSubtractProgram.uniforms.uPressure, pressure.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1i(gradienSubtractProgram.uniforms.uVelocity, velocity.read[2]);&lt;br /&gt;&amp;#160; blit(velocity.write[1]);&lt;br /&gt;&amp;#160; velocity.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);&lt;br /&gt;&amp;#160; displayProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform1i(displayProgram.uniforms.uTexture, density.read[2]);&lt;br /&gt;&amp;#160; blit(null);&lt;/p&gt;
						&lt;p&gt;&amp;#160; requestAnimationFrame(update);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function splat(x, y, dx, dy, color) {&lt;br /&gt;&amp;#160; splatProgram.bind();&lt;br /&gt;&amp;#160; gl.uniform1i(splatProgram.uniforms.uTarget, velocity.read[2]);&lt;br /&gt;&amp;#160; gl.uniform1f(splatProgram.uniforms.aspectRatio, canvas.width / canvas.height);&lt;br /&gt;&amp;#160; gl.uniform2f(splatProgram.uniforms.point, x / canvas.width, 1.0 - y / canvas.height);&lt;br /&gt;&amp;#160; gl.uniform3f(splatProgram.uniforms.color, dx, -dy, 1.0);&lt;br /&gt;&amp;#160; gl.uniform1f(splatProgram.uniforms.radius, config.SPLAT_RADIUS);&lt;br /&gt;&amp;#160; blit(velocity.write[1]);&lt;br /&gt;&amp;#160; velocity.swap();&lt;/p&gt;
						&lt;p&gt;&amp;#160; gl.uniform1i(splatProgram.uniforms.uTarget, density.read[2]);&lt;br /&gt;&amp;#160; gl.uniform3f(splatProgram.uniforms.color, color[0] * 0.3, color[1] * 0.3, color[2] * 0.3);&lt;br /&gt;&amp;#160; blit(density.write[1]);&lt;br /&gt;&amp;#160; density.swap();&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function multipleSplats(amount) {&lt;br /&gt;&amp;#160; for (let i = 0; i &amp;lt; amount; i++) {&lt;br /&gt;&amp;#160; &amp;#160; const color = [Math.random() * 10, Math.random() * 10, Math.random() * 10];&lt;br /&gt;&amp;#160; &amp;#160; const x = canvas.width * Math.random();&lt;br /&gt;&amp;#160; &amp;#160; const y = canvas.height * Math.random();&lt;br /&gt;&amp;#160; &amp;#160; const dx = 1000 * (Math.random() - 0.5);&lt;br /&gt;&amp;#160; &amp;#160; const dy = 1000 * (Math.random() - 0.5);&lt;br /&gt;&amp;#160; &amp;#160; splat(x, y, dx, dy, color);&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;function resizeCanvas() {&lt;br /&gt;&amp;#160; if (canvas.width != canvas.clientWidth || canvas.height != canvas.clientHeight) {&lt;br /&gt;&amp;#160; &amp;#160; canvas.width = canvas.clientWidth;&lt;br /&gt;&amp;#160; &amp;#160; canvas.height = canvas.clientHeight;&lt;br /&gt;&amp;#160; &amp;#160; initFramebuffers();&lt;br /&gt;&amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;canvas.addEventListener(&#039;mousemove&#039;, e =&amp;gt; {&lt;br /&gt;&amp;#160; pointers[0].moved = pointers[0].down;&lt;br /&gt;&amp;#160; pointers[0].dx = (e.offsetX - pointers[0].x) * 10.0;&lt;br /&gt;&amp;#160; pointers[0].dy = (e.offsetY - pointers[0].y) * 10.0;&lt;br /&gt;&amp;#160; pointers[0].x = e.offsetX;&lt;br /&gt;&amp;#160; pointers[0].y = e.offsetY;&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;canvas.addEventListener(&#039;touchmove&#039;, e =&amp;gt; {&lt;br /&gt;&amp;#160; e.preventDefault();&lt;br /&gt;&amp;#160; const touches = e.targetTouches;&lt;br /&gt;&amp;#160; for (let i = 0; i &amp;lt; touches.length; i++) {&lt;br /&gt;&amp;#160; &amp;#160; let pointer = pointers[i];&lt;br /&gt;&amp;#160; &amp;#160; pointer.moved = pointer.down;&lt;br /&gt;&amp;#160; &amp;#160; pointer.dx = (touches[i].pageX - pointer.x) * 10.0;&lt;br /&gt;&amp;#160; &amp;#160; pointer.dy = (touches[i].pageY - pointer.y) * 10.0;&lt;br /&gt;&amp;#160; &amp;#160; pointer.x = touches[i].pageX;&lt;br /&gt;&amp;#160; &amp;#160; pointer.y = touches[i].pageY;&lt;br /&gt;&amp;#160; }&lt;br /&gt;}, false);&lt;/p&gt;
						&lt;p&gt;canvas.addEventListener(&#039;mousemove&#039;, () =&amp;gt; {&lt;br /&gt;&amp;#160; pointers[0].down = true;&lt;br /&gt;&amp;#160; pointers[0].color = [Math.random() + 0.2, Math.random() + 0.2, Math.random() + 0.2];&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;canvas.addEventListener(&#039;touchstart&#039;, e =&amp;gt; {&lt;br /&gt;&amp;#160; e.preventDefault();&lt;br /&gt;&amp;#160; const touches = e.targetTouches;&lt;br /&gt;&amp;#160; for (let i = 0; i &amp;lt; touches.length; i++) {&lt;br /&gt;&amp;#160; &amp;#160; if (i &amp;gt;= pointers.length)&lt;br /&gt;&amp;#160; &amp;#160; pointers.push(new pointerPrototype());&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; pointers[i].id = touches[i].identifier;&lt;br /&gt;&amp;#160; &amp;#160; pointers[i].down = true;&lt;br /&gt;&amp;#160; &amp;#160; pointers[i].x = touches[i].pageX;&lt;br /&gt;&amp;#160; &amp;#160; pointers[i].y = touches[i].pageY;&lt;br /&gt;&amp;#160; &amp;#160; pointers[i].color = [Math.random() + 0.2, Math.random() + 0.2, Math.random() + 0.2];&lt;br /&gt;&amp;#160; }&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;window.addEventListener(&#039;mouseleave&#039;, () =&amp;gt; {&lt;br /&gt;&amp;#160; pointers[0].down = false;&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;window.addEventListener(&#039;touchend&#039;, e =&amp;gt; {&lt;br /&gt;&amp;#160; const touches = e.changedTouches;&lt;br /&gt;&amp;#160; for (let i = 0; i &amp;lt; touches.length; i++)&lt;br /&gt;&amp;#160; for (let j = 0; j &amp;lt; pointers.length; j++)&lt;br /&gt;&amp;#160; if (touches[i].identifier == pointers[j].id)&lt;br /&gt;&amp;#160; pointers[j].down = false;&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
						&lt;p&gt;&amp;lt;section id=&#039;container&#039;&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;h1 class=&#039;a-title&#039;&amp;gt;Move the mouse&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;h2 class=&#039;a-second-title&#039;&amp;gt;See the magic&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;canvas&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;/section&amp;gt;&lt;/p&gt;
						&lt;p&gt;[/html]&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Mon, 04 Mar 2024 11:30:34 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=81#p81</guid>
		</item>
		<item>
			<title>Тема для создание бб-шаблона эпизода</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=76#p76</link>
			<description>&lt;p&gt;ББ-код: &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 33em&quot;&gt;&lt;pre&gt;[block=epblock][block=epquote]тут какая-нибудь красивенькая и непонятная цитатка[/block]

[block=eppicture][img]https://upforme.ru/uploads/001b/9d/37/2/899755.webp[/img][/block]

[block=epplayers] 
[hr]
[block=epava][url=https://esymeo.mybb.ru/profile.php?id=2][img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/url][/block]
[hr]
[block=epava][url=https://esymeo.mybb.ru/profile.php?id=2][img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/url][/block]
[hr]
[block=epava] [url=https://esymeo.mybb.ru/profile.php?id=2][img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/url][/block]
[hr]
[/block]
[block=epinfo][block=eptext] [b]ЛОКАЦИЯ, 000 ГОД[/b]
— &amp;#9830; — &amp;#9830; — &amp;#9830; —
[align=left]А тут будет описание эпизода[/align]
[/block][/block]
[block=epappendx]тут мелким шрифтом будет примечание про использование системы и гм[/block]

[/block]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;СТИЛИ: &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;/* Стили для блока .epblock */
.epblock {
    background: #181818; /* Цвет фона */
}

/* Стили для элементов .eppicture, .epplayers, .epappendx, .epquote, .epinfo */
.eppicture, .epplayers, .epappendx, .epquote, .epinfo {
    display: flex;
    align-items: center; /* Центрирование по вертикали */
    justify-content: center; /* Центрирование по горизонтали */
    text-align: center; /* Центрирование текста */
}

/* Стили для .epquote и .epappendx */
.epquote, .epappendx {
    padding: 5px; /* Отступы внутри элементов .epquote и .epappendx */
}

/* Стили для .epquote */
.epquote {
    font-style: italic; /* Курсивный стиль текста */
    color: #856616; /* Цвет текста */
}

/* Стили для изображений в .eppicture */
.eppicture img {
    width: 650px; /* Ширина изображения */
    height: 200px; /* Высота изображения */
    border: 2px #856616 solid; /* Обводка изображения */
    border-radius: 10px; /* Закругление углов изображения */
}

/* Стили для изображений в .eppicture, .epplayers и .epava с эффектом по наведению */
.eppicture img, .epplayers img, .epava {
    transition: all .5s ease-in-out 0s; /* Плавный переход для всех свойств с длительностью 0.5 секунды */
    filter: grayscale(100%); /* Начальный эффект: изображение полностью серое (отфильтрованное) */
}

.eppicture img:hover, .epplayers img:hover, .epava:hover {
    transition: all .5s ease-in-out 0s; /* Плавный переход для всех свойств с длительностью 0.5 секунды при наведении */
    filter: grayscale(0%); /* Эффект при наведении: восстановление цвета изображения */
}

/* Стили для разделительной линии в .epplayers */
.epplayers hr {
    width: 50px; /* Ширина линии */
    border: 1px solid #856616; /* Цвет и толщина линии */
}

/* Стили для изображений в .epplayers */
.epplayers img {
    display: inline-flex; /* Установка изображений внутри контейнера в ряд */
    height: 50px; /* Высота изображения */
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 50% 0%); /* Клип-путь для создания круглой формы */
    -webkit-clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 50% 0%); /* Альтернативный клип-путь для WebKit браузеров */
    border: 4px solid #856616; /* Цвет обводки изображения */
}

/* Стили для .epava */
.epava {
    height: 67px; /* Высота блока .epava */
    padding: 3px; /* Внутренний отступ блока .epava */
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 50% 0%); /* Клип-путь для создания круглой формы */
    -webkit-clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%, 50% 0%); /* Альтернативный клип-путь для WebKit браузеров */
    background: #856616; /* Цвет фона блока .epava */
    margin: 0 30px; /* Внешний отступ блока .epava справа и слева */
}

/* Стили для .epinfo */
.epinfo {
    margin: 10px; /* Внешний отступ блока .epinfo со всех сторон */
}

/* Стили для текстового блока .eptext */
.eptext {
    padding: 15px; /* Внутренний отступ блока .eptext */
    background: #c6bca8 url(http://forumstatic.ru/files/001b/33/a6/40888.png); /* Фон блока .eptext с изображением */
    border: 1px solid #a79c86; /* Цвет и толщина границы блока .eptext */
    box-shadow: 0 0 0 1px #d4c883 inset, 0 0 0 2px #a79c86 inset, 0 2px 10px 0 #aca596, 0 0 15px 0 #afa89a inset; /* Тень блока .eptext */
    border-radius: 10px; /* Закругление углов блока .eptext */
    width: 95%; /* Ширина блока .eptext */
}

/* Стили для .epappendx */
.epappendx {
    font-size: 10px; /* Размер шрифта текста в блоке .epappendx */
    color: #c0c0c0; /* Цвет текста в блоке .epappendx */
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Fri, 29 Dec 2023 02:10:56 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=76#p76</guid>
		</item>
		<item>
			<title>Тема для создания бб-шаблона новостей</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=73#p73</link>
			<description>&lt;p&gt;Коды: &lt;/p&gt;
						&lt;p&gt;ББ-коды: &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;[block=newsblock]

[block=newsheader][size=25][b]&amp;#9679; news #10[/b][/size]
[size=10]на связи ваш админ[/size][/block]
[block=newsava][img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/block]
[block=newstext]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis laoreet leo. Pellentesque bibendum fermentum diam ac mollis. Pellentesque nunc justo, pretium at ultrices ut, faucibus a elit. Nunc consequat, turpis sit amet accumsan rutrum, nunc eros consequat metus, sodales rutrum nulla nunc non eros. Ut elementum non ex sed commodo. Nulla scelerisque orci metus, nec pretium libero congue at. Aenean sit amet ante imperdiet, mattis odio sit amet, interdum tellus. Aenean ut facilisis lorem. Vivamus tincidunt dictum tristique. Phasellus tristique porta massa, vitae sodales orci venenatis eget. Sed efficitur rutrum dolor in semper. Fusce vitae suscipit sapien. Sed finibus diam non euismod lacinia. Vestibulum eget aliquet ex.

Phasellus diam magna, lacinia quis eros eget, vestibulum tincidunt urna. Duis convallis hendrerit leo, vel ornare est rutrum vitae. In laoreet turpis in nibh maximus, ac dapibus quam aliquet. Nullam sit amet velit vel leo euismod efficitur ut et odio. Sed pharetra tincidunt mauris, at dapibus odio sodales sit amet. Donec lacus neque, aliquam eget cursus eget, suscipit ut dolor. Maecenas ac elit et orci vestibulum maximus.

Maecenas consequat est arcu, nec ornare dolor faucibus at. Duis rhoncus imperdiet nibh vel posuere. Proin vehicula urna id rutrum sodales. Pellentesque cursus purus eu augue finibus, et convallis elit placerat. Phasellus ut mi et velit semper porttitor. Nunc diam urna, efficitur eget luctus sit amet, volutpat a metus. Mauris at nisi ac diam gravida pharetra vel sit amet metus. In condimentum sit amet nisl ac rutrum. Curabitur fringilla sem et lacus congue auctor. Aenean rhoncus augue et ante lacinia imperdiet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris tortor eros, efficitur sed mollis vitae, placerat vitae urna. Interdum et malesuada fames ac ante ipsum primis in faucibus.

Mauris interdum mattis sem, a iaculis eros fringilla non. Praesent efficitur luctus fringilla. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin massa ante, rutrum id laoreet et, placerat vitae est. Phasellus volutpat sapien ut sapien bibendum congue ut ut elit. In nec turpis sit amet neque finibus semper. Suspendisse potenti. Curabitur at orci libero.

Nullam scelerisque neque odio, sed tempus sapien sagittis vitae. Integer posuere luctus nibh. Etiam non volutpat tortor, in elementum risus. Donec maximus quam et euismod porta. Sed sollicitudin magna non mi sagittis aliquet. Donec ipsum metus, imperdiet sit amet dictum a, sollicitudin et magna. Phasellus ut odio vel neque consectetur hendrerit. Sed lacus risus, tempus in risus at, consectetur pulvinar lacus. Fusce cursus laoreet nisl, id aliquet dolor maximus in. Etiam id tristique nisi, nec porta dolor. Nulla dapibus, orci a bibendum pharetra, eros elit pharetra metus, in cursus nisi erat vitae nisl. Integer imperdiet nisi sapien, vehicula fermentum justo tempor ac. Curabitur augue eros, aliquam id sagittis sed, molestie sed ligula. Cras efficitur volutpat iaculis. Mauris varius nulla sit amet blandit accumsan.

[align=center][size=30]&amp;#9829;[/size][/align][/block]
[block=newlist]
[block=newlistheader][align=center][b]важности[/b][/align][/block]
[ul]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras quis laoreet leo. Pellentesque bibendum fermentum diam ac mollis. Pellentesque nunc justo, pretium at ultrices ut, faucibus a elit. Nunc consequat, turpis sit amet accumsan rutrum, nunc eros consequat metus, sodales rutrum nulla nunc non eros. Ut elementum non ex sed commodo. Nulla scelerisque orci metus, nec pretium libero congue at. Aenean sit amet ante imperdiet, mattis odio sit amet, interdum tellus. Aenean ut facilisis lorem. Vivamus tincidunt dictum tristique. Phasellus tristique porta massa, vitae sodales orci venenatis eget. Sed efficitur rutrum dolor in semper. Fusce vitae suscipit sapien. Sed finibus diam non euismod lacinia. Vestibulum eget aliquet ex.
Phasellus diam magna, lacinia quis eros eget, vestibulum tincidunt urna. Duis convallis hendrerit leo, vel ornare est rutrum vitae. In laoreet turpis in nibh maximus, ac dapibus quam aliquet. Nullam sit amet velit vel leo euismod efficitur ut et odio. Sed pharetra tincidunt mauris, at dapibus odio sodales sit amet. Donec lacus neque, aliquam eget cursus eget, suscipit ut dolor. Maecenas ac elit et orci vestibulum maximus.
Maecenas consequat est arcu, nec ornare dolor faucibus at. Duis rhoncus imperdiet nibh vel posuere. Proin vehicula urna id rutrum sodales. Pellentesque cursus purus eu augue finibus, et convallis elit placerat. Phasellus ut mi et velit semper porttitor. Nunc diam urna, efficitur eget luctus sit amet, volutpat a metus. Mauris at nisi ac diam gravida pharetra vel sit amet metus. In condimentum sit amet nisl ac rutrum. Curabitur fringilla sem et lacus congue auctor. Aenean rhoncus augue et ante lacinia imperdiet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris tortor eros, efficitur sed mollis vitae, placerat vitae urna. Interdum et malesuada fames ac ante ipsum primis in faucibus.[/ul][/block]

[block=newactive]
[block=newactiveheader][align=center][b]активисты[/b][/align][/block]
[block=newactivecontent]
[block=activeavaleft]
[img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img]
[img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img]
[img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/block]
[block=activeavaright][img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img]
[img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img]
[img]https://forumavatars.ru/img/avatars/001b/9d/37/2-1654298376.jpg[/img][/block]

[block=activequote]Mauris interdum mattis sem, a iaculis eros fringilla non. Praesent efficitur luctus fringilla. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin massa ante, rutrum id laoreet et, placerat vitae est. Phasellus volutpat sapien ut sapien bibendum congue ut ut elit. In nec turpis sit amet neque finibus semper. Suspendisse potenti. Curabitur at orci libero.
[url=https://esymeo.mybb.ru/][читать дальше][/url][/block]

[block=activecouple][align=center][url=https://esymeo.mybb.ru/]Lorem[/url] &amp;amp; [url=https://esymeo.mybb.ru/]Ipsum[/url][/align][/block]

[block=activeep][align=center][url=https://esymeo.mybb.ru/]Lorem Ipsum[/url][/align][/block]

[/block][/block][/block]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;СТИЛИ: &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;/* Общий стиль для блока новостей */
.newsblock {
    width: 70%; /* Ширина блока новостей */
    text-align: justify; /* Выравнивание текста по ширине */
    margin: 0 auto; /* Выравнивание по центру */
    border: 1px solid #e1dfdd; /* Граница блока новостей */
    border-radius: 25px; /* Закругление углов */
    background: #bbbbbb; /* Цвет фона */
    position: relative; /* Относительное позиционирование */
}

/* Стиль заголовка новости */
.newsheader {
    background: #bbbbbb; /* Цвет фона */
    border-radius: 25px; /* Закругление углов */
    padding: 20px 0 0 120px; /* Внутренний отступ сверху, справа, снизу, слева */
    text-transform: uppercase; /* Преобразование текста в верхний регистр */
}

/* Стиль аватара */
.newsava {
    position: absolute; /* Абсолютное позиционирование */
    top: 20px; /* Отступ сверху */
    left: 25px; /* Отступ слева */
}

.newsava img {
    width: 70px; /* Ширина изображения аватара */
    border-radius: 50%; /* Круглый аватар */
    padding: 5px; /* Внутренний отступ */
    border: 1px solid #e1dfdd; /* Граница аватара */
}

/* Стиль текста новости */
.newstext {
    padding: 20px 50px; /* Внутренний отступ сверху, слева, снизу, справа */
    border-radius: 25px 25px 0 0; /* Закругление углов сверху */
    background: #f9f9f9; /* Цвет фона */
    text-indent: 5em; /* Отступ первой строки */
}

/* Стиль списка новости */
.newlist {
    padding: 20px 40px; /* Внутренний отступ сверху, слева, снизу, справа */
    background: #f9f9f9; /* Цвет фона */
    position: relative; /* Относительное позиционирование */
}

.newlist ul li::marker {color: #b7d8f6;} /* Цвет маркера списка */

/* Стиль заголовка списка */
.newlistheader {
    width: 300px; /* Ширина блока заголовка списка */
    height: 30px; /* Высота блока заголовка списка */
    background: #fbfbfb; /* Цвет фона */
    border: 1px solid #e1dfdd; /* Граница блока заголовка списка */
    border-radius: 25px 0 0 25px; /* Закругление углов */
    position: absolute; /* Абсолютное позиционирование */
    right: 0; /* Прижимание к правому краю */
    top: -20px; /* Поднятие наверх на 20px */
}

.newlistheader span, .newactiveheader span, .activecouple span, .activeep span {line-height: 30px;} /* Высота строки */

/* Стиль блока активных новостей */
.newactive {
    background: #f9f9f9; /* Цвет фона */
    padding: 30px 80px; /* Внутренний отступ сверху, слева, снизу, справа */
    position: relative; /* Относительное позиционирование */
    margin-bottom: 60px; /* Внешний отступ снизу */
}

/* Стиль заголовка блока активных новостей слева */
.newactiveheader {
    width: 300px; /* Ширина блока заголовка */
    height: 30px; /* Высота блока заголовка */
    background: #fbfbfb; /* Цвет фона */
    border: 1px solid #e1dfdd; /* Граница блока заголовка */
    border-radius: 0 25px 25px 0; /* Закругление углов */
    position: absolute; /* Абсолютное позиционирование */
    left: 0; /* Прижимание к левому краю */
    top: -20px; /* Поднятие наверх на 20px */
}

/* Стиль контента блока активных новостей */
.newactivecontent {
    border-radius: 25px; /* Закругление углов */
    border: 1px solid #e1dfdd; /* Граница блока */
    padding: 0 40px; /* Внутренний отступ сверху, слева, снизу, справа */
    position: relative; /* Относительное позиционирование */
}

/* Стиль аватаров в блоке активных новостей */
.activeavaleft, .activeavaright {position: absolute; top: 10px;} /* Позиционирование аватаров */
.activeavaleft {left: -20px;} /* Отступ слева */
.activeavaright {right: -20px;} /* Отступ справа */

.activeavaleft img, .activeavaright img {
    width: 40px; /* Ширина изображения аватара */
    border-radius: 50%; /* Круглый аватар */
    border: 1px solid #f9f9f9; /* Граница аватара */
}

/* Стиль цитаты в блоке активных новостей */
.activequote {
    border: 1px solid #e1dfdd; /* Граница блока цитаты */
    border-radius: 0 0 25px 25px; /* Закругление углов снизу */
    padding: 5px 10px; /* Внутренний отступ сверху, слева, снизу, справа */
    font-size: 10px; /* Размер шрифта */
}

/* Стиль блока пары в блоке активных новостей */
.activecouple {
    margin: 10px 0; /* Внешний отступ сверху и снизу */
    height: 30px; /* Высота блока */
    border: 1px solid #e1dfdd; /* Граница блока */
    border-radius: 25px; /* Закругление углов */
}

/* Стиль блока эпизода в блоке активных новостей */
.activeep {
    height: 30px; /* Высота блока */
    border: 1px solid #e1dfdd; /* Граница блока */
    border-radius: 25px 25px 0 0; /* Закругление углов сверху */
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Tue, 12 Dec 2023 16:11:26 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=73#p73</guid>
		</item>
		<item>
			<title>Тестовая тема для хтмл</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=67#p67</link>
			<description>&lt;p&gt;[html]&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;.container {&lt;br /&gt;&amp;#160; display: grid;&lt;br /&gt;&amp;#160; place-items: center;&lt;br /&gt;&amp;#160; height: 100%;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner, .spinner__won {&lt;br /&gt;&amp;#160; position: relative;&lt;br /&gt;&amp;#160; overflow-x: hidden;&lt;br /&gt;&amp;#160; background-color: white;&lt;br /&gt;&amp;#160; box-shadow: 0px 5px 7px -2px rgba(0, 0, 0, 0.4);&lt;br /&gt;&amp;#160; border-radius: 5px;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner {&lt;br /&gt;&amp;#160; max-width: 610px;&lt;br /&gt;&amp;#160; min-width: 610px;&lt;br /&gt;&amp;#160; border-top: 5px solid black;&lt;br /&gt;&amp;#160; border-bottom: 5px solid black;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner__won {&lt;br /&gt;&amp;#160; max-width: 590px;&lt;br /&gt;&amp;#160; min-width: 590px;&lt;br /&gt;&amp;#160; padding: 3px 10px;&lt;br /&gt;&amp;#160; font-size: 24px;&lt;br /&gt;&amp;#160; letter-spacing: 12px;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner-items {&lt;br /&gt;&amp;#160; position: relative;&lt;br /&gt;&amp;#160; display: inline-flex;&lt;br /&gt;&amp;#160; margin: 0;&lt;br /&gt;&amp;#160; padding: 0;&lt;br /&gt;&amp;#160; margin-left: -246px;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner__marker {&lt;br /&gt;&amp;#160; position: absolute;&lt;br /&gt;&amp;#160; height: 100%;&lt;br /&gt;&amp;#160; width: 3px;&lt;br /&gt;&amp;#160; background-color: yellow;&lt;br /&gt;&amp;#160; transform: translateX(-50%);&lt;br /&gt;&amp;#160; left: 50%;&lt;br /&gt;&amp;#160; top: 0;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.spinner-items__item {&lt;br /&gt;&amp;#160; display: block;&lt;br /&gt;&amp;#160; list-style-type: none;&lt;br /&gt;&amp;#160; padding: 32px 0;&lt;br /&gt;&amp;#160; font-size: 32px;&lt;br /&gt;&amp;#160; color: #c2c2c2;&lt;br /&gt;&amp;#160; border-left: 5px solid black;&lt;br /&gt;&amp;#160; width: 117px;&lt;br /&gt;&amp;#160; max-width: 117px;&lt;br /&gt;&amp;#160; overflow: hidden;&lt;br /&gt;&amp;#160; text-align: center;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.button3 {&lt;br /&gt;&amp;#160; padding: 21px 46px;&lt;br /&gt;&amp;#160; border-radius: 10px;&lt;br /&gt;&amp;#160; border: none;&lt;br /&gt;&amp;#160; box-shadow: 0px 5px 7px -2px rgba(0, 0, 0, 0.4);&lt;br /&gt;&amp;#160; cursor: pointer;&lt;br /&gt;&amp;#160; background-color: white;&lt;br /&gt;&amp;#160; transition: box-shadow 300ms ease;&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.button3:hover {&lt;br /&gt;&amp;#160; box-shadow: 0px 2.5px 3.5px -1px rgba(0, 0, 0, 0.2);&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;.win {&lt;br /&gt;&amp;#160; background-color: lemonchiffon;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;/*&lt;br /&gt; * Emoji Spinner inspired by CS:GO Case Opening&lt;br /&gt; *&lt;br /&gt; * I know, the code&#039;s a mess. I hope in a few years I&#039;ll look back at this and laugh.&lt;br /&gt; * But for now, I&#039;m actually proud of this monster.&lt;br /&gt; * &lt;br /&gt; * With a bit of front-end sprinkles it ain&#039;t that bad!&lt;br /&gt; *&lt;br /&gt; * If you&#039;re re-using this code. Please refer this as your source.&lt;br /&gt; * Give credit where it&#039;s due. With a comment in the code for example. &lt;br /&gt; */&lt;/p&gt;
						&lt;p&gt;class SpinnerAnimation {&lt;br /&gt;&amp;#160; &amp;#160; constructor({container, list}) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.tickSound = new Audio(&amp;quot;h-ttps://freesound.org/data/previews/269/269026_5094889-lq.mp3&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.tickSound.playbackRate = 4;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.winSound = new Audio(&amp;quot;h-ttps://freesound.org/data/previews/511/511484_6890478-lq.mp3&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.firstRound = true;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; this.reset();&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; this.spinnerContainer = document.getElementById(container);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.spinnerList = spinnerContainer.children.namedItem(list);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.spinnerMarker = spinnerContainer.children.namedItem(&amp;quot;spinnerMarker&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.spinnerItems = this.spinnerList.children;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; this.spinnerWon = document.getElementById(&amp;quot;spinnerWon&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; reset() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.started = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.stopped = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.stopAnimation = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.lowerSpeed = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.ticks = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.recycle = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.tick = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.state = null;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.speed = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.winningItem = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.firstRound = false;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; start(speed = 1200) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.started = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.speed = speed;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; console.log(this.speed);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.loop();&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; loop() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let dt = 0; // Delta Time is the amount of time between two frames&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let last = 0; // Last time of frame&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // The Animation Loop&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; function loop(ms) {&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.recycle) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.recycle = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const item = spinnerList.firstElementChild;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; spinnerList.append(item);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.tick) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.tick = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.tickSound.play();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet += this.speed * dt;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const ct = ms / 1000; // MS == The amount of Milliseconds the animation is already going for. Divided by 1000 is the amount of seconds&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; dt = ct - last;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; last = ct;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Move the item to the left&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.spinnerList.style.right = this.offSet + &amp;quot;px&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.offSet &amp;gt;= 122 ) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.recycle = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.tick = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.ticks += 1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.ticks &amp;gt;= 20 &amp;amp;&amp;amp; (Math.random() * 10) &amp;gt;= 5) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.stop();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.stopped) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let stopped = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(!stopped) this.speed -= this.lowerSpeed;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.speed &amp;lt;= 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; stopped = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.speed = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(stopped) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.offSet &amp;gt;= 58.6) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet += 6;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet -= 6;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.offSet &amp;gt;= 122 || this.offSet &amp;lt;= 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.stopAnimation = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.winSound.play();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.offSet &amp;gt;= 122) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.winningItem = 5;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.spinnerItems.item(5).classList.add(&amp;quot;win&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.spinnerWon.innerText += this.spinnerItems.item(5).innerText;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet = 122;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(this.offSet &amp;lt;= 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.winningItem = 4;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.spinnerItems.item(4).classList.add(&amp;quot;win&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.spinnerWon.innerText += this.spinnerItems.item(4).innerText;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; this.offSet = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if(!this.stopAnimation) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; requestAnimationFrame(loop);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // Bind Class to loop function&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; loop = loop.bind(this);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; requestAnimationFrame(loop);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; stop() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.stopped = true;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // Calculate a random lower speed&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; this.lowerSpeed = Math.ceil(Math.random() * 10) + 1;&lt;br /&gt;&amp;#160; &amp;#160; }&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;const startSpinnerBtn = document.getElementById(&amp;quot;startSpinner&amp;quot;);&lt;/p&gt;
						&lt;p&gt;const animation = new SpinnerAnimation({&lt;br /&gt;&amp;#160; &amp;#160; container: &amp;quot;spinnerContainer&amp;quot;,&lt;br /&gt;&amp;#160; &amp;#160; list: &amp;quot;spinnerList&amp;quot;&lt;br /&gt;});&lt;/p&gt;
						&lt;p&gt;startSpinnerBtn.addEventListener(&amp;quot;click&amp;quot;, (e) =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; if(animation.started == &amp;quot;ready&amp;quot;) { return; }&lt;br /&gt;&amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; if(!animation.firstRound) animation.spinnerItems.item(animation.winningItem).classList.remove(&amp;quot;win&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; animation.reset();&lt;br /&gt;&amp;#160; &amp;#160; animation.start();&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;div class=&amp;quot;spinner&amp;quot; id=&amp;quot;spinnerContainer&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;ul class=&amp;quot;spinner-items&amp;quot; id=&amp;quot;spinnerList&amp;quot;&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;8&amp;quot;&amp;gt;&amp;#128054;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;9&amp;quot;&amp;gt;&amp;#128055;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;1&amp;quot;&amp;gt;&amp;#128056;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;2&amp;quot;&amp;gt;&amp;#128057;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;3&amp;quot;&amp;gt;&amp;#128053;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;4&amp;quot;&amp;gt;&amp;#128048;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;5&amp;quot;&amp;gt;&amp;#128045;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;6&amp;quot;&amp;gt;&amp;#128046;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;lt;li class=&amp;quot;spinner-items__item&amp;quot; id=&amp;quot;7&amp;quot;&amp;gt;&amp;#128040;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;spinner__marker&amp;quot; id=&amp;quot;spinnerMarker&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;div class=&amp;quot;spinner__won&amp;quot; id=&amp;quot;spinnerWon&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;#160; &amp;lt;div class=&amp;quot;button3&amp;quot; id=&amp;quot;startSpinner&amp;quot;&amp;gt;Spin Emoji!&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;[/html]&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Tue, 09 May 2023 14:48:36 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=67#p67</guid>
		</item>
		<item>
			<title>тестовая тема 2</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=41#p41</link>
			<description>&lt;p&gt;/&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Sun, 12 Feb 2023 14:05:02 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=41#p41</guid>
		</item>
		<item>
			<title>Тестовое сообщение</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=9#p9</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;Esymeo написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Благодарим за выбор нашего сервиса!&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Fri, 03 Jun 2022 20:43:45 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=9#p9</guid>
		</item>
		<item>
			<title>Lorem Ipsum</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=4#p4</link>
			<description>&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in justo quis neque auctor tristique nec eget nulla. Duis et ante porttitor, efficitur justo eu, tempus lectus. Nunc id egestas sem. Cras et vulputate lorem. Duis placerat tellus eget enim rhoncus egestas. Vestibulum non posuere felis. Duis a felis ac mi sagittis blandit. Maecenas eleifend accumsan libero a finibus. Nulla faucibus dui diam, nec fermentum risus lobortis sit amet. In ut mauris sed lectus pellentesque scelerisque sit amet sed ex. Fusce placerat lacus lacus, at rutrum purus aliquam ut. Morbi egestas rhoncus vulputate. Vivamus ut nisi hendrerit, suscipit massa in, malesuada purus.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Sat, 21 May 2022 19:57:41 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=4#p4</guid>
		</item>
		<item>
			<title>Lorem Ipsum</title>
			<link>http://esymeo.mybb.ru/viewtopic.php?pid=3#p3</link>
			<description>&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in justo quis neque auctor tristique nec eget nulla. Duis et ante porttitor, efficitur justo eu, tempus lectus. Nunc id egestas sem. Cras et vulputate lorem. Duis placerat tellus eget enim rhoncus egestas. Vestibulum non posuere felis. Duis a felis ac mi sagittis blandit. Maecenas eleifend accumsan libero a finibus. Nulla faucibus dui diam, nec fermentum risus lobortis sit amet. In ut mauris sed lectus pellentesque scelerisque sit amet sed ex. Fusce placerat lacus lacus, at rutrum purus aliquam ut. Morbi egestas rhoncus vulputate. Vivamus ut nisi hendrerit, suscipit massa in, malesuada purus.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Спойлер&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in justo quis neque auctor tristique nec eget nulla. Duis et ante porttitor, efficitur justo eu, tempus lectus. Nunc id egestas sem. Cras et vulputate lorem. Duis placerat tellus eget enim rhoncus egestas. Vestibulum non posuere felis. Duis a felis ac mi sagittis blandit. Maecenas eleifend accumsan libero a finibus. Nulla faucibus dui diam, nec fermentum risus lobortis sit amet. In ut mauris sed lectus pellentesque scelerisque sit amet sed ex. Fusce placerat lacus lacus, at rutrum purus aliquam ut. Morbi egestas rhoncus vulputate. Vivamus ut nisi hendrerit, suscipit massa in, malesuada purus.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in justo quis neque auctor tristique nec eget nulla. Duis et ante porttitor, efficitur justo eu, tempus lectus. Nunc id egestas sem. Cras et vulputate lorem. Duis placerat tellus eget enim rhoncus egestas. Vestibulum non posuere felis. Duis a felis ac mi sagittis blandit. Maecenas eleifend accumsan libero a finibus. Nulla faucibus dui diam, nec fermentum risus lobortis sit amet. In ut mauris sed lectus pellentesque scelerisque sit amet sed ex. Fusce placerat lacus lacus, at rutrum purus aliquam ut. Morbi egestas rhoncus vulputate. Vivamus ut nisi hendrerit, suscipit massa in, malesuada purus.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin in justo quis neque auctor tristique nec eget nulla. Duis et ante porttitor, efficitur justo eu, tempus lectus. Nunc id egestas sem. Cras et vulputate lorem. Duis placerat tellus eget enim rhoncus egestas. Vestibulum non posuere felis. Duis a felis ac mi sagittis blandit. Maecenas eleifend accumsan libero a finibus. Nulla faucibus dui diam, nec fermentum risus lobortis sit amet. In ut mauris sed lectus pellentesque scelerisque sit amet sed ex. Fusce placerat lacus lacus, at rutrum purus aliquam ut. Morbi egestas rhoncus vulputate. Vivamus ut nisi hendrerit, suscipit massa in, malesuada purus.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Esymeo)</author>
			<pubDate>Sat, 21 May 2022 19:56:11 +0300</pubDate>
			<guid>http://esymeo.mybb.ru/viewtopic.php?pid=3#p3</guid>
		</item>
	</channel>
</rss>
