Files
mybb-april-fools/dist/april-fools.js
T

334 lines
120 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*!
* mybb-april-fools 1.1.0 (21.03.2024)
* https://forumd.ru/viewtopic.php?id=7372
* Система первоапрельских розыгрышей для форумов MyBB
* @author kozhilya
* @license https://forumd.ru/viewtopic.php?id=5751#rule
*/
/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./src/html/button.html":
/*!******************************!*\
!*** ./src/html/button.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<button class=\\\"april-fools__button\\\">🎉</button>\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/button.html?");
/***/ }),
/***/ "./src/html/styles.html":
/*!******************************!*\
!*** ./src/html/styles.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<style class=\\\"april-fools__styles\\\">\\r\\n .april-fools__button {\\r\\n position: fixed;\\r\\n bottom: 0.2rem;\\r\\n right: 0.2rem;\\r\\n padding: 0;\\r\\n font-size: 3rem;\\r\\n border: 0 solid;\\r\\n background: transparent none;\\r\\n opacity: 0.3;\\r\\n transition: 0.4s all;\\r\\n cursor: pointer;\\r\\n }\\r\\n .april-fools__button:hover {\\r\\n opacity: 1;\\r\\n }\\r\\n .april-fools__joke-row {\\r\\n border-bottom: 1px solid black;\\r\\n }\\r\\n .april-fools__joke-row:first-of-type {\\r\\n border-top: 1px solid black;\\r\\n }\\r\\n .april-fools__joke {\\r\\n display: flex;\\r\\n flex-flow: row wrap;\\r\\n padding: 10px;\\r\\n opacity: 0.5;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n gap: 1ch;\\r\\n cursor: pointer;\\r\\n }\\r\\n .april-fools__joke:hover {\\r\\n text-shadow: 0 0 black;\\r\\n }\\r\\n .april-fools__joke:before {\\r\\n display: block;\\r\\n flex: 0 0 2ch;\\r\\n text-align: center;\\r\\n content: \\\"✔\\\";\\r\\n opacity: 0;\\r\\n }\\r\\n input.april-fools__joke-input:checked + .april-fools__joke {\\r\\n opacity: 1;\\r\\n }\\r\\n input.april-fools__joke-input:checked + .april-fools__joke:before {\\r\\n opacity: 1;\\r\\n }\\r\\n .april-fools__joke .april-fools__joke-title {\\r\\n flex: 1 auto;\\r\\n font-weight: bold;\\r\\n }\\r\\n .april-fools__joke .april-fools__joke-description {\\r\\n flex: 1 auto;\\r\\n text-align: right;\\r\\n }\\r\\n .april-fools__joke .april-fools__joke-chance {\\r\\n flex: 0 0 4ch;\\r\\n text-align: right;\\r\\n }\\r\\n .april-fools__content .april-fools__reset-button {\\r\\n display: block;\\r\\n margin: 10px auto;\\r\\n }\\r\\n</style>\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/styles.html?");
/***/ }),
/***/ "./src/html/window.html":
/*!******************************!*\
!*** ./src/html/window.html ***!
\******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"<div class=\\\"april-fools__content\\\">\\r\\n <div class=\\\"april-fools__jokes\\\"></div>\\r\\n\\r\\n <button class=\\\"april-fools__reset-button\\\">\\r\\n Вернуться к настройкам форума (страница будет перезагружена!)\\r\\n </button>\\r\\n</div>\\r\\n<template class=\\\"april-fools__template\\\" id=\\\"april-fools__window-row\\\">\\r\\n <div class=\\\"april-fools__joke-row\\\">\\r\\n <input\\r\\n type=\\\"checkbox\\\"\\r\\n class=\\\"april-fools__joke-input\\\"\\r\\n name=\\\"april-fools__joke-${joke.id}\\\"\\r\\n id=\\\"april-fools__joke-${joke.id}\\\"\\r\\n style=\\\"display: none\\\"\\r\\n />\\r\\n <label class=\\\"april-fools__joke\\\" for=\\\"april-fools__joke-${joke.id}\\\">\\r\\n <span class=\\\"april-fools__joke-title\\\">${joke.title}</span>\\r\\n <span class=\\\"april-fools__joke-description\\\">${joke.description}</span>\\r\\n <span class=\\\"april-fools__joke-chance\\\">${joke.settings.chance}%</span>\\r\\n </label>\\r\\n </div>\\r\\n</template>\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/window.html?");
/***/ }),
/***/ "./src/types/html.d.ts":
/*!*****************************!*\
!*** ./src/types/html.d.ts ***!
\*****************************/
/***/ (() => {
eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/html.d.ts?");
/***/ }),
/***/ "./src/types/mybb.d.ts":
/*!*****************************!*\
!*** ./src/types/mybb.d.ts ***!
\*****************************/
/***/ (() => {
eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/mybb.d.ts?");
/***/ }),
/***/ "./src/common.ts":
/*!***********************!*\
!*** ./src/common.ts ***!
\***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ debug: () => (/* binding */ debug),\n/* harmony export */ enableDebug: () => (/* binding */ enableDebug),\n/* harmony export */ getTextNodes: () => (/* binding */ getTextNodes)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Получение всех элементов, являющимися TextNode.\n * Используется некоторыми шутками для уменьшения\n * влияния на существующее DOM-дерево.\n *\n * @param {HTMLElement | JQuery<HTMLElement> | JQuery.Selector} root\n * Элемет, у которого необходимо найти текстовые ноды\n *\n * @return {JQuery<HTMLElement | Text | Comment | Document>}\n */\nfunction getTextNodes(root) {\n // Это очень странный код, но надо успокоить ESLint\n const $root = (typeof root === 'string') ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(root) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(root);\n return $root.\n find('*').\n contents().\n filter((_, node) => node.nodeType === Node.TEXT_NODE);\n}\nlet debugEnabled = ((scriptElement) => {\n if (!(scriptElement instanceof HTMLScriptElement)) {\n return false;\n }\n return !/\\.min\\.js$/.test(scriptElement.src);\n})(document.currentScript);\n/**\n * Отоброзить отладочное сообщение\n */\nfunction debug(...data) {\n if (!debugEnabled)\n return;\n console.log(...data);\n}\n/**\n * Включить отладку\n */\nfunction enableDebug() {\n debugEnabled = true;\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/common.ts?");
/***/ }),
/***/ "./src/data/stupid_title_variants.ts":
/*!*******************************************!*\
!*** ./src/data/stupid_title_variants.ts ***!
\*******************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StupidTitleDefaultVariants: () => (/* binding */ StupidTitleDefaultVariants)\n/* harmony export */ });\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n\n/**\n * Метод, генерирующий стандартный список слов\n * @param {StupidTitleVariants} vars\n */\nfunction StupidTitleDefaultVariants(vars) {\n vars.adj = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'адекватный,$адский,активный,алчный,%ангельский,банальный,безнадёжный,$бесполезный,былой,верный,виртуальный,вкусный,воспитанный,выгодный,выходной,гигантский,$глупый,гордый,грамотный,громадный,грубый,далекий,двуличный,деятельный,доброжелательный,$жалкий,жёсткий,жестокий,$жирный,заинтересованный,запасной,застенчивый,знакомый,иностранный,истинный,конструктивный,креативный,ласковый,любимый,мелочный,^мирный,мстительный,небесный,невозможный,независимый,низкий,нужный,объективный,обыкновенный,опрятный,^оригинальный,особенный,острый,откровенный,открытый,пестрый,повседневный,подземный,пожилой,показательный,последний,посторонний,провинциальный,пышный,робкий,родной,самовлюблённый,северный,седой,семейный,серьёзный,сногсшибательный,^солнечный,спокойный,суровый,терпеливый,уверенный в себе,ударный,^удачливый,формальный,хладнокровный,целый,чистый,чрезвычайный,чужой,южный')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'адекватная,$адская,активная,алчная,%ангельская,банальная,безнадёжная,$бесполезная,былая,верная,виртуальная,вкусная,воспитанная,выгодная,выходная,гигантская,$глупая,гордая,грамотная,громадная,грубая,далекая,двуличная,деятельная,доброжелательная,$жалкая,жёсткая,жестокая,$жирная,заинтересованная,запасная,застенчивая,знакомая,иностранная,истинная,конструктивная,креативная,ласковая,любимая,мелочная,^мирная,мстительная,небесная,невозможная,независимая,низкая,нужная,объективная,обыкновенная,опрятная,^оригинальная,особенная,острая,откровенная,открытая,пестрая,повседневная,подземная,пожилая,показательная,последняя,посторонняя,провинциальная,пышная,робкая,родная,самовлюблённая,северная,седая,семейная,серьезная,сногсшибательная,^солнечная,спокаяная,суровая,терпеливая,уверенная в себе,ударная,^удачливая,формальная,хладнокровная,целая,чистая,чрезвычайная,чужая,южная')), vars.adj);\n vars.noun = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'актёр,$балбес,бард,басурманин,борец,бродяга,бруталище,волк,дворф,%дед,%дедушка,джентльмен,диван,динозавр,дракон,ёж,%ёжик,жук,зайц,$злоумышленник,зомби,карасик,кентавр,кит,кот,кролик,кулак,лев,ледник,лесоруб,%мальчег,мальчик,манекен,массажист,мачо,монах,монстр,наследник,ниндзя,носорог,одиночка,организм,орёл,отец,принц,проказник,пузырь,$раб,рыцарь,спортсмен,сурикат,сын,%сынок,тигр,товарищ,хоббит,эльф')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'актриса,акула,$бабка,бабочка,%бабушка,бактерия,белочка,бусинка,валькирия,$ведьма,волторна,волчица,горгулья,дворфиха,девочка,деревяшка,детка,%деффачка,%дочка,дочь,заноза,$злоумышленница,знаменитость,каруселька,килька,конфетка,косточка,кошка,красотка,крышка,леди,$личинка,львица,мать,машина,милашка,монашка,мышь,наследница,орлица,панда,пиранья,принцесса,простуда,$рабыня,русалочка,рыбка,рыбка,скамеечка,спортсменка,тигрица,травка,черепашка,чертовка,эльфийка')), vars.noun);\n vars.verb = Object.assign(Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'бежит,берёт и делает,болеет,встаёт,говорит,думает,забывает,замирает,заходит,идёт,%имеет план и придерживается его,ловит,меняется,молчит,нарушает,оглядывается,орёт,освобождает,отвечает,отказаться куда-то идти,отказывается,отказывается вставать,отказывается что-то делать,оформляет,плывёт,поглядывает,поздравляет,поздравляет,получает,прибывает,приказывает,просыпается,прощает,работает,радуется,скрывается,снимает,снимает,снимается в сериале,снимается в фильме,собирается,соединяет,спрашивает,тянет,указывает,учит,читает,что-то скрывает,чувствует опасность,шепчет')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'взял и сделал,додумался,женился,женится,заработался,не спал,не успел,обиделся,познал дзен,присел,проснулся,скрылся,смог,успел')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'взяла и сделала,выходит замуж,вышла замуж,додумалась,заработалась,не спала,не успела,обиделась,познала дзен,присела,проснулась,скрылась,смогла,успела')), vars.verb);\n vars.place = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'в джунглях,в квартире,в космосе,в лесу,в очереди,в пустыне,в театре,%в тёплой и уютной квартире,в филармонии,где-то,на заснеженной вершине,на конференции,на пляже,на форуме,под водой,под дождём,%под проливным дождём')), vars.place);\n vars.adv = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'безрассудно,быстро,внезапно,вновь,$грубо,грустно,медленно,%молниеносно,немедленно,опять,осмысленно,позже,предсказуемо,расчётливо,регулярно,счастливо,уже,уныло')), vars.adv);\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/data/stupid_title_variants.ts?");
/***/ }),
/***/ "./src/joke.ts":
/*!*********************!*\
!*** ./src/joke.ts ***!
\*********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Joke: () => (/* binding */ Joke),\n/* harmony export */ JokeSettings: () => (/* binding */ JokeSettings),\n/* harmony export */ StoppableJoke: () => (/* binding */ StoppableJoke)\n/* harmony export */ });\n/**\n * Объект настроек шутки\n */\nclass JokeSettings {\n constructor() {\n /**\n * Флаг блокировки срабатывания\n */\n this.enabled = true;\n /**\n * Вероятность срабатывания в процентах\n */\n this.chance = 20;\n }\n}\n/**\n * Объект, описывающий шутку\n */\nclass Joke {\n /**\n * Получение полного списка настроек\n */\n get settings() {\n return this._settings;\n }\n /**\n * Запись новых настроек\n *\n * @param {JokeSettings} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const value = entry[1];\n switch (id) {\n case 'name':\n case 'title':\n this.title = value;\n break;\n case 'description':\n this.description = value;\n break;\n default:\n // eslint-disable-next-line\n this._settings[id] = value;\n }\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Разблокировать шутку\n */\n enable() {\n this.settings.enabled = true;\n }\n /**\n * Заблокировать шутку\n */\n disable() {\n this.settings.enabled = false;\n }\n /**\n * Переключить блокировку шутки\n * @param {boolean | null} [value] Новое значение\n */\n toggle(value = null) {\n this.settings.enabled = value === null ? !this.settings.enabled : value;\n }\n}\n/**\n * Объект, описывающий шутку, которая может быть остановлена\n */\nclass StoppableJoke extends Joke {\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joke.ts?");
/***/ }),
/***/ "./src/joker.ts":
/*!**********************!*\
!*** ./src/joker.ts ***!
\**********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerClass: () => (/* binding */ JokerClass)\n/* harmony export */ });\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./joke */ \"./src/joke.ts\");\n/* harmony import */ var _ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui */ \"./src/ui.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common */ \"./src/common.ts\");\n\n\n\n\n/**\n * Блок обработки перво-апрельских шуток\n *\n * @author Kozhilya\n */\nclass JokerClass {\n constructor() {\n this.ui = new _ui__WEBPACK_IMPORTED_MODULE_2__.JokerUI(this);\n /**\n * Общие настройки системы\n */\n this.core_settings = new CoreSettings();\n /**\n * Перечисление всех шуток\n */\n this.jokes = {};\n }\n /**\n * Получение полного списка настроек\n */\n get settings() {\n const result = {};\n result['core'] = this.core_settings;\n for (const entries of Object.entries(this.jokes)) {\n const id = entries[0];\n const joke = entries[1];\n result[id] = joke.settings;\n }\n return result;\n }\n /**\n * Запись новых настроек\n *\n * @param {SettingsMap} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const jokeSettings = entry[1];\n const targetSettings = id === 'core' ? this.core_settings : this.jokes[id].settings;\n Object.assign(targetSettings, jokeSettings);\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Добавление шутки\n *\n * @param {Joke} joke Объект шутки\n */\n add(joke) {\n this.jokes[joke.id] = joke;\n }\n /**\n * Регистрация новой шутки\n *\n * @param {string} id Идентификатор шутки\n * @param {JokeHandler} handler Метод, выполняющий шутку\n * @param {JokeSettings | null} [settings] Объект настроек шутки\n * @return {Joke<JokeSettings>} Объект шутки\n */\n addCustom(id, handler, settings = null) {\n const joke = new (class extends _joke__WEBPACK_IMPORTED_MODULE_1__.Joke {\n constructor() {\n super(...arguments);\n this.id = id;\n this.title = 'Пользовательская шутка';\n this.description = 'Для шутки не определено описание';\n this._settings = new _joke__WEBPACK_IMPORTED_MODULE_1__.JokeSettings();\n }\n /**\n * Метод запуска шутки\n */\n start() {\n handler.call(this, this.settings);\n }\n })();\n joke.settings = settings;\n this.add(joke);\n return joke;\n }\n /**\n * Разблокировать систему\n */\n enable() {\n this.core_settings.enabled = true;\n }\n /**\n * Заблокировать систему\n */\n disable() {\n this.core_settings.enabled = false;\n }\n /**\n * Разблокировать все шутки\n */\n enableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].enable();\n }\n }\n /**\n * Заблокировать все шутки\n */\n disableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].disable();\n }\n }\n /**\n * Переключение шутки\n *\n * @param {string} jokeId ID шутки для переключения\n * @param {boolean} state Новое состояние\n */\n toggleJoke(jokeId, state) {\n const joke = this.jokes[jokeId];\n joke.settings.enabled = state;\n if (joke instanceof _joke__WEBPACK_IMPORTED_MODULE_1__.StoppableJoke && !state) {\n joke.stop();\n }\n this.saveUserStates();\n }\n /**\n * Сохранение пользовательских настроек\n */\n saveUserStates() {\n const states = {};\n for (const key of Object.keys(this.jokes)) {\n states[key] = this.jokes[key].settings.enabled;\n }\n fetch('/api.php?' +\n $.param({\n method: 'storage.set',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n value: JSON.stringify(states),\n timer: 24 * 60,\n })).then((_) => { });\n }\n /**\n * Загрузка пользовательских настроек\n */\n async loadUserStates() {\n const response = await fetch('/api.php?' +\n $.param({\n method: 'storage.get',\n user_id: window.UserID,\n key: 'april-fools',\n }));\n const json = await response.json();\n if (json.error) {\n return;\n }\n const data = JSON.parse(json.response.storage.data['april-fools']);\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].settings.enabled = data[key];\n }\n }\n /**\n * Отчистка настроек пользователя\n */\n async clearUserStates() {\n await fetch('/api.php?' +\n $.param({\n method: 'storage.delete',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n }));\n return;\n }\n /**\n * Запуск шутки\n *\n * @param {string} jokeId ID шутки для запуска\n * @param {boolean} [forced] Принудительный запуск\n */\n start(jokeId, forced = false) {\n if (!(jokeId in this.jokes))\n return;\n const joke = this.jokes[jokeId];\n if (!forced && (!joke.settings.enabled || !this.check(joke.settings.chance))) {\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка не включена');\n return;\n }\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка включена');\n joke.start();\n }\n /**\n * Запуск всех шуток\n *\n * @param {boolean} [forced] Принудительный запуск\n */\n startAll(forced = false) {\n for (const key of Object.keys(this.jokes)) {\n this.start(key, forced);\n }\n }\n /**\n * Стандартная проверка 1 апреля\n *\n * @return {boolean} Флаг, должна ли запускаться система\n */\n regularCheck() {\n if (!this.core_settings.enabled) {\n return false;\n }\n if (this.core_settings.testers.indexOf(window.UserID) >= 0) {\n return true;\n }\n const today = new Date();\n const month = today.getMonth() + 1;\n const day = today.getDate();\n if (month !== 4 || day !== 1) {\n return false;\n }\n return this.check(this.core_settings.chance);\n }\n /**\n * Стандартный запуск 1 апреля\n */\n async regularStart() {\n if (!this.regularCheck()) {\n return;\n }\n await this.loadUserStates();\n this.ui.show();\n this.startAll();\n }\n}\n/**\n * Общие правила системы\n */\nclass CoreSettings {\n constructor() {\n this.chance = 100;\n this.enabled = true;\n /**\n * Список пользователей-тестировщиков\n */\n this.testers = [];\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joker.ts?");
/***/ }),
/***/ "./src/jokes/carnival.ts":
/*!*******************************!*\
!*** ./src/jokes/carnival.ts ***!
\*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CarnivalJoke: () => (/* binding */ CarnivalJoke),\n/* harmony export */ CarnivalJokeSettings: () => (/* binding */ CarnivalJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Карнавал**\n *\n * Аватарки приобретают интересные цвета\n *\n * @author Kozhilya\n */\nclass CarnivalJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'carnival';\n this.title = 'Карнавал';\n this.description = 'Аватарки приобретают интересные цвета';\n this._settings = new CarnivalJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const filters = [];\n for (const entry of Object.entries(this.settings.variants)) {\n if (!this.check(this.settings.variant_chance)) {\n continue;\n }\n filters.push(entry[0].replace('{0}', Math.round(Math.random() * entry[1]).toString()));\n }\n if (filters.length > 0) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css({ filter: filters.join(' ') });\n }\n });\n }\n}\n/**\n * Класс настроек для шутки \"Карнавал\"\n */\nclass CarnivalJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 30;\n /**\n * Селектор всех элементов, которые будут перекрашены\n */\n this.selector = 'img[src*=\"/avatars/\"]';\n /**\n * Вероятность применения некоторого фильтра\n */\n this.variant_chance = 20;\n /**\n * Список фильтров и диапозона случайных параметров\n */\n this.variants = {\n 'sepia({0}%)': 100,\n 'saturate({0}%)': 100,\n 'hue-rotate({0}deg)': 360,\n 'invert({0}%)': 100,\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/carnival.ts?");
/***/ }),
/***/ "./src/jokes/crazy_letters.ts":
/*!************************************!*\
!*** ./src/jokes/crazy_letters.ts ***!
\************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrazyLettersJoke: () => (/* binding */ CrazyLettersJoke),\n/* harmony export */ CrazyLettersJokeSettings: () => (/* binding */ CrazyLettersJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Мама, Я сОшЛа С уМа!**\n *\n * иМеНа ЗаБоРчИкОм\n *\n * @author Kozhilya\n */\nclass CrazyLettersJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'crazy_letters';\n this.title = 'Мама, Я сОшЛа С уМа!';\n this.description = 'иМеНа ЗаБоРчИкОм';\n this._settings = new CrazyLettersJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const text = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).text();\n let result = '';\n for (let i = 0; i < text.length; i++) {\n result += text[i][i % 2 ? 'toLowerCase' : 'toUpperCase']();\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this).text(result);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Мама, Я сОшЛа С уМа!\"\n */\nclass CrazyLettersJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.pa-author a';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/crazy_letters.ts?");
/***/ }),
/***/ "./src/jokes/cursor.ts":
/*!*****************************!*\
!*** ./src/jokes/cursor.ts ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CursorEffectsJoke: () => (/* binding */ CursorEffectsJoke),\n/* harmony export */ CursorEffectsJokeSettings: () => (/* binding */ CursorEffectsJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var cursor_effects__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cursor-effects */ \"./node_modules/cursor-effects/dist/esm.js\");\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\n\n/**\n * **Красивый курсор**\n *\n * Эффекты, следующие за курсором\n *\n * @author Tim Holman\n * @link https://tholman.com/cursor-effects/\n */\nclass CursorEffectsJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'cursor_effects';\n this.title = 'Красивый курсор';\n this.description = 'Эффекты, следующие за курсором';\n this._settings = new CursorEffectsJokeSettings();\n }\n /**\n * Разблокировать все варианты курсоров\n */\n enableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = true;\n }\n }\n /**\n * Заблокировать все варианты курсоров\n */\n disableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = false;\n }\n }\n /**\n * Получение веса отдельного эффекта\n * @param {CursorEffectsEnum} effect Тип эффекта\n * @return {number} Значение веса\n * @private\n */\n weight(effect) {\n const s = this.settings.effects[effect];\n return s.enabled ? s.weight : 0;\n }\n /**\n * Получение случайного эффекта\n * @return {CursorEffectsEnum}\n */\n getRandomEffect() {\n const elements = Object.values(CursorEffectsEnum).map((e) => e);\n const totalWeight = elements.reduce((sum, element) => sum + this.weight(element), 0);\n const randomWeight = Math.random() * totalWeight;\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += this.weight(element);\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Запуск шутки\n */\n start() {\n const effect = this.getRandomEffect();\n const settings = this.settings.effects[effect];\n this.active_cursor_effect = resolveCursorEffectsEnum(effect, settings);\n }\n /**\n * Остановка шутки\n */\n stop() {\n this.active_cursor_effect.destroy();\n }\n}\nvar CursorEffectsEnum;\n(function (CursorEffectsEnum) {\n CursorEffectsEnum[\"Rainbow\"] = \"rainbow\";\n CursorEffectsEnum[\"FairyDust\"] = \"fairy_dust\";\n CursorEffectsEnum[\"SpringyEmoji\"] = \"springy_emoji\";\n CursorEffectsEnum[\"Emoji\"] = \"emoji\";\n CursorEffectsEnum[\"Ghost\"] = \"ghost\";\n CursorEffectsEnum[\"Trailing\"] = \"trailing\";\n CursorEffectsEnum[\"TextFlag\"] = \"text_flag\";\n CursorEffectsEnum[\"FollowingDot\"] = \"following_dot\";\n CursorEffectsEnum[\"Bubbles\"] = \"bubbles\";\n CursorEffectsEnum[\"Snowflake\"] = \"snowflake\";\n CursorEffectsEnum[\"Clock\"] = \"clock\";\n})(CursorEffectsEnum || (CursorEffectsEnum = {}));\n/**\n * Получение эффекта\n * @param {CursorEffectsEnum | string} effect Тип эффекта\n * @param {CursorEffectsSetting} options Настройки эффекта\n * @return {CursorEffectsLib.CursorEffectResult}\n */\nfunction resolveCursorEffectsEnum(effect, options) {\n switch (effect) {\n case CursorEffectsEnum.Rainbow:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.rainbowCursor(options);\n case CursorEffectsEnum.FairyDust:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.fairyDustCursor(options);\n case CursorEffectsEnum.SpringyEmoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.springyEmojiCursor(options);\n case CursorEffectsEnum.Emoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.emojiCursor(options);\n case CursorEffectsEnum.Ghost:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.ghostCursor(options);\n case CursorEffectsEnum.Trailing:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.trailingCursor(options);\n case CursorEffectsEnum.TextFlag:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.textFlag(options);\n case CursorEffectsEnum.FollowingDot:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.followingDotCursor(options);\n case CursorEffectsEnum.Bubbles:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.bubbleCursor(options);\n case CursorEffectsEnum.Snowflake:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.snowflakeCursor(options);\n case CursorEffectsEnum.Clock:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.clockCursor(options);\n }\n}\n/**\n * Класс настроек для шутки \"Красивый курсор\"\n */\nclass CursorEffectsJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n this.effects = {\n /**\n * Радужный след за курсором\n */\n [CursorEffectsEnum.Rainbow]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Длина полосы\n */\n this.length = 20;\n /**\n * Ширина полосы\n */\n this.size = 3;\n /**\n * Цвета полос (сверху вниз)\n */\n this.colors = [\n '#9400D3',\n '#4B0082',\n '#0000FF',\n '#00FF00',\n '#FFFF00',\n '#FF7F00',\n '#FF0000',\n ];\n }\n })(),\n /**\n * Цепочка из эмодзи \"на резинке\" под курсором\n */\n [CursorEffectsEnum.SpringyEmoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Висящий эмодзи\n */\n this.emoji = '🤪';\n }\n })(),\n /**\n * Падающие от курсора эмодзи\n */\n [CursorEffectsEnum.Emoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Падающие эмодзи\n */\n this.emoji = ['🔥', '🐬', '🦆'];\n }\n })(),\n /**\n * Падающие от курсора пылинки\n */\n [CursorEffectsEnum.FairyDust]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет пылинок\n */\n this.colors = ['#ff0000', '#00ff00', '#0000ff'];\n }\n })(),\n /**\n * След \"зависших\" курсоров\n */\n [CursorEffectsEnum.Ghost]: new CursorEffectsSetting(),\n /**\n * След курсоров \"на резинке\"\n */\n [CursorEffectsEnum.Trailing]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Количество элементов\n */\n this.particles = 15;\n /**\n * Скорость частиц\n */\n this.rate = 0.4;\n /**\n * Ссылка на картинку с курсором\n * Используйте `null`, что бы использовать картинку курсора по умолчанию\n */\n this.baseImageSrc = null;\n }\n })(),\n /**\n * Текст, развивающийся флагом от курсора\n */\n [CursorEffectsEnum.TextFlag]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Отображаемый текст\n */\n this.text = 'С днём смеха!';\n /**\n * Цвет текста\n */\n this.color = '#000000';\n /**\n * Шрифт текста\n */\n this.font = 'monospace';\n /**\n * Размер текста\n */\n this.textSize = 12;\n /**\n * Растояние между бквами\n */\n this.gap = 14;\n /**\n * Размер... чего-то.\n */\n this.size = 3;\n }\n })(),\n /**\n * Точка, преследующая курсор\n */\n [CursorEffectsEnum.FollowingDot]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет догоняющей точки\n */\n this.color = '#323232a6';\n }\n })(),\n /**\n * Пузырьки от курсора\n */\n [CursorEffectsEnum.Bubbles]: new CursorEffectsSetting(),\n /**\n * Снежинки, летящие от курсора\n *\n * Отключено, потому что сейчас не зима :D\n */\n [CursorEffectsEnum.Snowflake]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n this.weight = 0;\n }\n })(),\n /**\n * Циферблат вокруг курсора\n */\n [CursorEffectsEnum.Clock]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет даты\n */\n this.dateColor = 'blue';\n /**\n * Цвет циферблата\n */\n this.faceColor = 'black';\n /**\n * Цвет секундной стрелки\n */\n this.secondsColor = 'red';\n /**\n * Цвет минутной стрелки\n */\n this.minutesColor = 'black';\n /**\n * Цвет часовой стрелки\n */\n this.hoursColor = 'black';\n }\n })(),\n };\n }\n}\n/**\n * Восстановление класса CursorEffectsLib.DefaultOptions\n */\nclass DefaultOptions {\n}\n/**\n * Класс настроек для курсора\n */\nclass CursorEffectsSetting extends DefaultOptions {\n constructor() {\n super(...arguments);\n /**\n * Флаг возможности срабатывания\n */\n this.enabled = true;\n /**\n * Весовой коэффициент вероятности курсора\n */\n this.weight = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/cursor.ts?");
/***/ }),
/***/ "./src/jokes/humanitarian_hell.ts":
/*!****************************************!*\
!*** ./src/jokes/humanitarian_hell.ts ***!
\****************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HumanitarianHellJoke: () => (/* binding */ HumanitarianHellJoke),\n/* harmony export */ HumanitarianHellJokeSettings: () => (/* binding */ HumanitarianHellJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Ад гуманитария**\n *\n * Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"\n *\n * @author Kozhilya\n */\nclass HumanitarianHellJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'humanitarian_hell';\n this.title = 'Ад гуманитария';\n this.description = 'Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"';\n this._settings = new HumanitarianHellJokeSettings();\n }\n /**\n * Обработка текста\n *\n * @param {string} text Входная строка\n * @return {string} Итоговая строка\n */\n processText(text) {\n return text.replace(/(ть?ся)/g, function (fnd) {\n return fnd.indexOf('ь') > 0 ? 'тся' : 'ться';\n });\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, elem) => {\n elem.textContent = this.processText(elem.textContent);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Ад гуманитария\"\n */\nclass HumanitarianHellJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/humanitarian_hell.ts?");
/***/ }),
/***/ "./src/jokes/inverted_scroll.ts":
/*!**************************************!*\
!*** ./src/jokes/inverted_scroll.ts ***!
\**************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InvertedScrollJoke: () => (/* binding */ InvertedScrollJoke),\n/* harmony export */ InvertedScrollJokeSettings: () => (/* binding */ InvertedScrollJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n\n/**\n * **Обратная гравитация**\n *\n * Скролл в обратную сторону (крутишь вверх, а крутится вниз)\n *\n * @author Идея: Alex_63\n * @author Реализация: Kozhilya\n */\nclass InvertedScrollJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'inverted_scroll';\n this.title = 'Обратная гравитация';\n this.description = 'Скролл в обратную сторону';\n this._settings = new InvertedScrollJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n // let lastScroll = window.scrollY;\n document.addEventListener('wheel', (e) => {\n e.preventDefault();\n scrollBy(0, -e.deltaY);\n }, { passive: false });\n }\n}\n/**\n * Класс настроек для шутки \"Обратная гравитация\"\n */\nclass InvertedScrollJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/inverted_scroll.ts?");
/***/ }),
/***/ "./src/jokes/letter_chaos.ts":
/*!***********************************!*\
!*** ./src/jokes/letter_chaos.ts ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LetterChaosJoke: () => (/* binding */ LetterChaosJoke),\n/* harmony export */ LetterChaosJokeSettings: () => (/* binding */ LetterChaosJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Буквенный хаос**\n *\n * Все буквы в словах, кроме первой и последней, перемешены\n *\n * @author Kozhilya\n */\nclass LetterChaosJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'letter_chaos';\n this.title = 'Буквенный хаос';\n this.description = 'Все буквы в словах, кроме первой и последней, перемешены';\n this._settings = new LetterChaosJokeSettings();\n this.punctuationSymbols = null;\n }\n /**\n * Перемешивание букв в словах\n * @param {string} word\n * @return {string}\n * @private\n */\n shuffleLetters(word) {\n if (word.length < 3 || !this.check(this.settings.shuffle_chance)) {\n return word;\n }\n const characters = word.split('');\n const middleCharacters = characters.slice(1, -1);\n for (let i = middleCharacters.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [middleCharacters[i], middleCharacters[j]] = [\n middleCharacters[j],\n middleCharacters[i],\n ];\n }\n return [\n characters[0],\n ...middleCharacters,\n characters[characters.length - 1],\n ].join('');\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.shuffleLetters(word));\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n}\n/**\n * Класс настроек для шутки \"Буквенный хаос\"\n */\nclass LetterChaosJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n /**\n * Вероятность того, что буквы будут перемешаны\n */\n this.shuffle_chance = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/letter_chaos.ts?");
/***/ }),
/***/ "./src/jokes/mirror.ts":
/*!*****************************!*\
!*** ./src/jokes/mirror.ts ***!
\*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MirrorJoke: () => (/* binding */ MirrorJoke),\n/* harmony export */ MirrorJokeSettings: () => (/* binding */ MirrorJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Зеркало**\n *\n * Элементы форума отражаются (по крайней мере, пытаются)\n *\n * @author Kozhilya\n */\nclass MirrorJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'mirror';\n this.title = 'Зеркало';\n this.description = 'Элементы форума отражаются (по крайней мере, пытаются)';\n this._settings = new MirrorJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post, .post h3, .post-links, .post-author, .post-content')\n .css('transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('filter', 'FlipH')\n .css('-ms-filter', '\"FlipH\"');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-links, .post-links ul, .post h3 span').css('margin-left', '0');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post h3 span').css('margin-right', '25em');\n }\n}\n/**\n * Класс настроек для шутки \"Зеркало\"\n */\nclass MirrorJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 30;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/mirror.ts?");
/***/ }),
/***/ "./src/jokes/shake.ts":
/*!****************************!*\
!*** ./src/jokes/shake.ts ***!
\****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ShakeJoke: () => (/* binding */ ShakeJoke),\n/* harmony export */ ShakeJokeSettings: () => (/* binding */ ShakeJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Форумо-трясение**\n *\n * Страница форума начинает трястись\n *\n * @author Kozhilya\n */\nclass ShakeJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'shake';\n this.title = 'Форумо-трясение';\n this.description = 'Страница форума начинает трястись';\n this._settings = new ShakeJokeSettings();\n this.dataName = 'april-fools-shake';\n }\n /**\n * Выбор случайной амплитуды\n * @param {number} a\n * @return {number}\n */\n rand(a) {\n return a + this.settings.force * (Math.random() * 2 - 1);\n }\n /**\n * Запуск шутки\n */\n start() {\n this.items = jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n data[d] = parseInt(jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d));\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n this.intervalId = setInterval(() => {\n this.items.each((_, elem) => {\n const data = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName);\n for (const entry of Object.entries(data)) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + entry[0], this.rand(entry[1]));\n }\n });\n }, this.settings.interval);\n }\n /**\n * Остновка шутки\n */\n stop() {\n clearInterval(this.intervalId);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d, data[d]);\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Форумо-трясение\"\n */\nclass ShakeJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 1;\n /**\n * Направление тряски (тряска происходит путём изменения перечисленных\n * направлений margin на значение ±force от стандартного значения)\n */\n this.directions = ['top', 'left', 'bottom', 'left'];\n /**\n * Сила тряски - насколько отклоняется элемент от стандартного значения\n */\n this.force = 0.5;\n /**\n * Селектор всех элементов, которые будут трястись\n */\n this.selector = '[id^=pun]';\n /**\n * Частота тряски\n */\n this.interval = 100;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/shake.ts?");
/***/ }),
/***/ "./src/jokes/stupid_title.ts":
/*!***********************************!*\
!*** ./src/jokes/stupid_title.ts ***!
\***********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BuildStupidTitleVariant: () => (/* binding */ BuildStupidTitleVariant),\n/* harmony export */ StupidTitleJoke: () => (/* binding */ StupidTitleJoke),\n/* harmony export */ StupidTitleJokeSettings: () => (/* binding */ StupidTitleJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/stupid_title_variants */ \"./src/data/stupid_title_variants.ts\");\n\n\n\n/**\n * **Глупые статусы**\n *\n * Каждому пользователю даётся новый глупый статус\n *\n * @author Kozhilya\n */\nclass StupidTitleJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'stupid_title';\n this.title = 'Глупые статусы';\n this.description = 'Каждому пользователю даётся новый глупый статус';\n this._settings = new StupidTitleJokeSettings();\n this.loadedGenders = null;\n this.variantsGenerated = false;\n this.seed = 0;\n }\n /**\n * Загрузка полов, если они не определены\n */\n async loadGenders() {\n var _a;\n const names = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a').\n map((_, elem) => elem.innerText).\n toArray().\n reduce((arr, name) => {\n if (arr.indexOf(name) < 0) {\n arr.push(name);\n }\n return arr;\n }, []);\n const url = '/api.php?' +\n jquery__WEBPACK_IMPORTED_MODULE_1___default().param({ method: 'users.get', fields: 'username,sex', username: names });\n const response = await fetch(url);\n const json = await response.json();\n this.loadedGenders = {};\n if (json.error) {\n return;\n }\n (_a = json.response) === null || _a === void 0 ? void 0 : _a.users.forEach((element) => {\n if (element.sex === '0') {\n return;\n }\n this.loadedGenders[element.username] = element.sex === '1';\n });\n }\n /**\n * Разрешение пола по имени\n * @param {string} name\n * @return {boolean}\n */\n resolveGender(name) {\n if (this.settings.gender_resolver !== null) {\n return !!this.settings.gender_resolver.call(this, name);\n }\n if (name in this.loadedGenders) {\n return !!this.loadedGenders[name];\n }\n this.resetSeed();\n return this.selectRandom(name, { m: 1, f: 1 }) === 'm';\n }\n /**\n * Запуск шутки\n */\n async start() {\n if (!this.variantsGenerated) {\n (0,_data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__.StupidTitleDefaultVariants)(this.settings.variants);\n this.variantsGenerated = true;\n }\n await this.loadGenders();\n const cache = {};\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-author').each((_, root) => {\n const name = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a', root).text();\n if (!name) {\n return;\n }\n if (!(name in cache)) {\n this.resetSeed();\n cache[name] = this.generatePhrase(name);\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-title', root).text(cache[name]);\n });\n }\n /**\n * Сгенерировать фразу\n * @param {string} name Имя, кому необходимо сгенерировать фразу\n * @return {string} Итоговая фраза\n */\n generatePhrase(name) {\n const gender = this.resolveGender(name);\n const phrase = this.selectRandom(name, this.settings.schemas);\n return this.capitalizeFirst(phrase.replace(/\\{(.+?)}/g, (_, type) => {\n const variants = this.buildVariants(type, gender);\n return this.selectRandom(name, variants);\n }));\n }\n /**\n * Функция хеширования\n *\n * https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js\n *\n * cyrb53 (c) 2018 bryc (github.com/bryc)\n * A fast and simple hash function with decent collision resistance.\n * Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n * Public domain. Attribution appreciated.\n *\n * @param {string} name Имя\n * @param {number} seed Зерно случайности\n * @param {limit} limit Максимальное значение\n * @return {number} Хеш-значение\n * @private\n */\n prng(name, seed, limit) {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < name.length; i++) {\n ch = name.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^\n Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^\n Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n const value = 4294967296 * (2097151 & h2) + (h1 >>> 0);\n return Math.floor(Math.pow(Math.sin(value), 2) * limit) % limit;\n }\n /**\n * Сброс зерна случайности\n * @private\n */\n resetSeed() {\n const date = new Date();\n const time = date.getUTCHours() * 60 + date.getUTCMinutes();\n if (this.settings.change_frequency === 0) {\n this.seed = time * 60 + date.getUTCSeconds();\n return;\n }\n this.seed = Math.floor(time / this.settings.change_frequency);\n }\n /**\n * Выбор случайного слова\n * @param {string} name\n * @param {StupidTitleWeightedVariants} variants\n * @return {string}\n * @private\n */\n selectRandom(name, variants) {\n const elements = Object.keys(variants);\n const totalWeight = elements.reduce((sum, element) => sum + variants[element], 0);\n const randomWeight = this.prng(name, this.seed++, totalWeight);\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += variants[element];\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Выбор случайной фразы\n * @param {string} type\n * @param {boolean} gender\n * @return {StupidTitleWeightedVariants}\n * @private\n */\n buildVariants(type, gender) {\n const result = {};\n const variants = this.settings.variants[type];\n for (const iterator of Object.entries(variants)) {\n const word = iterator[0];\n const wordSettings = iterator[1];\n if (!wordSettings.enabled || wordSettings.gender === !gender) {\n continue;\n }\n if (!this.settings.rude && wordSettings.rude) {\n continue;\n }\n result[word] = wordSettings.weight;\n }\n return result;\n }\n /**\n * Сделать первую буква слова заглавной\n * @param {string} str Слово\n * @return {string} Исправленное слово\n * @private\n */\n capitalizeFirst(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n}\n/**\n * Класс настроек для шутки \"Глупые статусы\"\n */\nclass StupidTitleJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n /**\n * Определение пола по имени.\n * По умолчанию род устанавливается случайным образом\n *\n * Если установлено значение `null`, система попытается загрузить пол,\n * установленный в настройках аккаунта. Если этот пол определить невозможно,\n * то он будет выбран случайно. Эта настройка позволяет изменить это\n * поведение, если ваш форум обладает ролевой системой, в которой пол\n * определяется иным образом.\n */\n this.gender_resolver = null;\n /**\n * Разрешить возможно оскорбительные варианты\n */\n this.rude = false;\n /**\n * Частота смены статусов (в минутах)\n * Установите значение 0, что бы обновление происходило при\n * каждом обновлении страницы\n */\n this.change_frequency = 5;\n /**\n * Разрешённые схемы формирования статусов\n *\n * {adj} - прилагательное\n * {noun} - имя существительно\n * {verb} - глагол\n * {adv} - наречие\n * {place} - дополнение места\n * {p} - знак препинания\n */\n this.schemas = {\n '{adj} {noun}{p}': 10,\n '{noun} {adj}{p}': 3,\n '{adj}, {adj} {noun}{p}': 10,\n '{adj} и очень {adj} {noun}{p}': 10,\n '{adj} {noun} {verb}{p}': 10,\n '{adj} {noun} {adv} {verb}{p}': 5,\n '{adj} {noun} {verb} {place}{p}': 5,\n '{adj} {noun} {adv} {verb} {place}{p}': 5,\n };\n /**\n * Вариант слов\n * Смотрите раздел описания скрипта, что бы настроить это поле\n */\n this.variants = {\n adj: {},\n noun: {},\n verb: {},\n place: {},\n adv: {},\n p: {\n '': new StupidTitleSetting({ weight: 15 }),\n '.': new StupidTitleSetting({ weight: 10 }),\n '...': new StupidTitleSetting({ weight: 5 }),\n '!': new StupidTitleSetting({ weight: 5 }),\n '!!!': new StupidTitleSetting({ weight: 2 }),\n '?': new StupidTitleSetting({ weight: 2 }),\n '?!': new StupidTitleSetting({ weight: 1 }),\n },\n };\n }\n}\n/**\n * Класс настройки\n */\nclass StupidTitleSetting {\n /**\n * Создание класса\n * @param {StupidTitleSettingInitializer} options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n this.weight = 10;\n this.enabled = true;\n this.rude = false;\n this.gender = null;\n (_a = this.weight) !== null && _a !== void 0 ? _a : (this.weight = options.weight);\n (_b = this.enabled) !== null && _b !== void 0 ? _b : (this.enabled = options.enabled);\n (_c = this.rude) !== null && _c !== void 0 ? _c : (this.rude = options.rude);\n (_d = this.gender) !== null && _d !== void 0 ? _d : (this.gender = options.gender);\n }\n}\n/**\n * Метод создания списка слов\n * @param {boolean | null} gender\n * @param {string} input\n * @return {StupidTitleVariant}\n * @constructor\n */\nfunction BuildStupidTitleVariant(gender, input) {\n const result = {};\n const words = input.split(',').map((word) => word.trim());\n words.forEach((word) => {\n const cleanWord = word.replace(/[^А-ЯЁа-яёA-Za-z\\- ]/g, '');\n if (cleanWord === '') {\n return;\n }\n result[cleanWord] = new StupidTitleSetting({\n gender,\n rude: word.indexOf('$') >= 0,\n enabled: word.indexOf('!') < 0,\n weight: 10 *\n (word.indexOf('$') >= 0 ? 0.5 : 1) *\n (word.indexOf('%') >= 0 ? 0.5 : 1) *\n (word.indexOf('^') >= 0 ? 2 : 1),\n });\n });\n return result;\n}\nwindow.BuildStupidTitleVariant = BuildStupidTitleVariant;\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/stupid_title.ts?");
/***/ }),
/***/ "./src/main.ts":
/*!*********************!*\
!*** ./src/main.ts ***!
\*********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _joker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./joker */ \"./src/joker.ts\");\n/* harmony import */ var _jokes_shake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jokes/shake */ \"./src/jokes/shake.ts\");\n/* harmony import */ var _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jokes/humanitarian_hell */ \"./src/jokes/humanitarian_hell.ts\");\n/* harmony import */ var _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jokes/mirror */ \"./src/jokes/mirror.ts\");\n/* harmony import */ var _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jokes/carnival */ \"./src/jokes/carnival.ts\");\n/* harmony import */ var _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jokes/crazy_letters */ \"./src/jokes/crazy_letters.ts\");\n/* harmony import */ var _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./jokes/letter_chaos */ \"./src/jokes/letter_chaos.ts\");\n/* harmony import */ var _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./jokes/cursor */ \"./src/jokes/cursor.ts\");\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n/* harmony import */ var _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./jokes/inverted_scroll */ \"./src/jokes/inverted_scroll.ts\");\n\n\n\n\n\n\n\n\n\n\nwindow.AprilJokes = ((jokes) => {\n const cl = new _joker__WEBPACK_IMPORTED_MODULE_0__.JokerClass();\n jokes.forEach((CustomJoke) => {\n cl.add(new CustomJoke());\n });\n $(() => cl.regularStart());\n return cl;\n})([\n _jokes_shake__WEBPACK_IMPORTED_MODULE_1__.ShakeJoke,\n _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__.HumanitarianHellJoke,\n _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__.MirrorJoke,\n _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__.CarnivalJoke,\n _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__.CrazyLettersJoke,\n _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__.LetterChaosJoke,\n _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__.CursorEffectsJoke,\n _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__.StupidTitleJoke,\n _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__.InvertedScrollJoke,\n]);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/main.ts?");
/***/ }),
/***/ "./src/ui.ts":
/*!*******************!*\
!*** ./src/ui.ts ***!
\*******************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerUI: () => (/* binding */ JokerUI)\n/* harmony export */ });\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/html.d */ \"./src/types/html.d.ts\");\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_html_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _html_button_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html/button.html */ \"./src/html/button.html\");\n/* harmony import */ var _html_styles_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./html/styles.html */ \"./src/html/styles.html\");\n/* harmony import */ var _html_window_html__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./html/window.html */ \"./src/html/window.html\");\n\n\n\n\n\n\n/**\n * Класс интерфейса настроек\n */\nclass JokerUI {\n /**\n * Создание класса интерфейса настроек\n *\n * @param {JokerClass} joker\n */\n constructor(joker) {\n this.joker = joker;\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('link[rel=\"stylesheet\"]').eq(0).before(_html_styles_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n const button = this.button;\n button.hide();\n button.mybbModal({\n title: 'Настройки первоапрельских шуток',\n content: () => this.render(),\n closer: true,\n noscroll: true,\n escClose: true,\n });\n }\n /**\n * Основная кнопка, открывающая настройки\n * @return {JQuery<HTMLButtonElement>}\n */\n get button() {\n let button = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__button');\n if (button.length === 0) {\n button = jquery__WEBPACK_IMPORTED_MODULE_2___default()(_html_button_html__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).appendTo('body');\n }\n return button;\n }\n /**\n * Показать кнопку настроек\n */\n show() {\n this.button.show();\n }\n /**\n * Создать окно настроек\n * @return {JQuery<HTMLDivElement>}\n */\n render() {\n const result = jquery__WEBPACK_IMPORTED_MODULE_2___default()('<div></div>').html(_html_window_html__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n const rowTemplate = jquery__WEBPACK_IMPORTED_MODULE_2___default()('#april-fools__window-row', result).html();\n const jokeContainer = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__jokes', result);\n for (const joke of Object.values(this.joker.jokes)) {\n const row = jquery__WEBPACK_IMPORTED_MODULE_2___default()(eval('`' + rowTemplate + '`'));\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('input[type=\"checkbox\"]', row)\n .prop('checked', joke.settings.enabled)\n .on('click', (e) => {\n const target = e.currentTarget;\n this.joker.toggleJoke(joke.id, target.checked);\n });\n jokeContainer.append(row);\n }\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('button', result).on('click', async () => {\n await this.joker.clearUserStates();\n window.location.reload();\n });\n return jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__content', result);\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/ui.ts?");
/***/ }),
/***/ "jquery":
/*!*************************!*\
!*** external "jQuery" ***!
\*************************/
/***/ ((module) => {
"use strict";
module.exports = jQuery;
/***/ }),
/***/ "./node_modules/cursor-effects/dist/esm.js":
/*!*************************************************!*\
!*** ./node_modules/cursor-effects/dist/esm.js ***!
\*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bubbleCursor: () => (/* binding */ h),\n/* harmony export */ characterCursor: () => (/* binding */ i),\n/* harmony export */ clockCursor: () => (/* binding */ r),\n/* harmony export */ emojiCursor: () => (/* binding */ c),\n/* harmony export */ fairyDustCursor: () => (/* binding */ e),\n/* harmony export */ followingDotCursor: () => (/* binding */ s),\n/* harmony export */ ghostCursor: () => (/* binding */ l),\n/* harmony export */ rainbowCursor: () => (/* binding */ a),\n/* harmony export */ snowflakeCursor: () => (/* binding */ n),\n/* harmony export */ springyEmojiCursor: () => (/* binding */ t),\n/* harmony export */ textFlag: () => (/* binding */ d),\n/* harmony export */ trailingCursor: () => (/* binding */ o)\n/* harmony export */ });\nfunction t(t){let e,n,i,o,s=t&&t.emoji||\"🤪\",h=t&&t.element,c=h||document.body,l=window.innerWidth,a=window.innerHeight,r={x:l/2,y:l/2},d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",h?(e.style.position=\"absolute\",c.appendChild(e),e.width=c.clientWidth,e.height=c.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=l,e.height=a),n.font=\"16px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\";let t=n.measureText(s),i=document.createElement(\"canvas\"),r=i.getContext(\"2d\");i.width=t.width,i.height=2*t.actualBoundingBoxAscent,r.textAlign=\"center\",r.font=\"16px serif\",r.textBaseline=\"middle\",r.fillText(s,i.width/2,t.actualBoundingBoxAscent),o=i;let A=0;for(A=0;A<7;A++)d[A]=new x(o);c.addEventListener(\"mousemove\",f),c.addEventListener(\"touchmove\",g,{passive:!0}),c.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),p()}function m(t){l=window.innerWidth,a=window.innerHeight,h?(e.width=c.clientWidth,e.height=c.clientHeight):(e.width=l,e.height=a)}function g(t){if(t.touches.length>0)if(h){const e=c.getBoundingClientRect();r.x=t.touches[0].clientX-e.left,r.y=t.touches[0].clientY-e.top}else r.x=t.touches[0].clientX,r.y=t.touches[0].clientY}function f(t){if(h){const e=c.getBoundingClientRect();r.x=t.clientX-e.left,r.y=t.clientY-e.top}else r.x=t.clientX,r.y=t.clientY}function p(){!function(){e.width=e.width,d[0].position.x=r.x,d[0].position.y=r.y;for(let t=1;t<7;t++){let i=new v(0,0);t>0&&w(t-1,t,i),t<6&&w(t+1,t,i);let o,s,h=new v(10*-d[t].velocity.x,10*-d[t].velocity.y),c=new v((i.X+h.X)/1,(i.Y+h.Y)/1+50);d[t].velocity.x+=.01*c.X,d[t].velocity.y+=.01*c.Y,Math.abs(d[t].velocity.x)<.1&&Math.abs(d[t].velocity.y)<.1&&Math.abs(c.X)<.1&&Math.abs(c.Y)<.1&&(d[t].velocity.x=0,d[t].velocity.y=0),d[t].position.x+=d[t].velocity.x,d[t].position.y+=d[t].velocity.y,o=e.clientHeight,s=e.clientWidth,d[t].position.y>=o-11-1&&(d[t].velocity.y>0&&(d[t].velocity.y=.7*-d[t].velocity.y),d[t].position.y=o-11-1),d[t].position.x>=s-11&&(d[t].velocity.x>0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=s-11-1),d[t].position.x<0&&(d[t].velocity.x<0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=0),d[t].draw(n)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),c.removeEventListener(\"mousemove\",f),c.removeEventListener(\"touchmove\",g),c.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function v(t,e){this.X=t,this.Y=e}function w(t,e,n){let i=d[t].position.x-d[e].position.x,o=d[t].position.y-d[e].position.y,s=Math.sqrt(i*i+o*o);if(s>10){let t=10*(s-10);n.X+=i/s*t,n.Y+=o/s*t}}function x(t){this.position={x:r.x,y:r.y},this.velocity={x:0,y:0},this.canv=t,this.draw=function(t){t.drawImage(this.canv,this.position.x-this.canv.width/2,this.position.y-this.canv.height/2,this.canv.width,this.canv.height)}}return u.onchange=()=>{u.matches?y():A()},A(),{destroy:y}}function e(t){let e=t&&t.colors||[\"#D61C59\",\"#E7D84B\",\"#1B8798\"],n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2},l=[],a=[];let r,d,u;const A=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function m(){if(A.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;r=document.createElement(\"canvas\"),d=r.getContext(\"2d\"),r.style.top=\"0px\",r.style.left=\"0px\",r.style.pointerEvents=\"none\",n?(r.style.position=\"absolute\",i.appendChild(r),r.width=i.clientWidth,r.height=i.clientHeight):(r.style.position=\"fixed\",i.appendChild(r),r.width=o,r.height=s),d.font=\"21px serif\",d.textBaseline=\"middle\",d.textAlign=\"center\",e.forEach((t=>{let e=d.measureText(\"*\"),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=e.actualBoundingBoxAscent+e.actualBoundingBoxDescent,i.fillStyle=t,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(\"*\",n.width/2,e.actualBoundingBoxAscent),a.push(n)})),i.addEventListener(\"mousemove\",p),i.addEventListener(\"touchmove\",f,{passive:!0}),i.addEventListener(\"touchstart\",f,{passive:!0}),window.addEventListener(\"resize\",g),v()}function g(t){o=window.innerWidth,s=window.innerHeight,n?(r.width=i.clientWidth,r.height=i.clientHeight):(r.width=o,r.height=s)}function f(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)y(t.touches[e].clientX,t.touches[e].clientY,a[Math.floor(Math.random()*a.length)])}function p(t){window.requestAnimationFrame((()=>{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1.5&&(y(h.x,h.y,a[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y)}))}function y(t,e,n){l.push(new x(t,e,n))}function v(){!function(){if(0!=l.length){d.clearRect(0,0,o,s);for(let t=0;t<l.length;t++)l[t].update(d);for(let t=l.length-1;t>=0;t--)l[t].lifeSpan<0&&l.splice(t,1);0==l.length&&d.clearRect(0,0,o,s)}}(),u=requestAnimationFrame(v)}function w(){r.remove(),cancelAnimationFrame(u),i.removeEventListener(\"mousemove\",p),i.removeEventListener(\"touchmove\",f),i.removeEventListener(\"touchstart\",f),window.addEventListener(\"resize\",g)}function x(t,e,n){const i=Math.floor(30*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.7*Math.random()+.9},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.02;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return A.onchange=()=>{A.matches?w():m()},m(),{destroy:w}}function n(t){let e,n,i,o=t&&t.element,s=o||document.body,h=[\"❄️\"],c=window.innerWidth,l=window.innerHeight,a={x:c/2,y:c/2},r=[],d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=c,e.height=l),n.font=\"12px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\",h.forEach((t=>{let e=n.measureText(t),i=document.createElement(\"canvas\"),o=i.getContext(\"2d\");i.width=e.width,i.height=2*e.actualBoundingBoxAscent,o.textAlign=\"center\",o.font=\"12px serif\",o.textBaseline=\"middle\",o.fillText(t,i.width/2,e.actualBoundingBoxAscent),d.push(i)})),s.addEventListener(\"mousemove\",f),s.addEventListener(\"touchmove\",g,{passive:!0}),s.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),y()}function m(t){c=window.innerWidth,l=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=c,e.height=l)}function g(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)p(t.touches[e].clientX,t.touches[e].clientY,d[Math.floor(Math.random()*d.length)])}function f(t){if(o){const e=s.getBoundingClientRect();a.x=t.clientX-e.left,a.y=t.clientY-e.top}else a.x=t.clientX,a.y=t.clientY;p(a.x,a.y,d[Math.floor(Math.random()*h.length)])}function p(t,e,n){r.push(new w(t,e,n))}function y(){!function(){if(0!=r.length){n.clearRect(0,0,c,l);for(let t=0;t<r.length;t++)r[t].update(n);for(let t=r.length-1;t>=0;t--)r[t].lifeSpan<0&&r.splice(t,1);0==r.length&&n.clearRect(0,0,c,l)}}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",f),s.removeEventListener(\"touchmove\",g),s.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function w(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:1+Math.random()},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/300;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0),n=.0174533*(2*this.lifeSpan);t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return u.onchange=()=>{u.matches?v():A()},A(),{destroy:v}}function i(t){let e=t&&t.element,n=e||document.body,i=t?.characters||[\"h\",\"e\",\"l\",\"l\",\"o\"];const o=t?.colors||[\"#6622CC\",\"#A755C2\",\"#B07C9E\",\"#B59194\",\"#D2A1B8\"];let s,h,c,l=t?.cursorOffset||{x:0,y:0},a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=t?.font||\"15px serif\",m=t?.characterLifeSpanFunction||function(){return Math.floor(60*Math.random()+80)},g=t?.initialCharacterVelocityFunction||function(){return{x:(Math.random()<.5?-1:1)*Math.random()*5,y:(Math.random()<.5?-1:1)*Math.random()*5}},f=t?.characterVelocityChangeFunctions||{x_func:function(t,e){return(Math.random()<.5?-1:1)/30},y_func:function(t,e){return(Math.random()<.5?-1:1)/15}},p=t?.characterScalingFunction||function(t,e){let n=e-t;return Math.max(n/e*2,0)},y=t?.characterNewRotationDegreesFunction||function(t,e){return(e-t)/5},v=[];const w=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function x(){if(w.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;s=document.createElement(\"canvas\"),h=s.getContext(\"2d\"),s.style.top=\"0px\",s.style.left=\"0px\",s.style.pointerEvents=\"none\",e?(s.style.position=\"absolute\",n.appendChild(s),s.width=n.clientWidth,s.height=n.clientHeight):(s.style.position=\"fixed\",document.body.appendChild(s),s.width=a,s.height=r),h.font=A,h.textBaseline=\"middle\",h.textAlign=\"center\",i.forEach((t=>{let e=h.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2.5*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=A,i.textBaseline=\"middle\";var s=o[Math.floor(Math.random()*o.length)];i.fillStyle=s,i.fillText(t,n.width/2,e.actualBoundingBoxAscent),v.push(n)})),n.addEventListener(\"mousemove\",L),n.addEventListener(\"touchmove\",M,{passive:!0}),n.addEventListener(\"touchstart\",M,{passive:!0}),window.addEventListener(\"resize\",E),B()}function E(t){a=window.innerWidth,r=window.innerHeight,e?(s.width=n.clientWidth,s.height=n.clientHeight):(s.width=a,s.height=r)}function M(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)C(t.touches[e].clientX,t.touches[e].clientY,v[Math.floor(Math.random()*v.length)])}function L(t){if(e){const e=n.getBoundingClientRect();d.x=t.clientX-e.left,d.y=t.clientY-e.top}else d.x=t.clientX,d.y=t.clientY;C(d.x,d.y,v[Math.floor(Math.random()*i.length)])}function C(t,e,n){u.push(new S(t,e,n))}function B(){!function(){if(0!=u.length){h.clearRect(0,0,a,r);for(let t=0;t<u.length;t++)u[t].update(h);for(let t=u.length-1;t>=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&h.clearRect(0,0,a,r)}}(),c=requestAnimationFrame(B)}function R(){s.remove(),cancelAnimationFrame(c),n.removeEventListener(\"mousemove\",L),n.removeEventListener(\"touchmove\",M),n.removeEventListener(\"touchstart\",M),window.addEventListener(\"resize\",E)}function S(t,e,n){const i=m();this.rotationSign=Math.random()<.5?-1:1,this.age=0,this.initialLifeSpan=i,this.lifeSpan=i,this.velocity=g(),this.position={x:t+l.x,y:e+l.y},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.age++,this.velocity.x+=f.x_func(this.age,this.initialLifeSpan),this.velocity.y+=f.y_func(this.age,this.initialLifeSpan);const e=p(this.age,this.initialLifeSpan),n=.0174533*(this.rotationSign*y(this.age,this.initialLifeSpan));t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return w.onchange=()=>{w.matches?R():x()},x(),{destroy:R}}function o(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.particles||15,d=t?.rate||.4,u=t?.baseImageSrc||\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";let A=!1,m=new Image;m.src=u;const g=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function f(){if(g.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",y),window.addEventListener(\"resize\",p),v()}function p(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function y(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t<r;t++)e=l.x,n=l.y,i=m,a.push(new x(e,n,i))}var e,n,i}function v(){!function(){n.clearRect(0,0,h,c);let t=l.x,e=l.y;a.forEach((function(i,o,s){let h=s[o+1]||s[0];i.position.x=t,i.position.y=e,i.move(n),t+=(h.position.x-i.position.x)*d,e+=(h.position.y-i.position.y)*d}))}(),i=requestAnimationFrame(v)}function w(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",y),window.addEventListener(\"resize\",p)}function x(t,e,n){this.position={x:t,y:e},this.image=n,this.move=function(t){t.drawImage(this.image,this.position.x,this.position.y)}}return g.onchange=()=>{g.matches?w():f()},f(),{destroy:w}}function s(t){let e,n,i=t&&t.element,o=i||document.body,s=window.innerWidth,h=window.innerHeight,c={x:s/2,y:s/2},l=new function(t,e,n,i){this.position={x:t,y:e},this.width=n,this.lag=i,this.moveTowards=function(t,e,n){this.position.x+=(t-this.position.x)/this.lag,this.position.y+=(e-this.position.y)/this.lag,n.fillStyle=a,n.beginPath(),n.arc(this.position.x,this.position.y,this.width,0,2*Math.PI),n.fill(),n.closePath()}}(s/2,h/2,10,10),a=t?.color||\"#323232a6\";const r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function d(){if(r.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",i?(e.style.position=\"absolute\",o.appendChild(e),e.width=o.clientWidth,e.height=o.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=s,e.height=h),o.addEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u),m()}function u(t){s=window.innerWidth,h=window.innerHeight,i?(e.width=o.clientWidth,e.height=o.clientHeight):(e.width=s,e.height=h)}function A(t){if(i){const e=o.getBoundingClientRect();c.x=t.clientX-e.left,c.y=t.clientY-e.top}else c.x=t.clientX,c.y=t.clientY}function m(){n.clearRect(0,0,s,h),l.moveTowards(c.x,c.y,n),requestAnimationFrame(m)}function g(){e.remove(),cancelAnimationFrame(m),o.removeEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u)}return r.onchange=()=>{r.matches?g():d()},d(),{destroy:g}}function h(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[],r=[];const d=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function u(){if(d.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",g),s.addEventListener(\"touchmove\",m,{passive:!0}),s.addEventListener(\"touchstart\",m,{passive:!0}),window.addEventListener(\"resize\",A),p()}function A(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function m(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)f(t.touches[e].clientX,t.touches[e].clientY,r[Math.floor(Math.random()*r.length)])}function g(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;f(l.x,l.y)}function f(t,e,n){a.push(new v(t,e,n))}function p(){!function(){if(0!=a.length){n.clearRect(0,0,h,c);for(let t=0;t<a.length;t++)a[t].update(n);for(let t=a.length-1;t>=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&n.clearRect(0,0,h,c)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",g),s.removeEventListener(\"touchmove\",m),s.removeEventListener(\"touchstart\",m),window.addEventListener(\"resize\",A)}function v(t,e,n){const i=Math.floor(60*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/10),y:-1*Math.random()-.4},this.position={x:t,y:e},this.canv=n,this.baseDimension=4,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/600,this.lifeSpan--;const e=.2+(this.initialLifeSpan-this.lifeSpan)/this.initialLifeSpan;t.fillStyle=\"#e6f1f7\",t.strokeStyle=\"#3a92c5\",t.beginPath(),t.arc(this.position.x-this.baseDimension/2*e,this.position.y-this.baseDimension/2,this.baseDimension*e,0,2*Math.PI),t.stroke(),t.fill(),t.closePath()}}return d.onchange=()=>{d.matches?y():u()},u(),{destroy:y}}function c(t){const e=t&&t.emoji||[\"😀\",\"😂\",\"😆\",\"😊\"];let n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2};let l=0;const a=[],r=[];let d,u,A;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;d=document.createElement(\"canvas\"),u=d.getContext(\"2d\"),d.style.top=\"0px\",d.style.left=\"0px\",d.style.pointerEvents=\"none\",n?(d.style.position=\"absolute\",i.appendChild(d),d.width=i.clientWidth,d.height=i.clientHeight):(d.style.position=\"fixed\",document.body.appendChild(d),d.width=o,d.height=s),u.font=\"21px serif\",u.textBaseline=\"middle\",u.textAlign=\"center\",e.forEach((t=>{let e=u.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(t,n.width/2,e.actualBoundingBoxAscent),r.push(n)})),i.addEventListener(\"mousemove\",y,{passive:!0}),i.addEventListener(\"touchmove\",p,{passive:!0}),i.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),w()}function f(t){o=window.innerWidth,s=window.innerHeight,n?(d.width=i.clientWidth,d.height=i.clientHeight):(d.width=o,d.height=s)}function p(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)v(t.touches[e].clientX,t.touches[e].clientY,r[Math.floor(Math.random()*r.length)])}function y(t){t.timeStamp-l<16||window.requestAnimationFrame((()=>{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1&&(v(h.x,h.y,r[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y,l=t.timeStamp)}))}function v(t,e,n){a.push(new E(t,e,n))}function w(){!function(){if(0!=a.length){u.clearRect(0,0,o,s);for(let t=0;t<a.length;t++)a[t].update(u);for(let t=a.length-1;t>=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&u.clearRect(0,0,o,s)}}(),A=requestAnimationFrame(w)}function x(){d.remove(),cancelAnimationFrame(A),i.removeEventListener(\"mousemove\",y),i.removeEventListener(\"touchmove\",p),i.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function E(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.4*Math.random()+.8},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.05;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return m.onchange=()=>{m.matches?x():g()},g(),{destroy:x}}function l(t){let e,n,i,o=t&&t.element,s=o||document.body,h=t&&t.randomDelay,c=t&&t.minDelay||5,l=t&&t.maxDelay||50,a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=new Image;t&&t.image?A.src=t.image:A.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=a,e.height=r),s.addEventListener(\"mousemove\",x),s.addEventListener(\"touchmove\",p,{passive:!0}),s.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),M()}function f(t){a=window.innerWidth,r=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=a,e.height=r)}function p(t){if(t.touches.length>0)for(let e=0;e<t.touches.length;e++)E(t.touches[e].clientX,t.touches[e].clientY,A)}m.onchange=()=>{m.matches?L():g()};let y=()=>Math.floor(Math.random()*(l-c+1))+c,v=Date.now(),w=y();function x(t){if(h){if(v+w>Date.now())return;v=Date.now(),w=y()}if(o){const e=s.getBoundingClientRect();d.x=t.clientX-e.left,d.y=t.clientY-e.top}else d.x=t.clientX,d.y=t.clientY;E(d.x,d.y,A)}function E(t,e,n){u.push(new C(t,e,n))}function M(){!function(){if(0!=u.length){n.clearRect(0,0,a,r);for(let t=0;t<u.length;t++)u[t].update(n);for(let t=u.length-1;t>=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&n.clearRect(0,0,a,r)}}(),i=requestAnimationFrame(M)}function L(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",x),s.removeEventListener(\"touchmove\",p),s.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function C(t,e,n){this.initialLifeSpan=40,this.lifeSpan=40,this.position={x:t,y:e},this.image=n,this.update=function(t){this.lifeSpan--;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.globalAlpha=e,t.drawImage(this.image,this.position.x,this.position.y)}}return g(),{destroy:L}}function a(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.length||20,d=t?.colors||[\"#FE0000\",\"#FD8C00\",\"#FFE500\",\"#119F0B\",\"#0644B3\",\"#C22EDC\"],u=t?.size||3;let A=!1;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f),y()}function f(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function p(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t<r;t++)e=l.x,n=l.y,void 0,a.push(new w(e,n))}var e,n}function y(){!function(){n.clearRect(0,0,h,c),n.lineJoin=\"round\";let t=[],e=l.x,i=l.y;a.forEach((function(n,o,s){let h=s[o+1]||s[0];n.position.x=e,n.position.y=i,t.push({x:e,y:i}),e+=.4*(h.position.x-n.position.x),i+=.4*(h.position.y-n.position.y)})),d.forEach(((e,i)=>{n.beginPath(),n.strokeStyle=e,t.length&&n.moveTo(t[0].x,t[0].y+i*(u-1)),t.forEach(((t,e)=>{0!==e&&n.lineTo(t.x,t.y+i*u)})),n.lineWidth=u,n.lineCap=\"round\",n.stroke()}))}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f)}function w(t,e){this.position={x:t,y:e}}return m.onchange=()=>{m.matches?v():g()},g(),{destroy:v}}function r(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2};const a=t&&t.dateColor||\"blue\",r=t&&t.faceColor||\"black\",d=t&&t.secondsColor||\"red\",u=t&&t.minutesColor||\"black\",A=t&&t.hoursColor||\"black\",m=.4,g=t&&t.theDays||[\"SUNDAY\",\"MONDAY\",\"TUESDAY\",\"WEDNESDAY\",\"THURSDAY\",\"FRIDAY\",\"SATURDAY\"],f=t&&t.theMonths||[\"JANUARY\",\"FEBRUARY\",\"MARCH\",\"APRIL\",\"MAY\",\"JUNE\",\"JULY\",\"AUGUST\",\"SEPTEMBER\",\"OCTOBER\",\"NOVEMBER\",\"DECEMBER\"];let p=new Date,y=p.getDate(),v=p.getYear()+1900;const w=(\" \"+g[p.getDay()]+\" \"+y+\" \"+f[p.getMonth()]+\" \"+v).split(\"\"),x=[\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"1\",\"2\"],E=x.length,M=[\"•\",\"•\",\"•\"],L=[\"•\",\"•\",\"•\",\"•\"],C=[\"•\",\"•\",\"•\",\"•\",\"•\"],B=360/E,R=360/w.length,S=45/6.5,b=[],Y=[],W=[],H=[],I=[],X=[],D=[],T=[],F=[];var z=parseInt(w.length+E+M.length+L.length+C.length)+1;const P=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function J(){if(P.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),n.font=\"10px sans-serif\",n.textAlign=\"center\",n.textBaseline=\"middle\";for(let t=0;t<z;t++)b[t]=0,Y[t]=0,W[t]=0,H[t]=0;for(let t=0;t<w.length;t++)F[t]={color:a,value:w[t]};for(let t=0;t<x.length;t++)T[t]={color:r,value:x[t]};for(let t=0;t<M.length;t++)D[t]={color:A,value:M[t]};for(let t=0;t<L.length;t++)X[t]={color:u,value:L[t]};for(let t=0;t<C.length;t++)I[t]={color:d,value:C[t]};s.addEventListener(\"mousemove\",Z),s.addEventListener(\"touchmove\",Q,{passive:!0}),s.addEventListener(\"touchstart\",Q,{passive:!0}),window.addEventListener(\"resize\",U),k()}function U(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function Q(t){if(t.touches.length>0)if(o){const e=s.getBoundingClientRect();l.x=t.touches[0].clientX-e.left,l.y=t.touches[0].clientY-e.top}else l.x=t.touches[0].clientX,l.y=t.touches[0].clientY}function Z(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY}function k(){!function(){W[0]=Math.round(b[0]+=(l.y-b[0])*m),H[0]=Math.round(Y[0]+=(l.x-Y[0])*m);for(let t=1;t<z;t++)W[t]=Math.round(b[t]+=(W[t-1]-b[t])*m),H[t]=Math.round(Y[t]+=(H[t-1]-Y[t])*m),b[t-1]>=c-80&&(b[t-1]=c-80),Y[t-1]>=h-80&&(Y[t-1]=h-80)}(),function(){n.clearRect(0,0,h,c);const t=new Date,e=t.getSeconds(),i=Math.PI*(e-15)/30,o=t.getMinutes(),s=Math.PI*(o-15)/30,l=t.getHours(),a=Math.PI*(l-3)/6+Math.PI*parseInt(t.getMinutes())/360;for(let t=0;t<F.length;t++)F[t].y=b[t]+67.5*Math.sin(-i+t*R*Math.PI/180),F[t].x=Y[t]+67.5*Math.cos(-i+t*R*Math.PI/180),n.fillStyle=F[t].color,n.fillText(F[t].value,F[t].x,F[t].y);for(let t=0;t<T.length;t++)T[t].y=b[F.length+t]+45*Math.sin(t*B*Math.PI/180),T[t].x=Y[F.length+t]+45*Math.cos(t*B*Math.PI/180),n.fillStyle=T[t].color,n.fillText(T[t].value,T[t].x,T[t].y);for(let t=0;t<D.length;t++)D[t].y=b[F.length+E+t]+0+t*S*Math.sin(a),D[t].x=Y[F.length+E+t]+0+t*S*Math.cos(a),n.fillStyle=D[t].color,n.fillText(D[t].value,D[t].x,D[t].y);for(let t=0;t<X.length;t++)X[t].y=b[F.length+E+D.length+t]+0+t*S*Math.sin(s),X[t].x=Y[F.length+E+D.length+t]+0+t*S*Math.cos(s),n.fillStyle=X[t].color,n.fillText(X[t].value,X[t].x,X[t].y);for(let t=0;t<I.length;t++)I[t].y=b[F.length+E+D.length+X.length+t]+0+t*S*Math.sin(i),I[t].x=Y[F.length+E+D.length+X.length+t]+0+t*S*Math.cos(i),n.fillStyle=I[t].color,n.fillText(I[t].value,I[t].x,I[t].y)}(),i=requestAnimationFrame(k)}function N(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",Z),s.removeEventListener(\"touchmove\",Q),s.removeEventListener(\"touchstart\",Q),window.addEventListener(\"resize\",U)}return P.onchange=()=>{P.matches?N():J()},J(),{destroy:N}}function d(t){let e,n,i,o=t||{},s=t&&t.element,h=s||document.body,c=o.text?\" \"+t.text:\" Your Text Here\",l=t?.color||\"#000000\",a=o.font||\"monospace\",r=o.textSize||12,d=r+\"px \"+a,u=o.gap||r+2,A=0,m=[],g=window.innerWidth,f=window.innerHeight,p={x:g/2,y:g/2};for(let t=0;t<c.length;t++)m[t]={letter:c.charAt(t),x:g/2,y:g/2};t?.size;const y=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function v(){if(y.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",s?(e.style.position=\"absolute\",h.appendChild(e),e.width=h.clientWidth,e.height=h.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=g,e.height=f),h.addEventListener(\"mousemove\",x),window.addEventListener(\"resize\",w),E()}function w(t){g=window.innerWidth,f=window.innerHeight,s?(e.width=h.clientWidth,e.height=h.clientHeight):(e.width=g,e.height=f)}function x(t){if(s){const e=h.getBoundingClientRect();p.x=t.clientX-e.left,p.y=t.clientY-e.top}else p.x=t.clientX,p.y=t.clientY}function E(){!function(){n.clearRect(0,0,g,f),A+=.15;let t=2*Math.cos(A),e=5*Math.sin(A);for(let t=m.length-1;t>0;t--)m[t].x=m[t-1].x+u,m[t].y=m[t-1].y,n.fillStyle=l,n.font=d,n.fillText(m[t].letter,m[t].x,m[t].y);let i=m[0].x,o=m[0].y;i+=(p.x-i)/5+t+2,o+=(p.y-o)/5+e,m[0].x=i,m[0].y=o}(),i=requestAnimationFrame(E)}function M(){e.remove(),cancelAnimationFrame(i),h.removeEventListener(\"mousemove\",x),window.addEventListener(\"resize\",w)}return y.onchange=()=>{y.matches?M():v()},v(),{destroy:M}}\n\n\n//# sourceURL=webpack://mybb-april-fools/./node_modules/cursor-effects/dist/esm.js?");
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = (module) => {
/******/ var getter = module && module.__esModule ?
/******/ () => (module['default']) :
/******/ () => (module);
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./src/main.ts");
/******/
/******/ })()
;