KG_Chat_Application

Enhance the chat abilities

目前為 2025-05-20 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         KG_Chat_Application
// @namespace    klavogonki
// @version      4.7.3
// @description  Enhance the chat abilities
// @author       Patcher
// @match        *://klavogonki.ru/*
// @exclude      *://klavogonki.ru/g/?gmid=*
// @exclude      *://klavogonki.ru/chatlogs/*
// @exclude      *://klavogonki.ru/storage/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=klavogonki.ru
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(()=>{"use strict";var e={56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},72:e=>{var t=[];function n(e){for(var n=-1,r=0;r<t.length;r++)if(t[r].identifier===e){n=r;break}return n}function r(e,r){for(var a={},i=[],s=0;s<e.length;s++){var c=e[s],l=r.base?c[0]+r.base:c[0],d=a[l]||0,m="".concat(l," ").concat(d);a[l]=d+1;var u=n(m),p={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==u)t[u].references++,t[u].updater(p);else{var h=o(p,r);r.byIndex=s,t.splice(s,0,{identifier:m,updater:h,references:1})}i.push(m)}return i}function o(e,t){var n=t.domAPI(t);n.update(e);return function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var a=r(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<a.length;i++){var s=n(a[i]);t[s].references--}for(var c=r(e,o),l=0;l<a.length;l++){var d=n(a[l]);0===t[d].references&&(t[d].updater(),t.splice(d,1))}a=c}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(i[c]=!0)}for(var l=0;l<e.length;l++){var d=[].concat(e[l]);r&&i[d[0]]||(void 0!==a&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),t.push(d))}},t}},416:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.update-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);z-index:1200}.update-popup{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);background:var(--background-color) !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;color:var(--main-text-color) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;z-index:1200;max-width:400px;min-width:300px}.update-popup .update-header{margin-top:0 !important;font-size:1.5em !important;text-align:center !important;color:var(--first-accent-color) !important}.update-popup .update-script{margin:1rem 0 !important;text-align:center !important;font-size:1.2em !important;color:#4285f4 !important}.update-popup p{margin:.5rem 0;text-align:center}.update-popup p .version{font-weight:bold;color:var(--first-accent-color) !important}.update-popup .button-container{display:flex;justify-content:center;margin-top:15px}.update-popup .button-container button{padding:5px 10px !important;width:100% !important;border-radius:.2em !important;cursor:pointer !important;font-size:1rem !important;border:none !important;transition:background-color .15s !important}.update-popup .button-container button.update-later{margin-right:10px;background:#f1f1f1}.update-popup .button-container button.update-skip{margin-right:10px;background:#fc0;color:#333}.update-popup .button-container button.update-now{background:#4285f4;color:#fff}.update-popup .button-container button:hover{opacity:.9}',""]);const s=i},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},550:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Noto+Color+Emoji&display=swap);"]),i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap);"]),i.push([e.id,"@import url(https://fonts.googleapis.com/css2?family=Iansui&family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap);"]),i.push([e.id,'#app-chat-container{border-radius:.4em .4em 0 0 !important;position:fixed;bottom:0;left:0;height:300px;background-color:var(--background-color) !important;color:var(--main-text-color) !important;border:1px solid var(--border-color) !important;display:flex;font-family:sans-serif;z-index:999;min-width:320px !important;box-sizing:border-box;max-width:100vw;overflow:hidden;transition:opacity .3s ease,transform .4s cubic-bezier(0.68, -0.55, 0.265, 1.55)}#app-chat-container a{color:var(--fourth-accent-color) !important;transition:filter .15s !important}#app-chat-container a:hover{filter:brightness(0.8) !important}#app-chat-container img{text-align:unset !important;position:unset !important;padding:unset;margin:unset;display:unset;max-width:unset;height:fit-content;width:fit-content}#app-chat-container .break-content{display:inline-flex !important;flex-basis:100% !important;margin:0 !important;white-space:pre-wrap !important;flex-wrap:wrap !important}#app-chat-container.maximized{position:fixed !important;z-index:1010 !important;top:0 !important;left:0 !important;right:0 !important;bottom:0 !important;width:100vw !important;height:100vh !important;border-radius:0 !important;overflow:hidden !important;background-color:var(--background-color) !important;display:flex !important;flex-direction:column !important}#app-chat-container:not(.visible-chat):not(.hidden-chat):not(.maximized):not(.floating-chat){display:none;opacity:0}#app-chat-container.visible-chat{transform:translateY(0) !important}#app-chat-container.hidden-chat{opacity:1;transform:translateY(calc(100% - 25px)) !important}#app-chat-container.floating-chat{border-radius:.4em !important}#app-chat-container .font-size-control{display:flex !important;align-items:center !important;justify-content:center !important;height:25px !important;padding:0 10px !important;gap:5px !important;z-index:6 !important}#app-chat-container .font-size-control .font-size-slider{width:80px !important;height:4px !important;-webkit-appearance:none !important;appearance:none !important;background-color:color-mix(in srgb, var(--third-accent-color) 50%, var(--foreground-color) 50%) !important;outline:none !important;border-radius:2px !important;transition:opacity .2s !important}#app-chat-container .font-size-control .font-size-slider::-webkit-slider-thumb{-webkit-appearance:none !important;appearance:none !important;width:10px !important;height:10px !important;border-radius:50% !important;background:var(--third-accent-color) !important;cursor:pointer !important}#app-chat-container .font-size-control .font-size-slider::-moz-range-thumb{width:10px !important;height:10px !important;border-radius:50% !important;background:var(--third-accent-color) !important;cursor:pointer !important;border:none !important}#app-chat-container .resize-handle{position:absolute !important;background:rgba(0,0,0,0) !important;z-index:1000 !important}#app-chat-container .resize-handle.top{top:-3px !important;left:0 !important;right:0 !important;height:6px !important;cursor:ns-resize !important}#app-chat-container .resize-handle.left{left:-3px !important;top:0 !important;bottom:0 !important;width:6px !important;cursor:ew-resize !important}#app-chat-container .resize-handle.right{right:-3px !important;top:0 !important;bottom:0 !important;width:6px !important;cursor:ew-resize !important}#app-chat-container .chat-wrapper{display:grid;height:100% !important;width:100% !important;grid-template-areas:"header    header" "messages  userlist";grid-template-rows:auto 1fr !important;grid-template-columns:1fr auto;min-width:320px !important;overflow:hidden !important;background-color:var(--background-color) !important}#app-chat-container .chat-content{margin:0 !important;background-color:var(--background-color) !important;display:flex !important;grid-area:messages;flex-direction:column !important;overflow:hidden !important}#app-chat-container .messages-panel{flex:1 !important;overflow-y:auto !important;overflow-x:hidden !important;padding:1em !important;display:flex;flex-direction:column !important;gap:.2em !important;scrollbar-width:thin !important;scrollbar-color:var(--foreground-color) var(--background-color) !important}#app-chat-container .messages-panel.keyboard-active{transition:margin-bottom .3s ease !important}#app-chat-container .messages-panel::-webkit-scrollbar{width:8px !important}#app-chat-container .messages-panel::-webkit-scrollbar-thumb{background-color:var(--foreground-color) !important}#app-chat-container .messages-panel::-webkit-scrollbar-track{background-color:var(--background-color) !important}#app-chat-container .input-container{display:flex !important;width:100%;align-items:center !important;padding:1em !important;gap:.5em !important;border-top:1px solid var(--border-color) !important;background-color:var(--background-color) !important}#app-chat-container #message-input{outline:none !important;flex:1 !important;background-color:var(--highlight-color) !important;color:var(--main-text-color) !important;padding:.5em !important;border-radius:.2em !important;min-width:0 !important;border:none !important;position:relative;font-family:inherit !important;line-height:normal !important;transition:font-size .2s ease !important}#app-chat-container #message-input.private-mode{background-color:var(--private-mode-background-color) !important;color:color-mix(in srgb, var(--private-mode-color) 50%, #d2d2d2 50%) !important;caret-color:var(--private-mode-color) !important}#app-chat-container #message-input.private-mode::placeholder{color:var(--private-mode-placeholder-color) !important}#app-chat-container .length-field-popup{position:absolute !important;display:flex !important;font-size:12px !important;font-weight:bold !important;font-family:"Montserrat",Iansui,sans-serif !important;bottom:60px;transition:left 100ms ease-out !important;height:20px !important;align-items:center !important;justify-content:center !important;padding:2px 4px;opacity:0;border:none !important;z-index:101 !important}#app-chat-container .user-list-container{display:flex;grid-area:userlist;width:fit-content !important;min-width:180px !important;max-width:fit-content !important;overflow-y:auto !important;overflow-x:hidden !important;background-color:var(--background-color) !important;color:var(--main-text-color) !important;border-left:1px solid var(--border-color) !important;scrollbar-width:thin !important;scrollbar-color:var(--foreground-color) var(--background-color) !important}#app-chat-container .user-list-container #user-list{padding:1em !important}#app-chat-container .user-list-container::-webkit-scrollbar-thumb{background-color:var(--foreground-color) !important}#app-chat-container .user-list-container::-webkit-scrollbar-track{background-color:var(--background-color) !important}#app-chat-container .floating-userlist{box-shadow:0 0 6px 2px rgba(0,0,0,.1) !important}#app-chat-container .reveal-userlist-btn{position:absolute !important;top:50% !important;right:-1px !important;transform:translateY(-50%) !important;z-index:1000 !important;display:flex;align-items:center !important;justify-content:center !important;padding:.4em !important;background-color:var(--foreground-color) !important;font-size:18px !important;font-family:"Noto Color Emoji",sans-serif !important;font-weight:bold !important;border:1px solid var(--border-color) !important;border-radius:.4em 0 0 .4em !important;cursor:pointer !important;transition:background .2s ease,opacity .2s ease !important}#app-chat-container .reveal-userlist-btn:hover{background-color:var(--background-color) !important}#app-chat-container .message{padding:.2em .4em !important;display:flex;flex-direction:row;border-radius:.2em !important;width:100%;max-width:100% !important;word-break:break-word !important}#app-chat-container .message .pending-emoji{margin-left:.5em !important}#app-chat-container .message .message-text{display:inline-flex !important;flex-wrap:wrap !important}#app-chat-container .message .message-text .emoji-adjuster{font-family:"Noto Color Emoji",sans-serif !important;font-size:1.25em !important;display:inline-flex !important}#app-chat-container .message .message-text .mention{position:relative;height:fit-content !important;color:var(--mention-color) !important;display:inline-flex !important;font-family:Montserrat !important;font-weight:500 !important;letter-spacing:.05em !important;z-index:1 !important}#app-chat-container .message .message-text .mention::before{content:"";position:absolute !important;top:-2px !important;left:-6px !important;right:-6px !important;bottom:-2px !important;background-color:color-mix(in srgb, var(--mention-color) 30%, var(--foreground-color) 70%) !important;border:1px solid color-mix(in srgb, var(--mention-color) 90%, var(--foreground-color) 10%) !important;opacity:.4;border-radius:.2em !important;z-index:-1}#app-chat-container .message .message-text .md-heading{font-family:"Montserrat",sans-serif !important;margin:0 !important;padding:0 !important;color:#bf9d70 !important}#app-chat-container .message .message-text .md-heading.md-h1{font-size:1.8em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h2{font-size:1.6em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h3{font-size:1.4em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h4{font-size:1.2em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h5{font-size:1.1em !important;font-weight:bold !important}#app-chat-container .message .message-text .md-heading.md-h6{font-size:1em !important;font-weight:bold !important}#app-chat-container .message .message-text code,#app-chat-container .message .message-text .md-code{display:inline-flex !important;font-size:1em !important;font-family:"Consolas",monospace !important;background-color:#2a2a2a !important;border:1px solid #333 !important;border-radius:.2em !important;padding:.1em .2em !important;color:#82b32a !important;filter:none !important;white-space:break-spaces !important}#app-chat-container .message .message-text .md-bold{font-weight:bold !important;color:var(--main-text-color) !important}#app-chat-container .message .message-text .md-italic{font-style:italic !important;color:var(--main-text-color) !important}#app-chat-container .message .message-text .md-strikethrough{text-decoration:line-through !important;color:var(--main-text-color) !important}#app-chat-container .message.banned{background-color:var(--ban-message-background-color) !important;border:1px solid var(--ban-message-border-color) !important;border-left:3px solid var(--ban-message-color) !important;width:fit-content !important}#app-chat-container .message.banned .time{color:color-mix(in srgb, var(--ban-message-time-color) 70%, var(--foreground-color) 30%) !important}#app-chat-container .message.banned .username,#app-chat-container .message.banned .message-text{color:var(--ban-message-color) !important}#app-chat-container .message.system{background-color:var(--system-message-background-color) !important;border:1px solid var(--system-message-border-color) !important;border-left:3px solid var(--system-message-color) !important;width:fit-content !important;align-items:center !important}#app-chat-container .message.system .time{margin-right:unset !important;color:color-mix(in srgb, var(--system-message-time-color) 70%, var(--foreground-color) 30%) !important}#app-chat-container .message.system .username{display:none !important}#app-chat-container .message.system .message-text{color:var(--system-message-color) !important}#app-chat-container .message.private{width:fit-content !important}#app-chat-container .message.private.sent{background-color:var(--private-message-sent-background-color) !important;border:1px solid var(--private-message-sent-border-color) !important;border-left:3px solid var(--private-message-sent-color) !important}#app-chat-container .message.private.sent .time{color:color-mix(in srgb, var(--private-message-sent-time-color) 70%, var(--foreground-color) 30%) !important}#app-chat-container .message.private.sent .username,#app-chat-container .message.private.sent .message-text{color:var(--private-message-sent-color) !important}#app-chat-container .message.private.received{background-color:var(--private-message-received-background-color) !important;border:1px solid var(--private-message-received-border-color) !important;border-left:3px solid var(--private-message-received-color) !important}#app-chat-container .message.private.received .time{color:color-mix(in srgb, var(--private-message-received-time-color) 70%, var(--foreground-color) 30%) !important}#app-chat-container .message.private.received .username,#app-chat-container .message.private.received .message-text{color:var(--private-message-received-color) !important}#app-chat-container .message-info{margin-right:1em !important;white-space:nowrap !important;height:fit-content !important}#app-chat-container .message-info .time{font-size:.9em !important;margin-right:1em !important;color:color-mix(in srgb, var(--main-text-color) 50%, var(--foreground-color) 50%) !important}#app-chat-container .message-info .username{font-size:1em !important}#app-chat-container .username{filter:var(--username-filter) !important}#app-chat-container .username,#app-chat-container .time{cursor:pointer !important;transition:opacity .15s ease !important}#app-chat-container .username:hover,#app-chat-container .time:hover{opacity:.8 !important}#app-chat-container .user-item{display:flex !important;align-items:center !important;padding:.2em !important;margin-bottom:.2em !important;border-radius:.2em !important;max-width:100% !important;text-overflow:ellipsis !important}#app-chat-container .user-item .user-avatar{display:flex !important;justify-content:center !important;align-items:center !important;width:24px !important;height:24px !important;font-size:18px !important;border-radius:.1em !important;margin-right:1em !important;text-align:center !important;line-height:24px !important;flex-shrink:0 !important}#app-chat-container .user-item .user-avatar.image-avatar{cursor:pointer !important;transform-origin:left !important;transition:transform .15s ease-out !important}#app-chat-container .user-item .user-avatar.image-avatar:hover{transform:scale(2) !important}#app-chat-container .user-item .user-avatar.svg-avatar{font-family:"Noto Color Emoji",sans-serif !important}#app-chat-container .user-item .user-info{flex:1 !important;min-width:0 !important;overflow:hidden !important;text-overflow:ellipsis !important;white-space:nowrap !important}#app-chat-container .user-item .game-indicator{cursor:pointer !important}#app-chat-container .user-item .role,#app-chat-container .user-item .traffic-icon{font-family:"Noto Color Emoji",sans-serif !important}#app-chat-container .header-buttons{display:flex;flex-direction:row;width:fit-content;order:1}#app-chat-container .header-buttons .header-button{width:25px !important;height:25px !important}#app-chat-container .button{display:flex !important;align-items:center !important;justify-content:center !important;cursor:pointer !important;background-color:rgba(0,0,0,0) !important;border:none !important;outline:none !important;margin:0 !important;padding:0 !important;transition:all .15s ease-out}#app-chat-container .button:hover{filter:brightness(1.2) !important}#app-chat-container .emoji-trigger,#app-chat-container .private-mode-exit,#app-chat-container .send-button{font-family:"Noto Color Emoji",sans-serif !important;height:28px !important;width:28px !important;font-size:1.5em !important}#app-chat-container .emoji-trigger #smile_color{fill:var(--third-accent-color) !important}#app-chat-container .send-button .send{fill:var(--third-accent-color) !important}#app-chat-container .chat-toggle-button{right:0 !important}#app-chat-container .button .yes{fill:var(--first-accent-color) !important}#app-chat-container .button .no{fill:var(--second-accent-color) !important}#app-chat-container .chat-events-button,#app-chat-container .chat-blocked-button,#app-chat-container .chat-colors-button,#app-chat-container .chat-theme-button,#app-chat-container .chat-help-button,#app-chat-container .chat-maximize-button{fill:var(--third-accent-color)}#app-chat-container .chat-events-button.new-events{fill:var(--first-accent-color) !important}#app-chat-container .chat-events-button.no-events{fill:var(--second-accent-color) !important}#app-chat-container .chat-drag-area{display:flex;flex-direction:row;justify-content:space-between;grid-area:header;background-color:var(--drag-area-background-color) !important;border-bottom:1px solid var(--border-color) !important;border-radius:.4em .4em 0 0 !important;cursor:move !important}#app-chat-container .chat-drag-area .chat-dynamic-alert{white-space:nowrap;display:flex;align-items:center;justify-content:center;overflow:hidden;text-overflow:ellipsis;font:500 10px "Montserrat",sans-serif;opacity:0;color:#000;transform:translate(-50%, 0);position:absolute;top:40px;left:50%;padding:.5em;border-radius:.2em !important;z-index:1120;box-shadow:0 0 2px rgba(0,0,0,.5) !important}#app-chat-container .image-container .processed-image{margin-right:.5em !important}#app-chat-container .image-container .clickable-thumbnail{display:flex !important;align-items:center;opacity:1;transition:opacity .15s ease-in-out;border:none !important;max-width:150px !important;max-height:150px !important;cursor:pointer;background-color:rgba(0,0,0,0);margin:.5em .5em 0 0 !important;overflow:hidden !important;border-radius:.2em !important;box-shadow:0 0 2px rgba(0,0,0,.5) !important}#app-chat-container .image-container .clickable-thumbnail:hover{opacity:.8}#app-chat-container .image-container .clickable-thumbnail img{max-height:100% !important;max-width:100% !important;background-color:rgba(0,0,0,0);object-fit:contain}#app-chat-container .video-wrapper{display:flex;flex-direction:column}#app-chat-container .video-wrapper .processed-video{margin-bottom:.2em !important}#app-chat-container .video-wrapper .youtube-info{display:flex !important;flex-direction:column !important;margin-bottom:.2em !important;font-family:"Montserrat",sans-serif !important;font-size:.9em !important;color:var(--fourth-accent-color) !important;font-weight:500 !important;white-space:break-spaces !important}#app-chat-container .video-container,#app-chat-container .youtube-thumb{border-radius:.4em !important;display:flex;border:none;height:200px !important;width:356px !important;background-color:var(--background-color) !important}#app-chat-container .youtube-thumb{cursor:pointer !important;object-fit:cover !important}#app-chat-container .youtube-thumb:hover{filter:brightness(0.8);transition:filter .3s ease}.dimming-element{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.5019607843);z-index:1010 !important;opacity:0;transition:opacity .3s ease}.scaled-thumbnail{top:50%;left:50%;transform-origin:center center;transform:translate(-50%, -50%) scale(1);position:fixed;opacity:0;z-index:1015 !important;max-height:90vh;max-width:90vw;cursor:pointer;border-radius:.6em !important;box-shadow:0 0 2px rgba(0,0,0,.5) !important}.delete-btn{z-index:1020 !important;padding:8px 16px;transition:all .3s;cursor:pointer;filter:brightness(1);border-radius:.2em !important}.delete-btn:hover{filter:brightness(1.5)}.delete-btn.message-mode{background-color:hsl(0,50%,20%);color:hsl(0,60%,70%);border:1px solid hsl(0,50%,35%)}.delete-btn.username-mode{background-color:hsl(145,50%,20%);color:hsl(145,60%,70%);border:1px solid hsl(145,50%,35%)}.delete-btn.time-mode{background-color:hsl(200,50%,20%);color:hsl(200,60%,70%);border:1px solid hsl(200,50%,35%)}.toggle-button{font:bold .9em "Montserrat",sans-serif;position:absolute;top:0;right:2em;padding:8px 16px;transition:filter .3s;border-radius:0 0 .2em .2em !important;border-top:none;min-width:4em}.toggle-button.toggle-hidden{background:linear-gradient(to top, hsl(0, 50%, 20%), hsl(0, 50%, 25%));color:hsl(0,60%,70%);border-left:1px solid hsl(0,50%,35%);border-right:1px solid hsl(0,50%,35%);border-bottom:1px solid hsl(0,50%,35%)}.toggle-button.toggle-shown{background:linear-gradient(to top, hsl(30, 50%, 20%), hsl(30, 50%, 25%));color:hsl(30,60%,70%);border-left:1px solid hsl(30,50%,35%);border-right:1px solid hsl(30,50%,35%);border-bottom:1px solid hsl(30,50%,35%)}.toggle-button:hover{filter:brightness(1.5)}.toggle-button-hidden{background-color:hsl(0,20%,10%);color:hsl(0,50%,50%);border:1px solid hsl(0,50%,50%)}.toggle-button-show{background-color:hsl(90,20%,10%);color:hsl(90,50%,50%);border:1px solid hsl(90,50%,50%)}.toggle-button-hide{background-color:hsl(50,20%,10%);color:hsl(50,50%,50%);border:1px solid hsl(50,50%,50%)}.selected-message{background-clip:padding-box !important}.selected-message.message-mode{background-color:hsla(0,50%,50%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(0,50%,50%,.4) !important}.selected-message.username-mode{background-color:hsla(145,50%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(145,50%,50%,.4) !important}.selected-message.time-mode{background-color:hsla(200,50%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(200,50%,50%,.4) !important}.shown-message{background-color:hsla(30,60%,30%,.2) !important;box-shadow:inset 0px 0px 0px 1px hsla(30,60%,50%,.4) !important;background-clip:padding-box !important}.hidden-message{display:none !important}.new-messages-separator{display:flex;align-items:center;height:1em !important}.new-messages-separator .separator-line{flex-grow:1 !important;border:none !important;border-top:1px solid rgba(255,132,0,.568627451) !important;margin:0 !important}.new-messages-separator .separator-icon{background-color:rgba(255,132,0,.2509803922) !important;border-radius:.2em !important;padding:.2em .4em !important;font-family:"Noto Color Emoji" !important}.bounce-in{animation:bounceIn 500ms forwards}.bounce-out{animation:bounceOut 500ms forwards}@keyframes bounceIn{0%{transform:translateY(0);opacity:0}50%{transform:translateY(-10px);opacity:1}100%{transform:translateY(0);opacity:1}}@keyframes bounceOut{0%{transform:translateY(0);opacity:1}50%{transform:translateY(-10px);opacity:1}100%{transform:translateY(0);opacity:0}}@media(max-width: 780px){#app-chat-container .chat-wrapper{width:100% !important;border-right:none !important}}@media screen and (max-width: 768px),(hover: none),(pointer: coarse){body{background-color:#1e1e1e !important}#app-chat-container{height:100% !important;width:100vw !important;position:fixed !important;top:0 !important;bottom:0 !important;left:0 !important;right:0 !important;min-width:100vw !important;border:none !important;border-radius:0 !important;overflow:hidden !important}#app-chat-container .chat-wrapper{grid-template-rows:30px 1fr !important}#app-chat-container .font-size-control .font-size-slider{width:120px !important}#app-chat-container .resize-handle,#app-chat-container .chat-toggle-button,#app-chat-container .chat-maximize-button{display:none !important}#app-chat-container .font-size-control{height:30px !important}#app-chat-container .header-buttons{gap:4px !important}#app-chat-container .header-buttons .header-button{width:30px !important;height:30px !important}#app-chat-container .header-buttons .header-button svg{width:18px !important;height:18px !important}.ownbanner-back,.feedback,#reformal_tab,#footer,.threecol233 .col1{display:none !important}.profile-iframe-container{width:calc(100vw - 1em) !important;min-width:360px !important;top:0 !important;transform:translate(-50%, 1em) !important}}.profile-iframe-container{opacity:0;border:none;display:flex;position:fixed;z-index:1010 !important;width:75vw;min-width:1000px;height:80vh;top:48.5vh;left:50vw;transform:translate(-50%, -50%);box-shadow:0 4px 6px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.08) !important;border-radius:.6em !important}.clear-btn{position:absolute !important;top:0 !important;border-radius:.4em 0 .2em 0 !important;left:0 !important;cursor:pointer;height:25px !important;width:25px !important;border:none;filter:brightness(1);transition:filter .3s ease;background-color:var(--third-accent-color) !important}.clear-btn:hover{filter:brightness(1.2) !important}.clear-btn svg{stroke:color-mix(in srgb, var(--third-accent-color) 20%, var(--background-color) 80%) !important}.close-btn{position:absolute !important;top:0 !important;right:0 !important;border-radius:0 .4em 0 .2em !important;cursor:pointer;height:25px !important;width:25px !important;border:none;filter:brightness(1);transition:filter .3s ease;background-color:var(--second-accent-color) !important}.close-btn:hover{filter:brightness(1.2) !important}.close-btn svg{stroke:color-mix(in srgb, var(--second-accent-color) 20%, var(--background-color) 80%) !important}.image-info-container{position:fixed;display:flex;align-items:center;top:1em;left:1em;background:var(--background-color);color:var(--main-text-color);gap:.5em;padding:.5em 1em;border-radius:.2em !important;font-size:.9em;font-family:"Montserrat",sans-serif;z-index:1020 !important;box-shadow:0 0 2px rgba(0,0,0,.5) !important}.image-info-container .image-info-username{color:var(--fourth-accent-color);font-weight:500}.image-info-container .image-info-time{cursor:pointer;opacity:.8}',""]);const s=i},601:e=>{e.exports=function(e){return e[1]}},631:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.ignored-users-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;width:fit-content;background-color:var(--background-color);border:1px solid var(--border-color) !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow:hidden;z-index:1100}.ignored-users-panel .ignored-users-list{max-width:360px;min-width:220px;min-height:50px;max-height:70vh;overflow-y:auto;overflow-x:hidden;scrollbar-width:none}.ignored-users-panel .ignored-users-input-container{display:flex;position:absolute;top:0;left:0;right:0}.ignored-users-panel .ignored-users-input-container .ignored-users-input{flex:1;padding:.6em;border:none !important;border-radius:.4em 0 0 0 !important;background-color:var(--highlight-color);color:var(--main-text-color);caret-color:var(--main-text-color);outline:none !important}.ignored-users-panel .ignored-users-input-container .ignored-users-add-btn{padding:.6em;background-color:var(--first-accent-color) !important;color:color-mix(in srgb, var(--first-accent-color) 20%, var(--background-color) 80%) !important;border:none !important;outline:none !important;border-radius:0 .4em 0 0 !important;cursor:pointer;transition:filter .3s ease}.ignored-users-panel .ignored-users-input-container .ignored-users-add-btn:hover{filter:brightness(1.2)}.ignored-users-panel .ignored-users-list{margin-top:2em}.ignored-users-panel .ignored-users-list h2{font-size:1.2em !important;margin:0 !important;text-align:center !important;color:var(--third-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding-bottom:.6em !important}.ignored-users-panel .ignored-user-entry{display:flex;align-items:center;justify-content:space-between;padding:.3em;border-bottom:1px dashed var(--border-color) !important}.ignored-users-panel .ignored-user-entry .username{flex:1;color:var(--main-text-color) !important}.ignored-users-panel .ignored-user-entry .remove-btn{cursor:pointer;padding:.6em;background-color:var(--second-accent-color) !important;border:none;border-radius:.2em !important;filter:brightness(1);transition:filter .3s ease}.ignored-users-panel .ignored-user-entry .remove-btn svg{stroke:color-mix(in srgb, var(--second-accent-color) 20%, var(--background-color) 80%) !important}.ignored-users-panel .ignored-user-entry .remove-btn:hover{filter:brightness(1.2)}.field-error{background-color:var(--second-accent-color) !important;color:color-mix(in srgb, var(--first-accent-color) 20%, var(--background-color) 80%) !important;caret-color:color-mix(in srgb, var(--first-accent-color) 20%, var(--background-color) 80%) !important;transition:background-color .5s ease}',""]);const s=i},659:e=>{var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},802:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,".shake-effect{animation:shake 500ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both}@keyframes shake{0%{transform:translateX(0)}10%{transform:translateX(-4px)}20%{transform:translateX(6px)}30%{transform:translateX(-8px)}40%{transform:translateX(8px)}50%{transform:translateX(-6px)}60%{transform:translateX(5px)}70%{transform:translateX(-3px)}80%{transform:translateX(2px)}90%{transform:translateX(-1px)}100%{transform:translateX(0)}}",""]);const s=i},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var a=n.sourceMap;a&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},860:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.help-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;width:fit-content;background-color:var(--background-color) !important;border:1px solid var(--border-color) !important;padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;color:var(--main-text-color) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;z-index:1100}.help-panel .help-content{max-height:70vh !important;min-width:350px !important;overflow-y:auto;scrollbar-width:none}.help-panel .help-header{margin-top:0;font-size:1.5em;text-align:center;color:var(--first-accent-color) !important}.help-panel .help-section-header{margin-top:0 !important;margin-bottom:1.5em !important;font-size:1.5em !important;text-align:center;color:var(--third-accent-color) !important}.help-panel .help-section-subheader{margin:.8em 0 1.2em 1em;font-size:.9em;color:var(--first-accent-color) !important;font-weight:normal;text-align:left}.help-panel .help-list{list-style-type:none;padding-left:0}.help-panel .help-list .help-list-item{display:flex;align-items:center;flex-direction:row;padding:.3em;border-bottom:1px dashed var(--border-color) !important}.help-panel .help-list .help-list-item:last-child{border-bottom:none}.help-panel .help-list .help-list-item .help-hotkey{white-space:nowrap !important;width:fit-content;display:flex;color:var(--hotkey-label-text-color) !important;font-family:monospace;background-color:var(--hotkey-label-background-color) !important;border:1px solid var(--hotkey-label-border-color) !important;border-left:3px solid var(--hotkey-label-border-color) !important;border-radius:0 .2em .2em 0 !important;padding:2px 4px;margin-right:1em}@media(max-width: 768px){.help-panel .help-section-header{margin-bottom:1em !important;font-size:1em !important}.help-panel .help-section-subheader{margin:.5em 0 1em 1em !important;font-size:.8em !important}.help-panel .help-hotkey{margin-right:0 !important;margin-bottom:.5em !important}.help-panel .help-list-item{font-size:.9em !important;flex-direction:column !important;align-items:flex-start !important}}',""]);const s=i},879:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.themes-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;max-height:70vh !important;max-width:400px !important;width:fit-content;scrollbar-width:none;background-color:var(--background-color);border:1px solid var(--border-color);padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow-y:auto;overflow-x:hidden;z-index:1100}.themes-panel h2{font-size:1.2em !important;margin:0 !important;text-align:center !important;color:var(--third-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding-bottom:.6em !important}.themes-panel h3{font-size:1em !important;margin:.5em 0 !important;text-align:center !important;color:var(--first-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding-bottom:.3em !important}.themes-panel h3 .counter{font-size:.8em !important;color:var(--fourth-accent-color) !important;margin-left:.5em !important}.themes-panel .dark-themes,.themes-panel .light-themes{margin-top:1em}.themes-panel .dark-themes .theme-button,.themes-panel .light-themes .theme-button{display:flex;width:100%;padding:.5em;margin:.5em 0;background-color:var(--highlight-color);color:var(--main-text-color);border:none !important;border-radius:.2em !important;text-align:left;cursor:pointer;transition:all .2s ease}.themes-panel .dark-themes .theme-button:hover,.themes-panel .light-themes .theme-button:hover{background-color:var(--third-accent-color);color:var(--background-color)}.themes-panel .dark-themes .theme-button.active-theme,.themes-panel .light-themes .theme-button.active-theme{background-color:var(--third-accent-color);color:var(--background-color)}',""]);const s=i},934:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.events-panel{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;width:fit-content;background-color:var(--background-color);border:1px solid var(--border-color) !important;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow:hidden;z-index:1100}.events-panel h2{font-size:1.2em !important;margin:0 !important;text-align:center !important;color:var(--third-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding:.5em !important}.events-panel .events-list{max-width:90vw;max-height:70vh;min-width:300px;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;display:flex;flex-direction:column;gap:.5em;padding:1em}.events-panel .events-list .list-item{display:flex;font:500 .9em "Montserrat",sans-serif;color:#000;border-radius:.2em !important;padding:.5em;gap:.5em;cursor:pointer}.events-panel .events-list .list-item .event-icon svg,.events-panel .events-list .list-item .timestamp{filter:brightness(0.4)}.events-panel .events-list .list-item.new-event:not(.old-event){margin-top:2em}.events-panel .events-list .list-item.new-event:not(.old-event)+.list-item.new-event:not(.old-event){margin-top:0}',""]);const s=i},957:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.emoji-panel{opacity:0;transition:opacity .3s ease;position:absolute !important;top:50%;left:50%;transform:translate(-50%, -50%);background:var(--background-color) !important;border:1px solid var(--border-color) !important;border-radius:.4em !important;width:380px;height:580px;display:flex;flex-direction:column;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;z-index:1010}.emoji-panel .emoji-search-container{padding:1em !important;border:none !important}.emoji-panel .emoji-search-container .emoji-search{width:100%;padding:8px;border-radius:4px;background:var(--highlight-color) !important;border:none !important;border-radius:.2em !important;color:var(--main-text-color) !important;caret-color:var(--main-text-color) !important;font-size:.9em !important}.emoji-panel .emoji-search-container .emoji-search:focus{outline:none}.emoji-panel .emoji-categories{position:sticky !important;top:0 !important;display:grid !important;grid-template-columns:repeat(auto-fill, minmax(32px, 1fr)) !important;padding:8px !important;border-bottom:1px solid var(--border-color) !important;gap:8px !important;justify-content:center !important;align-items:center !important;overflow-x:auto !important;scrollbar-width:thin !important}.emoji-panel .emoji-categories .emoji-category-btn{font-family:"Noto Color Emoji" !important;position:relative !important;background:none !important;border:none !important;padding:4px !important;cursor:pointer !important;font-size:1.5em !important;transition:background-color .2s;width:100% !important;height:100% !important;display:flex !important;align-items:center !important;justify-content:center !important;aspect-ratio:1 !important;border-bottom:3px solid rgba(0,0,0,0) !important}.emoji-panel .emoji-categories .emoji-category-btn.active{opacity:1;border-bottom:3px solid var(--third-accent-color) !important}.emoji-panel .emoji-categories .emoji-category-btn:hover{background-color:#333}.emoji-panel .emoji-categories::-webkit-scrollbar{width:6px;height:6px}.emoji-panel .emoji-categories::-webkit-scrollbar-track{background:#1e1e1e}.emoji-panel .emoji-categories::-webkit-scrollbar-thumb{background:#444;border-radius:3px}.emoji-panel .emoji-categories::-webkit-scrollbar-thumb:hover{background:#555}.emoji-panel .emoji-container{flex:1;overflow-y:auto;overflow-x:hidden !important;display:grid !important;gap:8px !important;width:100% !important;max-width:100% !important;scrollbar-width:none !important}.emoji-panel .emoji-container .emoji-category-section{margin-bottom:10px}.emoji-panel .emoji-container .emoji-category-section .emoji-category-header{padding:8px !important;color:var(--main-text-color) !important;font-size:.9em !important;position:sticky !important;top:0px !important;background-color:var(--background-color) !important;z-index:1 !important;border-bottom:1px solid var(--border-color) !important;width:100% !important;box-sizing:border-box !important;margin:0 !important}.emoji-panel .emoji-container .emoji-category-section .emoji-list{display:grid;grid-template-columns:repeat(auto-fill, minmax(32px, 1fr)) !important;padding:8px !important;gap:8px;align-content:start}.emoji-panel .emoji-container .emoji-category-section .emoji-list .emoji-btn{font-family:"Noto Color Emoji" !important;background:none;border:none;border-radius:.2em !important;padding:4px !important;cursor:pointer;font-size:1.5em !important;transition:background-color .2s;width:100% !important;height:100% !important;display:flex !important;align-items:center !important;justify-content:center !important;aspect-ratio:1 !important}.emoji-panel .emoji-container .emoji-category-section .emoji-list .emoji-btn:hover{background-color:var(--highlight-color) !important}.emoji-panel .emoji-container::-webkit-scrollbar{width:6px;height:6px}.emoji-panel .emoji-container::-webkit-scrollbar-track{background:#1e1e1e}.emoji-panel .emoji-container::-webkit-scrollbar-thumb{background:#444;border-radius:3px}.emoji-panel .emoji-container::-webkit-scrollbar-thumb:hover{background:#555}.emoji-panel .emoji-footer{border-top:1px solid var(--border-color) !important;display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:5px}.emoji-panel .emoji-footer .emoji-info-panel{height:40px !important;padding:8px !important;display:flex !important;align-items:center !important;gap:8px !important;color:var(--main-text-color) !important;font-size:.9em !important;background-color:var(--background-color) !important}.emoji-panel .emoji-footer .emoji-info-panel .emoji-info-icon{font-family:"Noto Color Emoji" !important;font-size:1.5em !important}.emoji-panel .emoji-footer .emoji-info-panel .emoji-info-keywords{color:#888 !important;font-style:italic !important}.emoji-panel .emoji-footer .emoji-language-select{border-radius:.4em !important;border:none !important;padding:5px 10px;font-size:14px;background-color:var(--foreground-color) !important;color:var(--main-text-color) !important;cursor:pointer;transition:border-color .3s ease}.emoji-panel .emoji-footer .emoji-language-select:hover{border-color:var(--border-color) !important}.emoji-panel .emoji-footer .emoji-language-select option{font-size:14px;background-color:var(--foreground-color) !important;color:var(--main-text-color) !important}',""]);const s=i},999:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(601),o=n.n(r),a=n(314),i=n.n(a)()(o());i.push([e.id,'.chat-username-color-picker{opacity:0;position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);height:fit-content;width:fit-content;background-color:var(--background-color);border:1px solid var(--border-color);padding:1em;border-radius:.4em !important;box-shadow:0 2px 8px rgba(0,0,0,.15) !important;font-family:"Gill Sans","Gill Sans MT",Calibri,"Trebuchet MS",sans-serif;overflow:hidden;z-index:1100}.chat-username-color-picker .username-colors{max-width:360px;min-width:220px;min-height:50px;max-height:70vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.chat-username-color-picker h2{font-size:1.2em !important;margin:0 !important;text-align:center !important;color:var(--third-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding-bottom:.6em !important}.chat-username-color-picker .saved-username-colors,.chat-username-color-picker .generated-username-colors{margin-top:1em}.chat-username-color-picker .saved-username-colors h3,.chat-username-color-picker .generated-username-colors h3{font-size:1em !important;margin:.5em 0 !important;text-align:center !important;color:var(--first-accent-color) !important;border-bottom:1px dashed var(--border-color) !important;padding-bottom:.3em !important}.chat-username-color-picker .saved-username-colors h3 .counter,.chat-username-color-picker .generated-username-colors h3 .counter{font-size:.8em !important;color:var(--fourth-accent-color) !important;margin-left:.5em !important}.chat-username-color-picker .generated-username-colors .username-entry.disabled-entry{pointer-events:none;opacity:.2}.chat-username-color-picker .username-entry{display:flex;align-items:center;justify-content:right;padding:.3em;border-bottom:1px dashed var(--border-color)}.chat-username-color-picker .username-entry:last-child{border-bottom:none}.chat-username-color-picker .username-entry .username{flex:1;filter:var(--username-filter) !important}.chat-username-color-picker .username-entry .color-box{cursor:pointer !important;border-radius:.2em !important;margin-left:1em;padding:.6em;font-size:.8em;font-family:monospace;filter:var(--username-filter) !important}.chat-username-color-picker .username-entry input[type=color]{display:none !important}.chat-username-color-picker .entry-btn{cursor:pointer;display:flex;align-items:center;justify-content:center;width:25px;height:25px;border-radius:.2em !important;margin-left:8px}.chat-username-color-picker .remove-all-btn{background-color:color-mix(in srgb, var(--second-accent-color) 40%, var(--background-color) 60%) !important}.chat-username-color-picker .remove-all-btn svg{stroke:var(--second-accent-color) !important}.chat-username-color-picker .remove-btn,.chat-username-color-picker .edit-btn{filter:var(--username-filter) !important}.chat-username-color-picker .add-btn,.chat-username-color-picker .import-btn,.chat-username-color-picker .export-btn{background-color:color-mix(in srgb, var(--first-accent-color) 40%, var(--background-color) 60%) !important}.chat-username-color-picker .load-btn{background-color:color-mix(in srgb, var(--fourth-accent-color) 40%, var(--background-color) 60%) !important}.chat-username-color-picker .add-btn svg,.chat-username-color-picker .import-btn svg,.chat-username-color-picker .export-btn svg{stroke:var(--first-accent-color) !important}.chat-username-color-picker .load-btn svg{stroke:var(--fourth-accent-color) !important}.chat-username-color-picker .confirmation{display:flex;align-items:center;background-color:var(--background-color) !important;position:absolute;left:0 !important;top:0 !important;right:0 !important}.chat-username-color-picker .confirmation .input-field{padding:.6em !important;background-color:var(--highlight-color);color:var(--main-text-color);caret-color:var(--main-text-color);width:150% !important;border:none !important;outline:none !important}.chat-username-color-picker .confirmation .field-btn{width:50%;padding:.6em;border:none !important;outline:none !important;cursor:pointer;transition:filter .3s ease}.chat-username-color-picker .confirmation .field-btn:hover{filter:blur(1.2)}.chat-username-color-picker .confirmation .confirm-btn{border-radius:0 .4em 0 0 !important;background-color:var(--first-accent-color) !important;color:color-mix(in srgb, var(--first-accent-color) 20%, var(--background-color) 80%) !important}.chat-username-color-picker .confirmation .cancel-btn{border-radius:.4em 0 0 0 !important;background-color:var(--second-accent-color) !important;color:color-mix(in srgb, var(--second-accent-color) 20%, var(--background-color) 80%) !important}',""]);const s=i}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={id:r,exports:{}};return e[r](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var r=n(72),o=n.n(r),a=n(825),i=n.n(a),s=n(659),c=n.n(s),l=n(56),d=n.n(l),m=n(540),u=n.n(m),p=n(113),h=n.n(p),g=n(550),f={};f.styleTagTransform=h(),f.setAttributes=d(),f.insert=c().bind(null,"head"),f.domAPI=i(),f.insertStyleElement=u();o()(g.A,f);g.A&&g.A.locals&&g.A.locals;var b=n(957),v={};v.styleTagTransform=h(),v.setAttributes=d(),v.insert=c().bind(null,"head"),v.domAPI=i(),v.insertStyleElement=u();o()(b.A,v);b.A&&b.A.locals&&b.A.locals;var y=n(860),k={};k.styleTagTransform=h(),k.setAttributes=d(),k.insert=c().bind(null,"head"),k.domAPI=i(),k.insertStyleElement=u();o()(y.A,k);y.A&&y.A.locals&&y.A.locals;var x=n(416),w={};w.styleTagTransform=h(),w.setAttributes=d(),w.insert=c().bind(null,"head"),w.domAPI=i(),w.insertStyleElement=u();o()(x.A,w);x.A&&x.A.locals&&x.A.locals;var E=n(999),S={};S.styleTagTransform=h(),S.setAttributes=d(),S.insert=c().bind(null,"head"),S.domAPI=i(),S.insertStyleElement=u();o()(E.A,S);E.A&&E.A.locals&&E.A.locals;var C=n(631),L={};L.styleTagTransform=h(),L.setAttributes=d(),L.insert=c().bind(null,"head"),L.domAPI=i(),L.insertStyleElement=u();o()(C.A,L);C.A&&C.A.locals&&C.A.locals;var j=n(802),$={};$.styleTagTransform=h(),$.setAttributes=d(),$.insert=c().bind(null,"head"),$.domAPI=i(),$.insertStyleElement=u();o()(j.A,$);j.A&&j.A.locals&&j.A.locals;var A=n(879),M={};M.styleTagTransform=h(),M.setAttributes=d(),M.insert=c().bind(null,"head"),M.domAPI=i(),M.insertStyleElement=u();o()(A.A,M);A.A&&A.A.locals&&A.A.locals;var I=n(934),T={};T.styleTagTransform=h(),T.setAttributes=d(),T.insert=c().bind(null,"head"),T.domAPI=i(),T.insertStyleElement=u();o()(I.A,T);I.A&&I.A.locals&&I.A.locals;const z="https://klavogonki.ru",N=`${z}/xmpp-httpbind/`,P=100,B=3e3,O=500,q=300,_=500,H=150,D=150,R=2e3,U=1e4,F=2e3,J={chat:{en:{online:"Chat connection established.",offline:"Chat connection lost."},ru:{online:"Соединение с чатом установлено.",offline:"Соединение с чатом потеряно."}},network:{en:{online:"Network connection restored.",offline:"Network connection lost."},ru:{online:"Сетевое соединение восстановлено.",offline:"Сетевое соединение потеряно."}}},X=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😏","😐","😑","😒","😓","😔","😕","😖","😗","😘","😙","😚","😜","😝","😛","🤑","🤗","🤔","🤐","🤨","😣","😥","😮","🤯","😳","😱","😨","😰","😢","🤪","😵","😲","🤤","😷","🤒","🤕","🤢","🤧","😇","🥳","🥺","😬","😴","😌","🤥","🥴","🥵","🥶","🤧","🤭","🤫","😠","😡","😳","😞","😟","😕","🐱","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🐶","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐸","🐵","🙈","🙉","🙊","🐔","🦄"],Y=["klavogonki.ru","youtube.com","youtu.be","imgur.com","pikabu.ru","userapi.com","ibb.co","yaplakal.com","freepik.com","fastpic.org"],K="#1e1e1e",G="https://raw.githubusercontent.com/VimiummuimiV/KG_Chat_Application/refs/heads/main/src/data/usernameColors.json",W={info:"#2196F3",warning:"#FF9800",error:"#F44336",success:"#4CAF50"};let V=0,Q=!1,Z=null,ee={},te=null;const ne=.2,re=10,oe=.1;function ae(){Object.entries(ee).forEach((([e,t])=>{document.removeEventListener(e,t)}))}function ie(e){if(!te)return;const t=function(e){const t=document.querySelectorAll(".clickable-thumbnail"),n=Array.from(t)[e];if(!n)return null;let r=n.closest(".message");if(!r)return null;const o=r.querySelector(".message-info");return o?{time:o.querySelector(".time")?.textContent||"",username:o.querySelector(".username")?.textContent||""}:null}(e);if(!t)return;te.innerHTML=`\n    <div class="image-info-time">${t.time}</div>\n    <div class="image-info-username">${t.username}</div>\n  `;const n=te.querySelector(".image-info-time");n&&n.addEventListener("click",(e=>{e.stopPropagation();const t=St(n.textContent.trim()),r=`https://klavogonki.ru/chatlogs/${new Intl.DateTimeFormat("en-CA").format(new Date)}.html#${t}`;window.open(r,"_blank")}))}const se=e=>{ft(e,"hide","0");const t=document.querySelector(".dimming-element");!document.querySelector(".popup-panel")&&t&&ft(t,"hide","0"),ae(),te&&te.parentNode&&(te.parentNode.removeChild(te),te=null)},ce=e=>{const t=be(),n=V+e;n>=0&&n<t.length&&!Q&&(Q=!0,Z&&(Z.src=t[n].imgSrc),setTimeout((()=>{Q=!1,V=n,ie(V)}),50))},le=(e,t)=>{const n=document.createElement("img");n.src=e,n.classList.add("scaled-thumbnail"),document.body.appendChild(n),Z=n,V=t,te=function(){const e=document.createElement("div");return e.className="image-info-container",e}(),document.body.appendChild(te),ie(V);let r=1,o=!1,a=0,i=0,s=0,c=0;let l=document.querySelector(".dimming-element");return l||(l=document.createElement("div"),l.classList.add("dimming-element"),document.body.appendChild(l)),Lt()&&function(e,t,n,r){let o=0,a=0,i=0,s=0,c={x:0,y:0};const l=e=>{if(e.preventDefault(),2===e.touches.length){const t=e.touches[0],n=e.touches[1];c.x=(t.clientX+n.clientX)/2,c.y=(t.clientY+n.clientY)/2}},d=l=>{l.preventDefault();const d=l.touches.length;if(2===d){const i=l.touches[0],s=l.touches[1],d=(i.clientX+s.clientX)/2,m=(i.clientY+s.clientY)/2,u=Math.hypot(i.clientX-s.clientX,i.clientY-s.clientY);if(2===o){const o=e.getBoundingClientRect(),i=d-o.left-o.width/2,s=m-o.top-o.height/2,c=t;let l=t*(u/a);l=Math.max(ne,Math.min(l,re)),({translateX:n,translateY:r}=de({imageElement:e,anchorX:i,anchorY:s,oldScale:c,newScale:l,translateX:n,translateY:r})),t=l}a=u,c.x=d,c.y=m}else if(1===d){const a=l.touches[0],c=a.clientX,d=a.clientY;if(1===o){n+=c-i,r+=d-s,e.style.transform=`translate(-50%, -50%) translate(${n}px, ${r}px) scale(${t})`}i=c,s=d}o=d},m=e=>{0===e.touches.length&&(o=0)};e.addEventListener("touchstart",l,{passive:!1}),e.addEventListener("touchmove",d,{passive:!1}),e.addEventListener("touchend",m)}(n,r,s,c),ee.click=e=>{n.contains(e.target)||(n.remove(),ae())},ee.keydown=e=>{"Escape"===e.code||"Space"===e.code?(e.preventDefault(),se(n)):"ArrowLeft"===e.code?ce(-1):"ArrowRight"===e.code&&ce(1)},ee.wheel=e=>{e.preventDefault();const t=n.getBoundingClientRect(),o=e.clientX-t.left-t.width/2,a=e.clientY-t.top-t.height/2,i=e.deltaY<0?1:-1,l=r;let d=r+i*oe*r;d=Math.max(ne,Math.min(d,re)),({translateX:s,translateY:c}=de({imageElement:n,anchorX:o,anchorY:a,oldScale:l,newScale:d,translateX:s,translateY:c})),r=d},ee.mousemove=e=>{if(o){if(e.ctrlKey){const t=n.getBoundingClientRect(),o=e.clientX-t.left-t.width/2,a=e.clientY-t.top-t.height/2,l=e.clientY-i,d=l<0?1:-1,m=Math.abs(l)*oe*.05,u=r;let p=r+d*m*r;p=Math.max(ne,Math.min(p,re)),({translateX:s,translateY:c}=de({imageElement:n,anchorX:o,anchorY:a,oldScale:u,newScale:p,translateX:s,translateY:c})),r=p}else{const t=(e.clientX-a)/r*5,o=(e.clientY-i)/r*5;s+=t,c+=o,n.style.transform=`translate(-50%, -50%) translate(${s}px, ${c}px) scale(${r})`}a=e.clientX,i=e.clientY}},ee.mousedown=e=>{const{button:t,clientX:r,clientY:s,target:c,ctrlKey:l}=e;(0!==t&&2!==t||c===n)&&(0===t?ce(-1):2===t?(e.preventDefault(),l?(navigator.clipboard.writeText(c.src).catch(console.error),se(n)):ce(1)):1===t&&(o=!0,a=r,i=s,e.preventDefault()))},ee.mouseup=e=>{1===e.button&&(o=!1)},ee.contextmenu=e=>e.preventDefault(),Object.entries(ee).forEach((([e,t])=>{document.addEventListener(e,t)})),ft(l,"show","1"),l.addEventListener("click",(()=>{se(n)})),n};function de({imageElement:e,anchorX:t,anchorY:n,oldScale:r,newScale:o,translateX:a,translateY:i}){const s=o-r;return a-=t/r*s,i-=n/r*s,e.style.transform=`translate(-50%, -50%) translate(${a}px, ${i}px) scale(${o})`,{translateX:a,translateY:i}}const me=["jpg","jpeg","png","gif","webp"],ue="📷",pe="🖥️",he="💀️️";let ge=[];const fe=e=>{const t=(e=>{try{return e.match(/\.([^?#.]+)(?:[?#]|$)/i)?.[1]?.toLowerCase()||""}catch(e){return At(`Error extracting image extension: ${e.message}`,"error"),""}})(e);return{allowed:me.includes(t),extension:t}},be=()=>ge;function ve(e,t){let n=e.parentElement;n.classList.contains("image-container")||(n=document.createElement("div"),n.classList.add("image-container"),e.parentNode.insertBefore(n,e),n.appendChild(e));const r=document.createElement("div");r.classList.add("clickable-thumbnail"),r.dataset.sourceLink=e.href;const o=document.createElement("img");o.src=e.href,o.onload=()=>{r.appendChild(o),n.appendChild(r),kt(600)},o.onerror=()=>{At(`Failed to load image: ${e.href}`,"error"),e.classList.add("skipped")},t?e.querySelector(".clickable-thumbnail")||e.addEventListener("click",(()=>{e.querySelector(".clickable-thumbnail")||(r.appendChild(o),n.appendChild(r))})):(r.appendChild(o),n.appendChild(r)),r.addEventListener("click",(t=>{t.stopPropagation();const n=(()=>{const e=document.getElementById("messages-panel");if(e)return ge=[],e.querySelectorAll(".clickable-thumbnail").forEach(((e,t)=>{const n=e.querySelector("img");n&&e.dataset.sourceLink&&ge.push({link:e.dataset.sourceLink,imgSrc:n.src,index:t})})),ge})(),r=n.findIndex((t=>t.link===e.href||t.imgSrc===o.src));ft(le(o.src,r>=0?r:0),"show","1");const a=document.querySelector(".dimming-element");a&&ft(a,"show","1")}))}function ye(){const e=document.getElementById("messages-panel");if(!e)return;const t=e.querySelectorAll("a:not(.skipped):not(.processed-image)");t.length&&t.forEach((e=>{if(!e.href||!e.href.startsWith("http"))return;const{allowed:t,extension:n}=fe(e.href);if(!t)return;e.classList.add("media");const{isTrusted:r,domain:o}=bt(e.href);e.title=vt(e.href)?yt(e.href):e.href,r?function(e,t,n){e.textContent=`${ue} ${t.toUpperCase()} ${pe} ${n}`,e.classList.add("processed-image"),ve(e,!1)}(e,n,o):function(e,t,n){e.classList.add("skipped"),e.textContent=`${ue} ${t.toUpperCase()} ${pe} ${n} ${he} Untrusted`,e.addEventListener("click",(t=>{e.classList.contains("processed-image")||(t.preventDefault(),e.classList.remove("skipped"),e.classList.add("processed-image"),ve(e,!0))}))}(e,n,o)}))}const ke="📺",xe="📹",we="🎬️",Ee="🖥️",Se="💀️️",Ce=["mp4","webm","ogg","mov","avi"];let Le=null,je=null;async function $e(e,t,n,r){e.hidden=!0,t.hidden=!0;const o=await async function(e){const t=`https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${e}&format=json`;try{const e=await fetch(t),n=await e.json();return{title:n.title||"Title not found",channel:n.author_name||"Channel not found"}}catch(e){return At("Error fetching YouTube metadata.","error"),{title:"Error",channel:"Error"}}}(n),a=document.createElement("span");a.classList.add("channel-name"),a.textContent=`${ke} ${o.channel}`;const i=document.createElement("span");i.classList.add("video-title"),i.textContent=`${xe} ${o.title}`;const s=new Image;s.src=`https://img.youtube.com/vi/${n}/hqdefault.jpg`,s.alt=r,s.classList.add("youtube-thumb"),s.addEventListener("load",(()=>{e.replaceChildren(a,i),t.replaceChildren(s),e.hidden=!1,t.hidden=!1,kt(600)})),s.addEventListener("error",(()=>{At(`Error loading Youtube thumbnail image for ${n}.`,"error")}))}function Ae(){const e=document.getElementById("messages-panel");if(!e)return;const t=e.querySelectorAll("a:not(.skipped):not(.processed-video)");async function n(e,t,n,r){const{youtubeMatch:o,videoType:a,videoId:i}=r,s=(e=>{const t=e.match(/\.([^?#.]+)(?:[?#]|$)/i)?.[1]?.toLowerCase()||"";return{allowed:Ce.includes(t),extension:t}})(t);if(!o&&!s.allowed)return;e.classList.add("processed-video");const c=document.createElement("div");if(c.classList.add("video-wrapper"),e.textContent=`${we} ${a} ${Ee} ${n}`,e.title=vt(t)?yt(t):t,e.style.display="inline-flex",o){const t=document.createElement("div");t.classList.add("youtube-info");const n=document.createElement("div");n.classList.add("youtube-placeholder"),n.dataset.videoId=i,n.dataset.videoType=a,e.parentNode.insertBefore(c,e),c.append(e,t,n),await $e(t,n,i,a),n.addEventListener("click",(()=>{if(je&&je!==n){const e=je.dataset.videoId,t=je.dataset.videoType;$e(je.previousElementSibling,je,e,t)}je=n;const e=(Le||(Le=document.createElement("iframe"),Le.classList.add("video-container"),Le.allowFullscreen=!0),Le);e.hidden=!0,e.src=`https://www.youtube.com/embed/${i}?autoplay=1`,n.replaceChildren(e),e.addEventListener("load",(()=>{e.hidden=!1}))}))}else{const n=document.createElement("video");n.classList.add("video-container"),n.src=t,n.controls=!0,n.hidden=!0,n.addEventListener("loadeddata",(()=>{n.hidden=!1,kt(600)})),n.addEventListener("error",(()=>{At(`Error loading video source: ${t}`,"error"),c.replaceChildren(e)})),e.parentNode.insertBefore(c,e),c.append(e,n)}}t.length&&t.forEach((e=>{const t=e.href;if(!t)return;const r=function(e){const t=e.match(/(?:shorts\/|live\/|watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/i);if(t)return{youtubeMatch:!0,videoId:t[1],videoType:e.includes("shorts/")?"Shorts":e.includes("live/")?"Live":e.includes("watch?v=")?"Watch":e.includes("youtu.be/")?"Share":"YouTube"};const n=e.split(".").pop().toLowerCase();return!!Ce.includes(n)&&{youtubeMatch:!1,videoType:`Video (${n.toUpperCase()})`}}(t);if(!r)return;e.classList.add("media");const{isTrusted:o,domain:a}=bt(t);if(!o)return e.classList.add("skipped"),e.textContent=`${we} ${r.videoType} ${Ee} ${a} ${Se} Untrusted`,void e.addEventListener("click",(o=>{e.classList.contains("processed-video")||(o.preventDefault(),e.classList.remove("skipped"),n(e,t,a,r))}));n(e,t,a,r)}))}function Me(){const e=document.querySelector("#app-chat-container"),t=e.querySelector(".chat-wrapper"),n=t.offsetWidth<=780,r=t.offsetWidth<=380,o=e.querySelector(".user-list-container"),a=Lt();if(o){const t=e.querySelectorAll(".message.system");if(n||a){Object.assign(o.style,{position:"absolute",height:"100%",top:"0",right:"0",transition:`transform ${H}ms ease-in-out, opacity ${H}ms ease-in-out`,zIndex:"1001"}),o.classList.add("floating-userlist"),t.forEach((e=>e.style.setProperty("align-items","start","important")));let n=e.querySelector(".reveal-userlist-btn");const r=o.classList.contains("shown-userlist");if(!n){n=document.createElement("button"),n.className="reveal-userlist-btn",n.textContent="📋",e.appendChild(n);const t=e=>{o.contains(e.target)||e.target===n||(Ie(o,!1),setTimeout((()=>document.removeEventListener("click",t,!0)),H))};n.addEventListener("click",(e=>{e.stopPropagation();const n=o.classList.contains("shown-userlist");Ie(o,!n)?document.addEventListener("click",t,!0):document.removeEventListener("click",t,!0)}))}r||(o.style.transform="translateX(100%)",o.style.opacity="0",o.style.display="none")}else{Object.assign(o.style,{position:"",height:"",top:"",right:"",transform:"",opacity:"",display:"",transition:"",zIndex:""}),o.classList.remove("shown-userlist"),o.classList.remove("floating-userlist"),t.forEach((e=>e.style.removeProperty("align-items")));const n=e.querySelector(".reveal-userlist-btn");n?.remove()}}e.querySelectorAll(".message").forEach((e=>{const t=e.querySelector(".message-text");t&&(e.style.flexDirection=n?"column":"row",e.style.marginBottom=n?"0.8em":"0",t.style.marginTop=n?"0.2em":"0")})),e.querySelectorAll(".video-container, .youtube-thumb").forEach((e=>e.style.maxWidth=r?"100%":""))}function Ie(e,t){return e.classList.contains("shown-userlist")!==t&&(e.classList.toggle("shown-userlist",t),t?(e.style.display="flex",e.offsetWidth,e.style.transform="translateX(0)",e.style.opacity="1"):(e.style.transform="translateX(100%)",e.style.opacity="0",setTimeout((()=>{e.classList.contains("shown-userlist")||(e.style.display="none")}),H))),t}function Te(e){e.classList.add("shake-effect"),setTimeout((()=>{e.classList.remove("shake-effect")}),500)}const ze="http://www.w3.org/2000/svg",Ne=`\n  <svg class="send" xmlns="${ze}" \n  width="24" \n  height="24" \n  viewBox="-10 -10 270 270">\n    <path d="M22.32 98.04l-19.04 -87.15c-0.75,-3.46 0.48,-6.84 3.29,-9 2.81,-2.17 6.39,-2.49 9.55,-0.87l225.95 116.02c3.07,1.57 4.87,4.52 4.87,7.96 0,3.44 -1.8,6.39 -4.87,7.96l-225.95 116.02c-3.16,1.62 -6.74,1.3 -9.55,-0.87 -2.81,-2.16 -4.04,-5.54 -3.29,-9l19.04 -87.15c0.79,-3.62 3.53,-6.26 7.18,-6.91l102.6 -18.19c0.91,-0.16 1.56,-0.94 1.56,-1.86 0,-0.92 -0.65,-1.7 -1.56,-1.86l-102.6 -18.19c-3.65,-0.65 -6.39,-3.29 -7.18,-6.91z"/>\n  </svg>`,Pe=`\n  <svg class="no" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250" \n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n      <path d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm45.71 70.24l32.67 32.67 32.67 -32.67c2.73,-2.73 7.18,-2.73 9.91,0l12.18 12.18c2.73,2.73 2.73,7.18 0,9.91l-32.67 32.67 32.67 32.66c2.73,2.74 2.73,7.19 0,9.92l-12.18 12.18c-2.73,2.73 -7.18,2.73 -9.91,0l-32.67 -32.67 -32.67 32.67c-2.73,2.73 -7.18,2.73 -9.91,0l-12.18 -12.18c-2.73,-2.73 -2.73,-7.18 0,-9.92l32.67 -32.66 -32.67 -32.67c-2.73,-2.73 -2.73,-7.18 0,-9.91l12.18 -12.18c2.73,-2.73 7.18,-2.73 9.91,0z"/>\n  </svg>`,Be=`\n  <svg class="yes" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250" \n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n      <path d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm15.5 135.79l57.92 -57.93c2.73,-2.73 7.19,-2.72 9.92,0.01l57.92 57.92c2.73,2.73 2.73,7.18 0,9.91l-12.18 12.18c-2.73,2.73 -7.18,2.73 -9.92,0l-35.82 -35.83c-2.73,-2.73 -7.19,-2.73 -9.92,0l-35.82 35.83c-2.74,2.73 -7.19,2.73 -9.92,0l-12.18 -12.18c-2.73,-2.73 -2.73,-7.18 0,-9.91z"/>\n  </svg>`,Oe=`\n  <svg class="yes" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm109.99 181.69l-75.07 0c-7.3,0 -13.23,-5.92 -13.23,-13.22l0 -75.08c0,-2.35 1.92,-4.28 4.28,-4.28l17.9 0c2.35,0 4.27,1.93 4.27,4.28l0 32.81c0,1.77 1.01,3.28 2.64,3.96 1.63,0.67 3.42,0.33 4.66,-0.93l59.68 -59.68c1.67,-1.65 4.38,-1.65 6.05,0l12.66 12.66c1.66,1.67 1.66,4.38 0,6.05l-59.68 59.68c-1.26,1.24 -1.6,3.03 -0.93,4.66 0.68,1.63 2.19,2.64 3.96,2.64l32.81 0c2.35,0 4.28,1.92 4.28,4.28l0 17.9c0,2.36 -1.93,4.28 -4.28,4.28z"/>\n  </svg>`,qe=`\n  <svg class="no" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.62 0l156.76 0c25.64,0 46.62,20.98 46.62,46.62l0 156.75c0,25.65 -20.98,46.63 -46.62,46.63l-156.76 0c-25.64,0 -46.62,-20.98 -46.62,-46.63l0 -156.75c0,-25.64 20.98,-46.62 46.62,-46.62zm46.77 68.31l75.07 0c7.3,0 13.23,5.92 13.23,13.22l0 75.08c0,2.35 -1.92,4.28 -4.28,4.28l-17.9 0c-2.35,0 -4.27,-1.93 -4.27,-4.28l0 -32.81c0,-1.77 -1.01,-3.28 -2.64,-3.96 -1.63,-0.67 -3.42,-0.33 -4.66,0.93l-59.68 59.68c-1.67,1.65 -4.38,1.65 -6.05,0l-12.66 -12.66c-1.66,-1.67 -1.66,-4.38 0,-6.05l59.68 -59.68c1.26,-1.24 1.6,-3.03 0.93,-4.66 -0.68,-1.63 -2.19,-2.64 -3.96,-2.64l-32.81 0c-2.35,0 -4.28,-1.92 -4.28,-4.27l0 -17.9c0,-2.36 1.93,-4.28 4.28,-4.28z"/>\n  </svg>`,_e=`\n  <svg class="help" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm130.96 87.85c0,6.57 -1.03,12.72 -3.08,18.06 -2.05,5.34 -4.93,9.85 -8.42,13.75 -3.69,3.9 -8,7.39 -13.13,10.47 -4.11,2.46 -8.83,4.93 -13.96,6.98 -1.64,0.82 -2.87,2.46 -2.87,4.51l0 15.19c0,2.67 -2.06,4.72 -4.73,4.72l-25.04 0c-2.66,0 -4.92,-2.05 -4.92,-4.72l0 -25.65c0,-2.26 1.44,-3.9 3.49,-4.52 2.87,-1.02 5.95,-2.05 9.23,-3.28 4.52,-1.85 8.62,-3.9 12.11,-6.57 3.9,-2.67 6.78,-5.75 9.24,-9.24 2.46,-3.49 3.49,-7.59 3.49,-12.31 0,-6.78 -2.05,-11.7 -6.36,-14.78 -4.31,-2.88 -10.06,-4.52 -17.65,-4.52 -5.75,0 -11.7,1.24 -18.07,3.7 -5.33,2.05 -9.85,4.31 -13.13,6.36 -1.03,0.62 -2.26,0.62 -3.29,0 -1.02,-0.62 -1.64,-1.64 -1.64,-2.87l0 -23.2c0,-2.05 1.23,-3.9 3.08,-4.51 4.1,-1.44 9.44,-3.08 15.8,-4.52 8.42,-2.05 17.24,-3.07 26.89,-3.07 8.42,0 16.01,1.02 22.58,3.07 6.36,2.06 12.11,4.72 16.62,8.42 4.52,3.49 7.8,7.8 10.27,12.72 2.26,4.73 3.49,10.06 3.49,15.81l0 0zm-46.19 114.12l-25.04 0c-2.67,0 -4.92,-2.05 -4.92,-4.72l0 -17.24c0,-2.67 2.25,-4.72 4.92,-4.72l25.04 0c2.67,0 4.72,2.05 4.72,4.72l0 17.24c0,2.67 -2.05,4.72 -4.72,4.72z"/>\n  </svg>`,He=`\n  <svg class="theme" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250" \n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm5.64 173.13l65.47 -60.21c4.39,-4.03 11.2,-3.74 15.41,0.47l3.42 3.42c4.21,4.21 4.5,11.02 0.47,15.41l-60.22 65.47c-2.17,2.37 -4.86,3.69 -8.08 3.79 -3.21,0.1 -6.02,-1.01 -8.29,-3.29l-8.68 -8.68c-2.28,-2.28 -3.39,-5.08 -3.29,-8.3 0.1,-3.21 1.42,-5.9 3.79,-8.08zm142.53 -113.72l-4.72 22.03 11.64 21.05c0.62,1.11 0.63,2.35 0.05,3.47 -0.59,1.13 -1.62,1.82 -2.87,1.95l-22.41 2.32 -16.43 17.58c-0.86,0.93 -2.03,1.32 -3.28,1.11 -1.25,-0.21 -2.23,-0.97 -2.74,-2.12l-9.13 -20.59 -21.8 -10.19c-1.15,-0.54 -1.89,-1.53 -2.07,-2.78 -0.19,-1.26 0.23,-2.42 1.17,-3.27l16.76 -15.05 2.96 -23.87c0.16,-1.26 0.87,-2.27 2.01,-2.83 1.13,-0.57 2.37,-0.53 3.47,0.11l19.48 11.29 23.63 -4.57c1.24,-0.24 2.42,0.13 3.31,1.03 0.89,0.91 1.23,2.09 0.97,3.33z"/>\n  </svg>`,De=`\n  <svg class="colors" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm78.41 47.82c9.23,0 17.59,3.75 23.65,9.8 6.05,6.05 9.79,14.41 9.79,23.64 0,9.23 -3.74,17.6 -9.79,23.65 -6.06,6.05 -14.42,9.79 -23.65,9.79 -9.23,0 -17.59,-3.74 -23.64,-9.79 -6.06,-6.05 -9.8,-14.42 -9.8,-23.65 0,-9.23 3.74,-17.59 9.8,-23.64 6.05,-6.05 14.41,-9.8 23.64,-9.8zm-73.59 146.17c1.72,-38.79 33.75,-70.35 73.59,-70.35 39.84,0 71.87,31.56 73.59,70.35 0.17,4.09 -3.07,7.49 -7.16,7.49l-14.83 0c-3.81,0 -6.94,-2.98 -7.16,-6.77 -1.34,-23.41 -20.72,-41.9 -44.44,-41.9 -23.51,0 -43.09,18.27 -44.44,41.9 -0.21,3.79 -3.35,6.77 -7.15,6.77l-14.84 0c-4.09,0 -7.33,-3.4 -7.16,-7.49z"/>\n</svg>`,Re=`\n  <svg class="blocked" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm78.41 45.74c43.78,0 79.26,35.49 79.26,79.26 0,43.78 -35.48,79.26 -79.26,79.26 -43.77,0 -79.26,-35.49 -79.26,-79.26 0,-43.77 35.49,-79.26 79.26,-79.26zm-28.51 33.08l74.7 74.69c13.19,-21.32 9.98,-49.1 -7.81,-66.88 -17.79,-17.79 -45.56,-21.01 -66.89,-7.81zm57.02 92.37l-74.69 -74.7c-13.19,21.32 -9.98,49.1 7.8,66.88 17.81,17.78 45.54,21.02 66.89,7.82z"/>\n</svg>`,Ue=`\n  <svg class="smile" xmlns="${ze}"\n  width="24"\n  height="24"\n  viewBox="-10 -10 270 270"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <defs>\n      <linearGradient id="id0" gradientUnits="objectBoundingBox" x1="50.0025%" y1="0%" x2="50.0025%" y2="100%">\n        <stop offset="0" style="stop-opacity:0.8; stop-color:white"/>\n        <stop offset="1" style="stop-opacity:0; stop-color:#FEFEFE"/>\n      </linearGradient>\n      <radialGradient id="id1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(6.12322E-17 0.999998 -0.999998 6.12322E-17 250 0)" cx="125" cy="125" r="165.74" fx="125" fy="125">\n        <stop offset="0" style="stop-opacity:0; stop-color:black"/>\n        <stop offset="0.8" style="stop-opacity:0; stop-color:black"/>\n        <stop offset="1" style="stop-opacity:0.2; stop-color:black"/>\n      </radialGradient>\n      <radialGradient id="id2" gradientUnits="userSpaceOnUse" gradientTransform="matrix(6.12322E-17 0.999998 -0.999998 6.12322E-17 250 0)" cx="125" cy="125" r="165.74" fx="125" fy="125">\n        <stop offset="0" style="stop-opacity:0.4; stop-color:#FEFEFE"/>\n        <stop offset="0.701961" style="stop-opacity:0.254902; stop-color:#FEFEFE"/>\n        <stop offset="1" style="stop-opacity:0; stop-color:white"/>\n      </radialGradient>\n    </defs>\n\n    <g id="smile_svg">\n      <path\n        id="smile_background"\n        fill="#261717"\n        transform="translate(125 125) scale(0.9) translate(-125 -125)"\n        d="M125 0c69.04,0 125,55.96 125,125 0,69.04 -55.96,125 -125,125 -69.04,0 -125,-55.96 -125,-125 0,-69.04 55.96,-125 125,-125z"/>\n\n      <path\n        id="smile_color"\n        d="M81.5 78.58c9.51,0 17.23,8.98 17.23,20.05 0,11.08 -7.72,20.05 -17.23,20.05 -9.51,0 -17.22,-8.97 -17.22,-20.05 0,-11.07 7.71,-20.05 17.22,-20.05\n           zm87 0c-9.51,0 -17.23,8.98 -17.23,20.05 0,11.08 7.72,20.05 17.23,20.05 9.51,0 17.22,-8.97 17.22,-20.05 0,-11.07 -7.71,-20.05 -17.22,-20.05\n           zm-43.5 171.42c69.04,0 125,-55.96 125,-125 0,-69.04 -55.96,-125 -125,-125 -69.04,0 -125,55.96 -125,125 0,69.04 55.96,125 125,125\n           zm-48.25 -90.43c7.62,5.06 24.35,14.68 48.25,14.68 23.9,0 40.63,-9.62 48.25,-14.68 1.98,-1.32 4.64,-0.88 6.09,1 1.45,1.89 1.2,4.56 -0.58,6.14\n           -8.12,7.24 -26.48,20.11 -53.76,20.11 -27.28,0 -45.64,-12.87 -53.76,-20.11 -1.78,-1.58 -2.03,-4.25 -0.58,-6.14 1.45,-1.88 4.11,-2.32 6.09,-1z"/>\n\n      <path\n        id="smile_around_shadow"\n        fill="url(#id1)"\n        d="M81.5 78.58c9.51,0 17.23,8.98 17.23,20.05 0,11.08 -7.72,20.05 -17.23,20.05 -9.51,0 -17.22,-8.97 -17.22,-20.05 0,-11.07 7.71,-20.05 17.22,-20.05\n           zm87 0c-9.51,0 -17.23,8.98 -17.23,20.05 0,11.08 7.72,20.05 17.23,20.05 9.51,0 17.22,-8.97 17.22,-20.05 0,-11.07 -7.71,-20.05 -17.22,-20.05\n           zm-43.5 171.42c69.04,0 125,-55.96 125,-125 0,-69.04 -55.96,-125 -125,-125 -69.04,0 -125,55.96 -125,125 0,69.04 55.96,125 125,125\n           zm-48.25 -90.43c7.62,5.06 24.35,14.68 48.25,14.68 23.9,0 40.63,-9.62 48.25,-14.68 1.98,-1.32 4.64,-0.88 6.09,1 1.45,1.89 1.2,4.56 -0.58,6.14\n           -8.12,7.24 -26.48,20.11 -53.76,20.11 -27.28,0 -45.64,-12.87 -53.76,-20.11 -1.78,-1.58 -2.03,-4.25 -0.58,-6.14 1.45,-1.88 4.11,-2.32 6.09,-1z"/>\n\n      <path\n        id="smile_front_light"\n        fill="url(#id2)"\n        d="M81.5 78.58c9.51,0 17.23,8.98 17.23,20.05 0,11.08 -7.72,20.05 -17.23,20.05 -9.51,0 -17.22,-8.97 -17.22,-20.05 0,-11.07 7.71,-20.05 17.22,-20.05\n           zm87 0c-9.51,0 -17.23,8.98 -17.23,20.05 0,11.08 7.72,20.05 17.23,20.05 9.51,0 17.22,-8.97 17.22,-20.05 0,-11.07 -7.71,-20.05 -17.22,-20.05\n           zm-43.5 171.42c69.04,0 125,-55.96 125,-125 0,-69.04 -55.96,-125 -125,-125 -69.04,0 -125,55.96 -125,125 0,69.04 55.96,125 125,125\n           zm-48.25 -90.43c7.62,5.06 24.35,14.68 48.25,14.68 23.9,0 40.63,-9.62 48.25,-14.68 1.98,-1.32 4.64,-0.88 6.09,1 1.45,1.89 1.2,4.56 -0.58,6.14\n           -8.12,7.24 -26.48,20.11 -53.76,20.11 -27.28,0 -45.64,-12.87 -53.76,-20.11 -1.78,-1.58 -2.03,-4.25 -0.58,-6.14 1.45,-1.88 4.11,-2.32 6.09,-1z"/>\n\n      <path\n        id="smile_left_eye_highlight"\n        fill="url(#id0)"\n        d="M79.25 82.88c-4.34,0 -7.87,4.1 -7.87,9.16 0,5.06 3.53,9.16 7.87,9.16 4.35,0 7.88,-4.1 7.88,-9.16 0,-5.06 -3.53,-9.16 -7.88,-9.16z"/>\n\n      <path\n        id="smile_right_eye_highlight"\n        fill="url(#id0)"\n        d="M166.25 82.88c-4.35,0 -7.87,4.1 -7.87,9.16 0,5.06 3.52,9.16 7.87,9.16 4.35,0 7.87,-4.1 7.87,-9.16 0,-5.06 -3.52,-9.16 -7.87,-9.16z"/>\n    </g>\n  </svg>`,Fe=`\n  <svg class="add-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <line x1="12" y1="5" x2="12" y2="19"></line>\n    <line x1="5" y1="12" x2="19" y2="12"></line>\n  </svg>`,Je=`\n  <svg class="edit-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path>\n    <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path>\n  </svg>`,Xe=`\n  <svg class="remove-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <line x1="18" y1="6" x2="6" y2="18"></line>\n    <line x1="6" y1="6" x2="18" y2="18"></line>\n  </svg>`,Ye=`\n  <svg class="export-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>\n    <polyline points="7 10 12 15 17 10"></polyline>\n    <line x1="12" y1="15" x2="12" y2="3"></line>\n  </svg>`,Ke=`\n  <svg class="import-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>\n    <polyline points="17 8 12 3 7 8"></polyline>\n    <line x1="12" y1="3" x2="12" y2="15"></line>\n  </svg>`,Ge=`\n  <svg class="load-icon" xmlns="${ze}" \n  width="12" \n  height="12" \n  viewBox="0 0 24 24"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <line x1="12" y1="2" x2="12" y2="6"></line>\n    <line x1="12" y1="18" x2="12" y2="22"></line>\n    <line x1="4.93" y1="4.93" x2="7.76" y2="7.76"></line>\n    <line x1="16.24" y1="16.24" x2="19.07" y2="19.07"></line>\n    <line x1="2" y1="12" x2="6" y2="12"></line>\n    <line x1="18" y1="12" x2="22" y2="12"></line>\n    <line x1="4.93" y1="19.07" x2="7.76" y2="16.24"></line>\n    <line x1="16.24" y1="7.76" x2="19.07" y2="4.93"></line>\n  </svg>`,We=`\n  <svg class="activity" xmlns="${ze}" \n  width="15" \n  height="15" \n  viewBox="0 0 250 250"\n  style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd">\n    <path d="M46.59 0l156.82 0c25.65,0 46.59,20.94 46.59,46.59l0 156.82c0,25.65 -20.94,46.59 -46.59,46.59l-156.82 0c-25.65,0 -46.59,-20.94 -46.59,-46.59l0 -156.82c0,-25.65 20.94,-46.59 46.59,-46.59zm152.82 112.66c6.82,0 12.34,5.53 12.34,12.34 0,6.82 -5.52,12.34 -12.34,12.34l-20.92 0 -19.5 58.49c-2.13,6.44 -9.08,9.94 -15.52,7.81 -3.84,-1.27 -6.63,-4.25 -7.81,-7.81l-32.98 -98.95 -10.66 31.98c-1.71,5.16 -6.51,8.48 -11.67,8.48l-29.76 0c-6.82,0 -12.34,-5.52 -12.34,-12.34 0,-6.81 5.52,-12.34 12.34,-12.34l20.92 0 19.5 -58.49c1.18,-3.56 3.97,-6.54 7.81,-7.81 6.44,-2.13 13.39,1.37 15.52,7.81l32.98 98.95 10.3 -30.88c1.25,-5.48 6.16,-9.58 12.03,-9.58l29.76 0z"/>\n  </svg>`,Ve=`\n  <svg class="event-info" xmlns="${ze}" \n  viewBox="0 0 24 24" \n  width="14"\n  height="14"\n  fill="none" \n  stroke="currentColor" \n  stroke-width="2" \n  stroke-linecap="round" \n  stroke-linejoin="round">\n    <circle cx="12" cy="12" r="10"></circle>\n    <line x1="12" y1="16" x2="12" y2="12"></line>\n    <line x1="12" y1="8" x2="12.01" y2="8"></line>\n  </svg>`,Qe=`\n  <svg class="event-warning" xmlns="${ze}" \n  viewBox="0 0 24 24" \n  width="14"\n  height="14"\n  fill="none" \n  stroke="currentColor" \n  stroke-width="2" \n  stroke-linecap="round" \n  stroke-linejoin="round">\n    <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path>\n    <line x1="12" y1="9" x2="12" y2="13"></line>\n    <line x1="12" y1="17" x2="12.01" y2="17"></line>\n  </svg>`,Ze=`\n  <svg class="event-error" xmlns="${ze}" \n  viewBox="0 0 24 24" \n  width="14"\n  height="14"\n  fill="none" \n  stroke="currentColor" \n  stroke-width="2" \n  stroke-linecap="round" \n  stroke-linejoin="round">\n    <circle cx="12" cy="12" r="10"></circle>\n    <line x1="15" y1="9" x2="9" y2="15"></line>\n    <line x1="9" y1="9" x2="15" y2="15"></line>\n  </svg>`,et=`\n  <svg class="event-success" xmlns="${ze}" \n  viewBox="0 0 24 24" \n  width="14"\n  height="14"\n  fill="none" \n  stroke="currentColor" \n  stroke-width="2" \n  stroke-linecap="round" \n  stroke-linejoin="round">\n    <polyline points="20 6 9 17 4 12"></polyline>\n  </svg>`,tt=`\n  <svg class="event-clear" xmlns="${ze}"\n  viewBox="0 0 24 24"\n  width="12"\n  height="12"\n  fill="none"\n  stroke="currentColor"\n  stroke-width="2"\n  stroke-linecap="round"\n  stroke-linejoin="round">\n    <polyline points="3 6 5 6 21 6"></polyline>\n    <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>\n  </svg>`,nt="chatEvents",rt="lastViewedEventTime";function ot(){try{const e=localStorage.getItem(nt);if(e){const t=JSON.parse(e);if(t.date===(new Date).toDateString())return t.events||[];localStorage.setItem(nt,JSON.stringify({date:(new Date).toDateString(),events:[]})),At({en:"Events cache expired, creating fresh cache.",ru:"Кэш событий устарел, создается новый."},"info")}}catch(e){At({en:"Error loading events cache, creating fresh cache.",ru:"Ошибка загрузки кэша событий, создается новый."},"error")}return[]}function at(){return ot()}function it(){const e=document.querySelector(".chat-events-button");if(e){const t=at(),n=localStorage.getItem(rt)||"0",r=t.some((e=>new Date(e.date).getTime()>parseInt(n)));e.classList.toggle("new-events",r),e.classList.toggle("no-events",!t||0===t.length)}}function st(e){const t=ot();t.push({...e,date:(new Date).toISOString()}),function(e){try{localStorage.setItem(nt,JSON.stringify({date:(new Date).toDateString(),events:e}))}catch(e){At({en:"Error saving events cache.",ru:"Ошибка сохранения кэша событий."},"error")}}(t),it()}class ct{static instance=null;constructor(){if(ct.instance){if(ct.instance.panel.parentNode)return ct.instance;ct.instance=null}ct.instance=this,this.panel=document.createElement("div"),this.panel.className="events-panel",this.eventsList=document.createElement("div"),this.eventsList.className="events-list",this.init(),this.show()}init(){const e=document.createElement("h2");e.textContent="Events",this.panel.appendChild(e),this.panel.appendChild(this.eventsList);const t=document.createElement("button");t.className="clear-btn",t.innerHTML=tt,t.title="Clear all events",t.addEventListener("click",(()=>{0!==at().length&&(localStorage.removeItem(nt),it(),this.hide())})),this.panel.appendChild(t);const n=document.createElement("button");n.className="close-btn",n.innerHTML=Xe,n.title="Close panel",n.addEventListener("click",(()=>{this.hide()})),this.panel.appendChild(n);const r=at(),o=localStorage.getItem(rt)||"0";r&&r.length>0&&r.forEach((e=>{const t=new Date(e.date).getTime()>parseInt(o);this.renderEvent(e,t)})),this.scrollToBottom(),this.setupEventListeners()}renderEvent(e,t=!1){const n=document.createElement("div");n.className="list-item "+(t?"new-event":"old-event");const r=document.createElement("span");let o;switch(r.className="event-icon icon-wrapper",e.type){case"warning":o=Qe;break;case"error":o=Ze;break;case"success":o=et;break;default:o=Ve}const a=W[e.type]||W.info;r.innerHTML=o.replace('stroke="currentColor"',`stroke="${a}"`);const i=document.createElement("span");var s;i.className="timestamp",i.textContent=(s=e.date,new Date(s).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"})),i.style.color=a;const c=document.createElement("span");c.className="message",c.textContent=e.message,n.style.backgroundColor=W[e.type]||W.info,n.append(r,i,c),this.eventsList.appendChild(n)}setupEventListeners(){this.handleEscape=e=>{"Escape"===e.key&&this.hide()},this.handleClickOutside=e=>{this.panel.contains(e.target)||this.hide()},this.eventsList.addEventListener("click",(e=>{const t=e.target.closest(".list-item");if(t){const e=t.querySelector(".message");e&&navigator.clipboard.writeText(e.textContent).then((()=>{Te(t)})).catch((e=>{At({en:`Failed to copy event message: ${e.message}`,ru:`Не удалось скопировать сообщение события: ${e.message}`},"error")}))}})),document.addEventListener("keydown",this.handleEscape),document.addEventListener("click",this.handleClickOutside,!0)}scrollToBottom(){requestAnimationFrame((()=>{this.eventsList.scrollTop=this.eventsList.scrollHeight}))}show(){const e=at();e&&0!==e.length&&(document.body.appendChild(this.panel),ft(this.panel,"show",1),localStorage.setItem(rt,(new Date).getTime().toString()),it(),this.scrollToBottom())}hide(){ft(this.panel,"hide",0),document.removeEventListener("keydown",this.handleEscape),document.removeEventListener("click",this.handleClickOutside,!0),setTimeout((()=>{this.panel.parentNode&&this.panel.parentNode.removeChild(this.panel)}),300)}addEvent(e,t="info"){const n={message:e,type:t,date:(new Date).toISOString()};this.renderEvent(n,!0),st(n),this.scrollToBottom()}}function lt(){return new ct}let dt=null;function mt(){let e;do{e=X[Math.floor(Math.random()*X.length)]}while(e===dt);return dt=e,e}function ut(e,t,n){return Math.min(Math.max(e,t),n)}function pt(e){return"string"!=typeof e?e:e.replace(/^\d+#/,"")}function ht(e){if(!e)return null;const t=e.split("/");if(t.length<2)return null;return t[1].split("#")[0]}function gt(e){return e?e.includes("#")?e.split("#")[1]:e.replace(/^\d+#/,""):"Unknown"}function ft(e,t,n){e&&(e.offsetHeight,e.style.transition="opacity 0.3s ease",e.style.opacity="show"===t?n:"0","hide"===t&&e.addEventListener("transitionend",(()=>{"0"===e.style.opacity&&e.parentNode&&e.parentNode.removeChild(e)}),{once:!0}))}const bt=e=>{try{const{hostname:t}=new URL(e),n=t.toLowerCase().split(".").slice(-2).join(".");return{isTrusted:Y.includes(n),domain:n}}catch(t){return At({en:`Error in isTrustedDomain: ${t.message}`,ru:`Ошибка в isTrustedDomain: ${t.message}`},"error"),{isTrusted:!1,domain:e}}};function vt(e){return/^https?:\/\//.test(e)&&/%[0-9A-Fa-f]{2}/.test(e)}function yt(e){const[t]=e.split("#");return decodeURIComponent(t).replace(/ /g,"_")}function kt(e){const t=document.getElementById("messages-panel");if(!t)return;t.scrollHeight-t.scrollTop-t.clientHeight<=e&&(t.scrollTop=t.scrollHeight)}function xt(){const e=document.getElementById("app-chat-container"),t=document.getElementById("message-input");return!(!t||!e||"none"===e.style.display)&&(t.focus(),!0)}async function wt(e){const t=`https://klavogonki.ru/api/profile/search-users?query=${encodeURIComponent(e)}`;try{const n=await async function(e){const t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}`);return t.json()}(t);if(!n.all?.length)throw new Error(`User ${e} not found.`);const r=n.all.find((t=>t.login===e));if(!r)throw new Error(`Exact match for user ${e} not found.`);return r.id}catch(t){return console.error(`Error fetching user ID for ${e}: ${t.message}`),null}}function Et(e){return new Promise((t=>setTimeout(t,e)))}function St(e){const t=180- -(new Date).getTimezoneOffset(),[n,r,o]=e.split(":").map(Number);let a=60*n+r+t;a=(a%1440+1440)%1440;const i=a%60;return`${Math.floor(a/60).toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`}function Ct(e){return e.replace(/\n/g,"").replace(/\s+/g," ").replace(/>\s+</g,"><").trim()}function Lt(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||"ontouchstart"in window}function jt(e,t){let n=null;function r(...r){clearTimeout(n),n=setTimeout((()=>e.apply(this,r)),t)}return r.cancel=()=>{clearTimeout(n),n=null},r}function $t(){return window.getSelection().toString().length>0}function At(e,t="info",n=!0,r=null){const o={info:`color: ${W.info}`,warning:`color: ${W.warning}`,error:`color: ${W.error}`,success:`color: ${W.success}`},a=o[t]||o.info;r=r||localStorage.getItem("emojiPanelLanguage")||"en";let i=e;switch("object"==typeof e&&null!==e&&(e.en||e.ru)&&(i=e[r]||e.en||e.ru,e=e.en||e.ru||""),t){case"error":console.error(`%c${e}`,a);break;case"warning":console.warn(`%c${e}`,a);break;case"success":console.log(`%c${e}`,a);break;default:console.info(`%c${e}`,a)}n&&function(e,t={}){const n=document.querySelector(".chat-drag-area");if(!n)return;const r=n.querySelector(".chat-dynamic-alert");r&&r.parentNode===n&&n.removeChild(r);const o={type:"info",duration:R,...t},a=document.createElement("div");a.className="chat-dynamic-alert",a.innerHTML=e,a.style.cssText=`\n    background-color: ${W[o.type]||W.info};\n  `,n.appendChild(a),e&&st({message:e,type:o.type}),requestAnimationFrame((()=>{a.style.transition="opacity 0.3s ease-in-out",a.style.opacity="1",setTimeout((()=>{a.style.transition="transform 0.05s ease-in-out",[{x:5,delay:0},{x:-7,delay:50},{x:9,delay:100},{x:-6,delay:150},{x:4,delay:200},{x:-3,delay:250},{x:0,delay:300}].forEach((e=>{setTimeout((()=>{a.style.transform=`translate(calc(-50% + ${e.x}px), 0)`}),e.delay)}))}),300),setTimeout((()=>{a.style.transition="opacity 0.3s ease-in-out",a.style.opacity="0",setTimeout((()=>{a&&a.parentNode===n&&n.removeChild(a)}),300)}),o.duration)}))}(i,{type:t,duration:R})}class Mt{constructor({username:e,password:t,bindUrl:n,delay:r=P}){this.username=e,this.password=t,this.bindUrl=n,this.delay=r,this.sid=null,this.rid=0}nextRid(){return++this.rid}async sendRequest(e){const t=await fetch(this.bindUrl,{method:"POST",headers:{"Content-Type":"text/xml; charset=UTF-8","User-Agent":"Mozilla/5.0"},body:e});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);return await t.text()}async sendRequestWithRetry(e,t=5){let n,r=this.delay;for(let o=1;o<=t;o++)try{return await this.sendRequest(e)}catch(e){if(n=e,!e.message.includes("429"))throw e;{const e=r*Math.pow(2,o);At({en:`Rate limited (attempt ${o}/${t}). Waiting ${e}ms...`,ru:`Превышен лимит (попытка ${o}/${t}). Ожидание ${e}мс...`},"warning"),await Et(e)}}throw At({en:`Max retries reached. Last error: ${n.message}`,ru:`Достигнут лимит попыток. Последняя ошибка: ${n.message}`},"error"),new Error(`Max retries reached. Last error: ${n.message}`)}async connect(){console.log("🌐 Step 1: Connecting to XMPP server...");const e=`<body xmlns='http://jabber.org/protocol/httpbind'\n               rid='${this.nextRid()}'\n               to='jabber.klavogonki.ru'\n               xml:lang='en'\n               wait='60'\n               hold='1'\n               ver='1.6'\n               xmpp:version='1.0'\n               xmlns:xmpp='urn:xmpp:xbosh'/>`,t=await this.sendRequestWithRetry(e);this.sid=t.match(/sid=['"]([^'"]+)['"]/)[1],console.log(`🔑 Step 2: Session ID received: ${this.sid}`),await Et(this.delay),console.log("🔐 Step 3: Authenticating...");const n=function(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}("\0"+this.username+"\0"+this.password),r=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>${n}</auth>\n        </body>`;if(!(await this.sendRequestWithRetry(r)).includes("<success"))throw new Error("❌ Authentication failed");console.log("✅ Step 4: Authentication successful!"),await Et(this.delay),console.log("🔄 Step 5: Restarting stream...");const o=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'\n               to='jabber.klavogonki.ru'\n               xmpp:restart='true'\n               xmlns:xmpp='urn:xmpp:xbosh'/>`;await this.sendRequestWithRetry(o),await Et(this.delay),console.log("📦 Step 6: Binding resource...");const a=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <iq type='set' id='bind_1' xmlns='jabber:client'>\n            <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>\n              <resource>web</resource>\n            </bind>\n          </iq>\n        </body>`;await this.sendRequestWithRetry(a),await Et(this.delay),console.log("🔌 Step 7: Establishing session...");const i=`<body rid='${this.nextRid()}' sid='${this.sid}'\n               xmlns='http://jabber.org/protocol/httpbind'>\n          <iq type='set' id='session_1' xmlns='jabber:client'>\n            <session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>\n          </iq>\n        </body>`;return await this.sendRequestWithRetry(i),await Et(this.delay),{sid:this.sid,rid:this.rid}}}const It={hslToHex(e,t,n){t/=100,n/=100;const r=(1-Math.abs(2*n-1))*t,o=r*(1-Math.abs(e/60%2-1)),a=n-r/2;let i,s,c;return e<60?(i=r,s=o,c=0):e<120?(i=o,s=r,c=0):e<180?(i=0,s=r,c=o):e<240?(i=0,s=o,c=r):e<300?(i=o,s=0,c=r):(i=r,s=0,c=o),i=Math.round(255*(i+a)),s=Math.round(255*(s+a)),c=Math.round(255*(c+a)),"#"+((1<<24)+(i<<16)+(s<<8)+c).toString(16).slice(1)},hexToHSL(e){3===(e=e.replace(/^#/,"")).length&&(e=e.split("").map((e=>e+e)).join(""));const t=parseInt(e.substring(0,2),16)/255,n=parseInt(e.substring(2,4),16)/255,r=parseInt(e.substring(4,6),16)/255,o=Math.max(t,n,r),a=Math.min(t,n,r);let i=0,s=0;const c=(o+a)/2;if(o!==a){const e=o-a;s=c>.5?e/(2-o-a):e/(o+a),i=o===t?60*((n-r)/e+(n<r?6:0)):o===n?60*((r-t)/e+2):60*((t-n)/e+4)}return{h:Math.round(i),s:100*s,l:100*c}},hexToHue(e){return this.hexToHSL(e).h},getLuminance(e){e=e.replace("#","");const t=parseInt(e.slice(0,2),16)/255,n=parseInt(e.slice(2,4),16)/255,r=parseInt(e.slice(4,6),16)/255,o=e=>e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4);return.2126*o(t)+.7152*o(n)+.0722*o(r)},contrastRatio(e,t){const n=this.getLuminance(e),r=this.getLuminance(t);return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}};const Tt=function(e){const t=e.storageKey||"usernameColors";let n;try{const e=sessionStorage.getItem(t);n=e?JSON.parse(e):{}}catch(e){n={}}const r=e.hueRanges||[{min:0,max:360}],o=r.reduce(((e,t)=>e+(t.max-t.min)),0),a=Boolean(e.saturation),i=Boolean(e.lightness),s=e.minSaturation||40,c=e.maxSaturation||90,l=e.minLightness||55,d=e.maxLightness||80,m=c-s,u=new Set(Object.values(n)),p=new Set;function h(){let e=Math.floor(Math.random()*o);for(let t of r){const n=t.max-t.min;if(e<n)return t.min+e;e-=n}return r[0].min}return Object.values(n).forEach((e=>{try{p.add(It.hexToHue(e))}catch(e){}})),{getColor(r){if(!r){const t=a?parseInt(e.saturation,10):50;let n=i?parseInt(e.lightness,10):50;return It.hslToHex(0,t,n)}const c=r.trim();let g={};try{const e=localStorage.getItem(t);g=e?JSON.parse(e):{}}catch(e){}if(g[c])return g[c];if(n[c])return n[c];let f=null,b=0;for(;!f&&b<10;){let t;if(p.size>=o)t=h();else do{t=h()}while(p.has(t)&&p.size<o);const n=a?parseInt(e.saturation,10):Math.floor(Math.random()*m)+s;let r;if(i)r=parseInt(e.lightness,10),t>=210&&t<280&&r<65&&(r=65);else{let e=l;t>=210&&t<280&&(e=Math.max(l,65));const n=d-e;r=Math.floor(Math.random()*n)+e}const c=It.hslToHex(t,n,r);if(!u.has(c)){f=c,p.add(t);break}b++}if(!f){const t=h(),n=a?parseInt(e.saturation,10):Math.floor(Math.random()*m)+s;let r;if(i)r=parseInt(e.lightness,10),t>=210&&t<280&&r<65&&(r=65);else{let e=l;t>=210&&t<280&&(e=Math.max(l,65));const n=d-e;r=Math.floor(Math.random()*n)+e}f=It.hslToHex(t,n,r)}return n[c]=f,u.add(f),this.saveColors(),f},saveTimeout:null,saveColors(){this.saveTimeout&&clearTimeout(this.saveTimeout),this.saveTimeout=setTimeout((()=>{try{sessionStorage.setItem(t,JSON.stringify(n))}catch(e){}}),500)}}}({storageKey:"usernameColors",minSaturation:35,maxSaturation:75,minLightness:65,maxLightness:80}),zt=()=>{try{const e=localStorage.getItem("ignored");return e?JSON.parse(e):[]}catch(e){return At({en:`Error parsing ignored users data: ${e.message}`,ru:`Ошибка разбора данных игнорируемых пользователей: ${e.message}`},"error"),[]}},Nt=e=>{try{return localStorage.setItem("ignored",JSON.stringify(e)),!0}catch(e){return At({en:`Error saving ignored users data: ${e.message}`,ru:`Ошибка сохранения данных игнорируемых пользователей: ${e.message}`},"error"),!1}},Pt=(e,t,n={})=>{const r=document.createElement(e);return t&&(r.className=t),Object.entries(n).forEach((([e,t])=>{"text"===e?r.textContent=t:r.setAttribute(e,t)})),r},Bt=()=>{const e=document.querySelector(".ignored-users-panel");if(e)return e;const t=zt(),n=Pt("div","ignored-users-panel"),r=Pt("div","ignored-users-list");n.appendChild(r);const o=Pt("h2",null,{text:"Ignored users"});r.appendChild(o);const a=Pt("div","ignored-users-input-container"),i=Pt("input","ignored-users-input",{type:"search",placeholder:"Enter username to ignore"}),s=Pt("button","ignored-users-add-btn",{text:"Block"}),c=async()=>{const e=i.value.trim();if(e&&!t.includes(e)){if(!await wt(e))return At({en:`Could not find user "${e}"`,ru:`Не удалось найти пользователя "${e}"`},"error"),i.value="",i.classList.add("field-error"),void setTimeout((()=>i.classList.remove("field-error")),500);if(t.push(e),Nt(t),At({en:`Added "${e}" to the ignore list`,ru:`"${e}" добавлен(а) в список игнорируемых`},"info"),!r.querySelector(`.username[text="${e}"]`)){const t=l(e);r.appendChild(t)}i.value="",(e=>{if(!e||"string"!=typeof e)return void console.warn("Invalid username provided to purgeUserFromChat");const t=document.querySelector(".messages-panel"),n=document.getElementById("user-list");t&&t.querySelectorAll(".message").forEach((t=>{const n=t.querySelector(".username")?.textContent;n===e&&t.remove()}));n&&n.querySelectorAll(".user-item").forEach((t=>{const n=t.querySelector(".username")?.textContent;n===e&&t.remove()}))})(e)}};s.addEventListener("click",c),i.addEventListener("keypress",(e=>{"Enter"===e.key&&c()})),a.append(i,s),n.insertBefore(a,r);const l=e=>{const n=Pt("div","ignored-user-entry"),r=Pt("div","username",{text:e}),o=Pt("button","remove-btn"),a=document.createElementNS("http://www.w3.org/2000/svg","svg");return a.setAttribute("viewBox","0 0 24 24"),a.setAttribute("width","12"),a.setAttribute("height","12"),a.setAttribute("fill","none"),a.setAttribute("stroke","currentColor"),a.setAttribute("stroke-width","2"),a.setAttribute("stroke-linecap","round"),a.setAttribute("stroke-linejoin","round"),a.classList.add("remove-icon"),["M18 6L6 18","M6 6L18 18"].forEach((e=>{const t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttribute("d",e),a.appendChild(t)})),o.appendChild(a),o.addEventListener("click",(()=>{const r=t.filter((t=>t!==e));Nt(r),t.splice(t.indexOf(e),1),n.remove()})),n.append(r,o),n};t.forEach((e=>{const t=l(e);r.appendChild(t)})),document.body.appendChild(n),ft(n,"show",1);const d=e=>{"Escape"===e.key&&(ft(n,"hide",0),document.removeEventListener("keydown",d))};document.addEventListener("keydown",d);const m=e=>{n.contains(e.target)||(ft(n,"hide",0),document.removeEventListener("click",m,!0),document.removeEventListener("keydown",d))};return document.addEventListener("click",m,!0),n};let Ot=null;const qt=e=>{let t=document.querySelector(".profile-iframe-container");t||(t=document.createElement("iframe"),t.classList.add("profile-iframe-container"),document.body.appendChild(t)),t.src=e,ft(t,"show",1);const n=()=>{ft(t,"hide",0),document.removeEventListener("keydown",r),document.removeEventListener("mousedown",r)},r=e=>{if("keydown"===e.type&&"Space"===e.code){if(Ot)return void e.stopPropagation();e.preventDefault(),n()}if("mousedown"===e.type){const r=e.target.classList.contains("username");t.contains(e.target)||r||n()}};document.addEventListener("keydown",r),document.addEventListener("mousedown",r),t.onload=()=>{try{const e=t.contentWindow,o=e.document;o.addEventListener("focusin",(e=>{"TEXTAREA"===e.target.tagName&&(Ot=e.target)})),o.addEventListener("focusout",(()=>{setTimeout((()=>{o.activeElement&&"TEXTAREA"===o.activeElement.tagName||(Ot=null)}),0)})),e.addEventListener("keydown",r),e.addEventListener("dblclick",n),new MutationObserver(((e,t)=>{e.some((e=>[...e.removedNodes].some((e=>1===e.nodeType&&(e.classList.contains("dimming-background")||e.classList.contains("cached-users-panel"))))))&&(n(),t.disconnect())})).observe(document.body,{childList:!0,subtree:!0})}catch(e){At({en:"Unable to access iframe contents. This may be due to cross-origin restrictions.",ru:"Невозможно получить доступ к содержимому iframe. Возможно, это связано с ограничениями кросс-домена."},"error")}}},_t={isPrivateMode:!1,targetUsername:null,targetId:null,fullJid:null,async setPrivateTarget(e){if(!e)return this.exitPrivateMode(),!1;try{const t=await wt(e);return!!t&&(this.isPrivateMode=!0,this.targetUsername=e,this.targetId=t,this.fullJid=`${t}#${e}@jabber.klavogonki.ru/web`,!0)}catch(e){return At({en:`Error setting private target: ${e.message}`,ru:`Ошибка установки приватной цели: ${e.message}`},"error"),!1}},exitPrivateMode(){this.isPrivateMode=!1,this.targetUsername=null,this.targetId=null,this.fullJid=null}};let Ht=null;function Dt(e){"Escape"===e.key&&_t.isPrivateMode&&Ut()}async function Rt(e){if(!e)return;const t=e.value,n=/^\/pm\s+([\wа-яА-ЯёЁ\-\.\_\+]+)\s/,r=t.match(n);if(r){const o=r[1];await _t.setPrivateTarget(o)?(!function(e){const t=document.getElementById("message-input");_t.isPrivateMode&&_t.targetUsername!==e&&Ut();if(t.classList.contains("private-mode")&&_t.targetUsername===e)_t.targetUsername===e&&(t.placeholder=`️PM to ➡ ${e}`,At({en:`Entered private chat with ${e}`,ru:`Вошли в приватный чат с ${e}`},"warning"));else{t.classList.add("private-mode"),t.placeholder=`PM to ➡ ${e}`;let n=document.querySelector(".private-mode-exit");if(!n){n=document.createElement("span"),n.className="button private-mode-exit",n.addEventListener("click",(()=>{Ut(),t.focus()}));t.parentElement.insertBefore(n,t.nextSibling)}n.innerHTML="🔒",n.title="Exit private mode",n.addEventListener("mouseenter",(()=>{n.innerHTML="🔓"})),n.addEventListener("mouseleave",(()=>{n.innerHTML="🔒"})),At({en:`Entered private chat with ${e}`,ru:`Вошли в приватный чат с ${e}`},"warning"),_t.isPrivateMode=!0,_t.targetUsername=e,Ht||(Ht=Dt,document.addEventListener("keydown",Ht))}}(o),e.value=t.replace(n,"")):(At({en:`Could not find user "${o}"`,ru:`Не удалось найти пользователя "${o}"`},"error"),Ut())}else/^\/exit\s*$/.test(t)&&(Ut(),e.value="")}function Ut(){const e=document.getElementById("message-input");if(e.classList.contains("private-mode")){e.classList.remove("private-mode"),e.placeholder="";const t=document.querySelector(".private-mode-exit");t&&t.remove();const n=_t.targetUsername;_t.exitPrivateMode(),At({en:`Exited private chat with ${n}`,ru:`Вышли из приватного чата с ${n}`},"success"),Ht&&(document.removeEventListener("keydown",Ht),Ht=null)}}const Ft=()=>`rand=${Date.now()}`;class Jt{constructor(e="user-list"){this.container=document.getElementById(e),this.activeUsers=new Map,this.isFirstLoad=!0,this.avatarCache=this.loadAvatarCache(),this.cacheDate=(new Date).toDateString(),this.changes=!1,this.pendingUserJIDs=new Set,this.updatedUserJIDs=new Set,this.updateUITimeout=null,this.roleIcons={visitor:"🚫",participant:"",moderator:"⚔️️"},this.rolePriority={moderator:1,participant:2,visitor:3},this.setupEventListeners()}loadAvatarCache(){try{const e=localStorage.getItem("userAvatarCache");if(e){const t=JSON.parse(e);return t.date===(new Date).toDateString()?(console.log("🗃️ Loaded avatar cache from localStorage"),t.avatars||{}):(At({en:"Avatar cache expired, creating fresh cache.",ru:"Кэш аватаров устарел, создаётся новый."},"info"),{})}}catch(e){At({en:`Error loading avatar cache: ${e.message}`,ru:`Ошибка загрузки кэша аватаров: ${e.message}`},"error")}return{}}saveAvatarCache(){try{localStorage.setItem("userAvatarCache",JSON.stringify({date:this.cacheDate,avatars:this.avatarCache}))}catch(e){At({en:`Error saving avatar cache: ${e.message}`,ru:`Ошибка сохранения кэша аватаров: ${e.message}`},"error")}}updateAvatarCache(e,t,n,r){const o=this.avatarCache[e];if(!o||o.hasAvatar!==t){this.avatarCache[e]={hasAvatar:t,...t?{avatarUrl:n}:{emoji:n}};const o=t?"🖼️":"😊",a=t?"avatar":"emoji";return console.log(`${o} Set ${a} for [${r}] (${e}):`,n),this.saveAvatarCache(),!0}return!1}handlePrivateMode(e){const t=document.getElementById("message-input");t.value=`/pm ${e} `,Rt(t),t.focus()}setupLongPressEvent(e,t){let n,r=!1;const o=(e,o)=>{if(e.target.classList.contains("username")){r=!1;const a=()=>{clearTimeout(n)};n=setTimeout((()=>{r=!0,t(e.target)}),q);("mouse"===o?["mouseup","mouseleave"]:["touchend","touchmove"]).forEach((t=>{e.target.addEventListener(t,a,{once:!0})}))}};return e.addEventListener("mousedown",(e=>o(e,"mouse"))),e.addEventListener("touchstart",(e=>o(e,"touch"))),()=>r}setupEventListeners(){const e=this.setupLongPressEvent(this.container,(e=>{const t=e.textContent.trim();this.handlePrivateMode(t)}));this.container.addEventListener("click",(t=>{if(t.target.classList.contains("username")){const n=t.target.getAttribute("data-user-id");if(n){const r=t.target.textContent.trim();if(t.ctrlKey)this.handlePrivateMode(r);else if(!e()){const e=n.split("/")[1].split("#")[0];qt(`https://klavogonki.ru/u/#/${e}/`)}}}if(t.target.closest(".game-indicator")){const e=t.target.closest(".game-indicator").getAttribute("data-game-id");e&&(t.stopPropagation(),window.location.href=`https://klavogonki.ru/g/?gmid=${e}`)}}))}async updatePresence(e){const t=(new DOMParser).parseFromString(e,"text/xml").getElementsByTagName("presence");if(e.includes('<presence id="initialChatLoad"'))return console.log("🔄 Initial room join detected, requesting full roster"),void this.requestFullRoster();this.changes=!1,this.updatedUserJIDs.clear();for(let e=0;e<t.length;e++){const n=t[e],r=n.getAttribute("from"),o=n.getAttribute("type");if(!r||!r.includes("[email protected]/"))continue;const a=r.split("/").pop();if(!a)continue;if("клавобот"===a.toLowerCase()||r.toLowerCase().includes("#клавобот"))continue;if("unavailable"===o){if(this.activeUsers.has(r)){const e=this.activeUsers.get(r);ht(r),gt(e.login);this.isFirstLoad,this.activeUsers.delete(r),this.changes=!0}continue}const i=this.activeUsers.get(r)||{},s=ht(r),c=this.avatarCache[s];let l={jid:r,login:a,color:K,usernameColor:Tt.getColor(gt(a)),role:"participant",gameId:null,avatar:null};const d=n.getElementsByTagName("x");let m=!1;Array.from(d).forEach((e=>{const t=e.getAttribute("xmlns");if("klavogonki:userdata"===t){const t=e.getElementsByTagName("user")[0];if(t){const e=t.getElementsByTagName("login")[0];e&&e.textContent&&(l.login=e.textContent,l.usernameColor=Tt.getColor(gt(l.login)));const n=t.getElementsByTagName("avatar")[0];n&&n.textContent&&(l.avatar=n.textContent,m=!0);const r=t.getElementsByTagName("moderator")[0];r&&"1"===r.textContent&&(l.role="moderator")}const n=e.getElementsByTagName("game_id")[0];n&&n.textContent&&(l.gameId=n.textContent)}if("http://jabber.org/protocol/muc#user"===t){const t=e.getElementsByTagName("item")[0];if(t){const e=t.getAttribute("role");e&&"moderator"!==l.role&&(l.role=e)}}})),!m&&i&&i.avatar&&(l.avatar=i.avatar),!l.avatar&&c&&c.hasAvatar&&(l.avatar=c.avatarUrl);gt(l.login);this.activeUsers.has(r)?JSON.stringify(i)!==JSON.stringify(l)&&(this.activeUsers.set(r,l),this.changes=!0,this.updatedUserJIDs.add(r)):(this.isFirstLoad,this.activeUsers.set(r,l),this.changes=!0,this.pendingUserJIDs.add(r))}this.changes&&(this.isFirstLoad?(this.updateUI(),this.pendingUserJIDs.clear()):(this.updateUITimeout&&clearTimeout(this.updateUITimeout),this.updateUITimeout=setTimeout((()=>{this.updateUI(),this.updateUITimeout=null,this.pendingUserJIDs.clear()}),O)))}updateUI(){const e=zt(),t=new Map;this.container.querySelectorAll(".user-item").forEach((e=>{t.set(e.getAttribute("data-jid"),e)}));const n=Array.from(this.activeUsers.values()).filter((t=>{const n=gt(t.login);return!e.includes(n)})).sort(((e,t)=>{const n=this.rolePriority[e.role]-this.rolePriority[t.role];return 0!==n?n:gt(e.login).localeCompare(gt(t.login))})),r=document.createDocumentFragment();n.forEach((e=>{let n=t.get(e.jid);const o=ht(e.jid),a=gt(e.login);if(n){if(!n.querySelector(".avatar-container")){const t=document.createElement("span");t.className="avatar-container",this.setUserAvatar(t,e,o,a),n.insertBefore(t,n.firstChild)}t.delete(e.jid);const r=n.querySelector(".role"),i=this.roleIcons[e.role];r&&r.textContent!==i&&(r.textContent=i,r.classList.contains(e.role)||(r.className=`role ${e.role}`));const s=n.querySelector(".username");s&&s.style.color!==e.usernameColor&&(s.style.color=e.usernameColor)}else{n=document.createElement("div"),n.classList.add("user-item"),n.setAttribute("data-jid",e.jid);const t=this.roleIcons[e.role],r=document.createElement("span");r.className="avatar-container",this.setUserAvatar(r,e,o,a);const i=document.createElement("div");i.className="user-info",i.innerHTML=`\n          <span class="username" style="color: ${e.usernameColor}" data-user-id="${e.jid}">${a}</span>\n          <span class="role ${e.role}">${t}</span>\n        `,n.appendChild(r),n.appendChild(i)}this.updateGameIndicator(n,e),r.appendChild(n)})),this.container.innerHTML="",this.container.appendChild(r),t.forEach((e=>{e&&e.parentNode&&e.remove()})),this.isFirstLoad||this.pendingUserJIDs.forEach((e=>{const t=this.container.querySelector(`.user-item[data-jid="${e}"]`);t&&t.parentNode&&Te(t)})),this.isFirstLoad&&(this.isFirstLoad=!1)}setUserAvatar(e,t,n,r){const o=this.avatarCache[n];if(t.avatar){const t=o?.avatarUrl||`${z}/storage/avatars/${n}_big.png?${Ft()}`,a=document.createElement("img");a.className="user-avatar image-avatar",a.src=t,a.alt=`${r}'s avatar`,a.addEventListener("error",(()=>{const t=o?.emoji||mt();e.innerHTML="";const a=document.createElement("span");a.className="user-avatar svg-avatar",a.textContent=t,e.appendChild(a),this.updateAvatarCache(n,!1,t,r)})),a.addEventListener("load",(()=>{this.updateAvatarCache(n,!0,t,r)})),e.appendChild(a)}else if(o)if(o.hasAvatar){const t=document.createElement("img");t.className="user-avatar image-avatar",t.src=o.avatarUrl,t.alt=`${r}'s avatar`,t.addEventListener("error",(()=>{const t=mt();e.innerHTML="";const o=document.createElement("span");o.className="user-avatar svg-avatar",o.textContent=t,e.appendChild(o),this.updateAvatarCache(n,!1,t,r)})),e.appendChild(t)}else{const t=document.createElement("span");t.className="user-avatar svg-avatar",t.textContent=o.emoji,e.appendChild(t)}else{const t=`${z}/storage/avatars/${n}_big.png?${Ft()}`,o=document.createElement("img");o.className="user-avatar image-avatar",o.src=t,o.alt=`${r}'s avatar`,o.addEventListener("error",(()=>{const t=mt();e.innerHTML="";const o=document.createElement("span");o.className="user-avatar svg-avatar",o.textContent=t,e.appendChild(o),this.updateAvatarCache(n,!1,t,r)})),o.addEventListener("load",(()=>{this.updateAvatarCache(n,!0,t,r)})),e.appendChild(o)}}updateGameIndicator(e,t){let n=e.querySelector(".game-indicator");if(t.gameId){if(!n||n.getAttribute("data-game-id")!==t.gameId){const r=`<span class="game-indicator" title="${t.gameId}" data-game-id="${t.gameId}">\n                                    <span class="traffic-icon">🚦</span>\n                                  </span>`;if(n)n.outerHTML=r;else{e.querySelector(".user-info").insertAdjacentHTML("beforeend",r)}}}else n&&n.parentNode&&n.remove()}async requestFullRoster(){console.log("📑 Would request full roster here (using existing data for now)"),this.updateUI()}}function Xt(e){const t=e.querySelector(".new-messages-separator");t&&t.remove()}const Yt="https://github.com/VimiummuimiV/KG_Chat_Application/raw/refs/heads/main/src/sounds/notification-pluck-on.mp3";function Kt(e){const t=new Audio(e);t.volume=1,t.play()}function Gt(){const e=document.getElementById("messages-panel");if(!e)return;const t=localStorage.getItem("klavoauth");let n="";try{if(t){const e=JSON.parse(t);e&&e.username&&(n=gt(e.username))}}catch(e){At({en:`Mention watcher: Error parsing auth data: ${e.message}`,ru:`Ошибка парсинга данных авторизации в отслеживателе упоминаний: ${e.message}`},"error")}if(!n)return;const r=[n],o=new WeakSet;e.querySelectorAll(".message:not(.system):not(.private) .message-text:not(.processed-for-mention)").forEach((e=>{const t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>{if(o.has(e))return NodeFilter.FILTER_SKIP;return e.parentElement.closest(".mention, .time, .username")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT}}),n=[];let a;for(;a=t.nextNode();)n.push(a);n.length>0&&(n.forEach((e=>{o.has(e)||(!function(e,t){const n=/(@?[\wа-яА-ЯёЁ'-]+)|[\s]+|[^@\s\wа-яА-ЯёЁ'-]+/gu,r=e.textContent.match(n)||[],o=document.createDocumentFragment();r.forEach((e=>{if(t.some((t=>0===t.localeCompare(e,void 0,{sensitivity:"accent"})))){const t=document.createElement("span");t.className="mention",t.textContent=e,o.appendChild(t)}else o.appendChild(document.createTextNode(e))})),e.parentNode.replaceChild(o,e)}(e,r),o.add(e))})),e.classList.add("processed-for-mention"))}))}const Wt="deletedChatAppMessages";class Vt{constructor(){this.selected=new Set,this.isDragging=!1,this.toggleBtn=null,this.longPressTimer=null,this.touchStartX=0,this.touchStartY=0,this.isMobile=Lt(),this.init()}init(){this.attachEvents(),this.updateDeletedMessages(),this.renderToggle()}attachEvents(){document.addEventListener("mousedown",(e=>{const t=e.target.closest(".messages-panel .message");t&&2===e.button&&t&&this.handleSelection(e.target,t,e.ctrlKey)})),document.addEventListener("mouseup",(()=>this.isDragging=!1)),document.addEventListener("mousemove",(e=>{if(!this.isDragging)return;const t=e.target.closest(".messages-panel .message");t&&this.toggleSelect(t,!0,"message-mode")})),document.addEventListener("contextmenu",(e=>{const t=e.target.closest(".messages-panel .message");t&&($t()||(e.preventDefault(),this.showDeleteButton(e,t)))})),this.isMobile&&(document.addEventListener("touchstart",(e=>{const t=e.target.closest(".messages-panel .message");t&&(this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.longPressTimer=setTimeout((()=>{this.handleSelection(e.target,t,!1),this.showDeleteButton({clientX:this.touchStartX,clientY:this.touchStartY,preventDefault:()=>{}},t),navigator.vibrate&&navigator.vibrate(50)}),q))})),document.addEventListener("touchmove",(e=>{this.isDragging&&e.preventDefault();const t=e.touches[0].clientX,n=e.touches[0].clientY,r=Math.abs(t-this.touchStartX),o=Math.abs(n-this.touchStartY);(r>10||o>10)&&this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)}),{passive:!1}),document.addEventListener("touchend",(()=>{this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)})))}handleSelection(e,t,n){if($t())return;const r=e.closest(".time"),o=e.closest(".username");r?this.handleTimeSelection(t,n):o?this.handleUsernameSelection(o):(this.isDragging=!0,this.toggleSelect(t,!0,"message-mode"))}handleTimeSelection(e,t){const n=Array.from(document.querySelectorAll(".messages-panel .message")),r=n.indexOf(e);if(-1!==r)if(t)n.slice(r).forEach((e=>{this.toggleSelect(e,!0,"time-mode"),e.classList.add("time-mode")}));else{const t=e.querySelector(".username");if(!t)return;const o=t.textContent.trim();n.slice(r).forEach((e=>{const t=e.querySelector(".username");t&&t.textContent.trim()===o&&(this.toggleSelect(e,!0,"time-mode"),e.classList.add("time-mode"))}))}}handleUsernameSelection(e){const t=e.textContent.trim();document.querySelectorAll(".messages-panel .message").forEach((e=>{const n=e.querySelector(".username");n&&n.textContent.trim()===t&&(this.toggleSelect(e,!0,"username-mode"),e.classList.add("username-mode"))}))}toggleSelect(e,t,n="message-mode"){if(!e)return;e.classList.toggle("selected-message",t),t?"message-mode"===n&&e.classList.add("message-mode"):e.classList.remove("username-mode","time-mode","message-mode");const r=Qt(e);t?this.selected.add(r):this.selected.delete(r)}showDeleteButton(e,t){if($t())return;const n=document.querySelector(".delete-btn");n&&n.remove();const r=document.createElement("button");r.className="delete-btn";let o="message-mode";t.classList.contains("time-mode")?o="time-mode":t.classList.contains("username-mode")&&(o="username-mode"),r.classList.add(o),this.isMobile&&r.classList.add("mobile-delete-btn"),r.textContent="Delete",r.addEventListener("touchstart",(e=>{e.stopPropagation()})),document.body.append(r);const{offsetWidth:a,offsetHeight:i}=r;if(r.remove(),Object.assign(r.style,{position:"fixed",top:e.clientY-i/2+"px",left:e.clientX-a/2+"px"}),r.onclick=()=>this.deleteSelectedMessages(r),this.isMobile){const e=t=>{r.contains(t.target)||(this.clearSelection(),r.remove(),document.removeEventListener("touchstart",e))};document.addEventListener("touchstart",e),r.outsideTapHandler=e}let s;r.addEventListener("mouseenter",(()=>{s&&clearTimeout(s)})),r.addEventListener("mouseleave",(()=>{s=setTimeout((()=>{r.remove(),this.clearSelection()}),_)})),document.body.append(r)}deleteSelectedMessages(e){document.querySelectorAll(".selected-message").forEach((e=>{e&&(e.classList.remove("selected-message","username-mode","time-mode","message-mode"),0===e.classList.length&&e.removeAttribute("class"))})),this.storeDeleted([...this.selected]),e.remove(),this.isMobile&&e.outsideTapHandler&&document.removeEventListener("touchstart",e.outsideTapHandler),this.selected.clear(),this.updateDeletedMessages(),this.renderToggle()}clearSelection(){document.querySelectorAll(".selected-message").forEach((e=>{e&&(e.classList.remove("selected-message","username-mode","time-mode","message-mode"),0===e.classList.length&&e.removeAttribute("class"))})),this.selected.clear()}storeDeleted(e){const t=new Set(JSON.parse(localStorage.getItem(Wt)||"[]"));e.forEach((e=>t.add(e))),localStorage.setItem(Wt,JSON.stringify([...t]))}updateDeletedMessages(){const e=new Set(JSON.parse(localStorage.getItem(Wt)||"[]")),t=document.querySelectorAll(".messages-panel .message");0!==t.length&&(t.forEach((t=>{if(!t)return;const n=Qt(t);t.classList.remove("shown-message"),t.classList.toggle("hidden-message",e.has(n))})),localStorage.setItem(Wt,JSON.stringify([...e])))}renderToggle(){if(!(JSON.parse(localStorage.getItem(Wt)||"[]").length>0))return void(this.toggleBtn&&(this.toggleBtn.remove(),this.toggleBtn=null));const e=document.querySelector(".messages-panel");if(e&&!this.toggleBtn){if(this.toggleBtn=document.createElement("button"),this.toggleBtn.className="toggle-button toggle-hidden",this.toggleBtn.textContent="Show",this.toggleBtn.onclick=e=>{if(e.ctrlKey)return void this.restoreAllMessages();const t="Show"===this.toggleBtn.textContent,n=JSON.parse(localStorage.getItem(Wt)||"[]");document.querySelectorAll(".messages-panel .message").forEach((e=>{if(!e)return;const r=Qt(e);n.includes(r)&&(e.classList.toggle("hidden-message",!t),e.classList.toggle("shown-message",t))})),t?(this.toggleBtn.textContent="Hide",this.toggleBtn.classList.remove("toggle-hidden"),this.toggleBtn.classList.add("toggle-shown")):(this.toggleBtn.textContent="Show",this.toggleBtn.classList.remove("toggle-shown"),this.toggleBtn.classList.add("toggle-hidden"))},this.isMobile){let e,t=!1;this.toggleBtn.addEventListener("touchstart",(n=>{this.touchStartX=n.touches[0].clientX,this.touchStartY=n.touches[0].clientY,t=!1,e=setTimeout((()=>{t=!0,this.restoreAllMessages(),navigator.vibrate&&navigator.vibrate(50)}),q)})),this.toggleBtn.addEventListener("touchmove",(t=>{const n=t.touches[0].clientX,r=t.touches[0].clientY,o=Math.abs(n-this.touchStartX),a=Math.abs(r-this.touchStartY);(o>10||a>10)&&clearTimeout(e)})),this.toggleBtn.addEventListener("touchend",(()=>{clearTimeout(e),t&&this.toggleBtn.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation()}),{once:!0})}))}e.append(this.toggleBtn)}}restoreAllMessages(){document.querySelectorAll(".messages-panel .message").forEach((e=>{e&&e.classList.remove("hidden-message","shown-message")})),localStorage.setItem(Wt,JSON.stringify([])),this.selected.clear(),this.updateDeletedMessages(),this.renderToggle()}}function Qt(e){if(!e)return"";if(e.dataset.messageId)return e.dataset.messageId;let t=Array.from(e.childNodes).map((e=>e?e.nodeType===Node.TEXT_NODE||e.classList?.contains("username")?e.textContent.trim():"A"===e.tagName?e.href:"IMG"===e.tagName?e.title.trim():"IFRAME"===e.tagName?e.src.trim():"":"")).join("");return t||(t="msg-"+Math.random().toString(36).substring(2,7)),e.dataset.messageId=t,t}const Zt=e=>e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/^######\s+(.*)$/gim,'<h6 class="md-heading md-h6">$1</h6>')).replace(/^#####\s+(.*)$/gim,'<h5 class="md-heading md-h5">$1</h5>')).replace(/^####\s+(.*)$/gim,'<h4 class="md-heading md-h4">$1</h4>')).replace(/^###\s+(.*)$/gim,'<h3 class="md-heading md-h3">$1</h3>')).replace(/^##\s+(.*)$/gim,'<h2 class="md-heading md-h2">$1</h2>')).replace(/^#\s+(.*)$/gim,'<h1 class="md-heading md-h1">$1</h1>')).replace(/`([^`]+)`/g,'<code class="md-code">$1</code>')).replace(/\*\*(.+?)\*\*/g,'<strong class="md-bold">$1</strong>')).replace(/__(.+?)__/g,'<em class="md-italic">$1</em>')).replace(/~~(.+?)~~/g,'<del class="md-strikethrough">$1</del>');class en{constructor(e="messages-panel",t=""){this.panel=document.getElementById(e),this.messageMap=new Map,this.renderedMessageIds=new Set,this.currentUsername=t,this.maxMessages=30,this.defaultMessagesCount=20,this.initialLoadComplete=!1,this.chatRemover=new Vt,this.messageInput=document.getElementById("message-input"),this.shouldCreateSeparator=!0,this._delegatedClickAttached=!1,document.addEventListener("visibilitychange",(()=>{document.hidden&&(Xt(this.panel),this.shouldCreateSeparator=!0)})),this.messageInput&&this.messageInput.addEventListener("focus",(()=>{Xt(this.panel),this.shouldCreateSeparator=!0}))}generateUniqueId(e,t,n,r){const o=t||(new Date).toLocaleTimeString("en-GB",{hour12:!1});if("private"===e){return`private-${Date.now()}`}return`${o}-${n}-${r}`}addMessage(e){return this.messageMap.set(e.id,e),this.trimMessages(),!0}trimMessages(){for(;this.messageMap.size>this.maxMessages;){const e=this.messageMap.keys().next().value;this.messageMap.delete(e),this.renderedMessageIds.delete(e)}}processMessages(e){if("string"!=typeof e||!e)return;const t=zt(),n=(new DOMParser).parseFromString(e,"text/xml").getElementsByTagName("message");let r=!1;Array.from(n).forEach((e=>{const n=e.getElementsByTagName("body")[0];if(!n||!n.textContent)return;const o=n.textContent.trim();if("This room is not anonymous"===o)return;const a=/^([^,\s]+),/.exec(o);if(a&&t.includes(a[1]))return;const i=e.getAttribute("from"),s=pt(i&&i.split("#")[1]?.split("@")[0]||"unknown");if(t.includes(s))return;const c=e.getAttribute("to"),l="chat"===e.getAttribute("type");let d=null;l&&c&&(d=pt(c.split("#")[1]?.split("@")[0]||c));let m=null;const u=e.getElementsByTagName("delay")[0];if(u&&u.getAttribute("stamp")){const e=u.getAttribute("stamp");try{m=new Date(e).toLocaleTimeString("en-GB",{hour12:!1})}catch(e){At(`Message manager: Error parsing timestamp: ${e.message}`,"error")}}if(m||(m=(new Date).toLocaleTimeString("en-GB",{hour12:!1})),s===this.currentUsername&&this.initialLoadComplete)return;if(!Array.from(this.messageMap.values()).some((e=>e.from===s&&e.text===o))){const e={id:this.generateUniqueId(l?"private":"public",m,s,o),from:s,text:o,isPrivate:l,recipient:d,pending:!1,timestamp:m};this.addMessage(e)&&(r=!0)}})),r&&this.updatePanel()}addSentMessage(e,t={}){const n=t.isPrivate||!1,r=(new Date).toLocaleTimeString("en-GB",{hour12:!1}),o=this.generateUniqueId(n?"private":"public",r,this.currentUsername,e),a={id:o,from:this.currentUsername,text:e,isPrivate:n,recipient:t.recipient||null,pending:t.pending||!1,timestamp:r};return this.addMessage(a)&&this.updatePanel(),o}updatePendingStatus(e,t){const n=this.messageMap.get(e);n&&(n.pending=t,this.updatePanel())}updatePanel(){if(!this.panel)return;const e=new Set(Array.from(this.panel.querySelectorAll(".message")).map((e=>e.getAttribute("data-message-id"))));this.renderedMessageIds=e;const t=document.createDocumentFragment();let n=!1;if(this.messageMap.forEach(((e,r)=>{if(!this.renderedMessageIds.has(r)){const o=e.timestamp||(new Date).toLocaleTimeString("en-GB",{hour12:!1}),a=pt(e.from),i=Tt.getColor(a),s=document.createElement("div");s.className="message",s.setAttribute("data-message-id",r),"Клавобот"===e.from&&(s.classList.add("banned"),this.initialLoadComplete&&Kt("https://github.com/VimiummuimiV/KG_Chat_Application/raw/refs/heads/main/src/sounds/mario-game-over.mp3")),e.isPrivate&&e.from!==this.currentUsername&&document.hidden&&Kt(Yt),e.isPrivate&&(s.classList.add("private"),s.classList.add(e.from===this.currentUsername?"sent":"received"),e.recipient&&s.setAttribute("data-recipient",e.recipient)),e.text.startsWith("/me ")&&(s.classList.add("system"),e.text=`${e.from} ${e.text.substring(e.text.indexOf(" ")+1)}`),e.isSystem&&s.classList.add("system");const c=document.createElement("div");c.className="message-info";let l=e.from;e.isPrivate&&(l=e.from===this.currentUsername&&e.recipient?`→ ${e.recipient}`:`${e.from} →`),c.innerHTML=`\n          <span class="time">${o}</span>\n          <span class="username" style="color: ${i}">${l}</span>\n        `;const d=document.createElement("div");if(d.className="message-text",d.innerHTML=(e=>{e=Zt(e);let t=0,n=[];e=(e=e.replace(/(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~|!:,.;()_]*[-A-Z0-9+&@#\/%=~|()_])/gi,(e=>(n.push(e),`___URL${t++}___`)))).replace(/:(\w+):/g,((e,t)=>`<img src="https://klavogonki.ru/img/smilies/${t}.gif" alt="${t}" />`)).replace(/(\p{Emoji_Presentation}|\p{Emoji}\uFE0F)/gu,'<span class="emoji-adjuster">$&</span>'),n.forEach(((t,n)=>{if(vt(t)){const r=yt(t);e=e.replace(`___URL${n}___`,`<a class="processed-link decoded-link" href="${t}" target="_blank">${r}</a>`)}else e=e.replace(`___URL${n}___`,`<a class="processed-link" href="${t}" target="_blank">${t}</a>`)}));const r=/<a [^>]+>.*?<\/a>/gi,o=e.split(r),a=e.match(r)||[];let i="";return o.forEach(((e,t)=>{e.trim()&&(i+=`<p class="message-piece break-content">${e}</p>`),t<a.length&&(i+=a[t])})),i})(e.text),s.appendChild(c),s.appendChild(d),e.pending){const e=document.createElement("span");e.className="pending-emoji",e.textContent="⏱️",s.appendChild(e)}t.appendChild(s),this.renderedMessageIds.add(r),this.currentUsername&&e.text.includes(this.currentUsername)&&(n=!0)}})),document.hidden&&this.initialLoadComplete&&t.childNodes.length>0&&this.shouldCreateSeparator){const e=function(){const e=document.createElement("div");e.className="new-messages-separator";const t=document.createElement("hr");t.className="separator-line";const n=document.createElement("div");return n.className="separator-icon",n.textContent="🔥",e.appendChild(t),e.appendChild(n),e}();t.insertBefore(e,t.firstChild),this.shouldCreateSeparator=!1}this.panel.appendChild(t),this.addDelegatedClickListeners(),Gt(this.currentUsername),this.initialLoadComplete&&n&&Kt(Yt),requestAnimationFrame((()=>{!this.initialLoadComplete&&this.messageMap.size>=this.defaultMessagesCount&&(this.panel.scrollTop=this.panel.scrollHeight,this.initialLoadComplete=!0)})),this.chatRemover&&(this.chatRemover.updateDeletedMessages(),this.chatRemover.renderToggle())}addDelegatedClickListeners(){if(!this.panel._delegatedClickAttached){let e=0,t="";this.panel.addEventListener("click",(async n=>{const r=n.target.closest(".username");if(r&&this.panel.contains(r)){let o=r.textContent.trim();if(o.includes("→")&&(o=o.startsWith("→")?o.replace("→","").trim():o.split("→")[0].trim()),n.shiftKey){window.getSelection().removeAllRanges();let e={};const t=sessionStorage.getItem("usernameIds");if(t)try{e=JSON.parse(t)}catch(t){At(`Message manager: Error parsing stored username IDs: ${t.message}`,"error"),e={}}let n=e[o];if(n||(n=await wt(o),n&&(e[o]=n,sessionStorage.setItem("usernameIds",JSON.stringify(e)))),n){qt(`https://klavogonki.ru/u/#/${n}/`)}return}if(n.ctrlKey)this.messageInput.value=`/pm ${o} `,Rt(this.messageInput);else{const n=Date.now();if(n-e<300&&t===o)this.messageInput.value=`${o}, `;else{const e=`${o}, `;this.messageInput.value.includes(e)||(this.messageInput.value+=e)}e=n,t=o}this.messageInput.focus()}const o=n.target.closest(".time");if(o&&this.panel.contains(o)){const e=St(o.textContent.trim()),t=`https://klavogonki.ru/chatlogs/${new Intl.DateTimeFormat("en-CA").format(new Date)}.html#${e}`;window.open(t,"_blank")}})),this.panel._delegatedClickAttached=!0}}getChatHistory(){return Array.from(this.messageMap.values())}refreshMessages(e=!1,t="chat"){const n="connection-status",r="ru"===localStorage.getItem("emojiPanelLanguage")?"ru":"en",o=J[t][r][e?"online":"offline"];this.messageMap.delete(n),this.renderedMessageIds.delete(n);const a={id:n,from:"System",text:o,isPrivate:!1,recipient:null,isSystem:!0,pending:!1,timestamp:(new Date).toLocaleTimeString("en-GB",{hour12:!1})};this.messageMap.set(n,a),this.updateConnectionStatusInUI(a)}updateConnectionStatusInUI(e){this.panel.querySelectorAll(".pending-emoji").forEach((e=>e.remove()));const t=this.panel.querySelector(`[data-message-id="${e.id}"]`);t&&t.remove(),this.updatePanel()}}let tn=null,nn=null,rn=null;const on=document.createElement("canvas").getContext("2d");let an,sn=!1,cn=0;function ln(e){let t=e>cn?`${e} ➡`:e<cn?`⬅ ${e}`:`${e}`;rn.textContent=t,function(e){if(!rn)return void At({en:"Length popup: Popup element is not defined.",ru:"Длинномер сообщения: Элемент всплывающего окна не определён."},"error");let t,n=100,r=50;0===e?(t=200,n=20,r=50):t=e<=90?120:e<=100?120-(e-90)/10*60:e<=190?60:e<=200?60-(e-190)/10*20:e<=250?40:e<=300?40-(e-250)/50*40:0;const o=`hsl(${t}, ${n}%, ${r}%)`,a=`hsl(${t}, ${n}%, ${Math.max(r-(e>250?35:30),8)}%)`,i=`hsla(${t}, ${n}%, ${r}%, 0.1)`;rn.style.setProperty("color",o,"important"),rn.style.setProperty("background-color",a,"important"),rn.style.setProperty("border",`1px solid ${i}`,"important"),rn.style.setProperty("border-radius","0.4em","important")}(e),cn=e}function dn(e){sn!==e&&(rn.classList.toggle("bounce-in",e),rn.classList.toggle("bounce-out",!e),sn=e,e||setTimeout((()=>rn.classList.remove("bounce-out")),500))}function mn(){clearTimeout(an),ln(tn.value.length),function(e){if(!tn)return void At({en:"Length popup: Chat field is not defined for updating metrics.",ru:"Длинномер сообщения: Поле чата не определено для обновления метрик."},"error");const t=getComputedStyle(tn);on.font=`${t.fontWeight} ${t.fontSize} ${t.fontFamily}`;const n=on.measureText(e).width,r=tn.offsetLeft+n+5,o=tn.offsetLeft+tn.offsetWidth-rn.offsetWidth;rn.style.left=`${Math.min(r,o)}px`}(tn.value),dn(!0),an=setTimeout((()=>dn(!1)),1e3)}function un(e){"Enter"===e.key&&(ln(0),Object.assign(rn.style,{left:"0px",color:"hsl(200, 20%, 50%)"}),dn(!0),an=setTimeout((()=>dn(!1)),1e3))}function pn(e,t){e.innerHTML=t?Pe:Be,e.title=t?"Hide chat":"Show chat"}function hn(e,t){e.innerHTML=t?Oe:qe,e.title=t?"Collapse chat":"Expand chat"}function gn(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-toggle-button"),n=document.querySelector(".chat-maximize-button");if(!e||!t||!n)return;const r=fn();e.classList.toggle("maximized",r.isMaximized),hn(n,r.isMaximized),r.floating?(e.style.display=r.isVisible?"flex":"none",e.style.opacity=r.isVisible?"1":"0",e.classList.remove("visible-chat","hidden-chat")):(e.classList.toggle("visible-chat",r.isVisible),e.classList.toggle("hidden-chat",!r.isVisible)),pn(t,r.isVisible);const o=window.innerWidth,a=window.innerHeight,i=getComputedStyle(document.documentElement),s=parseInt(i.getPropertyValue("--min-chat-width"))||250,c=parseInt(i.getPropertyValue("--min-chat-height"))||200;e.style.width=Math.min(o,Math.max(s,r.width))+"px",e.style.height=Math.min(a,Math.max(c,r.height))+"px",e.style.left=ut(r.left,0,o-e.offsetWidth)+"px",r.floating?(e.style.top=ut(r.top,0,a-e.offsetHeight)+"px",e.style.bottom="",e.classList.add("floating-chat")):(e.style.bottom="0",e.style.top="",e.classList.remove("floating-chat")),Me()}function fn(){const e=localStorage.getItem("chatState"),t={height:300,width:Math.min(window.innerWidth,600),left:0,floating:!1,top:window.innerHeight-300,isVisible:!0,fontSizeMultiplier:1,isMaximized:!1};return e?{...t,...JSON.parse(e)}:t}function bn(e){localStorage.setItem("chatState",JSON.stringify(e))}function vn(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-toggle-button");if(!e)return;const n=fn(),r=n.floating||!1,o=!n.isVisible;r?(e.style.opacity=o?"1":"0",setTimeout((()=>{e.style.display=o?"flex":"none",pn(t,o),bn({...n,isVisible:o}),o&&xt()}),300)):(e.classList.toggle("visible-chat",o),e.classList.toggle("hidden-chat",!o),pn(t,o),bn({...n,isVisible:o}),o&&xt())}function yn(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-maximize-button");if(!e||!t)return;const n=fn(),r=!n.isMaximized;e.classList.toggle("maximized",r),hn(t,r),bn({...n,isMaximized:r}),requestAnimationFrame((()=>{Me();const e=document.getElementById("messages-panel");e&&(e.scrollTop=e.scrollHeight),xt()}))}function kn(e){const t=document.getElementById("app-chat-container"),n=document.getElementById("message-input");if(!t)return;t.style.fontSize=`${e}em`,n&&(n.style.fontSize="1em");bn({...fn(),fontSizeMultiplier:e})}function xn(){kn(fn().fontSizeMultiplier)}function wn(){if(!document.getElementById("app-chat-container"))return;const e=fn(),t=document.createElement("div");t.className="font-size-control";const n=document.createElement("input");n.type="range",n.min="0.8",n.max="1.5",n.step="0.1",n.value=e.fontSizeMultiplier,n.className="font-size-slider",n.addEventListener("mousedown",(e=>{e.stopPropagation()})),n.addEventListener("input",(e=>{kn(parseFloat(e.target.value))})),t.appendChild(n);const r=document.querySelector(".chat-drag-area");r&&r.appendChild(t)}class En{constructor(e={}){this.container=null,this.options={container:e.container||document.body,helpButton:e.helpButton,onDestroy:e.onDestroy},En.instance=this}init(){return this.createPanel(),this.bindEvents(),this}createPanel(){this.container=document.createElement("div"),this.container.className="help-panel",this.content=document.createElement("div"),this.content.className="help-content",this.updatePanelContent(),this.container.appendChild(this.content);const e=document.createElement("button");e.className="close-btn",e.innerHTML=Xe,e.title="Close panel",e.addEventListener("click",(()=>{this.remove()})),this.container.appendChild(e),document.body.appendChild(this.container),ft(this.container,"show","1")}updatePanelContent(){const e={en:{heading:"Chat Commands & Hotkeys",sections:[{title:"Chat Commands",items:[{key:"/help",desc:"Show this help panel"},{key:"/me message",desc:"Send an action message"},{key:"/pm username",desc:"Activate private chat mode with the specified user"},{key:"/exit",desc:"Exit private chat mode"},{key:"/reset",desc:"Reset the chat data"},{key:"/colors",desc:"Show the username color panel"},{key:"/import colors",desc:"Import user colors from a json file"},{key:"/export colors",desc:"Export user colors to a json file"},{key:"/ignored",desc:"Show the ignored users panel"},{key:"/themes",desc:"Show the themes panel"},{key:"/events",desc:"Show the events panel"}]},{title:"Chat Hotkeys",items:[{key:"Ctrl + Space",desc:"Hide/Show the chat"},{key:"Shift + Ctrl + Space",desc:"Expand/Collapse the chat"},{key:"Ctrl + Click",desc:"Activate private chat mode with the clicked user"},{key:"Long Press (LMB)",desc:"Activate private chat mode with the clicked user (Userlist)"},{key:"Double Click (LMB)",desc:"Replace selected users with one in the input field (Messages)"},{key:"Shift + Click",desc:"Open the user profile by nickname in the message"}]},{heading:"Emoji Panel Actions & Hotkeys",subSections:[{title:"Emoji Panel Actions",items:[{key:"Click an emoji",desc:"Insert the emoji"},{key:"Click outside panel",desc:"Closes the panel (emoji or help)"}]},{title:"Emoji Panel Hotkeys",items:[{key:"Ctrl + ;",desc:"Open the Emoji Panel"},{key:"Enter",desc:"Insert the emoji"},{key:"Ctrl + Enter",desc:"Insert the emoji keeping the panel open"},{key:"Ctrl + Click",desc:"Insert the emoji keeping the panel open"},{key:"Shift + Click",desc:"Remove emoji from recent list (in recent category)"},{key:"q",desc:"Hide the Emoji Panel (single press when search is not focused)"},{key:"qq",desc:"Hide the Emoji Panel (double press 'q' when search is focused)"},{key:"Esc",desc:"Close the panel (emoji or help)"}]}]},{heading:"Image Manipulations",subSections:[{title:"Open/Close",items:[{key:"(LMB) Click",desc:"Open the image"},{key:"Ctrl + (RMB)",desc:"Close the image and copy the link"},{key:"Space or ESC",desc:"Close the image"}]},{title:"Movement and Scaling",items:[{key:"Hold (MMB)",desc:"Drag the expanded image"},{key:"Scroll (MMB)",desc:"Zoom in/out the image"},{key:"Ctrl + (MMB)",desc:"Scale the image. Move the cursor up or down."}]},{title:"Navigation",items:[{key:"Arrow keys (< >)",desc:"Switch between images"},{key:"(LMB), (RMB)",desc:"Switch between images"}]}]},{heading:"Markdown Formatting",items:[{key:"# Heading",desc:"Headings: use # for h1, ## for h2, up to ###### for h6"},{key:"`code`",desc:"Inline code"},{key:"**text**",desc:"Bold text"},{key:"__text__",desc:"Italic text"},{key:"~~text~~",desc:"Strikethrough text"}]},{heading:"Delete / Show / Restore Messages",subSections:[{title:"Deletion",items:[{key:"(RMB) + Message",desc:"Delete message"},{key:"(RMB) + Nickname",desc:"Delete user's messages"},{key:"(RMB) + Time",desc:"Delete his messages from the selected time"},{key:"Ctrl + (RMB) + Time",desc:"Delete all messages from the selected time"}]},{title:"Show / Restore",items:[{key:"(LMB) + Toggle",desc:"Show/Hide messages"},{key:"Ctrl + (LMB) + Toggle",desc:"Restore hidden messages"}]}]}]},ru:{heading:"Команды чата и горячие клавиши",sections:[{title:"Команды чата",items:[{key:"/help",desc:"Показать панель помощи"},{key:"/me сообщение",desc:"Отправить сообщение действия"},{key:"/pm username",desc:"Активировать приватный чат для указанного пользователя"},{key:"/exit",desc:"Выйти из приватного чата"},{key:"/reset",desc:"Сбросить данные чата"},{key:"/colors",desc:"Показать панель цветов имен пользователей"},{key:"/import colors",desc:"Импортировать цвета пользователей из json файла"},{key:"/export colors",desc:"Экспортировать цвета пользователей в json файл"},{key:"/ignored",desc:"Показать панель игнорируемых пользователей"},{key:"/themes",desc:"Показать панель тем"},{key:"/events",desc:"Показать панель событий"}]},{title:"Горячие клавиши чата",items:[{key:"Ctrl + Space",desc:"Скрыть/Показать чат"},{key:"Shift + Ctrl + Space",desc:"Развернуть/Свернуть чат"},{key:"Ctrl + Click",desc:"Активировать приватный чат для выбранного пользователя"},{key:"Долгое нажатие (ЛКМ)",desc:"Активировать приватный чат для выбранного пользователя (Пользователи)"},{key:"Двойной клик (ЛКМ)",desc:"Замена выбранных пользователей одним в поле ввода (Сообщения)"},{key:"Shift + Click",desc:"Открыть профиль пользователя по никнейму в сообщении"}]},{heading:"Действия и горячие клавиши панели эмодзи",subSections:[{title:"Действия панели эмодзи",items:[{key:"Click an emoji",desc:"Вставить эмодзи"},{key:"Click outside panel",desc:"Закрыть панель (эмодзи или помощь)"}]},{title:"Горячие клавиши панели эмодзи",items:[{key:"Ctrl + ;",desc:"Открыть панель эмодзи"},{key:"Enter",desc:"Вставить эмодзи"},{key:"Ctrl + Enter",desc:"Вставить эмодзи, оставив панель открытой"},{key:"Ctrl + Click",desc:"Вставить эмодзи, оставив панель открытой"},{key:"Shift + Click",desc:'Удалить эмодзи из списка "Недавно использованные"'},{key:"q",desc:"Скрыть панель эмодзи (одиночный нажим, когда поиск не в фокусе)"},{key:"qq",desc:"Скрыть панель эмодзи (дважды нажмите 'q', когда поиск в фокусе)"},{key:"Esc",desc:"Закрыть (эмодзи или помощь)"}]}]},{heading:"Манипуляции с изображением",subSections:[{title:"Открытие/Закрытие",items:[{key:"(ЛКМ) Клик",desc:"Открыть изображение"},{key:"Ctrl + (ПКМ)",desc:"Закрыть изображение и скопировать ссылку"},{key:"Space или ESC",desc:"Закрыть изображение"}]},{title:"Перемещение и масштабирование",items:[{key:"Зажатая (СКМ)",desc:"Перемещайте развернутое изображение"},{key:"Прокрутка (СКМ)",desc:"Увеличивайте/уменьшайте изображение"},{key:"Ctrl + (СКМ)",desc:"Масштабируйте изображение. Курсор вверх или вниз."}]},{title:"Навигация",items:[{key:"Стрелки (< >)",desc:"Переключение между изображениями"},{key:"(ЛКМ), (ПКМ)",desc:"Переключение между изображениями"}]}]},{heading:"Форматирование Markdown",items:[{key:"# Заголовок",desc:"Заголовки: используйте # для h1, ## для h2, до ###### для h6"},{key:"`код`",desc:"Встроенный код"},{key:"**текст**",desc:"Жирный текст"},{key:"__текст__",desc:"Курсивный текст"},{key:"~~текст~~",desc:"Зачёркнутый текст"}]},{heading:"Удаление / Показ / Восстановление сообщений",subSections:[{title:"Удаление",items:[{key:"(ПКМ) + Сообщение",desc:"Удалить сообщение"},{key:"(ПКМ) + Никнейм",desc:"Удалить сообщения пользователя"},{key:"(ПКМ) + Время",desc:"Удалить его сообщения с выбранного времени"},{key:"Ctrl + (ПКМ) + Время",desc:"Удалить все сообщения с выбранного времени"}]},{title:"Показ / Восстановление",items:[{key:"(ЛКМ) + Toggle",desc:"Показать/Скрыть сообщения"},{key:"Ctrl + (ЛКМ) + Toggle",desc:"Восстановить скрытые сообщения"}]}]}]}}[localStorage.getItem("emojiPanelLanguage")||"en"];let t=`<h5 class="help-section-header">${e.heading}</h5>`;e.sections.forEach((e=>{e.title?t+=`<h6 class="help-section-subheader">${e.title}</h6>`:e.heading&&(t+=`<h5 class="help-section-header">${e.heading}</h5>`),e.items&&(t+='<ul class="help-list">',e.items.forEach((e=>{t+=`<li class="help-list-item"><strong class="help-hotkey">${e.key}</strong> ${e.desc}</li>`})),t+="</ul>"),e.subSections&&e.subSections.forEach((e=>{t+=`<h6 class="help-section-subheader">${e.title}</h6>`,t+='<ul class="help-list">',e.items.forEach((e=>{t+=`<li class="help-list-item"><strong class="help-hotkey">${e.key}</strong> ${e.desc}</li>`})),t+="</ul>"}))})),this.content.innerHTML=t}bindEvents(){this._clickOutsideHandler=e=>{this.options.helpButton&&(e.target===this.options.helpButton||this.options.helpButton.contains(e.target))||this.container&&!this.container.contains(e.target)&&this.remove()},document.addEventListener("click",this._clickOutsideHandler,!0),this._escHandler=e=>{"Escape"===e.key&&this.remove()},document.addEventListener("keydown",this._escHandler,!0),this._stopPropagationHandler=e=>{e.stopPropagation()},this.container.addEventListener("click",this._stopPropagationHandler)}remove(){this._clickOutsideHandler&&(document.removeEventListener("click",this._clickOutsideHandler,!0),this._clickOutsideHandler=null),this._escHandler&&(document.removeEventListener("keydown",this._escHandler,!0),this._escHandler=null),this.container&&(this.container.removeEventListener("click",this._stopPropagationHandler),this._stopPropagationHandler=null),this.container&&(ft(this.container,"hide","0"),this.container=null),"function"==typeof this.options.onDestroy&&this.options.onDestroy(),En.instance=null}show(){this.container?this.updatePanelContent():this.init(),document.body.contains(this.container)||(document.body.appendChild(this.container),ft(this.container,"show","1"))}toggle(){this.container&&document.body.contains(this.container)?this.remove():this.show()}}En.instance=null;const Sn={smileys:["😀","😃","😄","😆","😁","😅","😂","🤣","🥲","☺️","😊","😇","🙂","🙃","😉","😌","😍","🥰","😙","😚","😗","😘","😋","🥸","😵‍💫","😛","😝","😜","🤪","😎","🤓","🧐","🤨","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","☹️","😣","😖","😫","😩","🥺","😢","😭","😤","😠","😡","🤬","🤯","😳","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🤫","🤥","😶","😐","😑","😬","🙄","😯","😦","😧","😮","😲","🥱","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","😈","👿","👹","👺","🤡","💩","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","✍️","💅","🤳","💪","🦾","🦿","🦵","🦶","👂","🦻","👃","🧠","🫀","🫁","🦷","🦴","👀","👁️","👅","👄","👶","🧒","👦","👧","🧑","👱","👨","🧔","👩","🧓","👴","👵","🙍","🙎","🙅","🙆","💁","🙋","🧏","🙇","🤦","🤷","👮","🕵️","💂","🥷","👷","🤴","👸","👳","👲","🧕","🤵","👰","🤰","🤱","👼","🎅","🤶","🦸","🦹","🧙","🧚","🧛","🧜"],nature:["🐵","🐒","🦍","🦧","🐶","🐕","🦮","🐕‍🦺","🐩","🐺","🦊","🦝","🐱","🐈","🐈‍⬛","🦁","🐯","🐅","🐆","🐴","🐎","🦄","🦓","🦌","🦬","🐮","🐂","🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑","🐐","🐪","🐫","🦙","🦒","🐘","🦏","🦛","🐭","🐁","🐀","🐹","🐰","🐇","🦫","🦘","🦡","🐿️","🦔","🦦","🦥","🐼","🦨","🦘","🦡","🦃","🐔","🐓","🐣","🐤","🐥","🐦","🐧","🕊️","🦅","🦆","🦢","🦉","🦤","🪶","🦩","🦚","🦜","🐸","🐊","🐢","🦎","🐍","🐲","🐉","🦕","🦖","🐳","🐋","🐬","🦭","🐟","🐠","🐡","🦈","🐙","🐚","🪸","🐌","🦋","🐛","🐜","🐝","🪲","🐞","🦗","🪳","🕷️","🕸️","🦂","🦟","🪰","🪱","🌸","💮","🏵️","🌹","🥀","🌺","🌻","🌼","🌷","🌱","🪴","🌲","🌳","🌴","🌵","🌾","🌿","☘️","🍀","🍁","🍂","🍃"],food:["🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🫐","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🥦","🥬","🥒","🌶️","🫑","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🥨","🧀","🥚","🍳","🥓","🥩","🍗","🍖","🦴","🌭","🍔","🍟","🍕","🫓","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🫖","☕","🍵","🧃","🥤","🧋","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🧉","🍾"],activities:["⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","⛳","🪁","🎣","🤿","🎽","🛹","🛼","🛷","⛸️","🥌","⛷️","🏂","🪂","🏋️","🤼","🤸","⛹️","🤾","🏌️","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚴","🚵","🎪","🎭","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🎷","🎺","🎸","🎻","🎲","🎯","🎳","🎮","🎰","🧩","🎪","🎫","🎟️"],travel:["🚗","🚕","🚙","🚌","🚎","🏎️","🚓","🚑","🚒","🚐","🛻","🚚","🚛","🚜","🛵","🏍️","🛺","🚲","🛴","✈️","🛩️","🛫","🛬","🚁","🚀","🛸","🛶","⛵","🚤","🛥️","🛳️","⛴️","🚢","🏰","🏯","🏟️","🏖️","🏝️","🏜️","🌋","⛰️","🏔️","🗻","🏕️","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","⛪","🕌","🕍","🛕","⛩️","🏛️"],objects:["📱","💻","⌨️","🖥️","🖨️","🖱️","🖲️","🕹️","🗜️","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📞","☎️","📟","📠","📺","📻","🎙️","🎚️","🎛️","📡","🔋","🔌","💡","🔦","🕯️","🧯","🛢️","💸","💵","💴","💶","💷","🪙","💰","💳","💎","⚖️","🪜","🧰","🔧","🔨","⚒️","🛠️","⛏️","✏️","🖊️","🖋️","✒️","🖌️","🖍️","📝","📚","📖","🔖","📑","🗒️","📄","📰","🗞️","📁","📂","🗂️","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕰️","⏰","⏱️","⏲️","⌚"],symbols:["❤️","🧡","💛","💚","💙","💜","🤎","🖤","🤍","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✝️","☪️","🕉️","☸️","✡️","🔯","🕎","☯️","☦️","🛐","⛎","⚠️","🚸","⛔","🚫","☢️","☣️","➕","➖","➗","✖️","♾️","💲","💱","⬆️","↗️","➡️","↘️","⬇️","↙️","⬅️","↖️","↕️","↔️","↩️","↪️","⤴️","⤵️","🔃","🔄","🔆","📶","🎦","🔅","♻️","✅","❌","❎","➰","➿","〽️","✳️","✴️","❇️","©️","®️","™️"],flags:["🏁","🚩","🎌","🏴","🏳️","🏳️‍🌈","🏳️‍⚧️","🏴‍☠️","🇺🇸","🇬🇧","🇯🇵","🇰🇷","🇩🇪","🇨🇳","🇧🇷","🇮🇳","🇫🇷","🇪🇸","🇮🇹","🇷🇺","🇨🇦","🇦🇺","🇳🇿","🇲🇽","🇦🇷","🇵🇰","🇪🇬","🇸🇪","🇳🇴","🇳🇱","🇨🇭","🇹🇷","🇮🇩","🇸🇬","🇮🇱","🇵🇹","🇵🇱","🇹🇭"]},Cn={"😀":{en:["grinning","face","smile","happy","joy"],ru:["улыбающийся","лицо","улыбка","счастливый","радость"]},"😃":{en:["smiley","face","happy","joy","laugh"],ru:["улыбчивый","лицо","счастливый","радость","смех"]},"😄":{en:["laughing","face","happy","joy","grin"],ru:["смеющийся","лицо","счастливый","радость","ухмылка"]},"😆":{en:["grinning face","laugh"],ru:["улыбка","смех"]},"😁":{en:["beaming","face","grin","smile","happy"],ru:["сияющий","лицо","улыбка","счастье","радость"]},"😅":{en:["sweat","nervous","face","laugh","relief"],ru:["пот","нервный","лицо","смех","облегчение"]},"😂":{en:["tears","joy","face","laugh","happy"],ru:["слёзы","радость","лицо","смех","счастье"]},"🤣":{en:["rolling","floor","laugh","funny","amused"],ru:["катающийся","пол","смех","смешной","развлечённый"]},"🥲":{en:["smiling","tear","bittersweet","nostalgic","happy"],ru:["улыбающийся","слеза","горько-сладкий","ностальгический","счастливый"]},"☺️":{en:["smile","blush","content","peaceful"],ru:["улыбка","румянец","довольный","спокойный"]},"😊":{en:["smiling","happy","blushing","content"],ru:["улыбающийся","счастливый","румянец","довольный"]},"😇":{en:["angel","halo","innocent","saint","pure"],ru:["ангел","ореол","невинный","святой","чистый"]},"🙂":{en:["slight","smile","face","mild"],ru:["слегка","улыбка","лицо","умеренный"]},"🙃":{en:["upside-down","silly","quirky","funny"],ru:["перевернутый","глупый","странный","смешной"]},"😉":{en:["wink","flirt","playful","smile"],ru:["подмигивание","флирт","игривый","улыбка"]},"😌":{en:["relieved","calm","content","satisfied"],ru:["облегчённый","спокойный","довольный","удовлетворённый"]},"😍":{en:["heart","love","smiling","eyes","adore"],ru:["сердце","любовь","улыбающийся","глаза","обожать"]},"🥰":{en:["love","hearts","affection","adoration","cuddle"],ru:["любовь","сердца","нежность","обожание","обниматься"]},"😙":{en:["kiss","love","affection","flirt"],ru:["поцелуй","любовь","нежность","флирт"]},"😗":{en:["kiss","face","smile","affection"],ru:["поцелуй","лицо","улыбка","нежность"]},"😚":{en:["kiss","closed eyes","affection","love"],ru:["поцелуй","закрытые глаза","нежность","любовь"]},"😘":{en:["kiss","love","affection","flirt"],ru:["поцелуй","любовь","нежность","флирт"]},"😋":{en:["yum","delicious","tasty","savor","lick"],ru:["ням","вкусно","аппетитно","наслаждаться","лизать"]},"🥸":{en:["disguise","glasses","funny","sneaky","face"],ru:["маскировка","очки","смешной","хитрый","лицо"]},"😵‍💫":{en:["dizzy","spiral eyes","confused","hypnotized","disoriented"],ru:["головокружение","спиральные глаза","запутанный","загипнотизированный","дезориентированный"]},"😛":{en:["tongue","playful","cheeky","silly"],ru:["язык","игривый","нахальный","глупый"]},"😝":{en:["tongue","silly","wacky","fun"],ru:["язык","глупый","безумный","весёлый"]},"😜":{en:["tongue","wink","playful","fun"],ru:["язык","подмигивание","игривый","весёлый"]},"🤪":{en:["crazy","wacky","zany","quirky"],ru:["сумасшедший","безумный","чудаковатый","странный"]},"😎":{en:["cool","sunglasses","confident","chill"],ru:["крутой","очки","уверенный","расслабленный"]},"🤓":{en:["nerd","geek","glasses","studious"],ru:["ботан","задрот","очки","учёный"]},"🧐":{en:["monocle","investigative","curious","thoughtful"],ru:["одноглазый","расследовательский","любопытный","задумчивый"]},"🤨":{en:["skeptical","doubtful","uncertain","raised eyebrow"],ru:["скептический","сомневающийся","неуверенный","поднятая бровь"]},"🤩":{en:["starstruck","amazed","excited","admire"],ru:["восхищённый","поражённый","взволнованный","обожать"]},"🥳":{en:["party","celebrate","birthday","festive"],ru:["вечеринка","праздновать","день рождения","праздничный"]},"😏":{en:["smirk","sly","mischievous","confident"],ru:["ухмылка","хитрый","озорной","уверенный"]},"😒":{en:["unamused","displeased","bored","sigh"],ru:["неудовлетворённый","недовольный","скучный","вздох"]},"😞":{en:["disappointed","sad","down","somber"],ru:["разочарованный","грустный","унылый","мрачный"]},"😔":{en:["pensive","sad","reflective","mournful"],ru:["задумчивый","грустный","рефлексивный","скорбный"]},"😟":{en:["worried","concerned","anxious","upset"],ru:["обеспокоенный","тревожный","беспокойный","расстроенный"]},"😕":{en:["confused","perplexed","uncertain","baffled"],ru:["смущённый","озадаченный","неуверенный","в замешательстве"]},"🙁":{en:["frowning","sad","disappointed","downcast"],ru:["хмурый","грустный","разочарованный","угнетённый"]},"☹️":{en:["frowning","sad","unhappy","mournful"],ru:["хмурый","грустный","несчастный","скорбный"]},"😣":{en:["strained","persevering","tired","discomfort"],ru:["напряжённый","терпеливый","уставший","дискомфорт"]},"😖":{en:["confounded","annoyed","distressed","exasperated"],ru:["озадаченный","раздражённый","огорчённый","изнурённый"]},"😫":{en:["tired","exhausted","weary","worn out"],ru:["усталый","измученный","изнурённый","измотанный"]},"😩":{en:["weary","tired","exhausted","overwhelmed"],ru:["изнурённый","уставший","измученный","перегруженный"]},"🥺":{en:["pleading","begging","cute","vulnerable"],ru:["умоляющий","просьба","милый","уязвимый"]},"😢":{en:["cry","sad","tear","sorrow"],ru:["плакать","грустный","слеза","печаль"]},"😭":{en:["crying","tearful","sad","heartbroken"],ru:["плачущий","со слезами","грустный","с разбитым сердцем"]},"😤":{en:["triumphant","exasperated","proud","angry"],ru:["триумфальный","раздражённый","гордый","сердитый"]},"😠":{en:["angry","mad","annoyed","irate"],ru:["сердитый","злой","раздражённый","яростный"]},"😡":{en:["pouting","mad","furious","irate"],ru:["надувшийся","злой","яростный","взбешённый"]},"🤬":{en:["cursing","swearing","angry","foul language"],ru:["ругательства","мат","сердитый","неприличный"]},"🤯":{en:["mind blown","shocked","amazed","stunned"],ru:["взрыв мозга","шокированный","поражённый","ошеломлённый"]},"😳":{en:["flushed","embarrassed","shocked","awkward"],ru:["покрасневший","смущённый","шокированный","неловкий"]},"🥵":{en:["hot","overheated","sweaty","exhausted"],ru:["горячий","перегретый","потный","изнурённый"]},"🥶":{en:["cold","freezing","chilly","frozen"],ru:["холодный","замерзающий","прохладный","замороженный"]},"😱":{en:["screaming","horror","shock","fear"],ru:["кричащий","ужас","шок","страх"]},"😨":{en:["fearful","scared","anxious","nervous"],ru:["боязливый","испуганный","тревожный","нервный"]},"😰":{en:["anxious","nervous","sweating","scared"],ru:["тревожный","нервный","потеющий","испуганный"]},"😥":{en:["disappointed","sad","pensive","teary"],ru:["разочарованный","грустный","задумчивый","со слезами"]},"😓":{en:["cold sweat","nervous","anxious","tired"],ru:["холодный пот","нервный","тревожный","усталый"]},"🤗":{en:["hug","embrace","caring","love"],ru:["объятие","принимать","заботливый","любовь"]},"🤔":{en:["thinking","pondering","curious","confused"],ru:["думающий","размышляющий","любопытный","смущённый"]},"🤭":{en:["guilty","shy","embarrassed","oops"],ru:["виноватый","застенчивый","смущённый","упс"]},"🤫":{en:["quiet","secret","hush","shh"],ru:["тихий","секрет","тишина","ш-ш"]},"🤥":{en:["lying","fib","deceitful","dishonest"],ru:["врущий","ложь","обманчивый","нечестный"]},"😶":{en:["speechless","mute","quiet","blank"],ru:["безмолвный","немой","тихий","пустой"]},"😐":{en:["neutral","expressionless","indifferent","flat"],ru:["нейтральный","без выражения","безразличный","плоский"]},"😑":{en:["deadpan","expressionless","blank","unemotional"],ru:["без эмоций","без выражения","пустой","неэмоциональный"]},"😬":{en:["grimace","awkward","nervous","tense"],ru:["гримаса","неловко","нервный","напряжённый"]},"🙄":{en:["eye roll","sarcastic","disdain","bored"],ru:["закатывание глаз","саркастичный","пренебрежительный","скучный"]},"😯":{en:["hushed","surprised","shocked","amazed"],ru:["тихий","удивлённый","шокированный","поражённый"]},"😦":{en:["frowning","dismayed","shocked","surprised"],ru:["хмурый","огорчённый","шокированный","удивлённый"]},"😧":{en:["astonished","stunned","surprised","speechless"],ru:["изумлённый","ошеломлённый","удивлённый","безмолвный"]},"😮":{en:["open mouth","surprised","shocked","amazed"],ru:["открытый рот","удивлённый","шокированный","поражённый"]},"😲":{en:["astonished","stunned","shocked","in awe"],ru:["изумлённый","ошеломлённый","шокированный","в благоговении"]},"🥱":{en:["yawning","sleepy","tired","bored"],ru:["зевота","сонный","усталый","скучный"]},"😴":{en:["sleeping","tired","napping","dozing"],ru:["спящий","усталый","дремлющий","засыпающий"]},"🤤":{en:["drooling","desire","craving","hungry"],ru:["слюнявый","желание","тяга","голодный"]},"😪":{en:["sleepy","drowsy","tired","nodding"],ru:["сонный","вялый","усталый","кивающий"]},"😵":{en:["dizzy","knocked out","stunned","confused"],ru:["головокружительный","вырубленный","ошеломлённый","сбитый с толку"]},"🤐":{en:["zipper-mouth","secretive","quiet","mute"],ru:["закрытый рот","секретный","тихий","немой"]},"🥴":{en:["woozy","tipsy","dizzy","unsteady"],ru:["ошеломлённый","подошедший","головокружительный","неустойчивый"]},"🤢":{en:["nauseated","sick","disgusted","vomit"],ru:["тошнотворный","больной","отвратительный","рвота"]},"🤮":{en:["vomiting","nauseous","sick","disgust"],ru:["рвота","тошнотворный","больной","отвратительный"]},"🤧":{en:["sneezing","ill","sick","allergy"],ru:["чихание","болен","больной","аллергия"]},"😷":{en:["mask","sick","ill","health"],ru:["маска","больной","нездоровый","здоровье"]},"🤒":{en:["fever","sick","ill","unwell"],ru:["лихорадка","больной","нездоровый","неважно"]},"🤕":{en:["injured","hurt","bandaged","pain"],ru:["раненый","повреждённый","забинтованный","боль"]},"🤑":{en:["money","rich","greedy","cash"],ru:["деньги","богатый","жадный","наличные"]},"🤠":{en:["cowboy","hat","western","fun"],ru:["ковбой","шляпа","вестерн","веселье"]},"😈":{en:["devil","mischievous","naughty","sinister"],ru:["дьявол","озорной","непослушный","зловещий"]},"👿":{en:["angry","devil","evil","fiendish"],ru:["сердитый","дьявол","злой","зловещий"]},"👹":{en:["ogre","demon","monster","scary"],ru:["огр","демон","монстр","страшный"]},"👺":{en:["goblin","troll","spooky","creepy"],ru:["гоблин","тролль","жуткий","страшный"]},"🤡":{en:["clown","silly","funny","circus"],ru:["клоун","глупый","смешной","цирк"]},"💩":{en:["poop","crap","feces","funny"],ru:["какашка","дерьмо","фекалии","смешной"]},"👻":{en:["ghost","spirit","haunted","scary"],ru:["призрак","дух","обитающий","страшный"]},"💀":{en:["skull","death","creepy","spooky"],ru:["череп","смерть","жуткий","страшный"]},"☠️":{en:["skull","danger","death","poison"],ru:["череп","опасность","смерть","яд"]},"👽":{en:["alien","extraterrestrial","space","ufo"],ru:["инопланетянин","внеземной","космос","НЛО"]},"👾":{en:["alien","monster","video game","retro"],ru:["инопланетянин","монстр","видеоигра","ретро"]},"🤖":{en:["robot","machine","tech","android"],ru:["робот","машина","технология","андроид"]},"🎃":{en:["pumpkin","halloween","spooky","festive"],ru:["тыква","Хэллоуин","жуткий","праздничный"]},"😺":{en:["smiling","cat","happy","playful"],ru:["улыбающийся","кот","счастливый","игривый"]},"😸":{en:["grinning","cat","joyful","cheerful"],ru:["широко улыбающийся","кот","радостный","весёлый"]},"😹":{en:["tearful","joy","cat","laughing"],ru:["со слезами","радость","кот","смеющийся"]},"😻":{en:["heart","cat","love","adorable"],ru:["сердце","кот","любовь","милый"]},"😼":{en:["smirking","cat","mischievous","sly"],ru:["ухмыляющийся","кот","озорной","хитрый"]},"😽":{en:["kissing","cat","affection","cute"],ru:["целующий","кот","нежность","милый"]},"🙀":{en:["surprised","cat","scared","shocked"],ru:["испуганный","кот","испуганный","шокированный"]},"😿":{en:["crying","cat","sad","tearful"],ru:["плачущий","кот","грустный","со слезами"]},"😾":{en:["angry","cat","annoyed","displeased"],ru:["сердитый","кот","раздражённый","недовольный"]},"👋":{en:["wave","hello","goodbye","greeting"],ru:["махание","привет","прощание","приветствие"]},"🤚":{en:["raised hand","stop","palm"],ru:["поднятая рука","стой","ладонь"]},"🖐️":{en:["hand","high five","greeting"],ru:["рука","дай пять","приветствие"]},"✋":{en:["stop","palm","high five"],ru:["стой","ладонь","дай пять"]},"🖖":{en:["vulcan salute","live long","sci-fi"],ru:["салют Вулканцев","живи долго","научная фантастика"]},"👌":{en:["okay","perfect","good"],ru:["ок","идеально","хорошо"]},"🤌":{en:["pinched","precise","delicious"],ru:["сжатый","точный","вкусный"]},"🤏":{en:["small","tiny","minuscule"],ru:["маленький","крошечный","микроскопический"]},"✌️":{en:["peace","victory","v sign"],ru:["мир","победа","знак победы"]},"🤞":{en:["fingers crossed","hope","luck"],ru:["скрещенные пальцы","надежда","удача"]},"🤟":{en:["I love you","rock on","sign language"],ru:["я тебя люблю","рок он","язык жестов"]},"🤘":{en:["rock","metal","horns"],ru:["рок","металл","рога"]},"🤙":{en:["call me","hang loose","shaka"],ru:["позвони мне","расслабься","шак"]},"👈":{en:["point left","direction","arrow"],ru:["указание влево","направление","стрелка"]},"👉":{en:["point right","direction","arrow"],ru:["указание вправо","направление","стрелка"]},"👆":{en:["point up","direction","up"],ru:["указание вверх","направление","вверх"]},"🖕":{en:["middle finger","offensive","rude"],ru:["средний палец","оскорбительный","грубый"]},"👇":{en:["point down","direction","down"],ru:["указание вниз","направление","вниз"]},"☝️":{en:["point up","number one","important"],ru:["указание вверх","номер один","важный"]},"👍":{en:["thumbs up","good","approve"],ru:["палец вверх","хорошо","одобрить"]},"👎":{en:["thumbs down","bad","disapprove"],ru:["палец вниз","плохо","не одобрять"]},"✊":{en:["fist","power","solidarity"],ru:["кулак","сила","солидарность"]},"👊":{en:["punch","fist bump","hit"],ru:["удар","кулачок","ударить"]},"🤛":{en:["left fist","punch","strike"],ru:["левая рука","удар","нанести удар"]},"🤜":{en:["right fist","punch","strike"],ru:["правая рука","удар","нанести удар"]},"👏":{en:["clap","applause","bravo"],ru:["хлопки","аплодисменты","браво"]},"🙌":{en:["celebrate","praise","hooray"],ru:["торжествовать","хвалить","ура"]},"👐":{en:["open hands","embrace","welcome"],ru:["раскрытые руки","объятие","добро пожаловать"]},"🤲":{en:["palms","offering","receive"],ru:["ладони","предложение","получать"]},"🤝":{en:["handshake","agreement","cooperation"],ru:["рукопожатие","соглашение","сотрудничество"]},"🙏":{en:["pray","thanks","please"],ru:["молиться","спасибо","пожалуйста"]},"✍️":{en:["writing","pen","signature"],ru:["письмо","ручка","подпись"]},"💅":{en:["nail polish","beauty","manicure"],ru:["лак для ногтей","красота","маникюр"]},"🤳":{en:["selfie","photo","camera"],ru:["селфи","фото","камера"]},"💪":{en:["flex","strong","muscle"],ru:["сгибать","сильный","мышцы"]},"🦾":{en:["mechanical arm","robotic","cyborg"],ru:["механическая рука","роботизированный","киборг"]},"🦿":{en:["mechanical leg","prosthetic","robotic"],ru:["механическая нога","протез","роботизированный"]},"🦵":{en:["leg","limb","lower body"],ru:["нога","конечность","нижняя часть тела"]},"🦶":{en:["foot","toes","step"],ru:["нога","пальцы ноги","шаг"]},"👂":{en:["ear","listening","sound"],ru:["ухо","слушание","звук"]},"🦻":{en:["hearing aid","listening","assistive"],ru:["слуховой аппарат","слушание","помощь"]},"👃":{en:["nose","smell","scent"],ru:["нос","запах","аромат"]},"🧠":{en:["brain","intelligence","mind"],ru:["мозг","интеллект","ум"]},"🫀":{en:["heart (organ)","anatomy","biology"],ru:["сердце (орган)","анатомия","биология"]},"🫁":{en:["lungs","breath","organ"],ru:["легкие","дыхание","орган"]},"🦷":{en:["tooth","dental","smile"],ru:["зуб","стоматология","улыбка"]},"🦴":{en:["bone","skeleton","hard"],ru:["кость","скелет","твердый"]},"👀":{en:["eyes","look","see"],ru:["глаза","смотреть","видеть"]},"👁️":{en:["eye","vision","watch"],ru:["глаз","зрение","наблюдать"]},"👅":{en:["tongue","taste","lick"],ru:["язык","вкус","лизать"]},"👄":{en:["lips","kiss","mouth"],ru:["губы","поцелуй","рот"]},"👶":{en:["baby","infant","cute"],ru:["младенец","ребенок","милый"]},"🧒":{en:["child","kid","youth"],ru:["ребенок","малыш","юный"]},"👦":{en:["boy","child","kid"],ru:["мальчик","ребенок","малыш"]},"👧":{en:["girl","child","kid"],ru:["девочка","ребенок","малышка"]},"🧑":{en:["person","human","individual"],ru:["человек","личность","индивид"]},"👱":{en:["blonde","person","light hair"],ru:["блондин","человек","светлые волосы"]},"👨":{en:["man","male","guy"],ru:["мужчина","мужской","парень"]},"🧔":{en:["bearded","man","facial hair"],ru:["бородатый","мужчина","борода"]},"👩":{en:["woman","female","lady"],ru:["женщина","женский","дама"]},"🧓":{en:["elderly","senior","aged"],ru:["пожилой","старший","в преклонном возрасте"]},"👴":{en:["old man","elderly","senior"],ru:["старик","пожилой","старший"]},"👵":{en:["old woman","elderly","senior"],ru:["старуха","пожилая","старшая"]},"🙍":{en:["frowning","sad","displeased"],ru:["хмурый","грустный","недовольный"]},"🙎":{en:["pouting","angry","displeased"],ru:["надувшийся","сердитый","недовольный"]},"🙅":{en:["no","prohibited","refusal"],ru:["нет","запрещено","отказ"]},"🙆":{en:["ok","acceptable","okay"],ru:["ок","приемлемо","хорошо"]},"💁":{en:["information","help","assistance"],ru:["информация","помощь","поддержка"]},"🙋":{en:["raising hand","question","volunteer"],ru:["поднимающая руку","вопрос","доброволец"]},"🧏":{en:["deaf","listening","silent"],ru:["глухой","слушающий","безмолвный"]},"🙇":{en:["bowing","apologetic","respect"],ru:["наклон","извиняющийся","уважение"]},"🤦":{en:["facepalm","disbelief","oops"],ru:["лицо ладонь","недоверие","упс"]},"🤷":{en:["shrug","uncertain","indifferent"],ru:["пожимание плечами","неуверенный","безразличный"]},"👮":{en:["police","officer","law"],ru:["полицейский","офицер","закон"]},"🕵️":{en:["detective","spy","investigate"],ru:["детектив","шпион","расследование"]},"💂":{en:["guard","soldier","military"],ru:["страж","солдат","военный"]},"🥷":{en:["ninja","stealth","assassin"],ru:["ниндзя","скрытность","ассассин"]},"👷":{en:["construction","worker","helmet"],ru:["строитель","рабочий","шлем"]},"🤴":{en:["prince","royalty","king"],ru:["принц","королевская семья","король"]},"👸":{en:["princess","royalty","queen"],ru:["принцесса","королевская семья","королева"]},"👳":{en:["turban","cultural","tradition"],ru:["тюрбан","культура","традиция"]},"👲":{en:["man with cap","cultural","traditional"],ru:["мужчина в кепке","культура","традиционный"]},"🧕":{en:["woman with headscarf","cultural","modest"],ru:["женщина в платке","культурная","скромная"]},"🤵":{en:["tuxedo","groom","formal"],ru:["смокинг","жених","официальный"]},"👰":{en:["bride","wedding","formal"],ru:["невеста","свадьба","официальный"]},"🤰":{en:["pregnant","expecting","mother"],ru:["беременная","ожидающая","мать"]},"🤱":{en:["nursing","mother","baby"],ru:["кормящая","мать","ребенок"]},"👼":{en:["angel","cherub","divine"],ru:["ангел","херувим","божественный"]},"🎅":{en:["santa","christmas","jolly"],ru:["Санта","Рождество","радостный"]},"🤶":{en:["mrs claus","christmas","holiday"],ru:["миссис Клаус","Рождество","праздник"]},"🦸":{en:["superhero","power","hero"],ru:["супергерой","сила","герой"]},"🦹":{en:["villain","bad","criminal"],ru:["злодей","плохой","преступник"]},"🧙":{en:["wizard","magic","sorcery"],ru:["волшебник","магия","колдовство"]},"🧚":{en:["fairy","magic","mystical"],ru:["фея","магия","мистический"]},"🧛":{en:["vampire","dracula","undead"],ru:["вампир","Дракула","нежить"]},"🧜":{en:["mermaid","mythical","ocean"],ru:["русалка","мифическая","океан"]},"🐵":{en:["monkey","ape","funny","mammal"],ru:["обезьяна","примат","смешной","млекопитающее"]},"🐒":{en:["monkey","primate","curious"],ru:["обезьяна","примат","любопытный"]},"🦍":{en:["gorilla","ape","strong","wild"],ru:["горилла","обезьяна","сильный","дикий"]},"🦧":{en:["orangutan","ape","wild","mammal"],ru:["орангутан","обезьяна","дикий","млекопитающее"]},"🐶":{en:["dog","puppy","pet","mammal"],ru:["собака","щенок","домашний питомец","млекопитающее"]},"🐕":{en:["dog","canine","pet"],ru:["собака","псовой","домашний питомец"]},"🦮":{en:["guide dog","service","assistance"],ru:["собака-поводырь","служебная","помощь"]},"🐕‍🦺":{en:["service dog","working","assistance"],ru:["служебная собака","рабочая","помощь"]},"🐩":{en:["poodle","dog","pet","fancy"],ru:["пудель","собака","домашний питомец","элегантный"]},"🐺":{en:["wolf","wild","howl"],ru:["волк","дикий","воет"]},"🦊":{en:["fox","cunning","wild"],ru:["лиса","хитрая","дикая"]},"🦝":{en:["raccoon","mischievous","wild"],ru:["енот","озорной","дикий"]},"🐱":{en:["cat","pet","feline"],ru:["кот","домашний питомец","кошачий"]},"🐈":{en:["cat","feline","pet"],ru:["кот","кошачий","домашний питомец"]},"🐈‍⬛":{en:["black cat","mysterious","feline"],ru:["чёрный кот","загадочный","кошачий"]},"🦁":{en:["lion","king","wild","courage"],ru:["лев","король","дикий","отвага"]},"🐯":{en:["tiger","wild","stripes","fierce"],ru:["тигр","дикий","полосатый","свирепый"]},"🐅":{en:["tiger","stripes","wild"],ru:["тигр","полосатый","дикий"]},"🐆":{en:["leopard","spots","wild","fast"],ru:["леопард","пятна","дикий","быстрый"]},"🐴":{en:["horse","ride","equine"],ru:["лошадь","езда","конный"]},"🐎":{en:["horse","racing","equine"],ru:["лошадь","гонки","конный"]},"🦄":{en:["unicorn","magical","fantasy"],ru:["единорог","волшебный","фэнтези"]},"🦓":{en:["zebra","stripes","wild"],ru:["зебра","полосатая","дикая"]},"🦌":{en:["deer","antlers","forest"],ru:["олень","рога","лес"]},"🦬":{en:["bison","buffalo","wild"],ru:["бизон","буйвол","дикий"]},"🐮":{en:["cow","farm","bovine"],ru:["корова","ферма","коровий"]},"🐂":{en:["ox","bull","bovine"],ru:["вол","бык","коровий"]},"🐃":{en:["water buffalo","bovine","farm"],ru:["водный буйвол","коровий","ферма"]},"🐄":{en:["cow","bovine","farm"],ru:["корова","коровий","ферма"]},"🐷":{en:["pig","farm","oink"],ru:["свинья","ферма","хрюк"]},"🐖":{en:["pig","swine","farm"],ru:["свинья","свинное животное","ферма"]},"🐗":{en:["boar","wild","pig"],ru:["кабан","дикий","свинья"]},"🐽":{en:["pig nose","snout"],ru:["свинной нос","хоботок"]},"🐏":{en:["ram","sheep","male"],ru:["баран","овца","самец"]},"🐑":{en:["sheep","wool","farm"],ru:["овца","шерсть","ферма"]},"🐐":{en:["goat","farm","bleat"],ru:["коза","ферма","блеет"]},"🐪":{en:["camel","desert","hump"],ru:["верблюд","пустыня","горб"]},"🐫":{en:["camel","two-hump","desert"],ru:["двугорбый верблюд","двугорбый","пустыня"]},"🦙":{en:["llama","alpaca","cute"],ru:["лама","альпака","милый"]},"🦒":{en:["giraffe","tall","spots"],ru:["жираф","высокий","пятна"]},"🐘":{en:["elephant","trunk","large"],ru:["слон","хобот","большой"]},"🦏":{en:["rhinoceros","horn","tough"],ru:["носорог","рог","жесткий"]},"🦛":{en:["hippopotamus","water","large"],ru:["бегемот","вода","большой"]},"🦃":{en:["turkey","bird","thanksgiving"],ru:["индейка","птица","День благодарения"]},"🐔":{en:["chicken","rooster","hen"],ru:["курица","петух","курица (самка)"]},"🐓":{en:["rooster","chicken","bird"],ru:["петух","курица","птица"]},"🐣":{en:["hatching chick","baby","bird"],ru:["вылупляющийся цыплёнок","малыш","птица"]},"🐤":{en:["chick","small","bird"],ru:["цыплёнок","маленький","птица"]},"🐥":{en:["baby chicken","cute","bird"],ru:["цыплёнок","милый","птица"]},"🐦":{en:["bird","tweet","wing"],ru:["птица","чирик","крыло"]},"🐧":{en:["penguin","cold","bird"],ru:["пингвин","холодный","птица"]},"🕊️":{en:["dove","peace","bird"],ru:["голубь","мир","птица"]},"🦅":{en:["eagle","wild","bird"],ru:["орёл","дикий","птица"]},"🦆":{en:["duck","water","bird"],ru:["утка","вода","птица"]},"🦢":{en:["swan","graceful","bird"],ru:["лебедь","грациозный","птица"]},"🦉":{en:["owl","wise","night","bird"],ru:["сова","мудрая","ночная","птица"]},"🦤":{en:["dodo","extinct","bird"],ru:["додо","вымершая","птица"]},"🪶":{en:["feather","light","bird"],ru:["перо","лёгкое","птица"]},"🦩":{en:["flamingo","pink","bird"],ru:["фламинго","розовый","птица"]},"🦚":{en:["peacock","colorful","bird"],ru:["павлин","яркий","птица"]},"🦜":{en:["parrot","talkative","colorful"],ru:["попугай","болтливый","яркий"]},"🐸":{en:["frog","amphibian","green"],ru:["лягушка","амфибия","зелёная"]},"🐊":{en:["crocodile","reptile","danger"],ru:["крокодил","рептилия","опасность"]},"🐢":{en:["turtle","slow","reptile"],ru:["черепаха","медленная","рептилия"]},"🦎":{en:["lizard","reptile","scaly"],ru:["ящерица","рептилия","чешуйчатая"]},"🐍":{en:["snake","reptile","slither"],ru:["змея","рептилия","ползать"]},"🐲":{en:["dragon face","mythical","dragon"],ru:["лицо дракона","мифический","дракон"]},"🐉":{en:["dragon","mythical","fire"],ru:["дракон","мифический","огонь"]},"🦕":{en:["dinosaur","sauropod","prehistoric"],ru:["динозавр","зауропод","доисторический"]},"🦖":{en:["dinosaur","T-Rex","prehistoric"],ru:["динозавр","Ти-Рекс","доисторический"]},"🐳":{en:["whale","ocean","large"],ru:["кит","океан","большой"]},"🐋":{en:["whale","ocean","big"],ru:["кит","океан","огромный"]},"🐬":{en:["dolphin","ocean","friendly"],ru:["дельфин","океан","дружелюбный"]},"🦭":{en:["seal","marine","cute"],ru:["тюлень","морской","милый"]},"🐟":{en:["fish","ocean","swim"],ru:["рыба","океан","плавать"]},"🐠":{en:["tropical fish","ocean","colorful"],ru:["тропическая рыба","океан","яркая"]},"🐡":{en:["blowfish","puffer","ocean"],ru:["рыба-иглобрюх","фугу","океан"]},"🦈":{en:["shark","ocean","dangerous"],ru:["акула","океан","опасная"]},"🐙":{en:["octopus","marine","tentacles"],ru:["осьминог","морской","щупальца"]},"🐚":{en:["shell","beach","ocean"],ru:["ракушка","пляж","океан"]},"🪸":{en:["coral","reef","ocean"],ru:["коралл","риф","океан"]},"🐌":{en:["snail","slow","mollusk"],ru:["улитка","медленная","моллюск"]},"🦋":{en:["butterfly","insect","colorful"],ru:["бабочка","насекомое","яркая"]},"🐛":{en:["caterpillar","insect","larva"],ru:["гусеница","насекомое","личинка"]},"🐜":{en:["ant","small","insect"],ru:["муравей","маленький","насекомое"]},"🐝":{en:["bee","insect","honey"],ru:["пчела","насекомое","мёд"]},"🪲":{en:["beetle","insect","bug"],ru:["жук","насекомое","баг"]},"🐞":{en:["ladybug","insect","lucky"],ru:["божья коровка","насекомое","счастливая"]},"🦗":{en:["cricket","insect","chirp"],ru:["сверчок","насекомое","щебет"]},"🪳":{en:["cockroach","insect","pest"],ru:["таракан","насекомое","вредитель"]},"🕷️":{en:["spider","arachnid","insect"],ru:["паук","паукообразное","насекомое"]},"🕸️":{en:["web","spider","trap"],ru:["паутина","паук","ловушка"]},"🦂":{en:["scorpion","insect","venom"],ru:["скорпион","насекомое","яд"]},"🦟":{en:["mosquito","insect","bite"],ru:["комар","насекомое","укус"]},"🪰":{en:["fly","insect","buzz"],ru:["муха","насекомое","жужжание"]},"🪱":{en:["worm","earth","invertebrate"],ru:["червь","земля","беспозвоночное"]},"🌸":{en:["cherry blossom","flower","spring"],ru:["сакура","цветок","весна"]},"💮":{en:["white flower","flower","symbol"],ru:["белый цветок","цветок","символ"]},"🏵️":{en:["rosette","flower","decorative"],ru:["розетка","цветок","декоративный"]},"🌹":{en:["rose","flower","love","romance"],ru:["роза","цветок","любовь","романтика"]},"🥀":{en:["wilted flower","sad","decay"],ru:["увядший цветок","грусть","разложение"]},"🌺":{en:["hibiscus","flower","tropical"],ru:["гибискус","цветок","тропический"]},"🌻":{en:["sunflower","flower","summer"],ru:["подсолнух","цветок","лето"]},"🌼":{en:["blossom","flower","spring"],ru:["цветение","цветок","весна"]},"🌷":{en:["tulip","flower","spring"],ru:["тюльпан","цветок","весна"]},"🌱":{en:["seedling","plant","growth"],ru:["сеянец","растение","рост"]},"🪴":{en:["potted plant","indoor","green"],ru:["растение в горшке","в помещении","зелёное"]},"🌲":{en:["evergreen","tree","forest"],ru:["вечнозелёное","дерево","лес"]},"🌳":{en:["tree","nature","shade"],ru:["дерево","природа","тень"]},"🌴":{en:["palm tree","tropical","beach"],ru:["пальма","тропический","пляж"]},"🌵":{en:["cactus","desert","succulent"],ru:["кактус","пустыня","суккулент"]},"🌾":{en:["sheaf","grain","farm"],ru:["сноп","зерно","ферма"]},"🌿":{en:["herb","plant","leaf"],ru:["трава","растение","лист"]},"☘️":{en:["shamrock","luck","clover"],ru:["клевер","удача","трилистник"]},"🍀":{en:["four-leaf clover","luck","green"],ru:["клевер с четырьмя листьями","удача","зелёный"]},"🍁":{en:["maple leaf","autumn","fall"],ru:["кленовый лист","осень","осенний"]},"🍂":{en:["fallen leaf","autumn","nature"],ru:["опавший лист","осень","природа"]},"🍃":{en:["leaf","wind","nature"],ru:["лист","ветер","природа"]},"🍎":{en:["apple","red","fruit","healthy"],ru:["яблоко","красное","фрукт","полезное"]},"🍐":{en:["pear","fruit","green","juicy"],ru:["груша","фрукт","зелёная","сочная"]},"🍊":{en:["orange","fruit","citrus","vitamin C"],ru:["апельсин","фрукт","цитрус","витамин C"]},"🍋":{en:["lemon","citrus","sour","yellow"],ru:["лимон","цитрус","кислый","жёлтый"]},"🍌":{en:["banana","fruit","yellow","tropical"],ru:["банан","фрукт","жёлтый","тропический"]},"🍉":{en:["watermelon","fruit","summer","refreshing"],ru:["арбуз","фрукт","лето","освежающий"]},"🍇":{en:["grapes","fruit","purple","vine"],ru:["виноград","фрукт","фиолетовый","виноградная лоза"]},"🍓":{en:["strawberry","fruit","red","sweet"],ru:["клубника","фрукт","красная","сладкая"]},"🫐":{en:["blueberry","fruit","blue","healthy"],ru:["черника","фрукт","синяя","полезная"]},"🍈":{en:["melon","fruit","sweet","green"],ru:["дыня","фрукт","сладкая","зелёная"]},"🍒":{en:["cherry","fruit","red","sweet"],ru:["вишня","фрукт","красная","сладкая"]},"🍑":{en:["peach","fruit","fuzzy","sweet"],ru:["персик","фрукт","шероховатый","сладкий"]},"🥭":{en:["mango","fruit","tropical","yellow"],ru:["манго","фрукт","тропический","жёлтый"]},"🍍":{en:["pineapple","fruit","tropical","spiky"],ru:["ананас","фрукт","тропический","колючий"]},"🥥":{en:["coconut","tropical","fruit","white"],ru:["кокос","тропический","фрукт","белый"]},"🥝":{en:["kiwi","fruit","green","tart"],ru:["киви","фрукт","зелёный","кисловатый"]},"🍅":{en:["tomato","vegetable","red","juicy"],ru:["помидор","овощ","красный","сочный"]},"🍆":{en:["eggplant","vegetable","purple","aubergine"],ru:["баклажан","овощ","фиолетовый","баклажан"]},"🥑":{en:["avocado","vegetable","green","healthy"],ru:["авокадо","овощ","зелёный","полезный"]},"🥦":{en:["broccoli","vegetable","green","healthy"],ru:["брокколи","овощ","зелёный","полезный"]},"🥬":{en:["leafy greens","vegetable","lettuce","healthy"],ru:["листья салата","овощ","салат","полезный"]},"🥒":{en:["cucumber","vegetable","green","fresh"],ru:["огурец","овощ","зелёный","свежий"]},"🌶️":{en:["chili pepper","spicy","red","hot"],ru:["чили","острый","красный","горячий"]},"🫑":{en:["bell pepper","vegetable","colorful","sweet"],ru:["болгарский перец","овощ","разноцветный","сладкий"]},"🥕":{en:["carrot","vegetable","orange","crunchy"],ru:["морковь","овощ","оранжевая","хрустящая"]},"🧄":{en:["garlic","vegetable","aromatic","flavorful"],ru:["чеснок","овощ","ароматный","вкусный"]},"🧅":{en:["onion","vegetable","strong","flavor"],ru:["лук","овощ","сильный","вкус"]},"🥔":{en:["potato","vegetable","starchy","brown"],ru:["картофель","овощ","крахмалистый","коричневый"]},"🍠":{en:["sweet potato","vegetable","orange","starchy"],ru:["батат","овощ","оранжевый","крахмалистый"]},"🥐":{en:["croissant","bread","pastry","flaky"],ru:["круассан","хлеб","выпечка","слоёный"]},"🥯":{en:["bagel","bread","round","chewy"],ru:["бейгл","хлеб","круглый","жевательный"]},"🍞":{en:["bread","baked","loaf","toast"],ru:["хлеб","выпеченный","буханка","тост"]},"🥖":{en:["baguette","bread","French","long"],ru:["багет","хлеб","французский","длинный"]},"🥨":{en:["pretzel","snack","salted","twisted"],ru:["претцель","закуска","солёный","скрученный"]},"🧀":{en:["cheese","dairy","yellow","savory"],ru:["сыр","молочный продукт","жёлтый","пикантный"]},"🥚":{en:["egg","protein","breakfast"],ru:["яйцо","белок","завтрак"]},"🍳":{en:["fried egg","breakfast","cooked"],ru:["жареное яйцо","завтрак","приготовленное"]},"🥓":{en:["bacon","meat","crispy","breakfast"],ru:["бекон","мясо","хрустящий","завтрак"]},"🥩":{en:["steak","meat","protein","beef"],ru:["стейк","мясо","белок","говядина"]},"🍗":{en:["chicken leg","meat","drumstick","grilled"],ru:["куриная ножка","мясо","барабанная палочка","гриль"]},"🍖":{en:["meat on bone","barbecue","protein"],ru:["мясо на кости","барбекю","белок"]},"🦴":{en:["bone","meat","dog","skeleton"],ru:["кость","мясо","собака","скелет"]},"🌭":{en:["hot dog","fast food","sausage"],ru:["хот-дог","фастфуд","колбаска"]},"🍔":{en:["burger","fast food","beef","cheese"],ru:["бургер","фастфуд","говядина","сыр"]},"🍟":{en:["french fries","fast food","crispy","potato"],ru:["картофель фри","фастфуд","хрустящий","картофель"]},"🍕":{en:["pizza","cheese","fast food","Italian"],ru:["пицца","сыр","фастфуд","итальянская"]},"🫓":{en:["flatbread","bread","soft"],ru:["лепёшка","хлеб","мягкая"]},"🥪":{en:["sandwich","bread","meal"],ru:["бутерброд","хлеб","приём пищи"]},"🥙":{en:["pita","bread","stuffed","Greek"],ru:["пита","хлеб","фаршированная","греческая"]},"🧆":{en:["falafel","vegetarian","fried"],ru:["фалафель","вегетарианский","жареный"]},"🌮":{en:["taco","Mexican","spicy"],ru:["тако","мексиканская","острая"]},"🌯":{en:["burrito","Mexican","stuffed"],ru:["буррито","мексиканская","фаршированная"]},"🫔":{en:["tamale","Mexican","corn"],ru:["тамале","мексиканская","кукурузная"]},"🥗":{en:["salad","healthy","vegetable"],ru:["салат","здоровый","овощной"]},"🥘":{en:["paella","stew","seafood"],ru:["паэлья","тушёное блюдо","морепродукты"]},"🫕":{en:["fondue","melted","cheese"],ru:["фондю","расплавленный","сыр"]},"🥫":{en:["canned food","storage","preserved"],ru:["консервы","хранение","сохранённое"]},"🍝":{en:["spaghetti","pasta","Italian"],ru:["спагетти","паста","итальянская"]},"🍜":{en:["ramen","noodles","Asian"],ru:["рамен","лапша","азиатская"]},"🍲":{en:["hotpot","stew","broth"],ru:["хотпот","тушёное блюдо","бульон"]},"🍛":{en:["curry","spicy","rice"],ru:["карри","острая","рис"]},"🍣":{en:["sushi","Japanese","fish"],ru:["суши","японская","рыба"]},"🍱":{en:["bento box","Japanese","meal"],ru:["бенто","японская","еда"]},"🥟":{en:["dumpling","Asian","stuffed"],ru:["пельмени","азиатские","фаршированные"]},"🦪":{en:["oyster","seafood","shellfish"],ru:["устрица","морепродукт","раковина"]},"🍤":{en:["shrimp tempura","fried","seafood"],ru:["креветка темпура","жареная","морепродукт"]},"🍙":{en:["rice ball","Japanese","onigiri"],ru:["рисовый шар","японская","онигири"]},"🍚":{en:["cooked rice","staple","Asian"],ru:["варёный рис","основа","азиатская"]},"🍘":{en:["rice cracker","snack","Japanese"],ru:["рисовый крекер","закуска","японская"]},"🍥":{en:["fish cake","Japanese","swirl"],ru:["рыбный пирожок","японская","спираль"]},"🥠":{en:["fortune cookie","Chinese","paper"],ru:["печенье с предсказанием","китайское","бумажное"]},"🥮":{en:["mooncake","Chinese","festival"],ru:["лунное печенье","китайское","фестиваль"]},"🍢":{en:["skewered snack","street food"],ru:["шампур","уличная еда"]},"🍡":{en:["dango","Japanese","mochi"],ru:["данго","японское","мочи"]},"🍧":{en:["shaved ice","dessert","cold"],ru:["измельчённый лёд","десерт","холодный"]},"🍨":{en:["ice cream","cold","sweet"],ru:["мороженое","холодное","сладкое"]},"🍦":{en:["soft serve","dessert","cold"],ru:["мягкое мороженое","десерт","холодное"]},"🥧":{en:["pie","dessert","baked"],ru:["пирог","десерт","выпеченный"]},"🧁":{en:["cupcake","sweet","frosting"],ru:["капкейк","сладкий","с глазурью"]},"🍰":{en:["cake","dessert","slice"],ru:["торт","десерт","кусок"]},"🎂":{en:["birthday cake","celebration","sweet"],ru:["торт ко дню рождения","празднование","сладкий"]},"🍮":{en:["flan","custard","dessert"],ru:["флан","кастард","десерт"]},"🍭":{en:["lollipop","candy","sweet"],ru:["леденец","конфета","сладкий"]},"🍬":{en:["candy","sweet","sugar"],ru:["конфета","сладость","сахар"]},"🍫":{en:["chocolate","sweet","cocoa"],ru:["шоколад","сладкий","какао"]},"🍿":{en:["popcorn","snack","buttery"],ru:["попкорн","закуска","масляный"]},"🍩":{en:["doughnut","sweet","fried"],ru:["пончик","сладкий","жареный"]},"🍪":{en:["cookie","sweet","baked"],ru:["печенье","сладкое","выпеченное"]},"🫖":{en:["teapot","tea","hot"],ru:["чайник","чай","горячий"]},"☕":{en:["coffee","hot drink","caffeine"],ru:["кофе","горячий напиток","кофеин"]},"🍵":{en:["green tea","hot","Japanese"],ru:["зелёный чай","горячий","японский"]},"🧃":{en:["juice","drink","fruit"],ru:["сок","напиток","фруктовый"]},"🥤":{en:["soft drink","straw","fast food"],ru:["безалкогольный напиток","с трубочкой","фастфуд"]},"🧋":{en:["bubble tea","milk tea","boba"],ru:["бабл-ти","молочный чай","боба"]},"🍶":{en:["sake","Japanese","rice wine"],ru:["саке","японский","рисовое вино"]},"🍺":{en:["beer","drink","alcohol"],ru:["пиво","напиток","алкоголь"]},"🍻":{en:["cheers","beer","drinking"],ru:["ура","пиво","выпивка"]},"🥂":{en:["champagne","celebration","toast"],ru:["шампанское","празднование","тост"]},"🍷":{en:["wine","drink","red"],ru:["вино","напиток","красное"]},"🥃":{en:["whiskey","liquor","alcohol"],ru:["виски","ликёр","алкоголь"]},"🍸":{en:["cocktail","martini","drink"],ru:["коктейль","мартини","напиток"]},"🍹":{en:["tropical drink","cocktail","summer"],ru:["тропический напиток","коктейль","лето"]},"🧉":{en:["mate","South American","tea"],ru:["мате","южноамериканский","чай"]},"🍾":{en:["champagne bottle","celebration","party"],ru:["бутылка шампанского","празднование","вечеринка"]},"⚽":{en:["soccer","football","sports","ball"],ru:["футбол","футбол","спорт","мяч"]},"🏀":{en:["basketball","sports","hoop","dunk"],ru:["баскетбол","спорт","кольцо","данк"]},"🏈":{en:["American football","sports","rugby"],ru:["американский футбол","спорт","регби"]},"⚾":{en:["baseball","sports","bat"],ru:["бейсбол","спорт","бита"]},"🥎":{en:["softball","sports","ball"],ru:["софтбол","спорт","мяч"]},"🎾":{en:["tennis","sports","racket"],ru:["теннис","спорт","ракетка"]},"🏐":{en:["volleyball","sports","beach"],ru:["волейбол","спорт","пляж"]},"🏉":{en:["rugby","sports","oval ball"],ru:["регби","спорт","овальный мяч"]},"🥏":{en:["frisbee","throw","flying disc"],ru:["фрисби","бросок","летающий диск"]},"🎱":{en:["billiards","8 ball","pool"],ru:["бильярд","восьмёрка","пул"]},"🪀":{en:["yo-yo","toy","string"],ru:["йо-йо","игрушка","верёвка"]},"🏓":{en:["ping pong","table tennis","sports"],ru:["пинг-понг","настольный теннис","спорт"]},"🏸":{en:["badminton","racket","sports"],ru:["бадминтон","ракетка","спорт"]},"🏒":{en:["hockey","ice hockey","sports"],ru:["хоккей","хоккей на льду","спорт"]},"🏑":{en:["field hockey","sports","stick"],ru:["хоккей на траве","спорт","клюшка"]},"🥍":{en:["lacrosse","sports","net"],ru:["лакросс","спорт","сеть"]},"🏏":{en:["cricket","bat","sports"],ru:["крикет","бита","спорт"]},"⛳":{en:["golf","sports","hole in one"],ru:["гольф","спорт","луночка"]},"🪁":{en:["kite","flying","wind"],ru:["змей","летать","ветер"]},"🎣":{en:["fishing","hook","water"],ru:["рыбалка","крючок","вода"]},"🤿":{en:["diving","underwater","snorkel"],ru:["дайвинг","под водой","снорклинг"]},"🎽":{en:["running","jersey","athlete"],ru:["бег","майка","спортсмен"]},"🛹":{en:["skateboard","sports","extreme"],ru:["скейтборд","спорт","экстрим"]},"🛼":{en:["roller skate","sports","wheels"],ru:["роликовые коньки","спорт","колёса"]},"🛷":{en:["sled","winter","snow"],ru:["санки","зима","снег"]},"⛸️":{en:["ice skate","winter","sports"],ru:["коньки","зима","спорт"]},"🥌":{en:["curling","winter","stone"],ru:["керлинг","зима","камень"]},"⛷️":{en:["skiing","winter","snow"],ru:["лыжи","зима","снег"]},"🏂":{en:["snowboarding","sports","snow"],ru:["сноуборд","спорт","снег"]},"🪂":{en:["parachute","skydiving","air"],ru:["парашют","скайдайвинг","воздух"]},"🏋️":{en:["weightlifting","gym","strong"],ru:["тяжёлая атлетика","спортзал","сильный"]},"🤼":{en:["wrestling","fight","grapple"],ru:["борьба","драка","схватка"]},"🤸":{en:["gymnastics","acrobatics","flip"],ru:["гимнастика","акробатика","сальто"]},"⛹️":{en:["basketball","dribbling","sports"],ru:["баскетбол","дриблинг","спорт"]},"🤾":{en:["handball","sports","throw"],ru:["гандбол","спорт","бросок"]},"🏌️":{en:["golf","swing","sports"],ru:["гольф","мах","спорт"]},"🏇":{en:["horse racing","sports","jockey"],ru:["конные скачки","спорт","жокей"]},"🧘":{en:["meditation","yoga","zen"],ru:["медитация","йога","дзен"]},"🏄":{en:["surfing","wave","water"],ru:["серфинг","волна","вода"]},"🏊":{en:["swimming","water","pool"],ru:["плавание","вода","бассейн"]},"🤽":{en:["water polo","sports","swimming"],ru:["водное поло","спорт","плавание"]},"🚣":{en:["rowing","boat","water"],ru:["гребля","лодка","вода"]},"🧗":{en:["rock climbing","sports","mountain"],ru:["скалолазание","спорт","гора"]},"🚴":{en:["cycling","bike","sports"],ru:["велоспорт","велосипед","спорт"]},"🚵":{en:["mountain biking","sports","outdoor"],ru:["маунтинбайк","спорт","на свежем воздухе"]},"🎪":{en:["circus","tent","performance"],ru:["цирк","палатка","выступление"]},"🎭":{en:["theater","drama","acting"],ru:["театр","драма","актерство"]},"🎨":{en:["painting","art","colors"],ru:["живопись","искусство","цвета"]},"🎬":{en:["film","clapperboard","movie"],ru:["фильм","хлопушка","кино"]},"🎤":{en:["microphone","singing","music"],ru:["микрофон","пение","музыка"]},"🎧":{en:["headphones","music","listening"],ru:["наушники","музыка","прослушивание"]},"🎼":{en:["music","sheet","notes"],ru:["музыка","ноты","сценарий"]},"🎹":{en:["piano","keyboard","music"],ru:["пианино","клавиатура","музыка"]},"🥁":{en:["drums","music","percussion"],ru:["барабаны","музыка","ударные"]},"🎷":{en:["saxophone","jazz","music"],ru:["саксофон","джаз","музыка"]},"🎺":{en:["trumpet","brass","music"],ru:["труба","латунь","музыка"]},"🎸":{en:["guitar","music","rock"],ru:["гитара","музыка","рок"]},"🎻":{en:["violin","music","strings"],ru:["скрипка","музыка","струны"]},"🎲":{en:["dice","game","board game"],ru:["кубики","игра","настольная игра"]},"🎯":{en:["dart","target","game"],ru:["дротик","цель","игра"]},"🎳":{en:["bowling","sports","pins"],ru:["боулинг","спорт","кегли"]},"🎮":{en:["video game","console","gaming"],ru:["видеоигра","консоль","игры"]},"🎰":{en:["slot machine","casino","gambling"],ru:["игровой автомат","казино","азартные игры"]},"🧩":{en:["puzzle","pieces","brain teaser"],ru:["головоломка","кусочки","разминка для мозга"]},"🎫":{en:["ticket","event","entry"],ru:["билет","событие","вход"]},"🎟️":{en:["admission","ticket","event"],ru:["входной билет","билет","событие"]},"🚗":{en:["car","automobile","vehicle","transport"],ru:["автомобиль","машина","транспортное средство","транспорт"]},"🚕":{en:["taxi","cab","transport","vehicle"],ru:["такси","маршрутка","транспорт","транспортное средство"]},"🚙":{en:["suv","vehicle","transport"],ru:["внедорожник","транспортное средство","транспорт"]},"🚌":{en:["bus","public transport","commute"],ru:["автобус","общественный транспорт","коммьют"]},"🚎":{en:["trolleybus","public transport","electric"],ru:["троллейбус","общественный транспорт","электрический"]},"🏎️":{en:["race car","sports car","fast","speed"],ru:["гоночный автомобиль","спортивный автомобиль","быстрый","скорость"]},"🚓":{en:["police car","law enforcement","vehicle"],ru:["полицейская машина","правоохранительные органы","транспортное средство"]},"🚑":{en:["ambulance","emergency","hospital"],ru:["скорая помощь","чрезвычайная ситуация","больница"]},"🚒":{en:["fire truck","firefighter","emergency"],ru:["пожарная машина","пожарный","чрезвычайная ситуация"]},"🚐":{en:["van","minibus","transport"],ru:["фургон","маршрутка","транспорт"]},"🛻":{en:["pickup truck","off-road","vehicle"],ru:["пикап","для бездорожья","транспортное средство"]},"🚚":{en:["delivery truck","freight","cargo"],ru:["грузовик","доставка","груз"]},"🚛":{en:["truck","semi-trailer","transport"],ru:["грузовик","самосвал","транспорт"]},"🚜":{en:["tractor","farming","agriculture"],ru:["трактор","сельское хозяйство","агрономия"]},"🛵":{en:["scooter","motorbike","moped"],ru:["скутер","мотоцикл","мопед"]},"🏍️":{en:["motorcycle","bike","racing"],ru:["мотоцикл","байк","гоночный"]},"🛺":{en:["rickshaw","auto rickshaw","transport"],ru:["рикша","авто-рикша","транспорт"]},"🚲":{en:["bicycle","bike","pedal","cycling"],ru:["велосипед","байк","педаль","велоспорт"]},"🛴":{en:["kick scooter","scooter","ride"],ru:["самокат","скутер","поездка"]},"✈️":{en:["airplane","flight","travel","sky"],ru:["самолёт","рейс","путешествие","небо"]},"🛩️":{en:["small airplane","aviation","sky"],ru:["малый самолёт","авиация","небо"]},"🛫":{en:["departure","takeoff","airport"],ru:["вылет","взлёт","аэропорт"]},"🛬":{en:["landing","arrival","airport"],ru:["посадка","прибытие","аэропорт"]},"🚁":{en:["helicopter","aviation","air"],ru:["вертолёт","авиация","воздух"]},"🚀":{en:["rocket","space","launch","NASA"],ru:["ракета","космос","запуск","НАСА"]},"🛸":{en:["UFO","alien","spaceship","extraterrestrial"],ru:["НЛО","инопланетянин","космический корабль","внеземной"]},"🛶":{en:["canoe","boat","paddle","water"],ru:["каноэ","лодка","весло","вода"]},"⛵":{en:["sailboat","yacht","sea"],ru:["парусник","яхта","море"]},"🚤":{en:["motorboat","speedboat","ocean"],ru:["моторная лодка","скоростной катер","океан"]},"🛥️":{en:["yacht","luxury","boat"],ru:["яхта","роскошь","лодка"]},"🛳️":{en:["cruise ship","ocean","voyage"],ru:["круизный лайнер","океан","путешествие"]},"⛴️":{en:["ferry","boat","transport"],ru:["паром","лодка","транспорт"]},"🚢":{en:["ship","ocean","voyage"],ru:["корабль","океан","путешествие"]},"🏰":{en:["castle","fortress","history"],ru:["замок","крепость","история"]},"🏯":{en:["Japanese castle","Asia","samurai"],ru:["японский замок","Азия","самурай"]},"🏟️":{en:["stadium","sports","arena"],ru:["стадион","спорт","арена"]},"🏖️":{en:["beach","sun","vacation"],ru:["пляж","солнце","отпуск"]},"🏝️":{en:["island","tropical","vacation"],ru:["остров","тропический","отпуск"]},"🏜️":{en:["desert","sand","dry"],ru:["пустыня","песок","сухой"]},"🌋":{en:["volcano","eruption","lava"],ru:["вулкан","извержение","лава"]},"⛰️":{en:["mountain","hiking","nature"],ru:["гора","поход","природа"]},"🏔️":{en:["snowy mountain","climbing","cold"],ru:["снежная гора","скалолазание","холод"]},"🗻":{en:["Mount Fuji","Japan","scenic"],ru:["гора Фудзи","Япония","живописный"]},"🏕️":{en:["camping","tent","outdoors"],ru:["кемпинг","палатка","на природе"]},"🏭":{en:["factory","industry","building"],ru:["фабрика","индустрия","здание"]},"🏢":{en:["office building","corporate","city"],ru:["офисное здание","корпоративный","город"]},"🏬":{en:["shopping mall","retail","stores"],ru:["торговый центр","розничная торговля","магазины"]},"🏣":{en:["post office","mail","building"],ru:["почтовое отделение","почта","здание"]},"🏤":{en:["post office","mail","postal service"],ru:["почтовое отделение","почта","почтовая служба"]},"🏥":{en:["hospital","healthcare","emergency"],ru:["больница","здравоохранение","чрезвычайная ситуация"]},"🏦":{en:["bank","money","finance"],ru:["банк","деньги","финансы"]},"🏨":{en:["hotel","accommodation","stay"],ru:["отель","размещение","проживание"]},"🏪":{en:["convenience store","shopping","24/7"],ru:["магазин","шоппинг","круглосуточно"]},"🏫":{en:["school","education","learning"],ru:["школа","образование","обучение"]},"🏩":{en:["love hotel","romantic","Japan"],ru:["любовный отель","романтический","Япония"]},"💒":{en:["wedding","church","marriage"],ru:["свадьба","церковь","брак"]},"⛪":{en:["church","Christianity","religion"],ru:["церковь","христианство","религия"]},"🕌":{en:["mosque","Islam","prayer"],ru:["мечеть","ислам","молитва"]},"🕍":{en:["synagogue","Judaism","religion"],ru:["синагога","иудаизм","религия"]},"🛕":{en:["hindu temple","spiritual","India"],ru:["индуистский храм","духовный","Индия"]},"⛩️":{en:["shrine","torii","Japan"],ru:["святилище","тории","Япония"]},"🏛️":{en:["government building","politics","history"],ru:["правительственное здание","политика","история"]},"📱":{en:["smartphone","mobile","phone"],ru:["смартфон","мобильный","телефон"]},"💻":{en:["laptop","computer","technology"],ru:["ноутбук","компьютер","технология"]},"⌨️":{en:["keyboard","typing","computer"],ru:["клавиатура","набор текста","компьютер"]},"🖥️":{en:["desktop","monitor","screen"],ru:["настольный компьютер","монитор","экран"]},"🖨️":{en:["printer","print","office"],ru:["принтер","печать","офис"]},"🖱️":{en:["mouse","computer","click"],ru:["мышь","компьютер","клик"]},"🖲️":{en:["trackball","navigation","input"],ru:["трекбол","навигация","ввод"]},"🕹️":{en:["joystick","gaming","console"],ru:["джойстик","игры","консоль"]},"🗜️":{en:["clamp","tool","hardware"],ru:["зажим","инструмент","аппаратное обеспечение"]},"💽":{en:["mini disc","storage","media"],ru:["мини-диск","хранение","медиа"]},"💾":{en:["floppy disk","save","data"],ru:["флоппи-диск","сохранить","данные"]},"💿":{en:["CD","compact disc","music"],ru:["CD","компакт-диск","музыка"]},"📀":{en:["DVD","video","disc"],ru:["DVD","видео","диск"]},"📼":{en:["VHS","video cassette","retro"],ru:["VHS","видеокассета","ретро"]},"📷":{en:["camera","photo","photography"],ru:["камера","фото","фотография"]},"📸":{en:["camera flash","photography","snapshot"],ru:["вспышка камеры","фотография","снимок"]},"📹":{en:["video camera","recording","film"],ru:["видеокамера","запись","фильм"]},"🎥":{en:["movie camera","film","cinema"],ru:["кино-камера","фильм","кино"]},"📞":{en:["telephone","call","communication"],ru:["телефон","звонок","коммуникация"]},"☎️":{en:["phone","landline","call"],ru:["телефон","стационарный","звонок"]},"📟":{en:["pager","message","communication"],ru:["пейджер","сообщение","коммуникация"]},"📠":{en:["fax machine","office","document"],ru:["факс","офис","документ"]},"📺":{en:["TV","television","screen"],ru:["телевизор","теле","экран"]},"📻":{en:["radio","broadcast","audio"],ru:["радио","трансляция","аудио"]},"🎙️":{en:["microphone","recording","podcast"],ru:["микрофон","запись","подкаст"]},"🎚️":{en:["control knob","audio","volume"],ru:["ручка управления","аудио","громкость"]},"🎛️":{en:["sliders","equalizer","settings"],ru:["ползунки","эквалайзер","настройки"]},"📡":{en:["satellite dish","broadcast","signal"],ru:["спутниковая антенна","трансляция","сигнал"]},"🔋":{en:["battery","power","energy"],ru:["батарея","мощность","энергия"]},"🔌":{en:["plug","electricity","charging"],ru:["штекер","электричество","зарядка"]},"💡":{en:["light bulb","idea","illumination"],ru:["лампочка","идея","освещение"]},"🔦":{en:["flashlight","torch","light"],ru:["фонарик","фонарь","свет"]},"🕯️":{en:["candle","light","fire"],ru:["свеча","свет","огонь"]},"🧯":{en:["fire extinguisher","safety","fire"],ru:["огнетушитель","безопасность","огонь"]},"🛢️":{en:["barrel","oil","fuel"],ru:["бочка","масло","топливо"]},"💸":{en:["money with wings","cash","spending"],ru:["деньги с крыльями","наличные","расходы"]},"💵":{en:["dollar bills","money","USD"],ru:["долларовые банкноты","деньги","USD"]},"💴":{en:["yen","money","Japan"],ru:["иена","деньги","Япония"]},"💶":{en:["euro","money","currency"],ru:["евро","деньги","валюта"]},"💷":{en:["pound","money","UK"],ru:["фунт","деньги","Великобритания"]},"🪙":{en:["coin","currency","money"],ru:["монета","валюта","деньги"]},"💰":{en:["money bag","wealth","rich"],ru:["мешок с деньгами","богатство","богатый"]},"💳":{en:["credit card","banking","payment"],ru:["кредитная карта","банковское дело","оплата"]},"💎":{en:["gem","diamond","valuable"],ru:["драгоценный камень","бриллиант","ценный"]},"⚖️":{en:["balance scale","justice","law"],ru:["весы","справедливость","закон"]},"🪜":{en:["ladder","climb","height"],ru:["лестница","лазить","высота"]},"🧰":{en:["toolbox","tools","repair"],ru:["ящик с инструментами","инструменты","ремонт"]},"🔧":{en:["wrench","repair","tools"],ru:["гаечный ключ","ремонт","инструменты"]},"🔨":{en:["hammer","build","fix"],ru:["молоток","строить","чинить"]},"⚒️":{en:["hammer and pick","construction","work"],ru:["молот и кирка","строительство","работа"]},"🛠️":{en:["tools","fix","maintenance"],ru:["инструменты","чинить","обслуживание"]},"⛏️":{en:["pickaxe","mining","digging"],ru:["кирка","горное дело","копать"]},"✏️":{en:["pencil","writing","notes"],ru:["карандаш","написание","заметки"]},"🖊️":{en:["pen","writing","signature"],ru:["ручка","написание","подпись"]},"🖋️":{en:["fountain pen","calligraphy","writing"],ru:["перьевая ручка","каллиграфия","написание"]},"✒️":{en:["nib","ink","writing"],ru:["остриё","чернила","написание"]},"🖌️":{en:["paintbrush","art","painting"],ru:["кисть","искусство","живопись"]},"🖍️":{en:["crayon","drawing","color"],ru:["мелки","рисование","цвет"]},"📝":{en:["memo","notes","document"],ru:["заметка","записи","документ"]},"📚":{en:["books","reading","library"],ru:["книги","чтение","библиотека"]},"📖":{en:["open book","reading","story"],ru:["открытая книга","чтение","история"]},"🔖":{en:["bookmark","reading","save"],ru:["закладка","чтение","сохранить"]},"📑":{en:["bookmark tabs","pages","notes"],ru:["закладки","страницы","заметки"]},"🗒️":{en:["spiral notepad","notes","journal"],ru:["спиральный блокнот","записи","журнал"]},"📄":{en:["document","paper","page"],ru:["документ","бумага","страница"]},"📰":{en:["newspaper","news","journalism"],ru:["газета","новости","журналистика"]},"🗞️":{en:["rolled newspaper","press","print"],ru:["свернутая газета","пресса","печатное издание"]},"📁":{en:["file folder","documents","storage"],ru:["папка","документы","хранение"]},"📂":{en:["open folder","organization","files"],ru:["открытая папка","организация","файлы"]},"🗂️":{en:["card index","catalog","records"],ru:["карточный индекс","каталог","записи"]},"🕐":{en:["1 o'clock","clock face","time"],ru:["час","циферблат","время"]},"🕑":{en:["2 o'clock","clock face","time"],ru:["два часа","циферблат","время"]},"🕒":{en:["3 o'clock","clock face","time"],ru:["три часа","циферблат","время"]},"🕓":{en:["4 o'clock","clock face","time"],ru:["четыре часа","циферблат","время"]},"🕔":{en:["5 o'clock","clock face","time"],ru:["пять часов","циферблат","время"]},"🕕":{en:["6 o'clock","clock face","time"],ru:["шесть часов","циферблат","время"]},"🕖":{en:["7 o'clock","clock face","time"],ru:["семь часов","циферблат","время"]},"🕗":{en:["8 o'clock","clock face","time"],ru:["восемь часов","циферблат","время"]},"🕘":{en:["9 o'clock","clock face","time"],ru:["девять часов","циферблат","время"]},"🕙":{en:["10 o'clock","clock face","time"],ru:["десять часов","циферблат","время"]},"🕚":{en:["11 o'clock","clock face","time"],ru:["одиннадцать часов","циферблат","время"]},"🕛":{en:["12 o'clock","clock face","time"],ru:["двенадцать часов","циферблат","время"]},"🕰️":{en:["mantel clock","clock","time"],ru:["настенные часы","часы","время"]},"⏰":{en:["alarm clock","wake up","time"],ru:["будильник","пробуждение","время"]},"⏱️":{en:["stopwatch","timer","time"],ru:["секундомер","таймер","время"]},"⏲️":{en:["kitchen timer","timer","time"],ru:["кухонный таймер","таймер","время"]},"⌚":{en:["watch","smartwatch","time"],ru:["часы","умные часы","время"]},"❤️":{en:["heart","love","affection"],ru:["сердце","любовь","нежность"]},"🧡":{en:["orange heart","warmth","care"],ru:["оранжевое сердце","теплота","забота"]},"💛":{en:["yellow heart","friendship","happiness"],ru:["жёлтое сердце","дружба","счастье"]},"💚":{en:["green heart","envy","nature","eco"],ru:["зелёное сердце","зависть","природа","эко"]},"💙":{en:["blue heart","loyalty","trust"],ru:["синее сердце","верность","доверие"]},"💜":{en:["purple heart","compassion","admiration"],ru:["фиолетовое сердце","сострадание","восхищение"]},"🤎":{en:["brown heart","earth","stability"],ru:["коричневое сердце","земля","устойчивость"]},"🖤":{en:["black heart","mourning","dark"],ru:["чёрное сердце","скорбь","тёмный"]},"🤍":{en:["white heart","pure","peace"],ru:["белое сердце","чистый","мир"]},"💔":{en:["broken heart","sad","heartbreak"],ru:["разбитое сердце","грусть","сердечная боль"]},"❣️":{en:["heart exclamation","love","emotion"],ru:["сердечный восклицательный знак","любовь","эмоция"]},"💕":{en:["two hearts","romance","affection"],ru:["два сердца","романтика","нежность"]},"💞":{en:["revolving hearts","love","relationship"],ru:["вращающиеся сердца","любовь","отношения"]},"💓":{en:["beating heart","emotion","passion"],ru:["бьющееся сердце","эмоция","страсть"]},"💗":{en:["growing heart","love","expanding"],ru:["растущее сердце","любовь","расширяющееся"]},"💖":{en:["sparkling heart","admiration","shine"],ru:["блестящее сердце","восхищение","сияние"]},"💘":{en:["heart with arrow","love","romance"],ru:["сердце со стрелой","любовь","романтика"]},"💝":{en:["heart with ribbon","gift","affection"],ru:["сердце с лентой","подарок","нежность"]},"💟":{en:["heart decoration","symbol","love"],ru:["украшение сердца","символ","любовь"]},"☮️":{en:["peace","pacifism","symbol"],ru:["мир","пацифизм","символ"]},"✝️":{en:["cross","christianity","religion"],ru:["крест","христианство","религия"]},"☪️":{en:["star and crescent","islam","faith"],ru:["звезда и полумесяц","ислам","вера"]},"🕉️":{en:["om","hinduism","spiritual"],ru:["ом","индуизм","духовный"]},"☸️":{en:["dharma wheel","buddhism","karma"],ru:["колесо дхармы","буддизм","карма"]},"✡️":{en:["star of david","judaism","faith"],ru:["звезда Давида","иудаизм","вера"]},"🔯":{en:["hexagram","mystic","spiritual"],ru:["шестиконечная звезда","мистический","духовный"]},"🕎":{en:["menorah","hanukkah","jewish"],ru:["менора","Ханука","еврейский"]},"☯️":{en:["yin yang","balance","harmony"],ru:["инь-ян","баланс","гармония"]},"☦️":{en:["orthodox cross","christianity","faith"],ru:["православный крест","христианство","вера"]},"🛐":{en:["place of worship","religion","faith"],ru:["место поклонения","религия","вера"]},"⛎":{en:["ophiuchus","zodiac","astrology"],ru:["змееносец","зодиак","астрология"]},"⚠️":{en:["warning","caution","alert"],ru:["предупреждение","осторожность","тревога"]},"🚸":{en:["children crossing","school","pedestrian"],ru:["дети на переходе","школа","пешеход"]},"⛔":{en:["no entry","prohibited","restricted"],ru:["вход запрещён","запрещено","ограничено"]},"🚫":{en:["prohibited","no","forbidden"],ru:["запрещено","нет","запрещено"]},"☢️":{en:["radioactive","hazard","danger"],ru:["радиоактивный","опасность","угроза"]},"☣️":{en:["biohazard","toxic","warning"],ru:["биологическая опасность","ядовитый","предупреждение"]},"➕":{en:["plus","addition","math"],ru:["плюс","сложение","математика"]},"➖":{en:["minus","subtraction","math"],ru:["минус","вычитание","математика"]},"➗":{en:["division","divide","math"],ru:["деление","делить","математика"]},"✖️":{en:["multiplication","times","math"],ru:["умножение","раз","математика"]},"♾️":{en:["infinity","limitless","math"],ru:["бесконечность","безграничный","математика"]},"💲":{en:["dollar","money","currency"],ru:["доллар","деньги","валюта"]},"💱":{en:["currency exchange","finance","money"],ru:["обмен валюты","финансы","деньги"]},"⬆️":{en:["up arrow","increase","direction"],ru:["стрелка вверх","увеличение","направление"]},"↗️":{en:["up-right arrow","growth","move"],ru:["стрелка вверх-вправо","рост","движение"]},"➡️":{en:["right arrow","next","forward"],ru:["стрелка вправо","далее","вперёд"]},"↘️":{en:["down-right arrow","decrease","move"],ru:["стрелка вниз-вправо","уменьшение","движение"]},"⬇️":{en:["down arrow","lower","decline"],ru:["стрелка вниз","понижение","снижение"]},"↙️":{en:["down-left arrow","falling","move"],ru:["стрелка вниз-влево","падение","движение"]},"⬅️":{en:["left arrow","back","previous"],ru:["стрелка влево","назад","предыдущий"]},"↖️":{en:["up-left arrow","direction","move"],ru:["стрелка вверх-влево","направление","движение"]},"↕️":{en:["vertical arrows","up down","change"],ru:["вертикальные стрелки","вверх вниз","изменение"]},"↔️":{en:["horizontal arrows","left right","switch"],ru:["горизонтальные стрелки","влево вправо","переключение"]},"↩️":{en:["back arrow","undo","return"],ru:["стрелка назад","отмена","возврат"]},"↪️":{en:["right curved arrow","redirect","turn"],ru:["изогнутая стрелка вправо","перенаправление","поворот"]},"⤴️":{en:["up-right arrow","diagonal","move"],ru:["диагональная стрелка вверх-вправо","диагональ","движение"]},"⤵️":{en:["down-right arrow","diagonal","move"],ru:["диагональная стрелка вниз-вправо","диагональ","движение"]},"🔃":{en:["repeat","cycle","refresh"],ru:["повтор","цикл","обновление"]},"🔄":{en:["counterclockwise arrows","reload","sync"],ru:["стрелки против часовой стрелки","перезагрузка","синхронизация"]},"🔆":{en:["bright","high brightness","sun"],ru:["яркий","высокая яркость","солнце"]},"📶":{en:["signal","network","connection"],ru:["сигнал","сеть","соединение"]},"🎦":{en:["cinema","movies","entertainment"],ru:["кино","фильмы","развлечения"]},"🔅":{en:["dim","low brightness","light"],ru:["тусклый","низкая яркость","свет"]},"♻️":{en:["recycle","eco","sustainability"],ru:["переработка","эко","устойчивость"]},"✅":{en:["check mark","yes","approved"],ru:["галочка","да","одобрено"]},"❌":{en:["cross mark","no","wrong"],ru:["крестик","нет","неправильно"]},"❎":{en:["negative cross","decline","cancel"],ru:["отрицательный крест","отказ","отмена"]},"➰":{en:["curly loop","infinity","twist"],ru:["извилистая петля","бесконечность","скрутка"]},"➿":{en:["double curly loop","loop","repeat"],ru:["двойная извилистая петля","петля","повтор"]},"〽️":{en:["part alternation","music","symbol"],ru:["знак чередования","музыка","символ"]},"✳️":{en:["eight-spoked asterisk","star","highlight"],ru:["восьмиконечная астериска","звезда","акцент"]},"✴️":{en:["eight-pointed star","shine","special"],ru:["восьмиконечная звезда","сияние","особый"]},"❇️":{en:["sparkle","highlight","shine"],ru:["сверкание","акцент","сияние"]},"©️":{en:["copyright","legal","rights"],ru:["авторское право","юридический","права"]},"®️":{en:["registered","trademark","brand"],ru:["зарегистрировано","торговая марка","бренд"]},"™️":{en:["trademark","brand","symbol"],ru:["торговая марка","бренд","символ"]},"🏁":{en:["checkered flag","finish line","racing"],ru:["шашечный флаг","финишная черта","гонки"]},"🚩":{en:["triangular flag","mark","warning"],ru:["треугольный флаг","метка","предупреждение"]},"🎌":{en:["crossed flags","celebration","Japan"],ru:["перекрещённые флаги","празднование","Япония"]},"🏴":{en:["black flag","protest","symbol"],ru:["чёрный флаг","протест","символ"]},"🏳️":{en:["white flag","surrender","peace"],ru:["белый флаг","капитуляция","мир"]},"🏳️‍🌈":{en:["rainbow flag","LGBTQ+","pride"],ru:["радужный флаг","ЛГБТК+","гордость"]},"🏳️‍⚧️":{en:["transgender flag","trans","pride"],ru:["трансгендерный флаг","транс","гордость"]},"🏴‍☠️":{en:["pirate flag","skull","danger"],ru:["пиратский флаг","череп","опасность"]},"🇺🇸":{en:["United States","USA","America"],ru:["Соединённые Штаты","США","Америка"]},"🇬🇧":{en:["United Kingdom","UK","Britain"],ru:["Соединённое Королевство","Великобритания","Британия"]},"🇯🇵":{en:["Japan","Japanese","Asia"],ru:["Япония","японский","Азия"]},"🇰🇷":{en:["South Korea","Korea","Asian"],ru:["Южная Корея","Корея","азиатский"]},"🇩🇪":{en:["Germany","Deutschland","Europe"],ru:["Германия","Германия","Европа"]},"🇨🇳":{en:["China","Chinese","Asia"],ru:["Китай","китайский","Азия"]},"🇧🇷":{en:["Brazil","Brasil","South America"],ru:["Бразилия","Бразилия","Южная Америка"]},"🇮🇳":{en:["India","Indian","Asia"],ru:["Индия","индийский","Азия"]},"🇫🇷":{en:["France","French","Europe"],ru:["Франция","французский","Европа"]},"🇪🇸":{en:["Spain","Spanish","Europe"],ru:["Испания","испанский","Европа"]},"🇮🇹":{en:["Italy","Italian","Europe"],ru:["Италия","итальянский","Европа"]},"🇷🇺":{en:["Russia","Russian","Europe"],ru:["Россия","русский","Европа"]},"🇨🇦":{en:["Canada","Canadian","North America"],ru:["Канада","канадский","Северная Америка"]},"🇦🇺":{en:["Australia","Aussie","Oceania"],ru:["Австралия","австралиец","Океания"]},"🇳🇿":{en:["New Zealand","Kiwi","Oceania"],ru:["Новая Зеландия","киви","Океания"]},"🇲🇽":{en:["Mexico","Mexican","Latin America"],ru:["Мексика","мексиканский","Латинская Америка"]},"🇦🇷":{en:["Argentina","Argentinian","South America"],ru:["Аргентина","аргентинский","Южная Америка"]},"🇵🇰":{en:["Pakistan","Pakistani","Asia"],ru:["Пакистан","пакистанский","Азия"]},"🇪🇬":{en:["Egypt","Egyptian","Africa"],ru:["Египет","египетский","Африка"]},"🇸🇪":{en:["Sweden","Swedish","Europe"],ru:["Швеция","шведский","Европа"]},"🇳🇴":{en:["Norway","Norwegian","Europe"],ru:["Норвегия","норвежский","Европа"]},"🇳🇱":{en:["Netherlands","Dutch","Europe"],ru:["Нидерланды","голландский","Европа"]},"🇨🇭":{en:["Switzerland","Swiss","Europe"],ru:["Швейцария","швейцарский","Европа"]},"🇹🇷":{en:["Turkey","Turkish","Eurasia"],ru:["Турция","турецкий","Евразия"]},"🇮🇩":{en:["Indonesia","Indonesian","Asia"],ru:["Индонезия","индонезийский","Азия"]},"🇸🇬":{en:["Singapore","Singaporean","Asia"],ru:["Сингапур","сингапурский","Азия"]},"🇮🇱":{en:["Israel","Israeli","Middle East"],ru:["Израиль","израильский","Ближний Восток"]},"🇵🇹":{en:["Portugal","Portuguese","Europe"],ru:["Португалия","португальский","Европа"]},"🇵🇱":{en:["Poland","Polish","Europe"],ru:["Польша","польский","Европа"]},"🇹🇭":{en:["Thailand","Thai","Asia"],ru:["Таиланд","тайский","Азия"]}};(()=>{let e=!1;return function(){e||(document.addEventListener("keydown",(e=>{e.ctrlKey&&"Semicolon"===e.code&&(e.preventDefault(),document.querySelector(".emoji-panel")||new Ln({onEmojiSelect:e=>{const t=document.getElementById("message-input");t&&(t.value+=e,t.dispatchEvent(new Event("input",{bubbles:!0})),t.focus())}}).show())})),e=!0)}})()();class Ln{static instance=null;constructor(e={}){if(Ln.instance)return Ln.instance;Ln.instance=this,this.options={onEmojiSelect:e.onEmojiSelect||(()=>{}),container:e.container||document.getElementById("messages-panel")||document.body,position:e.position||"bottom",onDestroy:e.onDestroy,emojiButton:e.emojiButton},this.container=null,this.searchInput=null,this.emojiContainer=null,this.categoryNav=null,this.infoPanel=null,this.infoIcon=null,this.infoKeywords=null,this.languageSelect=null,this.categories={recent:{icon:"🕒"},smileys:{icon:"😊"},nature:{icon:"🦊"},food:{icon:"🍔"},activities:{icon:"⚽"},travel:{icon:"✈️"},objects:{icon:"💡"},symbols:{icon:"💕"},flags:{icon:"🎌"}},this.categoryLabels={en:{recent:"Recently Used",smileys:"Smileys & People",nature:"Animals & Nature",food:"Food & Drink",activities:"Activities",travel:"Travel & Places",objects:"Objects",symbols:"Symbols",flags:"Flags"},ru:{recent:"Недавно использованные",smileys:"Смайлы и люди",nature:"Животные и природа",food:"Еда и напитки",activities:"Активности",travel:"Путешествия и места",objects:"Объекты",symbols:"Символы",flags:"Флаги"}},this.uiLabels={en:{searchResults:"Search Results"},ru:{searchResults:"Результаты поиска"}},this.emojiData=Sn,this.emojiKeywords=Cn,this.recentEmojis=this.loadRecentEmojis(),this.batchSize=50,this.loadedIndices={},this.categorySections={},this.currentLanguage=localStorage.getItem("emojiPanelLanguage")||"en"}init(){return this.createPanel(),this.bindEvents(),this.loadAllEmojis(),this}createPanel(){if(document.querySelector(".emoji-panel"))return;this.container=document.createElement("div"),this.container.className="emoji-panel";const e=document.createElement("div");e.className="emoji-search-container",this.searchInput=document.createElement("input"),this.searchInput.type="search",this.searchInput.className="emoji-search",e.appendChild(this.searchInput),this.categoryNav=document.createElement("div"),this.categoryNav.className="emoji-categories",Object.entries(this.categories).forEach((([e,t])=>{const n=document.createElement("button");n.className="emoji-category-btn",n.dataset.category=e,n.innerHTML=t.icon,n.title=this.getLocalizedCategoryName(e),this.categoryNav.appendChild(n)})),this.emojiContainer=document.createElement("div"),this.emojiContainer.className="emoji-container",this.infoPanel=document.createElement("div"),this.infoPanel.className="emoji-info-panel",this.infoIcon=document.createElement("span"),this.infoIcon.className="emoji-info-icon",this.infoKeywords=document.createElement("span"),this.infoKeywords.className="emoji-info-keywords",this.infoPanel.appendChild(this.infoIcon),this.infoPanel.appendChild(this.infoKeywords),this.languageSelect=document.createElement("select"),this.languageSelect.className="emoji-language-select",this.languageSelect.innerHTML='\n      <option value="en">EN</option>\n      <option value="ru">RU</option>\n    ',this.languageSelect.value=this.currentLanguage;const t=document.createElement("div");t.className="emoji-footer",t.appendChild(this.infoPanel),t.appendChild(this.languageSelect),this.container.appendChild(e),this.container.appendChild(this.categoryNav),this.container.appendChild(this.emojiContainer),this.container.appendChild(t),this.options.container.appendChild(this.container),ft(this.container,"show","1"),Lt()||this.searchInput.focus()}loadAllEmojis(){this.emojiContainer&&(this.emojiContainer.innerHTML="",this.loadedIndices={},this.categorySections={},Object.keys(this.categories).forEach((e=>{const t=document.createElement("div");t.className="emoji-category-section",t.id=`emoji-section-${e}`;const n=document.createElement("div");n.className="emoji-category-header",n.textContent=this.getLocalizedCategoryName(e),t.appendChild(n);const r=document.createElement("div");r.className="emoji-list",t.appendChild(r),this.emojiContainer.appendChild(t),this.loadedIndices[e]=0,this.categorySections[e]={section:t,emojiList:r,header:n},this.loadMoreEmojisForCategory(e)})))}loadMoreEmojisForCategory(e){const t="recent"===e?this.recentEmojis:this.emojiData[e]||[],n=this.loadedIndices[e],r=t.slice(n,n+this.batchSize);if(!r.length)return;const o=this.categorySections[e].emojiList;r.forEach((t=>{const n=document.createElement("button");n.className="emoji-btn",n.textContent=t,n.addEventListener("mouseenter",(()=>this.updateInfoPanel(t))),n.addEventListener("mouseleave",(()=>this.clearInfoPanel())),n.addEventListener("click",(n=>{n.stopPropagation(),n.shiftKey&&"recent"===e?(n.preventDefault(),this.removeFromRecent(t)):(this.addToRecent(t),this.options.onEmojiSelect(t),n.ctrlKey?this.searchInput.focus():this.destroy())})),o.appendChild(n)})),this.loadedIndices[e]+=r.length}searchEmojis(e){if(!this.emojiContainer)return;this.emojiContainer.innerHTML="";const t=document.createElement("div");t.className="emoji-category-section";const n=document.createElement("div");n.className="emoji-category-header",n.textContent=this.uiLabels[this.currentLanguage].searchResults,t.appendChild(n);const r=document.createElement("div");r.className="emoji-list",t.appendChild(r);const o=[];Object.keys(this.emojiData).forEach((t=>{(this.emojiData[t]||[]).forEach((t=>{const n=this.emojiKeywords[t]||{},r=Object.values(n).flat();(t.includes(e)||r.some((t=>t.toLowerCase().includes(e))))&&o.push(t)}))})),o.forEach((e=>{const t=document.createElement("button");t.className="emoji-btn",t.textContent=e,t.addEventListener("mouseenter",(()=>this.updateInfoPanel(e))),t.addEventListener("mouseleave",(()=>this.clearInfoPanel())),t.addEventListener("click",(t=>{t.stopPropagation(),this.addToRecent(e),this.options.onEmojiSelect(e),t.ctrlKey?this.searchInput.focus():this.destroy()})),r.appendChild(t)})),this.emojiContainer.appendChild(t)}bindEvents(){this._documentClickHandler=e=>{this.container.contains(e.target)||this.destroy()},document.addEventListener("click",this._documentClickHandler),this._emojiKeydownHandler=e=>{"Escape"===e.key&&this.destroy()},document.addEventListener("keydown",this._emojiKeydownHandler),this._qKeydownHandler=e=>{if("KeyQ"===e.code)if(document.activeElement===this.searchInput){const t=Date.now();this._lastQPressTime&&t-this._lastQPressTime<500?(e.preventDefault(),this.destroy(),this._lastQPressTime=0):this._lastQPressTime=t}else e.preventDefault(),this.destroy()},document.addEventListener("keydown",this._qKeydownHandler),this.searchInput.addEventListener("input",(e=>{const t=e.target.value.trim().toLowerCase();t?(this.searchEmojis(t),this.emojiContainer.classList.add("search-active")):(this.loadAllEmojis(),this.emojiContainer.classList.remove("search-active"))})),this.searchInput.addEventListener("keydown",(e=>{if("Enter"===e.key){if(e.preventDefault(),!this.searchInput||!this.emojiContainer)return;if(this.emojiContainer.classList.contains("search-active")){const t=this.emojiContainer?.querySelector(".emoji-btn");if(t){const n=new MouseEvent("click",{bubbles:!0,cancelable:!0,ctrlKey:e.ctrlKey});t.dispatchEvent(n),this.emojiContainer&&(this.emojiContainer.classList.remove("search-active"),this.loadAllEmojis()),this.searchInput&&(this.searchInput.value=""),e.ctrlKey?this.searchInput&&this.searchInput.focus():this.destroy()}}}})),this.categoryNav.addEventListener("click",(e=>{const t=e.target.closest(".emoji-category-btn");if(t){const n=t.dataset.category,r=document.getElementById(`emoji-section-${n}`);r&&this.emojiContainer&&(this.emojiContainer.style.scrollBehavior="smooth",this.emojiContainer.scrollTop=r.offsetTop-this.emojiContainer.offsetTop,e.preventDefault(),e.stopPropagation())}})),this.emojiContainer.addEventListener("scroll",(()=>this.handleScroll())),this.languageSelect.addEventListener("change",(e=>{this.currentLanguage=e.target.value,localStorage.setItem("emojiPanelLanguage",this.currentLanguage);const t=this.infoIcon.textContent;t&&this.updateInfoPanel(t),this.updateCategoryLabels(),this.searchInput.value.trim()&&this.searchEmojis(this.searchInput.value.trim().toLowerCase())})),this.container.addEventListener("click",(e=>{e.stopPropagation()}))}handleScroll(){Object.keys(this.categorySections).forEach((e=>{const{section:t}=this.categorySections[e],n=t.getBoundingClientRect(),r=this.emojiContainer.getBoundingClientRect();n.bottom<r.bottom+100&&this.loadMoreEmojisForCategory(e)}));let e=null,t=1/0;Object.keys(this.categorySections).forEach((n=>{const r=this.categorySections[n].header.getBoundingClientRect(),o=this.emojiContainer.getBoundingClientRect(),a=Math.abs(r.top-o.top);r.top<=o.top+10&&a<t&&(t=a,e=n)})),e&&this.highlightCategory(e)}updateCategoryLabels(){Object.keys(this.categories).forEach((e=>{const t=this.getLocalizedCategoryName(e),n=this.categoryNav.querySelector(`[data-category="${e}"]`);n&&(n.title=t),this.categorySections[e]&&this.categorySections[e].header&&(this.categorySections[e].header.textContent=t)}))}updateInfoPanel(e){if(!this.infoIcon||!this.infoKeywords)return;this.infoIcon.textContent=e;const t=(this.emojiKeywords[e]||{})[this.currentLanguage]||[];this.infoKeywords.textContent=t.join(", ")}clearInfoPanel(){this.infoIcon&&this.infoKeywords&&(this.infoIcon.textContent="",this.infoKeywords.textContent="")}addToRecent(e){if(this.recentEmojis=[e,...this.recentEmojis.filter((t=>t!==e))].slice(0,25),this.saveRecentEmojis(),this.categorySections.recent){this.categorySections.recent.emojiList.innerHTML="",this.loadedIndices.recent=0,this.loadMoreEmojisForCategory("recent")}}removeFromRecent(e){if(this.recentEmojis=this.recentEmojis.filter((t=>t!==e)),this.saveRecentEmojis(),this.categorySections.recent){this.categorySections.recent.emojiList.innerHTML="",this.loadedIndices.recent=0,this.loadMoreEmojisForCategory("recent")}}loadRecentEmojis(){try{return JSON.parse(localStorage.getItem("recentEmojis"))||[]}catch{return[]}}saveRecentEmojis(){try{localStorage.setItem("recentEmojis",JSON.stringify(this.recentEmojis))}catch(e){At({en:"Failed to save recent emojis:",ru:"Не удалось сохранить последние эмодзи:"},e.message)}}highlightCategory(e){this.categoryNav.querySelectorAll(".emoji-category-btn").forEach((t=>{t.classList.toggle("active",t.dataset.category===e)}))}show(){this.createPanel(),this.bindEvents(),this.loadAllEmojis()}destroy(){document.removeEventListener("keydown",this._emojiKeydownHandler),document.removeEventListener("keydown",this._qKeydownHandler),document.removeEventListener("click",this._documentClickHandler),this.container&&ft(this.container,"hide","0"),this.container=null,this.searchInput=null,this.emojiContainer=null,this.categoryNav=null,this.infoPanel=null,this.infoIcon=null,this.infoKeywords=null,this.languageSelect=null,Ln.instance=null,this.options.emojiButton&&(this.options.emojiButton.title="Open emoji picker"),"function"==typeof this.options.onDestroy&&this.options.onDestroy()}toggle(){document.querySelector(".emoji-panel")?this.destroy():this.show()}getLocalizedCategoryName(e){return this.categoryLabels[this.currentLanguage][e]||e}}const jn={background:{"photoshop-light":"#f0f0f0","photoshop-gray":"#b8b8b8","gruvbox-hard-light":"#f9f5d7","gruvbox-medium-light":"#fbf1c7","gruvbox-soft-light":"#eddbb2","dracula-light":"#ffffff","material-light":"#fafafa","github-light":"#ffffff","solarized-light":"#fdf6e3","one-light":"#fafafa","nord-light":"#e5e9f0","monokai-pro-light":"#f8f8f2","ayu-light":"#fcfcfc","paper-light":"#eeeeee","dollar-light":"#e4e4d5",ysgrifennwr:"#f9f8f4"},foreground:{"photoshop-light":"#f0f0f0","photoshop-gray":"#a3a3a3","gruvbox-hard-light":"#ebdbb2","gruvbox-medium-light":"#d5c4a1","gruvbox-soft-light":"#d5c4a1","dracula-light":"#e9e9f4","material-light":"#d9d9d9","github-light":"#f6f8fa","solarized-light":"#eee8d5","one-light":"#f0f0f0","nord-light":"#eceff4","monokai-pro-light":"#e8e5de","ayu-light":"#e6eaed","paper-light":"#cccccc","dollar-light":"#d0d1bd",ysgrifennwr:"#edece8"},highlight:{"photoshop-light":"#dbdbdb","photoshop-gray":"#a3a3a3","gruvbox-hard-light":"#ebdbb2","gruvbox-medium-light":"#e0d2ac","gruvbox-soft-light":"#d5c4a1","dracula-light":"#e9e9f4","material-light":"#e6e6e6","github-light":"#ebf0f4","solarized-light":"#eee8d5","one-light":"#eaeaea","nord-light":"#d2d9e5","monokai-pro-light":"#e8e5de","ayu-light":"#e6eaed","paper-light":"#d9d9d9","dollar-light":"#d0d1bd",ysgrifennwr:"#edece8"},firstAccent:{"photoshop-light":"#30ac44","photoshop-gray":"#1b6427","gruvbox-hard-light":"#838216","gruvbox-medium-light":"#838216","gruvbox-soft-light":"#6d6c12","dracula-light":"#05ae30","material-light":"#43a047","github-light":"#2ea44f","solarized-light":"#859900","one-light":"#50a14f","nord-light":"#7da35c","monokai-pro-light":"#80b319","ayu-light":"#25c097","paper-light":"#12a036","dollar-light":"#12a036",ysgrifennwr:"#8f9550"},secondAccent:{"photoshop-light":"#d23e32","photoshop-gray":"#922920","gruvbox-hard-light":"#cc241d","gruvbox-medium-light":"#cc241d","gruvbox-soft-light":"#b32019","dracula-light":"#f33f33","material-light":"#e53935","github-light":"#d73a49","solarized-light":"#dc322f","one-light":"#e45649","nord-light":"#bf616a","monokai-pro-light":"#f8075e","ayu-light":"#cf4b4d","paper-light":"#d2181a","dollar-light":"#d2181a",ysgrifennwr:"#e05281"},thirdAccent:{"photoshop-light":"#1473e6","photoshop-gray":"#0c468d","gruvbox-hard-light":"#b57614","gruvbox-medium-light":"#b57614","gruvbox-soft-light":"#a16912","dracula-light":"#6272a4","material-light":"#3c96ef","github-light":"#0969da","solarized-light":"#268bd2","one-light":"#0184bc","nord-light":"#5e81ac","monokai-pro-light":"#139eb9","ayu-light":"#32a7e9","paper-light":"#1285a0","dollar-light":"#8a9a6b",ysgrifennwr:"#c38647"},fourthAccent:{"photoshop-light":"#1a66e1","photoshop-gray":"#0075ff","gruvbox-hard-light":"#076678","gruvbox-medium-light":"#076678","gruvbox-soft-light":"#076678","dracula-light":"#8d602d","material-light":"#234f5d","github-light":"#2f4c77","solarized-light":"#2aa198","one-light":"#50a14f","nord-light":"#bf616a","monokai-pro-light":"#709d16","ayu-light":"#fa8834","paper-light":"#2e5d9a","dollar-light":"#5f6a48",ysgrifennwr:"#67c6d0"}},$n={"--background-color":jn.background,"--foreground-color":jn.foreground,"--highlight-color":jn.highlight,"--main-text-color":{"photoshop-light":"#6c6c6c","photoshop-gray":"#535353","gruvbox-hard-light":"#282828","gruvbox-medium-light":"#282828","gruvbox-soft-light":"#282828","dracula-light":"#665e92","material-light":"#212121","github-light":"#2c3136","solarized-light":"#657b83","one-light":"#383a42","nord-light":"#2e3440","monokai-pro-light":"#272822","ayu-light":"#5c6167","paper-light":"#444444","dollar-light":"#555a56",ysgrifennwr:"#424348"},"--drag-area-background-color":{"photoshop-light":"#f0f0f0","photoshop-gray":"#b8b8b8","gruvbox-hard-light":"#f9f5d7","gruvbox-medium-light":"#fbf1c7","gruvbox-soft-light":"#eddbb2","dracula-light":"#e9e9f4","material-light":"#eeeeee","github-light":"#f6f8fa","solarized-light":"#eee8d5","one-light":"#eaeaea","nord-light":"#eceff4","monokai-pro-light":"#f5f4f1","ayu-light":"#f8f9fa","paper-light":"#eeeeee","dollar-light":"#e4e4d5",ysgrifennwr:"#edece8"},"--border-color":{"photoshop-light":"#d1d1d1","photoshop-gray":"#9c9c9c","gruvbox-hard-light":"#ebdbb2","gruvbox-medium-light":"#ebdbb2","gruvbox-soft-light":"#d5c4a1","dracula-light":"#d6d6e7","material-light":"#e0e0e0","github-light":"#e1e4e8","solarized-light":"#eee8d5","one-light":"#e5e5e6","nord-light":"#d8dee9","monokai-pro-light":"#e0e0e0","ayu-light":"#eaecef","paper-light":"#d9d9d9","dollar-light":"#d0d1bd",ysgrifennwr:"#edece8"},"--username-filter":{"photoshop-light":"brightness(0.7)","photoshop-gray":"brightness(0.55)","gruvbox-hard-light":"brightness(0.7)","gruvbox-medium-light":"brightness(0.6)","gruvbox-soft-light":"brightness(0.65)","dracula-light":"brightness(0.8)","material-light":"brightness(0.8)","github-light":"brightness(0.8)","solarized-light":"brightness(0.7)","one-light":"brightness(0.8)","nord-light":"brightness(0.7)","monokai-pro-light":"brightness(0.8)","ayu-light":"brightness(0.8)","paper-light":"brightness(0.7)","dollar-light":"brightness(0.6)",ysgrifennwr:"brightness(0.8)"},"--mention-color":{"photoshop-light":"#1473e6","photoshop-gray":"#0c468d","gruvbox-hard-light":"#b57614","gruvbox-medium-light":"#a16912","gruvbox-soft-light":"#734b0d","dracula-light":"#6272a4","material-light":"#1380ec","github-light":"#0969da","solarized-light":"#2466a8","one-light":"#0184bc","nord-light":"#3e5974","monokai-pro-light":"#0f758a","ayu-light":"#1481b8","paper-light":"#1285a0","dollar-light":"#5f6b47",ysgrifennwr:"#c38647"},"--third-accent-color":jn.thirdAccent,"--first-accent-color":jn.firstAccent,"--second-accent-color":jn.secondAccent,"--fourth-accent-color":jn.fourthAccent,"--hotkey-label-text-color":jn.fourthAccent,"--hotkey-label-background-color":Object.fromEntries(Object.entries(jn.fourthAccent).map((([e,t])=>[e,t+"1a"]))),"--hotkey-label-border-color":Object.fromEntries(Object.entries(jn.fourthAccent).map((([e,t])=>[e,t+"66"]))),"--private-mode-color":jn.secondAccent,"--private-mode-placeholder-color":Object.fromEntries(Object.entries(jn.secondAccent).map((([e,t])=>[e,t+"cc"]))),"--private-mode-background-color":Object.fromEntries(Object.entries(jn.secondAccent).map((([e,t])=>[e,t+"40"]))),"--private-message-sent-color":jn.firstAccent,"--private-message-sent-background-color":Object.fromEntries(Object.entries(jn.firstAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-sent-border-color":Object.fromEntries(Object.entries(jn.firstAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-sent-time-color":jn.firstAccent,"--private-message-received-color":jn.secondAccent,"--private-message-received-background-color":Object.fromEntries(Object.entries(jn.secondAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-received-border-color":Object.fromEntries(Object.entries(jn.secondAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-received-time-color":jn.secondAccent,"--system-message-color":jn.thirdAccent,"--system-message-background-color":Object.fromEntries(Object.entries(jn.thirdAccent).map((([e,t])=>[e,t+"20"]))),"--system-message-border-color":Object.fromEntries(Object.entries(jn.thirdAccent).map((([e,t])=>[e,t+"30"]))),"--system-message-time-color":jn.thirdAccent,"--ban-message-color":jn.fourthAccent,"--ban-message-background-color":Object.fromEntries(Object.entries(jn.fourthAccent).map((([e,t])=>[e,t+"20"]))),"--ban-message-border-color":Object.fromEntries(Object.entries(jn.fourthAccent).map((([e,t])=>[e,t+"30"]))),"--ban-message-time-color":jn.fourthAccent},An={background:{"photoshop-black":"#323232","photoshop-dark":"#454545","gruvbox-hard-dark":"#1d2021","gruvbox-medium-dark":"#282828","gruvbox-soft-dark":"#32302f","one-dark":"#282c34","one-dark-pro":"#282c34","dracula-dark":"#292a35","palenight-dark":"#292d3f","one-monokai-dark":"#282c34","one-monokai-darker":"#1e1e1e","polykai-dark":"#141818","material-dark":"#121212","turbo-dark":"#000000","github-dark":"#222830","solarized-dark":"#052b35","nord-polar-night":"#2e3440","nord-snow-storm":"#202325","monokai-pro-dark":"#181b1c","ayu-dark":"#0a0e14","ayu-mirage":"#1f2430","telegram-dark":"#17212b","dark-soul":"#1e1e1e","matrix-dark":"#191a19"},foreground:{"photoshop-black":"#323232","photoshop-dark":"#454545","gruvbox-hard-dark":"#282828","gruvbox-medium-dark":"#3c3836","gruvbox-soft-dark":"#3c3836","one-dark":"#21252b","one-dark-pro":"#21252b","dracula-dark":"#454759","palenight-dark":"#31364b","one-monokai-dark":"#21252b","one-monokai-darker":"#222222","polykai-dark":"#1e2424","material-dark":"#1e1e1e","turbo-dark":"#1a1a1a","github-dark":"#161b23","solarized-dark":"#0e3641","nord-polar-night":"#3b4252","nord-snow-storm":"#292d2e","monokai-pro-dark":"#232829","ayu-dark":"#191c25","ayu-mirage":"#292f3d","telegram-dark":"#1f2936","dark-soul":"#2a2a2a","matrix-dark":"#13221b"},highlight:{"photoshop-black":"#292929","photoshop-dark":"#383838","gruvbox-hard-dark":"#282828","gruvbox-medium-dark":"#3c3836","gruvbox-soft-dark":"#3c3836","one-dark":"#21252b","one-dark-pro":"#21252b","dracula-dark":"#44475a","palenight-dark":"#31364b","one-monokai-dark":"#21252b","one-monokai-darker":"#222222","polykai-dark":"#1e2424","material-dark":"#1e1e1e","turbo-dark":"#0f0f0f","github-dark":"#2c3644","solarized-dark":"#0e3641","nord-polar-night":"#3b4252","nord-snow-storm":"#292d2e","monokai-pro-dark":"#232829","ayu-dark":"#191c25","ayu-mirage":"#292f3d","telegram-dark":"#1f2936","dark-soul":"#2a2a2a","matrix-dark":"#1c221c"},firstAccent:{"photoshop-black":"#32c649","photoshop-dark":"#4be83e","gruvbox-hard-dark":"#b8bb26","gruvbox-medium-dark":"#b8bb26","gruvbox-soft-dark":"#b8bb26","one-dark":"#98c379","one-dark-pro":"#97c27e","dracula-dark":"#59f880","palenight-dark":"#c2e791","one-monokai-dark":"#a6e22e","one-monokai-darker":"#34c848","polykai-dark":"#a0ff20","material-dark":"#30d9c5","turbo-dark":"#1c9740","github-dark":"#56c882","solarized-dark":"#84981c","nord-polar-night":"#a3be8c","nord-snow-storm":"#a3be8c","monokai-pro-dark":"#a9db7b","ayu-dark":"#32C647","ayu-mirage":"#32C647","telegram-dark":"#85d610","dark-soul":"#82b32a","matrix-dark":"#659a4b"},secondAccent:{"photoshop-black":"#ff5f52","photoshop-dark":"#ff5d73","gruvbox-hard-dark":"#fb4934","gruvbox-medium-dark":"#fb4934","gruvbox-soft-dark":"#fb4934","one-dark":"#e06c75","one-dark-pro":"#de6d79","dracula-dark":"#e65e60","palenight-dark":"#fa5d77","one-monokai-dark":"#f9397e","one-monokai-darker":"#fa655e","polykai-dark":"#ff0060","material-dark":"#d9306f","turbo-dark":"#db3d3d","github-dark":"#c85666","solarized-dark":"#d83938","nord-polar-night":"#cc8087","nord-snow-storm":"#cc8087","monokai-pro-dark":"#fb6287","ayu-dark":"#fa625d","ayu-mirage":"#fa625d","telegram-dark":"#f1417b","dark-soul":"#d8775a","matrix-dark":"#bc7676"},thirdAccent:{"photoshop-black":"#72acf3","photoshop-dark":"#8abaf5","gruvbox-hard-dark":"#fabd2f","gruvbox-medium-dark":"#fabd2f","gruvbox-soft-dark":"#fabd2f","one-dark":"#c67bdb","one-dark-pro":"#c67bdb","dracula-dark":"#92e8fb","palenight-dark":"#c792ea","one-monokai-dark":"#66d9ef","one-monokai-darker":"#8cbeec","polykai-dark":"#40c4ff","material-dark":"#bd89f9","turbo-dark":"#b9a222","github-dark":"#d2d7e0","solarized-dark":"#3a8bcf","nord-polar-night":"#b6d8e2","nord-snow-storm":"#88c0d0","monokai-pro-dark":"#f89769","ayu-dark":"#ddae51","ayu-mirage":"#ffcc66","telegram-dark":"#4082bc","dark-soul":"#d07e36","matrix-dark":"#b5b344"},fourthAccent:{"photoshop-black":"#2797ff","photoshop-dark":"#45a6ff","gruvbox-hard-dark":"#83a598","gruvbox-medium-dark":"#83a598","gruvbox-soft-dark":"#83a598","one-dark":"#98c379","one-dark-pro":"#6dafed","dracula-dark":"#92e8fb","palenight-dark":"#89ddff","one-monokai-dark":"#66d9ef","one-monokai-darker":"#8cbeec","polykai-dark":"#ff9020","material-dark":"#4b9ff1","turbo-dark":"#20a4cc","github-dark":"#4b8cd8","solarized-dark":"#2aa198","nord-polar-night":"#c4a47c","nord-snow-storm":"#c4a47c","monokai-pro-dark":"#7ddae5","ayu-dark":"#36c692","ayu-mirage":"#36c692","telegram-dark":"#5eb3f3","dark-soul":"#58c195","matrix-dark":"#48c89e"}},Mn={"--background-color":An.background,"--foreground-color":An.foreground,"--highlight-color":An.highlight,"--main-text-color":{"photoshop-black":"#cccccc","photoshop-dark":"#d4d4d4","gruvbox-hard-dark":"#ebdbb2","gruvbox-medium-dark":"#ebdbb2","gruvbox-soft-dark":"#ebdbb2","one-dark":"#abb2bf","one-dark-pro":"#abb2bf","dracula-dark":"#f8f8f2","palenight-dark":"#bdc6d5","one-monokai-dark":"#b2bbbb","one-monokai-darker":"#aaaaaa","polykai-dark":"#cecece","material-dark":"#c6c6c6","turbo-dark":"#959595","github-dark":"#d1d7e0","solarized-dark":"#849496","nord-polar-night":"#b5bcca","nord-snow-storm":"#adb4b8","monokai-pro-dark":"#9c988d","ayu-dark":"#a3afc2","ayu-mirage":"#b1b9cd","telegram-dark":"#c8c8c8","dark-soul":"#cdb398","matrix-dark":"#7bc66b"},"--drag-area-background-color":{"photoshop-black":"#323232","photoshop-dark":"#454545","gruvbox-hard-dark":"#1d2021","gruvbox-medium-dark":"#282828","gruvbox-soft-dark":"#32302f","one-dark":"#21252b","one-dark-pro":"#21252b","dracula-dark":"#44475a","palenight-dark":"#31364b","one-monokai-dark":"#21252b","one-monokai-darker":"#1e1e1e","polykai-dark":"#1e2424","material-dark":"#000000","turbo-dark":"#000000","github-dark":"#161b23","solarized-dark":"#0e3641","nord-polar-night":"#3b4252","nord-snow-storm":"#292d2e","monokai-pro-dark":"#232829","ayu-dark":"#0a0e14","ayu-mirage":"#292f3d","telegram-dark":"#1f2936","dark-soul":"#171717","matrix-dark":"#191a19"},"--border-color":{"photoshop-black":"#262626","photoshop-dark":"#383838","gruvbox-hard-dark":"#32302f","gruvbox-medium-dark":"#3c3836","gruvbox-soft-dark":"#504945","one-dark":"#181a1f","one-dark-pro":"#404349","dracula-dark":"#434456","palenight-dark":"#444267","one-monokai-dark":"#35383f","one-monokai-darker":"#2d2d2d","polykai-dark":"#242424","material-dark":"#222222","turbo-dark":"#0d0d0d","github-dark":"#3d444d","solarized-dark":"#0e3641","nord-polar-night":"#3b4252","nord-snow-storm":"#292d2e","monokai-pro-dark":"#262a2c","ayu-dark":"#202734","ayu-mirage":"#2e3547","telegram-dark":"#101921","dark-soul":"#333333","matrix-dark":"#122c16"},"--username-filter":{"photoshop-black":"brightness(1)","photoshop-dark":"brightness(1.3)","gruvbox-hard-dark":"brightness(1)","gruvbox-medium-dark":"brightness(1)","gruvbox-soft-dark":"brightness(1)","one-dark":"brightness(1)","one-dark-pro":"brightness(1)","dracula-dark":"brightness(1)","palenight-dark":"brightness(1)","one-monokai-dark":"brightness(1)","one-monokai-darker":"brightness(1)","polykai-dark":"brightness(0.9)","material-dark":"brightness(0.8)","turbo-dark":"brightness(0.8)","github-dark":"brightness(1)","solarized-dark":"brightness(0.9)","nord-polar-night":"brightness(1)","nord-snow-storm":"brightness(1)","monokai-pro-dark":"brightness(1)","ayu-dark":"brightness(0.8)","ayu-mirage":"brightness(1)","telegram-dark":"brightness(1)","dark-soul":"brightness(1)","matrix-dark":"brightness(1)"},"--mention-color":{"photoshop-black":"#b8d3f9","photoshop-dark":"#b8d3f9","gruvbox-hard-dark":"#fbc251","gruvbox-medium-dark":"#fbc251","gruvbox-soft-dark":"#fbc251","one-dark":"#c67bdb","one-dark-pro":"#dbadeb","dracula-dark":"#92e8fb","palenight-dark":"#d9bef4","one-monokai-dark":"#8ce1f2","one-monokai-darker":"#a8ccf0","polykai-dark":"#40c4ff","material-dark":"#c5a1f7","turbo-dark":"#b9a222","github-dark":"#79cfec","solarized-dark":"#85b3e0","nord-polar-night":"#b6d8e2","nord-snow-storm":"#a3c9dc","monokai-pro-dark":"#f89769","ayu-dark":"#ddae51","ayu-mirage":"#ffcc66","telegram-dark":"#9fbfdf","dark-soul":"#e6bf99","matrix-dark":"#cece7e"},"--first-accent-color":An.firstAccent,"--second-accent-color":An.secondAccent,"--third-accent-color":An.thirdAccent,"--fourth-accent-color":An.fourthAccent,"--hotkey-label-text-color":An.fourthAccent,"--hotkey-label-background-color":Object.fromEntries(Object.entries(An.fourthAccent).map((([e,t])=>[e,t+"1a"]))),"--hotkey-label-border-color":Object.fromEntries(Object.entries(An.fourthAccent).map((([e,t])=>[e,t+"66"]))),"--private-mode-color":An.secondAccent,"--private-mode-placeholder-color":Object.fromEntries(Object.entries(An.secondAccent).map((([e,t])=>[e,t+"cc"]))),"--private-mode-background-color":Object.fromEntries(Object.entries(An.secondAccent).map((([e,t])=>[e,t+"40"]))),"--private-message-sent-color":An.firstAccent,"--private-message-sent-background-color":Object.fromEntries(Object.entries(An.firstAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-sent-border-color":Object.fromEntries(Object.entries(An.firstAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-sent-time-color":An.firstAccent,"--private-message-received-color":An.secondAccent,"--private-message-received-background-color":Object.fromEntries(Object.entries(An.secondAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-received-border-color":Object.fromEntries(Object.entries(An.secondAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-received-time-color":An.secondAccent,"--system-message-color":An.thirdAccent,"--system-message-background-color":Object.fromEntries(Object.entries(An.thirdAccent).map((([e,t])=>[e,t+"20"]))),"--system-message-border-color":Object.fromEntries(Object.entries(An.thirdAccent).map((([e,t])=>[e,t+"30"]))),"--system-message-time-color":An.thirdAccent,"--ban-message-color":An.fourthAccent,"--ban-message-background-color":Object.fromEntries(Object.entries(An.fourthAccent).map((([e,t])=>[e,t+"20"]))),"--ban-message-border-color":Object.fromEntries(Object.entries(An.fourthAccent).map((([e,t])=>[e,t+"30"]))),"--ban-message-time-color":An.fourthAccent},In=(e,t,n={})=>{const r=document.createElement(e);return t&&(r.className=t),Object.entries(n).forEach((([e,t])=>{"text"===e?r.textContent=t:"html"===e?r.innerHTML=t:r.setAttribute(e,t)})),r};function Tn(e){const t=document.documentElement,n=function(e){const t={},n=$n["--background-color"][e]?$n:Mn;for(const[r,o]of Object.entries(n))o[e]&&(t[r]=o[e]);return t}(e);n&&Object.entries(n).forEach((([e,n])=>{t.style.setProperty(e,n)}))}Tn(localStorage.getItem("selectedTheme")||"dark-soul");const zn=()=>{const e=document.querySelector(".themes-panel");if(e)return e;const t=In("div","themes-panel",{html:"<h2>Themes</h2>"}),n=In("div","dark-themes"),r=In("div","light-themes");n.innerHTML=`<h3>Dark Themes <span class="counter">${Object.keys(Mn["--background-color"]).length}</span></h3>`,r.innerHTML=`<h3>Light Themes <span class="counter">${Object.keys($n["--background-color"]).length}</span></h3>`;let o=localStorage.getItem("selectedTheme")||"dark-soul";const a=jt((e=>Tn(e)),D),i=(e,t)=>{const n=In("button","theme-button",{text:e.replace(/-/g," ").replace(/\b\w/g,(e=>e.toUpperCase()))});return n.dataset.theme=t,n.addEventListener("mouseenter",(()=>{a(t)})),n.addEventListener("click",(()=>{o=t,localStorage.setItem("selectedTheme",t),s(),Tn(t)})),n};Object.keys(Mn["--background-color"]).forEach((e=>{n.appendChild(i(e,e))})),Object.keys($n["--background-color"]).forEach((e=>{r.appendChild(i(e,e))}));const s=()=>{const e=localStorage.getItem("selectedTheme")||"dark-soul";o=e;let n=null;t.querySelectorAll(".theme-button").forEach((t=>{const r=t.dataset.theme===e;t.classList.toggle("active-theme",r),r&&(n=t)})),n&&setTimeout((()=>{n.scrollIntoView({behavior:"smooth",block:"center"})}),100)};t.addEventListener("mouseleave",(()=>{a.cancel(),Tn(o)})),t.appendChild(n),t.appendChild(r),document.body.appendChild(t),ft(t,"show",1),s();const c=e=>{"Escape"===e.key&&(ft(t,"hide",0),document.removeEventListener("keydown",c),document.removeEventListener("click",l,!0))};document.addEventListener("keydown",c);const l=e=>{t.contains(e.target)||(ft(t,"hide",0),document.removeEventListener("click",l,!0),document.removeEventListener("keydown",c))};return document.addEventListener("click",l,!0),t},Nn="usernameColors",Pn=e=>{try{const t=e.getItem(Nn);return t?JSON.parse(t):{}}catch(t){return At({en:`Error parsing ${e===sessionStorage?"sessionStorage":"localStorage"} data: ${t.message}`,ru:`Ошибка разбора данных ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`},"error"),{}}},Bn=(e,t)=>{try{return e.setItem(Nn,JSON.stringify(t)),!0}catch(t){return At({en:`Error saving data to ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`,ru:`Ошибка сохранения данных в ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`},"error"),!1}},On=()=>Pn(sessionStorage),qn=(e,t)=>{const n=Pn(localStorage);return n[e]=t,Bn(localStorage,n)},_n=e=>{const t=Pn(localStorage);return e in t&&(delete t[e],Bn(localStorage,t))},Hn=e=>e in Pn(localStorage),Dn=(e,t,n)=>{const r=Pn(localStorage);return e in r&&(delete r[e],r[t]=n,Bn(localStorage,r))};function Rn(e,t,n={}){const r=document.createElement(e);return t&&(r.className=t),Object.entries(n).forEach((([e,t])=>{"text"===e?r.textContent=t:"html"===e?r.innerHTML=t:r.setAttribute(e,t)})),r}function Un(e,t){const n=Math.round(255*t).toString(16).padStart(2,"0");return 7===e.length?e+n:e.slice(0,7)+n}function Fn(e,t,n){e.style.color=n,Object.assign(t.style,{backgroundColor:Un(n,.4),color:n}),t.textContent=n}function Jn(){const e=document.querySelector(".chat-username-color-picker");if(e)return e;const t=On();let n=null,r=null,o=null;const a=Rn("div","chat-username-color-picker"),i=Rn("div","username-colors");a.appendChild(i);const s=Rn("h2",null,{text:"Username Colors"});i.appendChild(s);const c=Rn("button","close-btn");c.innerHTML=Xe,c.title="Close panel",c.addEventListener("click",(()=>{ft(a,"hide",0)})),a.appendChild(c);const l=Rn("div","generated-username-colors",{html:'<h3>Generated Colors <span class="counter">0</span></h3>'});function d(){if(!n){n=Rn("div","saved-username-colors",{html:'<h3>Saved Colors <span class="counter">0</span></h3>'});const e=a.querySelector("h2");e.nextSibling?a.insertBefore(n,e.nextSibling):i.appendChild(n)}}function m(){if(l){const e=l.querySelectorAll(".username-entry").length,t=l.querySelector("h3 .counter");t&&(t.textContent=e)}if(n){const e=n.querySelectorAll(".username-entry").length,t=n.querySelector("h3 .counter");t&&(t.textContent=e)}}function u(){l.querySelectorAll(".username-entry").forEach((e=>{const t=e.querySelector(".username").textContent;e.classList.toggle("disabled-entry",Hn(t))})),m()}function p(e,r,o=!1){const a=Rn("div","username-entry"),i=Rn("div","username",{text:e}),s=Rn("div","color-box",{title:"Change hex"});Fn(i,s,r);const c=Rn("input",null,{type:"color",value:r});if(a._colorInput=c,a._username=e,a._color=r,a.append(i,s,c),o){const t=x(a,e,r,(()=>{a.remove(),u(),n&&!n.querySelector(".username-entry")&&(n.remove(),n=null)})),o=h(a,e,r);a.appendChild(o),a._removeBtn=t,a._editBtn=o}const l=jt((()=>{const r=c.value;Fn(i,s,r),o?(qn(e,r),a._color=r,a._removeBtn&&a.contains(a._removeBtn)?Object.assign(a._removeBtn.style,{backgroundColor:Un(r,.4),color:r}):a._removeBtn=x(a,e,r,(()=>{a.remove(),u(),n&&!n.querySelector(".username-entry")&&(n.remove(),n=null)})),a._editBtn&&a.contains(a._editBtn)?Object.assign(a._editBtn.style,{backgroundColor:Un(r,.4),color:r}):a._editBtn=h(a,e,r)):(t[e]=r,Bn(sessionStorage,t),qn(e,r),d(),g(),u())}),1e3);return c.addEventListener("input",l),a}function h(e,t,n){const r=Rn("div","entry-btn edit-btn");return r.innerHTML=Je,r.title="Edit username",Object.assign(r.style,{backgroundColor:Un(n,.4),color:n}),r.addEventListener("click",(t=>{t.stopPropagation(),k(e,"username")})),e.appendChild(r),r}function g(){if(!n)return;const e=Pn(localStorage);n.innerHTML='<h3>Saved Colors <span class="counter">0</span></h3>',n.appendChild(function(){const e=Rn("div","username-entry"),t=Rn("div","entry-btn remove-all-btn");t.innerHTML=Xe,t.title="Remove all saved colors",t.addEventListener("click",(e=>{e.stopPropagation(),k({_confirmation:!1},"removeAll",(()=>{localStorage.removeItem(Nn);const e=document.querySelector(".chat-username-color-picker");e&&(e.remove(),Jn()),At({en:"All saved username colors have been removed",ru:"Все сохранённые цвета имён пользователей удалены"},"info")}))}));const n=Rn("div","entry-btn load-btn");n.innerHTML=Ge,n.title="Load colors from URL",n.addEventListener("click",(e=>{e.stopPropagation(),fetch(G).then((e=>{if(!e.ok)throw new Error(`Failed to load: ${e.statusText}`);return e.json()})).then((e=>{localStorage.setItem("usernameColors",JSON.stringify(e)),At({en:"Username colors loaded successfully",ru:"Цвета имён пользователей успешно загружены"},"success");const t=document.querySelector(".chat-username-color-picker");t&&(t.remove(),Jn())})).catch((e=>{At(`Error loading colors: ${e.message}`,"error")}))}));const r=Rn("div","entry-btn import-btn");r.innerHTML=Ye,r.title="Import colors",r.addEventListener("click",(e=>{e.stopPropagation(),Yn()}));const o=Rn("div","entry-btn export-btn");o.innerHTML=Ke,o.title="Export colors",o.addEventListener("click",(e=>{e.stopPropagation(),Xn()}));const a=Rn("div","entry-btn add-btn");return a.innerHTML=Fe,a.title="Add username",a.addEventListener("click",(e=>{e.stopPropagation(),k({_confirmation:!1,_add:!0},"username")})),e.append(t,n,r,o,a),e}()),Object.entries(e).forEach((([e,t])=>{const r=p(e,t,!0);n.appendChild(r)})),n.querySelector(".username-entry")||(n.remove(),n=null),m()}Object.entries(t).forEach((([e,t])=>{const n=p(e,t);l.appendChild(n)})),m(),d(),g(),u(),i.appendChild(l),document.body.appendChild(a),ft(a,"show",1);const f=e=>{"Escape"===e.key&&(ft(a,"hide",0),document.removeEventListener("keydown",f))};document.addEventListener("keydown",f);const b=e=>{a.contains(e.target)||(ft(a,"hide",0),document.removeEventListener("click",b,!0),document.removeEventListener("keydown",f))};function v(){clearTimeout(r),o&&(o._isLongPress=!1,o=null)}function y(e){e.classList.add("field-error"),setTimeout((()=>e.classList.remove("field-error")),500)}function k(e,t="color",n=null){const r=document.querySelector(".chat-username-color-picker"),o=r.querySelector(".confirmation");o&&o.remove(),e._confirmation=!0;const a=Rn("div","confirmation"),i=Rn("button","field-btn cancel-btn",{text:"Cancel"}),s=Rn("button","field-btn confirm-btn",{text:"Confirm"});let c=null;function l(){a.remove(),e._confirmation=!1}"color"===t||"username"===t?(c=Rn("input","input-field",{type:"search",placeholder:"color"===t?`H: ${e._username}`:`U: ${e._username||"username"}`}),a.append(i,c,s)):a.append(i,s),r.appendChild(a),c&&(c.focus(),c.addEventListener("keydown",(e=>{"Enter"===e.key&&(e.stopPropagation(),s.click())}))),s.addEventListener("click",(async r=>{if(r.stopPropagation(),"color"===t){const t=c.value.trim();if(!t)return At({en:"The field cannot be empty",ru:"Поле не может быть пустым"},"warning"),void y(c);if(!/^#[0-9A-Fa-f]{6}$/.test(t))return At({en:`Invalid hex "${t}"`,ru:`Некорректный hex "${t}"`},"error"),void y(c);e._colorInput.value=t.toLowerCase(),e._colorInput.dispatchEvent(new Event("input",{bubbles:!0}))}else if("username"===t){const t=c.value.trim();if(!t)return At({en:"The field cannot be empty",ru:"Поле не может быть пустым"},"warning"),void y(c);if(!await wt(t))return At({en:`Could not find user "${t}"`,ru:`Не удалось найти пользователя "${t}"`},"error"),void y(c);if(e._add){return qn(t,"#cdcdcd"),d(),g(),u(),void l()}t!==e._username&&(Dn(e._username,t,e._color),e.querySelector(".username").textContent=t,e._username=t,u())}else"remove"===t?(_n(e._username),e instanceof Element&&e.remove(),u()):"removeAll"===t&&"function"==typeof n&&n();l()})),i.addEventListener("click",(e=>{e.stopPropagation(),l()})),a.addEventListener("click",(e=>e.stopPropagation()))}function x(e,t,n,r){let o=e.querySelector(".remove-btn");return o&&e.removeChild(o),o=Rn("div","entry-btn remove-btn"),o.innerHTML=Xe,o.title="Remove entry",Object.assign(o.style,{backgroundColor:Un(n,.4),color:n}),o.addEventListener("click",(n=>{n.stopPropagation(),e._confirmation||k(e,"remove",(()=>{_n(t),e.remove(),"function"==typeof r&&r()}))})),e.appendChild(o),o}return document.addEventListener("click",b,!0),a.addEventListener("click",(e=>{const t=e.target.closest(".remove-btn");if(t){const e=t.closest(".username-entry");if(!e)return;const r=e.querySelector(".username").textContent;return _n(r),e.remove(),u(),void(n&&!n.querySelector(".username-entry")&&(n.remove(),n=null))}const r=e.target.closest(".color-box");if(r){const e=r.closest(".username-entry");if(!e||e.classList.contains("disabled-entry")||e._confirmation)return;e._colorInput&&e._colorInput.click()}})),a.addEventListener("pointerdown",(e=>{const t=e.target.closest(".color-box");if(!t)return;const n=t.closest(".username-entry");n&&!n.classList.contains("disabled-entry")&&(r=setTimeout((()=>{n._isLongPress=!0,k(n,"color")}),q),o=n)})),a.addEventListener("pointerup",v),a.addEventListener("pointerleave",v),a.addEventListener("pointercancel",v),a}function Xn(){const e=localStorage.getItem("usernameColors");if(!e)return void At({en:"No username colors found to export",ru:"Нет цветов имён пользователей для экспорта"},"warning");const t=JSON.stringify(JSON.parse(e),null,2),n=new Blob([t],{type:"application/json"}),r=URL.createObjectURL(n),o=document.createElement("a");o.href=r,o.download="usernameColors.json",o.click(),URL.revokeObjectURL(r),At({en:"Username colors exported as JSON file",ru:"Цвета имён пользователей экспортированы в JSON-файл"},"success")}function Yn(){const e=document.createElement("input");e.type="file",e.accept="application/json",e.style.display="none",document.body.appendChild(e),e.addEventListener("change",(e=>{const t=e.target.files[0];if(!t)return void At({en:"No file selected",ru:"Файл не выбран"},"warning");const n=new FileReader;n.onload=e=>{try{const t=JSON.parse(e.target.result);localStorage.setItem("usernameColors",JSON.stringify(t)),At({en:"Username colors imported successfully",ru:"Цвета имён пользователей успешно импортированы"},"info")}catch(e){At({en:"Invalid JSON file",ru:"Некорректный JSON-файл"},"error")}},n.readAsText(t)})),e.click(),document.body.removeChild(e)}function Kn(){const e=document.createElement("div");e.id="app-chat-container",["top","left","right"].forEach((t=>{const n=document.createElement("div");n.className=`resize-handle ${t}`,e.appendChild(n)}));const t=document.createElement("div");t.className="chat-wrapper";const n=document.createElement("div");n.className="chat-drag-area",n.addEventListener("dblclick",vn),t.appendChild(n);const r=document.createElement("div");r.className="chat-content";const o=document.createElement("div");o.id="messages-panel",o.className="messages-panel";const a=document.createElement("div");a.className="input-container";const i=document.createElement("button");i.className="emoji-trigger button",i.innerHTML=Ue,i.classList.add("emoji-button"),i.title="Open emoji picker";let s=null;i.addEventListener("click",(e=>{e.stopPropagation(),s&&document.querySelector(".emoji-panel")?s.destroy():(s=new Ln({container:o,position:"bottom",emojiButton:i,onEmojiSelect:e=>{const t=document.getElementById("message-input");if(t){const n=t.selectionStart,r=t.value.substring(0,n),o=t.value.substring(t.selectionEnd);t.value=r+e+o;const a=n+e.length;t.setSelectionRange(a,a),t.focus()}},onDestroy:()=>{i.title="Open emoji picker",s=null}}),s.init(),i.title="Close emoji picker")}));const c=document.createElement("input");c.type="text",c.id="message-input",c.maxLength=300,c.autocomplete="off";const l=document.createElement("button");l.id="send-button",l.className="button send-button",l.innerHTML=Ne,a.append(i,c,l),r.append(o,a);const d=document.createElement("div");d.className="user-list-container";const m=document.createElement("div");m.id="user-list",d.appendChild(m),t.append(r,d),e.appendChild(t);const u=document.createElement("div");u.className="header-buttons",n.appendChild(u);const p=document.createElement("button");p.className="button header-button chat-events-button",p.innerHTML=We,p.title="Show events",p.addEventListener("click",(()=>{lt()}));const h=document.createElement("button");h.className="button header-button chat-blocked-button",h.innerHTML=Re,h.title="Block user",h.addEventListener("click",(()=>{Bt()}));const g=document.createElement("button");g.className="button header-button chat-colors-button",g.innerHTML=De,g.title="Set username color",g.addEventListener("click",(()=>{Jn()}));const f=document.createElement("button");f.className="button header-button chat-theme-button",f.innerHTML=He,f.title="Change theme",f.addEventListener("click",(()=>{zn()}));const b=document.createElement("button");b.className="button header-button chat-help-button",b.innerHTML=_e,b.title="Show chat help";let v=null;b.addEventListener("click",(e=>{if(e.stopPropagation(),v&&document.querySelector(".help-panel"))return v.remove(),b.title="Show chat help",void(v=null);v=new En({helpButton:b,onDestroy:()=>{b.title="Show chat help",v=null}}),v.init(),v.show(),b.title="Hide chat help"}));const y=document.createElement("button");y.className="button header-button chat-maximize-button",y.addEventListener("click",yn);const k=document.createElement("button");k.className="button header-button chat-toggle-button",k.addEventListener("click",vn),u.append(p,h,g,f,b,y,k),document.body.appendChild(e),function(){let e=localStorage.getItem("selectedTheme");e||(e="dark-soul",localStorage.setItem("selectedTheme",e)),document.body.className=e}(),gn(),wn(),xn(),requestAnimationFrame((()=>{c&&(c.value=""),nn=o,rn=document.createElement("div"),rn.className="length-field-popup",nn.appendChild(rn),tn=c,tn?rn?(tn.addEventListener("input",mn),tn.addEventListener("keydown",un)):At({en:"Length popup: Popup element is not created, skipping event listeners.",ru:"Длинномер сообщения: Всплывающее окно не создано, обработчики событий не добавлены."},"warning"):At({en:"Length popup: Chat field is null during initialization.",ru:"Длинномер сообщения: Поле чата равно null при инициализации."},"error"),function(e,t,n,r,o){if(Lt()){const a=document.createElement("style");a.classList.add("global-mobile-styles"),a.textContent="\n      html, body {\n        overflow: hidden !important;\n        height: 0 !important;\n      }\n\n      #app-chat-container .emoji-panel {\n        transform: translate(-50%, 0%) !important;\n        height: 60vh !important;\n        top: 1em !important;\n        left: 50% !important;\n        right: unset !important;\n      }\n      .help-panel,\n      .ignored-users-panel,\n      .chat-username-color-picker {\n        top: 80px !important;\n        transform: translate(-50%, 0%) !important;\n      }\n      \n      .events-panel {\n        left: 5% !important;\n        transform: none !important;\n        top: 80px !important;\n        width: 90% !important;\n      }\n\n      #app-chat-container .user-list-container {\n        top: 50px !important;\n        height: fit-content !important;\n        max-height: 70vh !important;\n        border-top: 1px solid var(--border-color) !important;\n        border-bottom: 1px solid var(--border-color) !important;\n        border-radius: 0.5em 0 0 0.5em !important;\n      }\n\n      #app-chat-container .toggle-button {\n        border: none !important;\n        top: 0 !important;\n        right: 0 !important;\n        border-radius: 0.2em !important;\n        margin: 1em !important;\n        box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1) !important;\n      }\n    ",document.head.appendChild(a),window.visualViewport&&window.visualViewport.addEventListener("resize",(()=>{const a=window.innerHeight-window.visualViewport.height-window.visualViewport.offsetTop;e.style.setProperty("height",`calc(100% - ${a}px)`,"important");const i=e.getBoundingClientRect().height<100;n.style.display=i?"none":"",t.style.margin=i?"0":"",t.style.marginTop=i?"0":"",o.style.position=i?"absolute":"",o.style.bottom=i?"0":"",r.style.display=i?"none":"";const s=document.querySelector(".reveal-userlist-btn");s&&(s.style.display=i?"none":""),n.scrollTop=n.scrollHeight}))}}(e,r,o,n,a),it()}))}function Gn(){localStorage.removeItem("klavoauth"),localStorage.removeItem("chatUsernameColor"),setTimeout((()=>{window.location.href="https://klavogonki.ru/gamelist/"}),500)}const Wn={get username(){const e=localStorage.getItem("klavoauth");return e?JSON.parse(e).username:""},get password(){const e=localStorage.getItem("klavoauth");return e?JSON.parse(e).password:""}};function Vn(){const e="KG_Chat_App_Version",t="https://update.greasyfork.org/scripts/529368/KG_Chat_Application.meta.js?rand="+Date.now();localStorage.getItem(e)||localStorage.setItem(e,"0.0.0");const n=localStorage.getItem(e);fetch(t).then((e=>e.text())).then((t=>{const r=t.match(/@version\s+v?([\d.]+)/i);if(!r)throw new Error("Version not found in meta file");const o=r[1].trim();(function(e,t){const n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let e=0;e<o;e++){const t=n[e]||0,o=r[e]||0;if(t>o)return 1;if(t<o)return-1}return 0})(o,n)>0&&function(e,t,n,r){const o=document.createElement("div");o.className="update-overlay";const a=document.createElement("div");a.className="update-popup",a.innerHTML=`\n      <h2 class="update-header">Update Available</h2>\n      <h2 class="update-script">KG_Chat_Application</h2>\n      <p>A new version <span class="version">${e}</span> is available.</p>\n      <p>You are currently using version <span class="version">${t}</span>.</p>\n      <div class="button-container">\n        <button id="update-later" class="update-later">Later</button>\n        <button id="update-skip" class="update-skip">Skip</button>\n        <button id="update-now" class="update-now">Update Now</button>\n      </div>\n  `,document.body.append(o,a),document.getElementById("update-later").addEventListener("click",(()=>{o.remove(),a.remove()})),document.getElementById("update-skip").addEventListener("click",(()=>{r&&r(),o.remove(),a.remove()})),document.getElementById("update-now").addEventListener("click",(()=>{r&&r(),window.open(n,"_blank"),o.remove(),a.remove()}))}(o,n,"https://update.greasyfork.org/scripts/529368/KG_Chat_Application.user.js",(()=>{localStorage.setItem(e,o)}))})).catch((e=>console.error("Update check failed:",e)))}const Qn=[{name:"reset",pattern:/^\/reset\s*$/,handler:()=>(Gn(),localStorage.removeItem("userAvatarCache"),localStorage.removeItem("chatState"),localStorage.removeItem("chatEvents"),At({en:"Chat settings have been reset. Reloading...",ru:"Настройки чата сброшены. Перезагрузка..."},"info"),!0)},{name:"colors",pattern:/^\/colors\s*$/,handler:()=>(Jn(),!0)},{name:"export colors",pattern:/^\/export\s+colors\s*$/,handler:()=>(Xn(),!0)},{name:"import colors",pattern:/^\/import\s+colors\s*$/,handler:()=>(Yn(),!0)},{name:"themes",pattern:/^\/themes\s*$/,handler:()=>(zn(),!0)},{name:"help",pattern:/^\/help\s*$/,handler:()=>{if(En.instance)En.instance.remove();else{const e=new En({onDestroy:()=>{}});e.init(),e.show()}return!0}},{name:"ignored",pattern:/^\/ignored\s*$/,handler:()=>(Bt(),!0)},{name:"events",pattern:/^\/events\s*$/,handler:()=>(lt(),!0)}];function Zn(e){e&&e.addEventListener("input",(()=>{!function(e){if(!e)return!1;const t=e.value;for(const n of Qn)if(n.pattern.test(t)){const t=n.handler();return t&&(e.value=""),t}}(e)}))}let er,tr,nr,rr,or=!1;let ar,ir,sr,cr,lr,dr,mr=!1,ur=null,pr=0;function hr(e,t,n,r){const o=e=>e&&t.updatePresence(e),a=e=>e&&n.processMessages(e);let i=function(){const e=gt(r),t=`/storage/avatars/${r.split("#")[0]}.png`,n=Math.floor(Date.now()/1e3);return{cleanedUsername:e,chatUsernameColor:(e=>{console.info("Optimizing color for contrast:",e);let{h:t,s:n,l:r}=It.hexToHSL(e),o=e;for(;It.contrastRatio(o,"#FFFFFF")<4.5&&r>0;)o=It.hslToHex(t,n,--r);return o})(localStorage.getItem("chatUsernameColor"))||K,baseAvatarPath:t,timestamp:n}}();const s={userManager:t,messageManager:n,isHttpBindingActive:!1,isReconnecting:!1,isConnected:!1,messageQueue:new Map,lastSentMessage:null,isReloading:!1,shouldCheckConnection:!1,checkConnectionTimeoutId:null,clearCheckConnectionTimeout(){this.checkConnectionTimeoutId&&(clearTimeout(this.checkConnectionTimeoutId),this.checkConnectionTimeoutId=null)},_createMessageStanza(t,n,o,a){const s=i,c=`\n      <x xmlns='klavogonki:userdata'>\n        <user>\n          <login>${s.cleanedUsername}</login>\n          <avatar>${s.baseAvatarPath}?updated=${s.timestamp}</avatar>\n          <background>${s.chatUsernameColor}</background>\n        </user>\n      </x>\n      `,l=o&&a?a:"[email protected]",d=o?"chat":"groupchat";return Ct(`\n      <body rid='${e.nextRid()}' sid='${e.sid}' xmlns='http://jabber.org/protocol/httpbind'>\n        <message \n          from='${r}@jabber.klavogonki.ru/web' \n          to='${l}' \n          type='${d}' \n          id='${n}' \n          xmlns='jabber:client'>\n          <body>${t}</body>\n          ${c}\n        </message>\n      </body>\n      `)},async processQueue(){if(this.isConnected&&!this.isReconnecting)for(const[t,r]of this.messageQueue){const o=this._createMessageStanza(r.text,r.id,r.isPrivate,r.fullJid);try{await e.sendRequestWithRetry(o),this.messageQueue.delete(t),n.updatePendingStatus(r.id,!1),a(null)}catch(e){At({en:`Failed to send queued message (${r.id}): ${e.message}`,ru:`Не удалось отправить сообщение из очереди (${r.id}): ${e.message}`},"error");break}}},async connect(){try{this.stopHttpBinding();let t=5;for(;t>0&&!this.isConnected;)try{const t=await e.connect();console.log("💬 Step 8: Joining chat room...");const s=i,c=Ct(`\n            <body rid='${e.nextRid()}' xmlns='http://jabber.org/protocol/httpbind' sid='${t.sid}'>\n              <presence from='${r}@jabber.klavogonki.ru/web' to='[email protected]/${r}' xmlns='jabber:client'>\n                <x xmlns='http://jabber.org/protocol/muc'/>\n                <x xmlns='klavogonki:userdata'>\n                  <user>\n                    <login>${s.cleanedUsername}</login>\n                    <avatar>${s.baseAvatarPath}?updated=${s.timestamp}</avatar>\n                    <background>${s.chatUsernameColor}</background>\n                  </user>\n                </x>\n              </presence>\n            </body>\n            `),l=await e.sendRequestWithRetry(c);console.log("📥 Join response:",l),o(l),a(l);const d=Ct(`\n              <body \n                rid='${e.nextRid()}' \n                sid='${t.sid}' \n                xmlns='http://jabber.org/protocol/httpbind'>\n                <iq \n                  type='get' \n                  id='info_${Math.random().toString(36).substring(2,10)}' \n                  xmlns='jabber:client' \n                  to='[email protected]'>\n                  <query xmlns='http://jabber.org/protocol/disco#info'/>\n                </iq>\n              </body>\n            `);await e.sendRequestWithRetry(d),console.log("🚀 Step 10: Connected!"),this.isConnected=!0,this.shouldCheckConnection=!0,this.isReconnecting&&(At({en:"Chat connected successfully.",ru:"Чат успешно подключён."},"success"),n.refreshMessages(!0),this.isReconnecting=!1),this.startHttpBinding(),this.processQueue(),this.checkConnection();break}catch(e){At({en:`XMPP Client: Connection error: ${e.message}`,ru:`XMPP клиент: ошибка соединения: ${e.message}`},"error"),t--,0===t?(At({en:`Scheduling reconnection attempt in ${B/1e3} seconds...`,ru:`Переподключение через ${B/1e3} секунд...`},"warning"),this.isReconnecting=!0,setTimeout((()=>this.connect()),B)):(At({en:`Retrying connection... (${t} attempts left)`,ru:`Повторное подключение... (осталось попыток: ${t})`},"warning"),await new Promise((e=>setTimeout(e,B))))}}catch(e){At({en:`XMPP Client: Final connection error: ${e.message}`,ru:`XMPP клиент: окончательная ошибка соединения: ${e.message}`},"error"),this.isConnected=!1,this.isReconnecting||(At({en:`Scheduling reconnection attempt in ${B/1e3} seconds...`,ru:`Переподключение через ${B/1e3} секунд...`},"warning"),this.isReconnecting=!0,setTimeout((()=>this.connect()),B))}},async startHttpBinding(){if(this.isHttpBindingActive)return;this.isHttpBindingActive=!0,console.log("💬 Starting XMPP HTTP binding...");const t=async()=>{if(this.isConnected&&!this.isReconnecting&&this.isHttpBindingActive)try{const n=`<body rid='${e.nextRid()}' sid='${e.sid}' xmlns='http://jabber.org/protocol/httpbind'/>`,r=await e.sendRequestWithRetry(n);o(r),a(r),this.isHttpBindingActive&&t()}catch(e){e.message.includes("404")&&!this.isReconnecting&&(At({en:"Chat connection lost.",ru:"Соединение с чатом потеряно."},"warning"),n.refreshMessages(!1),this.shouldCheckConnection=!1,this.clearCheckConnectionTimeout(),this.isReconnecting=!0,this.isConnected=!1,this.isHttpBindingActive=!1,this.connect())}else this.isHttpBindingActive=!1};t()},stopHttpBinding(){this.isHttpBindingActive&&(this.isHttpBindingActive=!1)},sendMessage(e){const t=`msg_${Date.now()}`;let r=!1,o=null,a=null;const i=!this.isConnected||this.isReconnecting;_t.isPrivateMode&&_t.fullJid?(r=!0,o=_t.fullJid,a=_t.targetUsername,n.addSentMessage(e,{isPrivate:!0,recipient:a,pending:i})):n.addSentMessage(e,{pending:i});const s=Date.now();this.lastSentMessage&&this.lastSentMessage.text===e&&s-this.lastSentMessage.timestamp<F?At({en:`Duplicate message prevented: ${e}`,ru:`Дублирующее сообщение предотвращено: ${e}`},"warning"):this.messageQueue.has(t)?At({en:`Message already in queue: ${t}`,ru:`Сообщение уже в очереди: ${t}`},"warning"):(this.lastSentMessage={text:e,timestamp:s},this.messageQueue.set(t,{text:e,id:t,isPrivate:r,fullJid:o,recipient:a,pending:i,enqueueTime:s}),this.isConnected&&!this.isReconnecting&&this.processQueue())},async checkConnection(){if(this.shouldCheckConnection){try{const t=`<body rid='${e.nextRid()}' sid='${e.sid}' xmlns='http://jabber.org/protocol/httpbind'/>`;await e.sendRequestWithRetry(t)}catch(e){At({en:"Ping failed.",ru:"Пинг не удался."},"warning"),this.isReconnecting||(this.shouldCheckConnection=!1,this.clearCheckConnectionTimeout(),this.isReconnecting=!0,this.isConnected=!1,this.isHttpBindingActive=!1,this.connect())}this.shouldCheckConnection&&(this.checkConnectionTimeoutId=setTimeout((()=>this.checkConnection()),U))}}};return window.addEventListener("offline",(()=>{At({en:"Network connection lost.",ru:"Сетевое соединение потеряно."},"warning"),s.stopHttpBinding(),s.isConnected=!1,s.shouldCheckConnection=!1,s.clearCheckConnectionTimeout(),n.refreshMessages(!1,"network")})),window.addEventListener("online",(()=>{At({en:"Network connection restored.",ru:"Сетевое соединение восстановлено."},"success"),s.isConnected||s.isReconnecting||s.connect(),n.refreshMessages(!0,"network")})),document.addEventListener("visibilitychange",(()=>{"visible"===document.visibilityState&&s.shouldCheckConnection&&!s.isReconnecting&&(s.clearCheckConnectionTimeout(),s.checkConnection())})),window.addEventListener("beforeunload",(()=>{s.shouldCheckConnection=!1,s.clearCheckConnectionTimeout()})),s}function gr(){if(function(){try{return window!==window.top}catch(e){return!0}}())return At("Application cannot run in an iframe","error"),!1;const e=new URLSearchParams(window.location.search);if("/g/"===window.location.pathname&&e.has("gmid"))return!1;if(window.location.href.includes("/gamelist/"))return function(){if(window.location.href.startsWith("https://klavogonki.ru/gamelist/"))try{const e=Array.from(document.scripts).find((e=>e.text.includes("PageData")));if(!e)throw new Error("PageData script not found");const t=e.text.match(/\.constant\('PageData', ([\s\S]*?})\)/)[1],n=JSON.parse(t.replace(/(\w+):/g,'"$1":').replace(/'/g,'"')),r=`${n.chatParams.user.id}#${n.chatParams.user.login}`,o=n.chatParams.pass;localStorage.getItem("klavoauth")||(localStorage.setItem("klavoauth",JSON.stringify({username:r,password:o})),localStorage.setItem("chatUsernameColor",n.chatParams.user.background),setTimeout((()=>{window.location.href="https://klavogonki.ru"}),500))}catch(e){At({en:`Authentication error: ${e.message}`,ru:`Ошибка аутентификации: ${e.message}`},"error"),Gn()}}(),!1;return!!(localStorage.getItem("klavoauth")&&Wn.username&&Wn.password)||(localStorage.removeItem("klavoauth"),window.location.href="https://klavogonki.ru/gamelist/",!1)}(async function(){try{if(function(){if(!document.querySelector('meta[name="viewport"]')){const e=document.createElement("meta");e.name="viewport",e.content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no",document.head.appendChild(e),console.log("Viewport meta tag added dynamically")}}(),!gr())return;Kn(),function(){const e=document.getElementById("app-chat-container"),t=document.getElementById("chat-close-btn"),n=document.getElementById("chat-header");if(!e)return;const r=JSON.parse(localStorage.getItem("chatState"))||{},o=r.floating||!1,a=!1!==r.isVisible;o?(e.style.display=a?"flex":"none",e.style.opacity=a?"1":"0"):(e.classList.remove("visible-chat","hidden-chat"),e.classList.add(a?"visible-chat":"hidden-chat")),document.addEventListener("keydown",(e=>{e.ctrlKey&&e.shiftKey&&"Space"===e.code?(e.preventDefault(),yn()):e.ctrlKey&&"Space"===e.code&&(e.preventDefault(),vn())})),t&&t.addEventListener("click",vn),n&&n.addEventListener("dblclick",vn)}(),document.addEventListener("mousedown",(e=>{if(!e.target.closest(".chat-drag-area"))return;const t=document.getElementById("app-chat-container");let n=fn();if(or=!0,er=e.clientX,tr=e.clientY,nr=t.offsetLeft,rr=parseInt(t.style.top)||t.getBoundingClientRect().top,!n.floating){const e=window.innerHeight-t.offsetHeight;t.style.top=e+"px",t.style.bottom="",n.top=e,n.floating=!0,t.classList.add("floating-chat"),bn(n)}document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!or)return;const t=document.getElementById("app-chat-container"),n=window.innerWidth,r=window.innerHeight,o=e.clientX-er,a=e.clientY-tr,i=ut(nr+o,0,n-t.offsetWidth),s=ut(rr+a,0,r-t.offsetHeight);t.style.left=i+"px",t.style.top=s+"px";let c=fn();c.left=i,c.top=s,c.floating=!0,bn(c)})),document.addEventListener("mouseup",(()=>{if(!or)return;or=!1;const e=document.getElementById("app-chat-container"),t=window.innerWidth,n=window.innerHeight,r=e.getBoundingClientRect(),o=r.left<0||r.top<0||r.right>t||r.bottom>n,a=n-r.bottom<50;let i=fn();o||a?(e.style.top="",e.style.bottom="0",i.floating=!1,e.classList.remove("floating-chat")):(i.floating=!0,i.top=r.top,e.classList.add("floating-chat")),bn(i),document.body.style.userSelect=""})),document.addEventListener("mousedown",(e=>{const t=e.target.closest(".resize-handle");if(!t)return;mr=!0,ur=t.classList[1];const n=document.getElementById("app-chat-container");ar=e.clientX,ir=e.clientY,sr=n.offsetWidth,cr=n.offsetHeight,lr=n.offsetLeft,dr=parseInt(n.style.top)||n.getBoundingClientRect().top,pr=e.clientY-dr,document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!mr)return;const t=document.getElementById("app-chat-container"),n=window.innerWidth,r=window.innerHeight,o=getComputedStyle(document.documentElement),a=parseInt(o.getPropertyValue("--min-chat-width"))||250,i=parseInt(o.getPropertyValue("--min-chat-height"))||200;let s=fn();if("left"===ur){const r=Math.max(a,sr-(e.clientX-ar)),o=ut(lr+(e.clientX-ar),0,n-r);t.style.width=r+"px",t.style.left=o+"px",s.width=r,s.left=o}else if("right"===ur){const r=n-t.getBoundingClientRect().left,o=Math.min(r,Math.max(a,sr+(e.clientX-ar)));t.style.width=o+"px",s.width=o}const c=e.clientY-pr;if("top"===ur)if(!1===s.floating){let e=ut(c,0,r-i),n=r-e;t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}else{let e=ut(c,0,dr+cr-i),n=cr-(e-dr);n=Math.min(n,r),t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}if("left"===ur||"right"===ur)if(!1===s.floating){let e=ut(c,0,r-i),n=r-e;t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}else{let e=ut(c,0,dr+cr-i),n=cr-(e-dr);n=Math.min(n,r-e),t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}t.offsetHeight>r&&(t.style.height=r+"px",!1===s.floating&&(t.style.top="0px",s.top=0),s.height=r),bn(s),Me()})),document.addEventListener("mouseup",(()=>{mr=!1,document.body.style.userSelect=""})),window.addEventListener("resize",(()=>{gn(),Me()})),function(){const e=document.getElementById("messages-panel");if(!e)return;new MutationObserver((()=>{Me(),Ae(),ye(),kt(250)})).observe(e,{childList:!0,subtree:!0})}();const t=new Jt("user-list"),n=new en("messages-panel",pt(Wn.username)),r=hr(new Mt({username:Wn.username,password:Wn.password,bindUrl:N,connectionDelay:P}),t,n,Wn.username),o=document.getElementById("message-input"),a=()=>{const e=o.value.trim();e&&(r.sendMessage(e),o.value="",o.focus())};document.getElementById("send-button").addEventListener("click",a),o.addEventListener("keypress",(e=>"Enter"===e.key&&a())),o.addEventListener("paste",(e=>requestAnimationFrame((()=>o.value=o.value.replace(/\b(https?:\/\/[^\s]+)/gi,(e=>vt(e)?yt(e):e)))))),(e=o)&&e.addEventListener("input",(()=>{Rt(e)})),Zn(o),await r.connect(),window.xmppClient=r}catch(e){At(`App initialization error: ${e.message}`,"error"),Gn()}var e})().then((()=>{!function(){const e=document.querySelectorAll(".messages-panel .message");if(0===e.length)return;const t=new Set(Array.from(e).map((e=>Qt(e)))),n=JSON.parse(localStorage.getItem(Wt)||"[]").filter((e=>t.has(e)));if(localStorage.setItem(Wt,JSON.stringify(n)),0===n.length){const e=document.querySelector(".toggle-button");e&&e.remove()}}(),Vn()}))})();