KG_Chat_Application

Enhance the chat abilities

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         KG_Chat_Application
// @namespace    klavogonki
// @version      5.2.9
// @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;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;user-select:none !important;flex:1 !important}#app-chat-container .user-list-container #user-list .user-item .avatar-container{z-index:1 !important}#app-chat-container .user-list-container #user-list .separation{margin-bottom:1.5em !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 .role,#app-chat-container .user-item .game-indicator{cursor:pointer !important;font-family:"Noto Color Emoji",sans-serif !important}#app-chat-container .user-item .role .games-count,#app-chat-container .user-item .game-indicator .games-count{font-family:"Montserrat",sans-serif !important;color:var(--third-accent-color) !important;opacity:.8 !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}.ignore-options-popup{position:fixed !important;display:flex;gap:.5em !important;top:0;left:0;z-index:1020 !important}.ignore-options-popup .ignore-option-btn{padding:8px 16px;transition:all .3s;cursor:pointer;filter:brightness(1);border-radius:.2em !important}.ignore-options-popup .ignore-option-btn:hover{filter:brightness(1.5)}.action-buttons-container{position:fixed !important;display:flex;gap:.5em !important;top:0;left:0;z-index:1020 !important}.action-buttons-container .delete-btn,.action-buttons-container .ignore-btn{padding:8px 16px;transition:all .3s;cursor:pointer;filter:brightness(1);border-radius:.2em !important}.action-buttons-container .delete-btn:hover,.action-buttons-container .ignore-btn:hover{filter:brightness(1.5)}.message-mode .delete-btn,.username-mode .ignore-btn,.ignore-option-btn{background-color:hsl(0,50%,20%);color:hsl(0,60%,70%);border:1px solid hsl(0,50%,35%)}.username-mode .delete-btn{background-color:hsl(145,50%,20%);color:hsl(145,60%,70%);border:1px solid hsl(145,50%,35%)}.time-mode .delete-btn{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;cursor:pointer !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}.ignore-options-popup{flex-direction:column !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}.custom-tooltip-popup{font-family:"Montserrat","Noto Color Emoji",sans-serif !important;position:fixed;background:#161616;color:#dedede;padding:.5em;z-index:1200;font-size:.9em;pointer-events:none;white-space:nowrap;opacity:0;transition:opacity .1s;display:none;flex-direction:column;left:0;top:0;border:1px solid #3c3c3c !important;border-radius:4px !important;box-shadow:0 2px 5px rgba(0,0,0,.3) !important}.custom-tooltip-popup .tooltip-item{display:inline-flex;align-items:center}.custom-tooltip-popup .tooltip-action{font-weight:500 !important;color:var(--hotkey-label-text-color) !important}',""]);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;max-height:70vh;overflow-y:auto;overflow-x:hidden;scrollbar-width:none}.ignored-users-panel .ignored-users-list 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}.ignored-users-panel .ignored-users-list h3 .counter{font-size:.8em !important;color:var(--fourth-accent-color) !important;margin-left:.5em !important}.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(--second-accent-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;max-width:450px !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 M=n(879),I={};I.styleTagTransform=h(),I.setAttributes=d(),I.insert=c().bind(null,"head"),I.domAPI=i(),I.insertStyleElement=u();o()(M.A,I);M.A&&M.A.locals&&M.A.locals;var A=n(934),T={};T.styleTagTransform=h(),T.setAttributes=d(),T.insert=c().bind(null,"head"),T.domAPI=i(),T.insertStyleElement=u();o()(A.A,T);A.A&&A.A.locals&&A.A.locals;const z="https://klavogonki.ru",N=`${z}/xmpp-httpbind/`,P=100,B=3e3,O=500,H=300,q=500,D=150,R=150,_=2e3,U=1e4,J=2e3,F=400,X=100,Y={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:"Сетевое соединение потеряно."}}},K=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😏","😐","😑","😒","😓","😔","😕","😖","😗","😘","😙","😚","😜","😝","😛","🤑","🤗","🤔","🤐","🤨","😣","😥","😮","🤯","😳","😱","😨","😰","😢","🤪","😵","😲","🤤","😷","🤒","🤕","🤢","🤧","😇","🥳","🥺","😬","😴","😌","🤥","🥴","🥵","🥶","🤧","🤭","🤫","😠","😡","😳","😞","😟","😕","🐱","😺","😸","😹","😻","😼","😽","🙀","😿","😾","🐶","🐭","🐹","🐰","🦊","🐻","🐼","🐨","🐯","🦁","🐮","🐷","🐸","🐵","🙈","🙉","🙊","🐔","🦄"],W=["😀","😁","😂","🤣","😃","😄","😅","😆","😉","😊","😋","😎","😏","😐","😑","😒","😓","😔","😕","😖","😗","😘","😙","😚","😜","😝","😛","🤑","🤗","🤔","🤐","🤨","😣","😥","😮","🤯","😳","😱","😨","😰","😢","🤪","😵","😲","🤤","😷","🤒","🤕","🤢","🤧","😇","🥳","🥺","😬","😴","😌","🤥","🥴","🥵","🥶","🤧","🤭","🤫","😠","😡","😳","😞","😟","😕"],G=["klavogonki.ru","youtube.com","youtu.be","imgur.com","pikabu.ru","userapi.com","ibb.co","yaplakal.com","freepik.com","fastpic.org"],V="#1e1e1e",Q="https://raw.githubusercontent.com/VimiummuimiV/KG_Chat_Application/refs/heads/main/src/data/usernameColors.json",Z={info:"#2196F3",warning:"#FF9800",error:"#F44336",success:"#4CAF50"},ee=localStorage.getItem("emojiPanelLanguage")||"en",te={eventsHeader:{en:"Events",ru:"События"},ignoredUsersHeader:{en:"Ignored",ru:"Игнорируемые"},ignoredUsersSubheaderForever:{en:"Forever",ru:"Навсегда"},ignoredUsersSubheaderTemporary:{en:"Temporary",ru:"Временно"},ignoredUsersPlaceholder:{en:"Enter username",ru:"Введите никнейм"},ignoredBlockButton:{en:"Block",ru:"Бан"},usernameColorsHeader:{en:"Username Colors",ru:"Пользовательские цвета"},generatedColorsHeader:{en:"Generated Colors",ru:"Сгенерированные цвета"},savedColorsHeader:{en:"Saved Colors",ru:"Сохранённые цвета"},themesPanelHeader:{en:"Themes",ru:"Темы"},themesLightHeader:{en:"Light Themes",ru:"Светлые темы"},themesDarkHeader:{en:"Dark Themes",ru:"Тёмные темы"},deleteButton:{en:"Delete",ru:"Удалить"},ignoreButton:{en:"Ignore",ru:"Игнорировать"},ignore1Hour:{en:"1 Hour",ru:"1 час"},ignore1Day:{en:"1 Day",ru:"1 день"},ignoreForever:{en:"Forever",ru:"Навсегда"},ignoreCustomMinutes:{en:"Minutes",ru:"Минуты"},ignoreCustomPrompt:{en:"Enter minutes to ignore:",ru:"Введите количество минут для игнора:"}};let ne=null,re=null,oe=null,ae=!1,ie=null;const se=(e,t)=>{if(!ne)return;let n=e+10;const r=ne.offsetWidth,o=ne.offsetHeight,a=window.innerWidth,i=window.innerHeight;n=Math.min(Math.max(n,10),a-r-10);let s=t+18;if(s+o>i-0){const e=t-o-18;s=e>=18?e:i-o-0}s=Math.max(18,s),ne.style.left=`${n}px`,ne.style.top=`${s}px`},ce=e=>ne&&se(e.clientX,e.clientY),le=()=>{ae=!1,ie=null,clearTimeout(oe),clearTimeout(re),re=setTimeout((()=>{ne&&(ne.style.opacity="0",setTimeout((()=>{!ae&&ne&&(ne.style.display="none",document.removeEventListener("mousemove",ce),ne.textContent="")}),X/2))}),X)};function de(e,t,n=null){if(_t())return;if(null==t)return;n=n||ee||"en";let r=t;"object"==typeof t&&(t.en||t.ru)&&(r=t[n]||t.en||t.ru),r=function(e){const t=/\[([^\]]+)\]([^\[]*)/g;let n,r="",o=0;for(;null!==(n=t.exec(e));)n.index>o&&(r+=e.slice(o,n.index)),r+=`\n    <div class="tooltip-item">\n      <span class="tooltip-action">${n[1]}</span>&nbsp;\n      <span class="tooltip-message">${n[2].trim()}</span>\n    </div>`,o=t.lastIndex;return o<e.length&&(r+=e.slice(o)),r}(r),e._tooltipContent=r,e._tooltipInitialized||(e._tooltipInitialized=!0,ne||=(()=>{const e=document.createElement("div");return e.classList.add("custom-tooltip-popup"),e.style.display="none",e.style.opacity="0",document.body.appendChild(e),e})(),e.addEventListener("mouseenter",(t=>{ae=!0,ie=e,clearTimeout(re),clearTimeout(oe),ne.innerHTML=e._tooltipContent,ne.style.display="flex",ne.style.opacity="0",ne.offsetHeight,se(t.clientX,t.clientY),document.addEventListener("mousemove",ce),oe=setTimeout((()=>{ne.style.opacity="1"}),F)})),e.addEventListener("mouseleave",(e=>{le(),document.removeEventListener("mousemove",ce)})))}new MutationObserver((()=>{ie&&!document.contains(ie)&&le()})).observe(document,{childList:!0,subtree:!0});let me=0,ue=!1,pe=null,he={},ge=null;const fe=.2,be=10,ve=.1;function ye(){Object.entries(he).forEach((([e,t])=>{document.removeEventListener(e,t)}))}function ke(e){if(!ge)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;ge.innerHTML=`\n    <div class="image-info-time">${t.time}</div>\n    <div class="image-info-username">${t.username}</div>\n  `;const n=ge.querySelector(".image-info-time");n&&n.addEventListener("click",(e=>{e.stopPropagation();const t=Dt(n.textContent.trim()),r=`https://klavogonki.ru/chatlogs/${new Intl.DateTimeFormat("en-CA").format(new Date)}.html#${t}`;window.open(r,"_blank")}))}const xe=e=>{zt(e,"hide","0");const t=document.querySelector(".dimming-element");!document.querySelector(".popup-panel")&&t&&zt(t,"hide","0"),ye(),ge&&ge.parentNode&&(ge.parentNode.removeChild(ge),ge=null)},we=e=>{const t=Ae(),n=me+e;n>=0&&n<t.length&&!ue&&(ue=!0,pe&&(pe.src=t[n].imgSrc),setTimeout((()=>{ue=!1,me=n,ke(me)}),50))},Ee=(e,t)=>{const n=document.createElement("img");n.src=e,n.classList.add("scaled-thumbnail"),document.body.appendChild(n),pe=n,me=t,ge=function(){const e=document.createElement("div");return e.className="image-info-container",e}(),document.body.appendChild(ge),ke(me);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)),_t()&&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(fe,Math.min(l,be)),({translateX:n,translateY:r}=Se({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),he.click=e=>{n.contains(e.target)||(n.remove(),ye())},he.keydown=e=>{"Escape"===e.code||"Space"===e.code?(e.preventDefault(),xe(n)):"ArrowLeft"===e.code?we(-1):"ArrowRight"===e.code&&we(1)},he.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*ve*r;d=Math.max(fe,Math.min(d,be)),({translateX:s,translateY:c}=Se({imageElement:n,anchorX:o,anchorY:a,oldScale:l,newScale:d,translateX:s,translateY:c})),r=d},he.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)*ve*.05,u=r;let p=r+d*m*r;p=Math.max(fe,Math.min(p,be)),({translateX:s,translateY:c}=Se({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}},he.mousedown=e=>{const{button:t,clientX:r,clientY:s,target:c,ctrlKey:l}=e;(0!==t&&2!==t||c===n)&&(0===t?we(-1):2===t?(e.preventDefault(),l?(navigator.clipboard.writeText(c.src).catch(console.error),xe(n)):we(1)):1===t&&(o=!0,a=r,i=s,e.preventDefault()))},he.mouseup=e=>{1===e.button&&(o=!1)},he.contextmenu=e=>e.preventDefault(),Object.entries(he).forEach((([e,t])=>{document.addEventListener(e,t)})),zt(l,"show","1"),l.addEventListener("click",(()=>{xe(n)})),n};function Se({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 Ce=["jpg","jpeg","png","gif","webp"],Le="📷",je="🖥️",$e="💀️️";let Me=[];const Ie=e=>{const t=(e=>{try{return e.match(/\.([^?#.]+)(?:[?#]|$)/i)?.[1]?.toLowerCase()||""}catch(e){return Ft(`Error extracting image extension: ${e.message}`,"error"),""}})(e);return{allowed:Ce.includes(t),extension:t}},Ae=()=>Me;function Te(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)},o.onerror=()=>{Ft(`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 Me=[],e.querySelectorAll(".clickable-thumbnail").forEach(((e,t)=>{const n=e.querySelector("img");n&&e.dataset.sourceLink&&Me.push({link:e.dataset.sourceLink,imgSrc:n.src,index:t})})),Me})(),r=n.findIndex((t=>t.link===e.href||t.imgSrc===o.src));zt(Ee(o.src,r>=0?r:0),"show","1");const a=document.querySelector(".dimming-element");a&&zt(a,"show","1")}))}function ze(){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}=Ie(e.href);if(!t)return;e.classList.add("media");const{isTrusted:r,domain:o}=Nt(e.href);de(e,Pt(e.href)?Bt(e.href):e.href),r?function(e,t,n){e.textContent=`${Le} ${t.toUpperCase()} ${je} ${n}`,e.classList.add("processed-image"),Te(e,!1)}(e,n,o):function(e,t,n){e.classList.add("skipped"),e.textContent=`${Le} ${t.toUpperCase()} ${je} ${n} ${$e} Untrusted`,e.addEventListener("click",(t=>{e.classList.contains("processed-image")||(t.preventDefault(),e.classList.remove("skipped"),e.classList.add("processed-image"),Te(e,!0))}))}(e,n,o)}))}const Ne="📺",Pe="📹",Be="🎬️",Oe="🖥️",He="💀️️",qe=["mp4","webm","ogg","mov","avi"];let De=null,Re=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 Ft("Error fetching YouTube metadata.","error"),{title:"Error",channel:"Error"}}}(n),a=document.createElement("span");a.classList.add("channel-name"),a.textContent=`${Ne} ${o.channel}`;const i=document.createElement("span");i.classList.add("video-title"),i.textContent=`${Pe} ${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})),s.addEventListener("error",(()=>{Ft(`Error loading Youtube thumbnail image for ${n}.`,"error")}))}function Ue(){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:qe.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=`${Be} ${a} ${Oe} ${n}`,de(e,Pt(t)?Bt(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(Re&&Re!==n){const e=Re.dataset.videoId,t=Re.dataset.videoType;_e(Re.previousElementSibling,Re,e,t)}Re=n;const e=(De||(De=document.createElement("iframe"),De.classList.add("video-container"),De.allowFullscreen=!0),De);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})),n.addEventListener("error",(()=>{Ft(`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!!qe.includes(n)&&{youtubeMatch:!1,videoType:`Video (${n.toUpperCase()})`}}(t);if(!r)return;e.classList.add("media");const{isTrusted:o,domain:a}=Nt(t);if(!o)return e.classList.add("skipped"),e.textContent=`${Be} ${r.videoType} ${Oe} ${a} ${He} 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 Je(){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=_t();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 ${D}ms ease-in-out, opacity ${D}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||(Fe(o,!1),setTimeout((()=>document.removeEventListener("click",t,!0)),D))};n.addEventListener("click",(e=>{e.stopPropagation();const n=o.classList.contains("shown-userlist");Fe(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 Fe(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")}),D))),t}function Xe(e){e.classList.add("shake-effect"),setTimeout((()=>{e.classList.remove("shake-effect")}),500)}const Ye="http://www.w3.org/2000/svg",Ke=`\n  <svg class="send" xmlns="${Ye}" \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>`,We=`\n  <svg class="no" xmlns="${Ye}" \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>`,Ge=`\n  <svg class="yes" xmlns="${Ye}" \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>`,Ve=`\n  <svg class="yes" xmlns="${Ye}" \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="${Ye}" \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>`,Ze=`\n  <svg class="help" xmlns="${Ye}" \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>`,et=`\n  <svg class="theme" xmlns="${Ye}" \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>`,tt=`\n  <svg class="colors" xmlns="${Ye}" \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>`,nt=`\n  <svg class="blocked" xmlns="${Ye}" \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>`,rt=`\n  <svg class="add-icon" xmlns="${Ye}" \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>`,ot=`\n  <svg class="edit-icon" xmlns="${Ye}" \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>`,at=`\n  <svg class="remove-icon" xmlns="${Ye}" \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>`,it=`\n  <svg class="export-icon" xmlns="${Ye}" \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>`,st=`\n  <svg class="import-icon" xmlns="${Ye}" \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>`,ct=`\n  <svg class="load-icon" xmlns="${Ye}" \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>`,lt=`\n  <svg class="activity" xmlns="${Ye}" \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>`,dt=`\n  <svg class="event-info" xmlns="${Ye}" \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>`,mt=`\n  <svg class="event-warning" xmlns="${Ye}" \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>`,ut=`\n  <svg class="event-error" xmlns="${Ye}" \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>`,pt=`\n  <svg class="event-success" xmlns="${Ye}" \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>`,ht=`\n  <svg class="event-clear" xmlns="${Ye}"\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>`,gt="chatEvents",ft="lastViewedEventTime";function bt(){try{const e=localStorage.getItem(gt);if(e){const t=JSON.parse(e);if(t.date===(new Date).toDateString())return t.events||[];localStorage.setItem(gt,JSON.stringify({date:(new Date).toDateString(),events:[]})),Ft({en:"Events cache expired, creating fresh cache.",ru:"Кэш событий устарел, создается новый."},"info")}}catch(e){Ft({en:"Error loading events cache, creating fresh cache.",ru:"Ошибка загрузки кэша событий, создается новый."},"error")}return[]}function vt(){return bt()}function yt(){const e=document.querySelector(".chat-events-button");if(e){const t=vt(),n=localStorage.getItem(ft)||"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 kt(e){const t=bt();t.push({...e,date:(new Date).toISOString()}),function(e){try{localStorage.setItem(gt,JSON.stringify({date:(new Date).toDateString(),events:e}))}catch(e){Ft({en:"Error saving events cache.",ru:"Ошибка сохранения кэша событий."},"error")}}(t),yt()}class xt{static instance=null;constructor(){if(xt.instance){if(xt.instance.panel.parentNode)return xt.instance;xt.instance=null}xt.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=te.eventsHeader[ee],this.panel.appendChild(e),this.panel.appendChild(this.eventsList);const t=document.createElement("button");t.className="clear-btn",t.innerHTML=ht,de(t,{en:"Clear all events",ru:"Очистить все события"}),t.addEventListener("click",(()=>{0!==vt().length&&(localStorage.removeItem(gt),yt(),this.hide())})),this.panel.appendChild(t);const n=document.createElement("button");n.className="close-btn",n.innerHTML=at,de(n,{en:"Close panel",ru:"Закрыть панель"}),n.addEventListener("click",(()=>{this.hide()})),this.panel.appendChild(n);const r=vt(),o=localStorage.getItem(ft)||"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"),de(n,{en:"Click to copy message",ru:"Нажмите, чтобы скопировать сообщение"});const r=document.createElement("span");let o;switch(r.className="event-icon icon-wrapper",e.type){case"warning":o=mt;break;case"error":o=ut;break;case"success":o=pt;break;default:o=dt}const a=Z[e.type]||Z.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=Z[e.type]||Z.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((()=>{Xe(t)})).catch((e=>{Ft({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=vt();e&&0!==e.length&&(document.body.appendChild(this.panel),zt(this.panel,"show",1),localStorage.setItem(ft,(new Date).getTime().toString()),yt(),this.scrollToBottom())}hide(){zt(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),kt(n),this.scrollToBottom()}}function wt(){return new xt}let Et=new Set,St=!1;function Ct(){if(St||0===Et.size)return;St=!0;const e=Et.values().next().value,[t,n="info"]=e.split("|");!function(e,t={},n){const r=document.querySelector(".chat-drag-area");if(!r)return Et.delete(n),St=!1,void Ct();const o=r.querySelector(".chat-dynamic-alert");o&&o.parentNode===r&&r.removeChild(o);const a={type:"info",duration:_,...t},i=document.createElement("div");i.className="chat-dynamic-alert",i.innerHTML=e,i.style.cssText=`\n    background-color: ${Z[a.type]||Z.info};\n  `,r.appendChild(i),e&&kt({message:e,type:a.type});function s(){requestAnimationFrame((()=>{i.style.transition="opacity 0.3s ease-in-out",i.style.opacity="1",setTimeout((()=>{i.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((()=>{i.style.transform=`translate(calc(-50% + ${e.x}px), 0)`}),e.delay)}))}),300),setTimeout((()=>{i.style.transition="opacity 0.3s ease-in-out",i.style.opacity="0",setTimeout((()=>{i&&i.parentNode===r&&r.removeChild(i),Et.delete(n),St=!1,Ct()}),300)}),a.duration)}))}s()}(t,{type:n},e)}let Lt=null;function jt(){let e;do{e=K[Math.floor(Math.random()*K.length)]}while(e===Lt);return Lt=e,e}function $t(){const e=document.getElementById("messages-panel");if(!e)return;new MutationObserver((()=>{Je(),Ue(),ze(),function(e){const t=document.getElementById("messages-panel");if(!t)return;t.scrollHeight-t.scrollTop-t.clientHeight<=e&&(t.scrollTop=t.scrollHeight)}(350)})).observe(e,{childList:!0,subtree:!0})}function Mt(e,t,n){return Math.min(Math.max(e,t),n)}function It(e){return"string"!=typeof e?e:e.replace(/^\d+#/,"")}function At(e){if(!e)return null;const t=e.split("/");if(t.length<2)return null;return t[1].split("#")[0]}function Tt(e){return e?e.includes("#")?e.split("#")[1]:e.replace(/^\d+#/,""):"Unknown"}function zt(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 Nt=e=>{try{const{hostname:t}=new URL(e),n=t.toLowerCase().split(".").slice(-2).join(".");return{isTrusted:G.includes(n),domain:n}}catch(t){return Ft({en:`Error in isTrustedDomain: ${t.message}`,ru:`Ошибка в isTrustedDomain: ${t.message}`},"error"),{isTrusted:!1,domain:e}}};function Pt(e){return/^https?:\/\//.test(e)&&/%[0-9A-Fa-f]{2}/.test(e)}function Bt(e){const[t]=e.split("#");return decodeURIComponent(t).replace(/ /g,"_")}function Ot(){const e=document.getElementById("app-chat-container"),t=document.getElementById("message-input");return!(!t||!e||"none"===e.style.display)&&(t.focus(),!0)}async function Ht(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 qt(e){return new Promise((t=>setTimeout(t,e)))}function Dt(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 Rt(e){return e.replace(/\n/g,"").replace(/\s+/g," ").replace(/>\s+</g,"><").trim()}function _t(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||"ontouchstart"in window}function Ut(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 Jt(){return window.getSelection().toString().length>0}function Ft(e,t="info",n=!0,r=null){const o={info:`color: ${Z.info}`,warning:`color: ${Z.warning}`,error:`color: ${Z.error}`,success:`color: ${Z.success}`},a=o[t]||o.info;r=r||ee||"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=`${e}|${t.type||"info"}`;Et.has(n)||(Et.add(n),St||Ct())}(i,{type:t,duration:_})}class Xt{constructor({username:e,password:t,bindUrl:n=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);Ft({en:`Rate limited (attempt ${o}/${t}). Waiting ${e}ms...`,ru:`Превышен лимит (попытка ${o}/${t}). Ожидание ${e}мс...`},"warning"),await qt(e)}}throw Ft({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 qt(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 qt(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 qt(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 qt(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 qt(this.delay),{sid:this.sid,rid:this.rid}}}const Yt={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 Kt=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(Yt.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 Yt.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=Yt.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=Yt.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}),Wt="ignored",Gt="tempIgnored",Vt=(e,t)=>{try{const n=localStorage.getItem(e);return n?JSON.parse(n):t}catch(e){return Ft({en:`Error parsing ignored users data: ${e.message}`,ru:`Ошибка разбора данных игнорируемых пользователей: ${e.message}`},"error"),t}},Qt=(e,t)=>{try{return localStorage.setItem(e,JSON.stringify(t)),!0}catch(e){return Ft({en:`Error saving ignored users data: ${e.message}`,ru:`Ошибка сохранения данных игнорируемых пользователей: ${e.message}`},"error"),!1}},Zt=(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};function en(){const e=Vt(Wt,[]),t=Vt(Gt,{}),n=Date.now();return{forever:e,temporary:Object.entries(t).filter((([e,t])=>t>n)).map((([e])=>e))}}const tn=()=>{const e=document.querySelector(".ignored-users-panel");if(e)return e;const{forever:t,temporary:n}=en(),r=Vt(Gt,{}),o=Zt("div","ignored-users-panel"),a=Zt("div","ignored-users-list");o.appendChild(a);const i=Zt("h2",null,{text:te.ignoredUsersHeader[ee]});function s({type:e,users:t,userList:n,uiStrings:r,defaultLanguage:o,createEntry:a,tempIgnoredMap:i}){if(!t.length)return null;const s=document.createElement("h3");s.className="ignored-users-subheader",s.innerHTML=`${r["forever"===e?"ignoredUsersSubheaderForever":"ignoredUsersSubheaderTemporary"][o]} <span class="counter">${t.length}</span>`;const c=Zt("div","forever"===e?"ignored-users-forever-section":"ignored-users-temporary-section");return n.append(s,c),t.forEach((t=>{const n=a(t,e,i);c.appendChild(n)})),c}a.appendChild(i),s({type:"forever",users:t,userList:a,uiStrings:te,defaultLanguage:ee,createEntry:u}),s({type:"temporary",users:n,userList:a,uiStrings:te,defaultLanguage:ee,createEntry:u,tempIgnoredMap:r});const c=Zt("div","ignored-users-input-container"),l=Zt("input","ignored-users-input",{type:"search",placeholder:te.ignoredUsersPlaceholder[ee]}),d=Zt("button","ignored-users-add-btn",{text:te.ignoredBlockButton[ee]});de(d,{en:"Add to ignored",ru:"Добавить в игнорируемые"});const m=async()=>{const e=l.value.trim();if(!e)return;if(t.includes(e)||n.includes(e))return;if(!await Ht(e))return Ft({en:`Could not find user "${e}"`,ru:`Не удалось найти пользователя "${e}"`},"error"),l.value="",l.classList.add("field-error"),void setTimeout((()=>l.classList.remove("field-error")),500);t.push(e),Qt(Wt,t),Ft({en:`Added "${e}" to the ignore list`,ru:`"${e}" добавлен(а) в список игнорируемых`},"info"),l.value="",window.messageManager&&"function"==typeof window.messageManager.removeIgnoredMessages&&window.messageManager.removeIgnoredMessages();let r=document.querySelector(".ignored-users-forever-section");r?r.appendChild(u(e,"forever")):r=s({type:"forever",users:[e],userList:a,uiStrings:te,defaultLanguage:ee,createEntry:u})};function u(e,t="forever",n=null){const r=Zt("div","ignored-user-entry"),o=Zt("div","username",{text:e});if("temporary"===t){o.classList.add("temporary-banned");const t=n?n[e]:null;if(t){const e=t-Date.now();let n=null;if(e>0){const r=Math.abs(t-e-(t-36e5)),o=Math.abs(t-e-(t-864e5));r<6e4?n=36e5:o<6e4&&(n=864e5)}const r=n?t-n:t-e,a=Math.max(0,Math.floor(e/1e3)),i=Math.floor(a/3600),s=Math.floor(a%3600/60),c=a%60,l=new Date(r),d=e=>e.toString().padStart(2,"0"),m=`${l.getFullYear()}-${d(l.getMonth()+1)}-${d(l.getDate())} ${d(l.getHours())}:${d(l.getMinutes())}:${d(l.getSeconds())}`,u=`${"ru"===ee?"[Добавлен]":"[Added]"}: ${m}\n${"ru"===ee?"[Осталось]":"[Time left]"}: ${i}h ${s}m ${c}s`;de(o,{en:u,ru:u})}}else o.classList.add("forever-banned");const a=Zt("button","remove-btn");function i(e){const t=e.parentElement;if(e.remove(),t&&0===t.children.length){const e=t.previousElementSibling;t.remove(),e&&e.remove()}}return a.innerHTML=at,de(a,{en:"Remove from ignored",ru:"Удалить из игнорируемых"}),a.addEventListener("click",(()=>{if("temporary"===t)delete n[e],Qt(Gt,n),i(r);else{const t=Vt(Wt,[]).filter((t=>t!==e));Qt(Wt,t),i(r)}})),r.append(o,a),r}d.addEventListener("click",m),l.addEventListener("keypress",(e=>{"Enter"===e.key&&m()})),c.append(l,d),o.insertBefore(c,a),document.body.appendChild(o),zt(o,"show",1);const p=e=>{"Escape"===e.key&&(zt(o,"hide",0),document.removeEventListener("keydown",p))};document.addEventListener("keydown",p);const h=e=>{o.contains(e.target)||(zt(o,"hide",0),document.removeEventListener("click",h,!0),document.removeEventListener("keydown",p))};return document.addEventListener("click",h,!0),o};let nn=null;const rn=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,zt(t,"show",1);const n=()=>{zt(t,"hide",0),document.removeEventListener("keydown",r),document.removeEventListener("mousedown",r)},r=e=>{if("keydown"===e.type&&"Space"===e.code){if(nn)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&&(nn=e.target)})),o.addEventListener("focusout",(()=>{setTimeout((()=>{o.activeElement&&"TEXTAREA"===o.activeElement.tagName||(nn=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){Ft({en:"Unable to access iframe contents. This may be due to cross-origin restrictions.",ru:"Невозможно получить доступ к содержимому iframe. Возможно, это связано с ограничениями кросс-домена."},"error")}}},on={isPrivateMode:!1,targetUsername:null,targetId:null,fullJid:null,async setPrivateTarget(e){if(!e)return this.exitPrivateMode(),!1;try{const t=await Ht(e);return!!t&&(this.isPrivateMode=!0,this.targetUsername=e,this.targetId=t,this.fullJid=`${t}#${e}@jabber.klavogonki.ru/web`,!0)}catch(e){return Ft({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 an=null;function sn(e){"Escape"===e.key&&on.isPrivateMode&&ln()}async function cn(e){if(!e)return;const t=e.value,n=/^\/pm\s+([\wа-яА-ЯёЁ\-\.\_\+]+)\s/,r=t.match(n);if(r){const o=r[1];await on.setPrivateTarget(o)?(!function(e){const t=document.getElementById("message-input");on.isPrivateMode&&on.targetUsername!==e&&ln();if(t.classList.contains("private-mode")&&on.targetUsername===e)on.targetUsername===e&&(t.placeholder=`️PM to ➡ ${e}`,Ft({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",(()=>{ln(),t.focus()}));t.parentElement.insertBefore(n,t.nextSibling)}n.innerHTML="🔒",de(n,{en:"Exit private mode",ru:"Выйти из приватного режима"}),n.addEventListener("mouseenter",(()=>{n.innerHTML="🔓"})),n.addEventListener("mouseleave",(()=>{n.innerHTML="🔒"})),Ft({en:`Entered private chat with ${e}`,ru:`Вошли в приватный чат с ${e}`},"warning"),on.isPrivateMode=!0,on.targetUsername=e,an||(an=sn,document.addEventListener("keydown",an))}}(o),e.value=t.replace(n,"")):(Ft({en:`Could not find user "${o}"`,ru:`Не удалось найти пользователя "${o}"`},"error"),ln())}else/^\/exit\s*$/.test(t)&&(ln(),e.value="")}function ln(){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=on.targetUsername;window.messageManager&&"function"==typeof window.messageManager.removePrivateMessages&&window.messageManager.removePrivateMessages(),on.exitPrivateMode(),Ft({en:`Exited private chat with ${n}`,ru:`Вышли из приватного чата с ${n}`},"success"),an&&(document.removeEventListener("keydown",an),an=null)}}const dn=()=>`rand=${Date.now()}`;class mn{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.raceStats=new Map,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||{}):(Ft({en:"Avatar cache expired, creating fresh cache.",ru:"Кэш аватаров устарел, создаётся новый."},"info"),{})}}catch(e){Ft({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){Ft({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} `,cn(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)}),H);("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(){this.container.addEventListener("dblclick",(e=>{e.currentTarget===e.target&&mn.toggleUserListMode(e.currentTarget)}));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];rn(`https://klavogonki.ru/u/#/${e}/`)}}}else 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}`)}else;}))}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);At(r),Tt(e.login);this.isFirstLoad,this.activeUsers.delete(r),this.changes=!0}continue}const i=this.activeUsers.get(r)||{},s=At(r),c=this.avatarCache[s];let l={jid:r,login:a,color:V,usernameColor:Kt.getColor(Tt(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=Kt.getColor(Tt(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);Tt(l.login);let u=this.raceStats.get(s);u||(u={count:0,lastGameId:null},this.raceStats.set(s,u)),l.gameId?u.lastGameId!==l.gameId&&(u.count+=1,u.lastGameId=l.gameId):(u.count=0,u.lastGameId=null),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)))}updateRoleTooltip(e,t){"moderator"===t?de(e,{en:"Chat Moderator",ru:"Модератор чата"}):"visitor"===t&&de(e,{en:"Banned User",ru:"Забаненный пользователь"})}static toggleUserListMode(){const e=["normal","race","chat"],t=localStorage.getItem("userlistMode")||"normal",n=e.indexOf(t),r=e[(n+1)%e.length];return localStorage.setItem("userlistMode",r),window.userManager&&window.userManager.updateUI(),Ft({normal:{en:"User list mode set to normal",ru:"Список пользователей: обычный режим"},race:{en:"User list mode set to race",ru:"Список пользователей: заезды сверху"},chat:{en:"User list mode set to general chat",ru:"Список пользователей: общий чат сверху"}}[r],"info"),r}sortByRoleAndName(e){return e.sort(((e,t)=>{const n=this.rolePriority[e.role]-this.rolePriority[t.role];return 0!==n?n:Tt(e.login).localeCompare(Tt(t.login))}))}sortByRaceCount(e){return e.sort(((e,t)=>{const n=this.raceStats.get(At(e.jid))?.count||0;return(this.raceStats.get(At(t.jid))?.count||0)-n}))}updateUI(){const{forever:e,temporary:t}=en(),n=[...e,...t],r=new Map;this.container.querySelectorAll(".user-item").forEach((e=>{r.set(e.getAttribute("data-jid"),e)}));const o=localStorage.getItem("userlistMode")||"normal";let a=Array.from(this.activeUsers.values()).filter((e=>{const t=Tt(e.login);return!n.includes(t)}));const i=a.filter((e=>e.gameId)),s=a.filter((e=>!e.gameId));a="race"===o?[...this.sortByRaceCount(i),...this.sortByRoleAndName(s)]:"chat"===o?[...this.sortByRoleAndName(s),...this.sortByRaceCount(i)]:this.sortByRoleAndName(a);let c=-1;"race"===o&&i.length>0?c=i.length-1:"chat"===o&&s.length>0&&(c=s.length-1);const l=document.createDocumentFragment();a.forEach(((e,t)=>{let n=r.get(e.jid);const o=At(e.jid),a=Tt(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)}r.delete(e.jid);const t=n.querySelector(".role"),i=this.roleIcons[e.role];t&&t.textContent!==i&&(t.textContent=i,t.classList.contains(e.role)||(t.className=`role ${e.role}`,this.updateRoleTooltip(t,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      `;const s=i.querySelector(".role");this.updateRoleTooltip(s,e.role),n.appendChild(r),n.appendChild(i)}this.updateGameIndicator(n,e),n.classList.toggle("separation",t===c),l.appendChild(n)})),this.container.innerHTML="",this.container.appendChild(l),r.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&&Xe(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?${dn()}`,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||jt();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=jt();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?${dn()}`,o=document.createElement("img");o.className="user-avatar image-avatar",o.src=t,o.alt=`${r}'s avatar`,o.addEventListener("error",(()=>{const t=jt();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){const n=e.querySelector(".user-info");let r=e.querySelector(".game-indicator");const o=At(t.jid||t.login||""),a=this.raceStats.get(o)||{count:0,lastGameId:null};if(t.gameId){if(r){const e=r.querySelector(".games-count");e&&(e.textContent=a.count)}else{r=document.createElement("span"),r.className="game-indicator";const e=document.createElement("span");e.className="traffic-icon",e.textContent="🚦";const t=document.createElement("span");t.className="games-count",t.textContent=a.count,r.append(e,t),n.appendChild(r)}i=r,s=t.gameId,c=a.count,i.setAttribute("data-game-id",s),de(i,{en:`[Game ID] ${s} [Races] ${c}`,ru:`[Игра] ${s} [Заездов] ${c}`})}else r&&r.remove();var i,s,c}async requestFullRoster(){console.log("📑 Would request full roster here (using existing data for now)"),this.updateUI()}}function un(e){const t=e.querySelector(".new-messages-separator");t&&t.remove()}const pn="https://github.com/VimiummuimiV/KG_Chat_Application/raw/refs/heads/main/src/sounds/notification-pluck-on.mp3";function hn(e){const t=new Audio(e);t.volume=1,t.play()}function gn(){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=Tt(e.username))}}catch(e){Ft({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 fn="deletedChatAppMessages",bn="ignored",vn="tempIgnored";class yn{constructor(){this.selected=new Set,this.isDragging=!1,this.toggleBtn=null,this.longPressTimer=null,this.touchStartX=0,this.touchStartY=0,this.isMobile=_t(),this.init()}init(){this.attachEvents(),this.updateDeletedMessages(),this.renderToggle(),this.cleanupExpiredIgnores()}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&&!e.target.closest("a")&&(Jt()||(e.preventDefault(),this.showDeleteButton(e,t)))})),this.isMobile&&(document.addEventListener("touchstart",(e=>{const t=e.target.closest(".messages-panel .message");t&&!e.target.closest("a")&&(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)}),H))})),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){const r=e.closest("a");if(Jt()||r)return;const o=e.closest(".time"),a=e.closest(".username");o?this.handleTimeSelection(t,n):a?this.handleUsernameSelection(a):(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=kn(e);t?this.selected.add(r):this.selected.delete(r)}showDeleteButton(e,t){if(Jt())return;const n=document.querySelector(".action-buttons-container");n&&n.remove();const r=document.createElement("div");r.className="action-buttons-container";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-container");const a=document.createElement("button");if(a.className="delete-btn",a.textContent=te.deleteButton[ee],a.onclick=()=>this.deleteSelectedMessages(r),r.appendChild(a),"username-mode"===o){const e=t.querySelector(".username");if(e){const t=e.textContent.trim();if(t){const e=document.createElement("button");e.className="ignore-btn",e.textContent=te.ignoreButton[ee],e.onclick=()=>this.showIgnoreOptions(e,t),r.appendChild(e)}}}r.addEventListener("touchstart",(e=>{e.stopPropagation()})),document.body.append(r);const{offsetWidth:i,offsetHeight:s}=r;r.remove();const c=Math.max(0,Math.min(e.clientX-i/2,window.innerWidth-i)),l=Math.max(0,Math.min(e.clientY-s/2,window.innerHeight-s));if(Object.assign(r.style,{position:"fixed",top:`${l}px`,left:`${c}px`}),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 d;r.addEventListener("mouseenter",(()=>{d&&clearTimeout(d)})),r.addEventListener("mouseleave",(()=>{d=setTimeout((()=>{r.remove(),this.clearSelection()}),q)})),document.body.append(r)}showIgnoreOptions(e,t){const n=document.createElement("div");n.className="ignore-options-popup";[{custom:!0},{text:te.ignore1Hour[ee],duration:36e5},{text:te.ignore1Day[ee],duration:864e5},{text:te.ignoreForever[ee],duration:null}].forEach((e=>{if(e.custom){const e=document.createElement("button");e.className="ignore-option-btn custom-ignore-minutes",e.textContent=te.ignoreCustomMinutes[ee],e.onclick=()=>{let e;for(;;){if(e=prompt(te.ignoreCustomPrompt[ee]),null===e)return;if(/^\d+$/.test(e)&&parseInt(e,10)>0)break}const r=parseInt(e,10);this.ignoreUser(t,60*r*1e3),n.remove(),this.clearSelection();const o=document.querySelector(".action-buttons-container");o&&o.remove()},n.appendChild(e)}else{const r=document.createElement("button");r.className="ignore-option-btn",r.textContent=e.text,r.onclick=()=>{this.ignoreUser(t,e.duration),n.remove(),this.clearSelection();const r=document.querySelector(".action-buttons-container");r&&r.remove()},n.appendChild(r)}}));const r=e.getBoundingClientRect(),o=Math.max(0,Math.min(r.left,window.innerWidth-100));n.style.top=`${r.bottom+5}px`,n.style.left=`${o}px`,document.body.appendChild(n);const a=t=>{n.contains(t.target)||e.contains(t.target)||(n.remove(),document.removeEventListener("click",a))};document.addEventListener("click",a)}ignoreUser(e,t){if(null===t){const t=JSON.parse(localStorage.getItem(bn)||"[]");t.includes(e)||(t.push(e),localStorage.setItem(bn,JSON.stringify(t))),Ft({en:`Added "${e}" to the ignore list`,ru:`"${e}" добавлен(а) в список игнорируемых`},"info")}else{const r=JSON.parse(localStorage.getItem(vn)||"{}"),o=Date.now()+t;r[e]=o,localStorage.setItem(vn,JSON.stringify(r));const a=Math.round(t/6e4);Ft({en:`Added "${e}" to the ignore list for ${a} minutes`,ru:`"${e}" добавлен(а) в список игнорируемых на ${a} ${n=a,n%10==1&&n%100!=11?"минуту":[2,3,4].includes(n%10)&&![12,13,14].includes(n%100)?"минуты":"минут"}`},"info")}var n;window.messageManager&&"function"==typeof window.messageManager.removeIgnoredMessages&&window.messageManager.removeIgnoredMessages()}cleanupExpiredIgnores(){const e=JSON.parse(localStorage.getItem(vn)||"{}"),t=Date.now();let n=!1,r=[];Object.keys(e).forEach((o=>{e[o]<=t&&(delete e[o],n=!0,r.push(o))})),n&&(localStorage.setItem(vn,JSON.stringify(e)),r.forEach((e=>{Ft({en:`User "${e}" was removed from the ignore list`,ru:`Пользователь "${e}" удалён из игнора`},"info")})))}isUserIgnored(e){if(JSON.parse(localStorage.getItem(bn)||"[]").includes(e))return!0;const t=JSON.parse(localStorage.getItem(vn)||"{}");return!!(t[e]&&t[e]>Date.now())}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(fn)||"[]"));e.forEach((e=>t.add(e))),localStorage.setItem(fn,JSON.stringify([...t]))}updateDeletedMessages(){const e=new Set(JSON.parse(localStorage.getItem(fn)||"[]")),t=document.querySelectorAll(".messages-panel .message");0!==t.length&&(t.forEach((t=>{if(!t)return;const n=kn(t);t.classList.remove("shown-message"),t.classList.toggle("hidden-message",e.has(n))})),localStorage.setItem(fn,JSON.stringify([...e])))}renderToggle(){if(!(JSON.parse(localStorage.getItem(fn)||"[]").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(fn)||"[]");document.querySelectorAll(".messages-panel .message").forEach((e=>{if(!e)return;const r=kn(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)}),H)})),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(fn,JSON.stringify([])),this.selected.clear(),this.updateDeletedMessages(),this.renderToggle()}}function kn(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 xn=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 wn{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 yn,this.messageInput=document.getElementById("message-input"),this.shouldCreateSeparator=!0,this._delegatedClickAttached=!1,document.addEventListener("visibilitychange",(()=>{document.hidden&&(un(this.panel),this.shouldCreateSeparator=!0)})),this.messageInput&&this.messageInput.addEventListener("focus",(()=>{un(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{forever:t,temporary:n}=en(),r=[...t,...n],o=(new DOMParser).parseFromString(e,"text/xml").getElementsByTagName("message");let a=!1;Array.from(o).forEach((e=>{const t=e.getElementsByTagName("body")[0];if(!t||!t.textContent)return;const n=t.textContent.trim();if("This room is not anonymous"===n)return;const o=/^([^,\s]+),/.exec(n);if(o&&r.includes(o[1]))return;const i=e.getAttribute("from"),s=It(i&&i.split("#")[1]?.split("@")[0]||"unknown");if(r.includes(s))return;const c=e.getAttribute("to"),l="chat"===e.getAttribute("type");let d=null;l&&c&&(d=It(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){Ft(`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===n))){const e={id:this.generateUniqueId(l?"private":"public",m,s,n),from:s,text:n,isPrivate:l,recipient:d,pending:!1,timestamp:m};this.addMessage(e)&&(a=!0)}})),a&&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=It(e.from),i=Kt.getColor(a),s=document.createElement("div");s.className="message",s.setAttribute("data-message-id",r),"Клавобот"===e.from&&(s.classList.add("banned"),this.initialLoadComplete&&hn("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&&hn(pn),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=xn(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(Pt(t)){const r=Bt(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="🔥",de(n,{en:"New messages [Click] to remove",ru:"Новые сообщения [Клик] для удаления"}),n.addEventListener("click",(()=>{e.remove()})),e.appendChild(t),e.appendChild(n),e}();t.insertBefore(e,t.firstChild),this.shouldCreateSeparator=!1}this.panel.appendChild(t),this.addDelegatedClickListeners(),gn(this.currentUsername),this.initialLoadComplete&&n&&hn(pn),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){Ft(`Message manager: Error parsing stored username IDs: ${t.message}`,"error"),e={}}let n=e[o];if(n||(n=await Ht(o),n&&(e[o]=n,sessionStorage.setItem("usernameIds",JSON.stringify(e)))),n){rn(`https://klavogonki.ru/u/#/${n}/`)}return}if(n.ctrlKey)this.messageInput.value=`/pm ${o} `,cn(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=Dt(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=Y[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()}removePrivateMessages(){for(const[e,t]of this.messageMap.entries())t.isPrivate&&(this.messageMap.delete(e),this.renderedMessageIds.delete(e));this.panel.querySelectorAll(".message.private").forEach((e=>e.remove()))}removeIgnoredMessages(){const{forever:e,temporary:t}=en(),n=[...e,...t];for(const[e,t]of this.messageMap.entries())n.includes(t.from)&&(this.messageMap.delete(e),this.renderedMessageIds.delete(e));Array.from(this.panel.querySelectorAll(".message")).filter((e=>n.includes(e.querySelector(".username").textContent.trim()))).forEach((e=>e.remove()));const r=document.getElementById("user-list");if(r){r.querySelectorAll(".user-item").forEach((e=>{const t=e.querySelector(".username")?.textContent;n.includes(t)&&e.remove()}))}}}let En=null,Sn=null,Cn=null;const Ln=document.createElement("canvas").getContext("2d");let jn,$n=!1,Mn=0;function In(e){let t=e>Mn?`${e} ➡`:e<Mn?`⬅ ${e}`:`${e}`;Cn.textContent=t,function(e){if(!Cn)return void Ft({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)`;Cn.style.setProperty("color",o,"important"),Cn.style.setProperty("background-color",a,"important"),Cn.style.setProperty("border",`1px solid ${i}`,"important"),Cn.style.setProperty("border-radius","0.4em","important")}(e),Mn=e}function An(e){$n!==e&&(Cn.classList.toggle("bounce-in",e),Cn.classList.toggle("bounce-out",!e),$n=e,e||setTimeout((()=>Cn.classList.remove("bounce-out")),500))}function Tn(){clearTimeout(jn),In(En.value.length),function(e){if(!En)return void Ft({en:"Length popup: Chat field is not defined for updating metrics.",ru:"Длинномер сообщения: Поле чата не определено для обновления метрик."},"error");const t=getComputedStyle(En);Ln.font=`${t.fontWeight} ${t.fontSize} ${t.fontFamily}`;const n=Ln.measureText(e).width,r=En.offsetLeft+n+5,o=En.offsetLeft+En.offsetWidth-Cn.offsetWidth;Cn.style.left=`${Math.min(r,o)}px`}(En.value),An(!0),jn=setTimeout((()=>An(!1)),1e3)}function zn(e){"Enter"===e.key&&(In(0),Object.assign(Cn.style,{left:"0px",color:"hsl(200, 20%, 50%)"}),An(!0),jn=setTimeout((()=>An(!1)),1e3))}function Nn(e,t){e.innerHTML=t?We:Ge,de(e,{en:"[Ctrl + Space] "+(t?"Hide chat":"Show chat"),ru:"[Ctrl + Space] "+(t?"Скрыть чат":"Показать чат")})}function Pn(e,t){e.innerHTML=t?Ve:Qe,de(e,{en:"[Ctrl + Shift + Space] "+(t?"Collapse chat":"Expand chat"),ru:"[Ctrl + Shift + Space] "+(t?"Свернуть чат":"Развернуть чат")})}function Bn(){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=On();e.classList.toggle("maximized",r.isMaximized),Pn(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)),Nn(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=Mt(r.left,0,o-e.offsetWidth)+"px",r.floating?(e.style.top=Mt(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")),Je()}function On(){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 Hn(e){localStorage.setItem("chatState",JSON.stringify(e))}function qn(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-toggle-button");if(!e)return;const n=On(),r=n.floating||!1,o=!n.isVisible;r?(e.style.opacity=o?"1":"0",setTimeout((()=>{e.style.display=o?"flex":"none",Nn(t,o),Hn({...n,isVisible:o}),o&&Ot()}),300)):(e.classList.toggle("visible-chat",o),e.classList.toggle("hidden-chat",!o),Nn(t,o),Hn({...n,isVisible:o}),o&&Ot())}function Dn(){const e=document.getElementById("app-chat-container"),t=document.querySelector(".chat-maximize-button");if(!e||!t)return;const n=On(),r=!n.isMaximized;e.classList.toggle("maximized",r),Pn(t,r),Hn({...n,isMaximized:r}),requestAnimationFrame((()=>{Je();const e=document.getElementById("messages-panel");e&&(e.scrollTop=e.scrollHeight),Ot()}))}function Rn(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");Hn({...On(),fontSizeMultiplier:e})}function _n(){Rn(On().fontSizeMultiplier)}function Un(){if(!document.getElementById("app-chat-container"))return;const e=On(),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()})),de(n,{en:`Adjust chat font size. Current: ${n.value}x`,ru:`Изменить размер шрифта чата. Текущий: ${n.value}x`}),n.addEventListener("input",(e=>{const t=parseFloat(e.target.value);Rn(t),de(n,{en:`Adjust chat font size. Current: ${t}x`,ru:`Изменить размер шрифта чата. Текущий: ${t}x`})})),t.appendChild(n);const r=document.querySelector(".chat-drag-area");r&&r.appendChild(t)}class Jn{constructor(e={}){this.container=null,this.options={container:e.container||document.body,helpButton:e.helpButton,onDestroy:e.onDestroy},Jn.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=at,de(e,{en:"Close panel",ru:"Закрыть панель"}),e.addEventListener("click",(()=>{this.remove()})),this.container.appendChild(e),document.body.appendChild(this.container),zt(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"},{key:"/list normal",desc:"User list: Normal mode (sorted by role, not by race count)"},{key:"/list race",desc:"User list: Users in a race at the top (sorted by race count)"},{key:"/list chat",desc:"User list: General chat users at the top, others (sorted by race count)"}]},{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:"Hold (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"},{key:"List + Double Click (LMB)",desc:"Toggle between user list modes (Normal/Race/Chat)"}]},{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:"Показать панель событий"},{key:"/list normal",desc:"Список пользователей: Обычный режим (сортировка по роли, без сортировки по колличеству заездов)"},{key:"/list race",desc:"Список пользователей: Пользователи в игре сверху (сортировка по колличеству заездов)"},{key:"/list chat",desc:"Список пользователей: Пользователи общего чата сверху, остальные (сортированные по колличеству заездов)"}]},{title:"Горячие клавиши чата",items:[{key:"Ctrl + Space",desc:"Скрыть/Показать чат"},{key:"Shift + Ctrl + Space",desc:"Развернуть/Свернуть чат"},{key:"Ctrl + Click",desc:"Активировать приватный чат для выбранного пользователя"},{key:"Удерживание (ЛКМ)",desc:"Активировать приватный чат для выбранного пользователя (Пользователи)"},{key:"Двойной клик (ЛКМ)",desc:"Замена выбранных пользователей одним в поле ввода (Сообщения)"},{key:"Shift + Click",desc:"Открыть профиль пользователя по никнейму в сообщении"},{key:"List + Двойной клик (ЛКМ)",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&&(zt(this.container,"hide","0"),this.container=null),"function"==typeof this.options.onDestroy&&this.options.onDestroy(),Jn.instance=null}show(){this.container?this.updatePanelContent():this.init(),document.body.contains(this.container)||(document.body.appendChild(this.container),zt(this.container,"show","1"))}toggle(){this.container&&document.body.contains(this.container)?this.remove():this.show()}}Jn.instance=null;const Fn={smileys:["😀","😃","😄","😆","😁","😅","😂","🤣","🥲","☺️","😊","😇","🙂","🙃","😉","😌","😍","🥰","😙","😚","😗","😘","😋","🥸","😵‍💫","😛","😝","😜","🤪","😎","🤓","🧐","🤨","🤩","🥳","😏","😒","😞","😔","😟","😕","🙁","☹️","😣","😖","😫","😩","🥺","😢","😭","😤","😠","😡","🤬","🤯","😳","🥵","🥶","😱","😨","😰","😥","😓","🤗","🤔","🤭","🤫","🤥","😶","😐","😑","😬","🙄","😯","😦","😧","😮","😲","🥱","😴","🤤","😪","😵","🤐","🥴","🤢","🤮","🤧","😷","🤒","🤕","🤑","🤠","😈","👿","👹","👺","🤡","💩","👻","💀","☠️","👽","👾","🤖","🎃","😺","😸","😹","😻","😼","😽","🙀","😿","😾","👋","🤚","🖐️","✋","🖖","👌","🤌","🤏","✌️","🤞","🤟","🤘","🤙","👈","👉","👆","🖕","👇","☝️","👍","👎","✊","👊","🤛","🤜","👏","🙌","👐","🤲","🤝","🙏","✍️","💅","🤳","💪","🦾","🦿","🦵","🦶","👂","🦻","👃","🧠","🫀","🫁","🦷","🦴","👀","👁️","👅","👄","👶","🧒","👦","👧","🧑","👱","👨","🧔","👩","🧓","👴","👵","🙍","🙎","🙅","🙆","💁","🙋","🧏","🙇","🤦","🤷","👮","🕵️","💂","🥷","👷","🤴","👸","👳","👲","🧕","🤵","👰","🤰","🤱","👼","🎅","🤶","🦸","🦹","🧙","🧚","🧛","🧜"],nature:["🐵","🐒","🦍","🦧","🐶","🐕","🦮","🐕‍🦺","🐩","🐺","🦊","🦝","🐱","🐈","🐈‍⬛","🦁","🐯","🐅","🐆","🐴","🐎","🦄","🦓","🦌","🦬","🐮","🐂","🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑","🐐","🐪","🐫","🦙","🦒","🐘","🦏","🦛","🐭","🐁","🐀","🐹","🐰","🐇","🦫","🦘","🦡","🐿️","🦔","🦦","🦥","🐼","🦨","🦘","🦡","🦃","🐔","🐓","🐣","🐤","🐥","🐦","🐧","🕊️","🦅","🦆","🦢","🦉","🦤","🪶","🦩","🦚","🦜","🐸","🐊","🐢","🦎","🐍","🐲","🐉","🦕","🦖","🐳","🐋","🐬","🦭","🐟","🐠","🐡","🦈","🐙","🐚","🪸","🐌","🦋","🐛","🐜","🐝","🪲","🐞","🦗","🪳","🕷️","🕸️","🦂","🦟","🪰","🪱","🌸","💮","🏵️","🌹","🥀","🌺","🌻","🌼","🌷","🌱","🪴","🌲","🌳","🌴","🌵","🌾","🌿","☘️","🍀","🍁","🍂","🍃"],food:["🍎","🍐","🍊","🍋","🍌","🍉","🍇","🍓","🫐","🍈","🍒","🍑","🥭","🍍","🥥","🥝","🍅","🍆","🥑","🥦","🥬","🥒","🌶️","🫑","🥕","🧄","🧅","🥔","🍠","🥐","🥯","🍞","🥖","🥨","🧀","🥚","🍳","🥓","🥩","🍗","🍖","🦴","🌭","🍔","🍟","🍕","🫓","🥪","🥙","🧆","🌮","🌯","🫔","🥗","🥘","🫕","🥫","🍝","🍜","🍲","🍛","🍣","🍱","🥟","🦪","🍤","🍙","🍚","🍘","🍥","🥠","🥮","🍢","🍡","🍧","🍨","🍦","🥧","🧁","🍰","🎂","🍮","🍭","🍬","🍫","🍿","🍩","🍪","🫖","☕","🍵","🧃","🥤","🧋","🍶","🍺","🍻","🥂","🍷","🥃","🍸","🍹","🧉","🍾"],activities:["⚽","🏀","🏈","⚾","🥎","🎾","🏐","🏉","🥏","🎱","🪀","🏓","🏸","🏒","🏑","🥍","🏏","⛳","🪁","🎣","🤿","🎽","🛹","🛼","🛷","⛸️","🥌","⛷️","🏂","🪂","🏋️","🤼","🤸","⛹️","🤾","🏌️","🏇","🧘","🏄","🏊","🤽","🚣","🧗","🚴","🚵","🎪","🎭","🎨","🎬","🎤","🎧","🎼","🎹","🥁","🎷","🎺","🎸","🎻","🎲","🎯","🎳","🎮","🎰","🧩","🎪","🎫","🎟️"],travel:["🚗","🚕","🚙","🚌","🚎","🏎️","🚓","🚑","🚒","🚐","🛻","🚚","🚛","🚜","🛵","🏍️","🛺","🚲","🛴","✈️","🛩️","🛫","🛬","🚁","🚀","🛸","🛶","⛵","🚤","🛥️","🛳️","⛴️","🚢","🏰","🏯","🏟️","🏖️","🏝️","🏜️","🌋","⛰️","🏔️","🗻","🏕️","🏭","🏢","🏬","🏣","🏤","🏥","🏦","🏨","🏪","🏫","🏩","💒","⛪","🕌","🕍","🛕","⛩️","🏛️"],objects:["📱","💻","⌨️","🖥️","🖨️","🖱️","🖲️","🕹️","🗜️","💽","💾","💿","📀","📼","📷","📸","📹","🎥","📞","☎️","📟","📠","📺","📻","🎙️","🎚️","🎛️","📡","🔋","🔌","💡","🔦","🕯️","🧯","🛢️","💸","💵","💴","💶","💷","🪙","💰","💳","💎","⚖️","🪜","🧰","🔧","🔨","⚒️","🛠️","⛏️","✏️","🖊️","🖋️","✒️","🖌️","🖍️","📝","📚","📖","🔖","📑","🗒️","📄","📰","🗞️","📁","📂","🗂️","🕐","🕑","🕒","🕓","🕔","🕕","🕖","🕗","🕘","🕙","🕚","🕛","🕰️","⏰","⏱️","⏲️","⌚"],symbols:["❤️","🧡","💛","💚","💙","💜","🤎","🖤","🤍","💔","❣️","💕","💞","💓","💗","💖","💘","💝","💟","☮️","✝️","☪️","🕉️","☸️","✡️","🔯","🕎","☯️","☦️","🛐","⛎","⚠️","🚸","⛔","🚫","☢️","☣️","➕","➖","➗","✖️","♾️","💲","💱","⬆️","↗️","➡️","↘️","⬇️","↙️","⬅️","↖️","↕️","↔️","↩️","↪️","⤴️","⤵️","🔃","🔄","🔆","📶","🎦","🔅","♻️","✅","❌","❎","➰","➿","〽️","✳️","✴️","❇️","©️","®️","™️"],flags:["🏁","🚩","🎌","🏴","🏳️","🏳️‍🌈","🏳️‍⚧️","🏴‍☠️","🇺🇸","🇬🇧","🇯🇵","🇰🇷","🇩🇪","🇨🇳","🇧🇷","🇮🇳","🇫🇷","🇪🇸","🇮🇹","🇷🇺","🇨🇦","🇦🇺","🇳🇿","🇲🇽","🇦🇷","🇵🇰","🇪🇬","🇸🇪","🇳🇴","🇳🇱","🇨🇭","🇹🇷","🇮🇩","🇸🇬","🇮🇱","🇵🇹","🇵🇱","🇹🇭"]},Xn={"😀":{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 Yn({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 Yn{static instance=null;constructor(e={}){if(Yn.instance)return Yn.instance;Yn.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=Fn,this.emojiKeywords=Xn,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,de(n,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",de(this.languageSelect,{en:"Select interface language",ru:"Выберите язык интерфейса"}),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),zt(this.container,"show","1"),_t()||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&&de(n,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){Ft({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&&zt(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,Yn.instance=null,this.options.emojiButton&&de(this.options.emojiButton,{en:"[Ctrl + ;] Open emoji picker",ru:"[Ctrl + ;] Открыть панель эмодзи"}),"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 Kn={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"}},Wn={"--background-color":Kn.background,"--foreground-color":Kn.foreground,"--highlight-color":Kn.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":Kn.thirdAccent,"--first-accent-color":Kn.firstAccent,"--second-accent-color":Kn.secondAccent,"--fourth-accent-color":Kn.fourthAccent,"--hotkey-label-text-color":Kn.fourthAccent,"--hotkey-label-background-color":Object.fromEntries(Object.entries(Kn.fourthAccent).map((([e,t])=>[e,t+"1a"]))),"--hotkey-label-border-color":Object.fromEntries(Object.entries(Kn.fourthAccent).map((([e,t])=>[e,t+"66"]))),"--private-mode-color":Kn.secondAccent,"--private-mode-placeholder-color":Object.fromEntries(Object.entries(Kn.secondAccent).map((([e,t])=>[e,t+"cc"]))),"--private-mode-background-color":Object.fromEntries(Object.entries(Kn.secondAccent).map((([e,t])=>[e,t+"40"]))),"--private-message-sent-color":Kn.firstAccent,"--private-message-sent-background-color":Object.fromEntries(Object.entries(Kn.firstAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-sent-border-color":Object.fromEntries(Object.entries(Kn.firstAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-sent-time-color":Kn.firstAccent,"--private-message-received-color":Kn.secondAccent,"--private-message-received-background-color":Object.fromEntries(Object.entries(Kn.secondAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-received-border-color":Object.fromEntries(Object.entries(Kn.secondAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-received-time-color":Kn.secondAccent,"--system-message-color":Kn.thirdAccent,"--system-message-background-color":Object.fromEntries(Object.entries(Kn.thirdAccent).map((([e,t])=>[e,t+"20"]))),"--system-message-border-color":Object.fromEntries(Object.entries(Kn.thirdAccent).map((([e,t])=>[e,t+"30"]))),"--system-message-time-color":Kn.thirdAccent,"--ban-message-color":Kn.fourthAccent,"--ban-message-background-color":Object.fromEntries(Object.entries(Kn.fourthAccent).map((([e,t])=>[e,t+"20"]))),"--ban-message-border-color":Object.fromEntries(Object.entries(Kn.fourthAccent).map((([e,t])=>[e,t+"30"]))),"--ban-message-time-color":Kn.fourthAccent},Gn={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"}},Vn={"--background-color":Gn.background,"--foreground-color":Gn.foreground,"--highlight-color":Gn.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":Gn.firstAccent,"--second-accent-color":Gn.secondAccent,"--third-accent-color":Gn.thirdAccent,"--fourth-accent-color":Gn.fourthAccent,"--hotkey-label-text-color":Gn.fourthAccent,"--hotkey-label-background-color":Object.fromEntries(Object.entries(Gn.fourthAccent).map((([e,t])=>[e,t+"1a"]))),"--hotkey-label-border-color":Object.fromEntries(Object.entries(Gn.fourthAccent).map((([e,t])=>[e,t+"66"]))),"--private-mode-color":Gn.secondAccent,"--private-mode-placeholder-color":Object.fromEntries(Object.entries(Gn.secondAccent).map((([e,t])=>[e,t+"cc"]))),"--private-mode-background-color":Object.fromEntries(Object.entries(Gn.secondAccent).map((([e,t])=>[e,t+"40"]))),"--private-message-sent-color":Gn.firstAccent,"--private-message-sent-background-color":Object.fromEntries(Object.entries(Gn.firstAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-sent-border-color":Object.fromEntries(Object.entries(Gn.firstAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-sent-time-color":Gn.firstAccent,"--private-message-received-color":Gn.secondAccent,"--private-message-received-background-color":Object.fromEntries(Object.entries(Gn.secondAccent).map((([e,t])=>[e,t+"20"]))),"--private-message-received-border-color":Object.fromEntries(Object.entries(Gn.secondAccent).map((([e,t])=>[e,t+"30"]))),"--private-message-received-time-color":Gn.secondAccent,"--system-message-color":Gn.thirdAccent,"--system-message-background-color":Object.fromEntries(Object.entries(Gn.thirdAccent).map((([e,t])=>[e,t+"20"]))),"--system-message-border-color":Object.fromEntries(Object.entries(Gn.thirdAccent).map((([e,t])=>[e,t+"30"]))),"--system-message-time-color":Gn.thirdAccent,"--ban-message-color":Gn.fourthAccent,"--ban-message-background-color":Object.fromEntries(Object.entries(Gn.fourthAccent).map((([e,t])=>[e,t+"20"]))),"--ban-message-border-color":Object.fromEntries(Object.entries(Gn.fourthAccent).map((([e,t])=>[e,t+"30"]))),"--ban-message-time-color":Gn.fourthAccent},Qn=(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 Zn(e){const t=document.documentElement,n=function(e){const t={},n=Wn["--background-color"][e]?Wn:Vn;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)}))}Zn(localStorage.getItem("selectedTheme")||"dark-soul");const er=()=>{const e=document.querySelector(".themes-panel");if(e)return e;const t=Qn("div","themes-panel"),n=Qn("h2",null,{text:te.themesPanelHeader[ee]});t.appendChild(n);const r=Qn("div","dark-themes"),o=Qn("div","light-themes");r.innerHTML=`<h3>${te.themesDarkHeader[ee]} <span class="counter">${Object.keys(Vn["--background-color"]).length}</span></h3>`,o.innerHTML=`<h3>${te.themesLightHeader[ee]} <span class="counter">${Object.keys(Wn["--background-color"]).length}</span></h3>`;let a=localStorage.getItem("selectedTheme")||"dark-soul";const i=Ut((e=>Zn(e)),R),s=(e,t)=>{const n=Qn("button","theme-button",{text:e.replace(/-/g," ").replace(/\b\w/g,(e=>e.toUpperCase()))});return de(n,{en:`[Hover] Preview theme ${n.textContent} [Click] Apply theme`,ru:`[Наведение] Предпросмотр темы ${n.textContent} [Клик] Применить тему`}),n.dataset.theme=t,n.addEventListener("mouseenter",(()=>{i(t)})),n.addEventListener("click",(()=>{a=t,localStorage.setItem("selectedTheme",t),c(),Zn(t)})),n};Object.keys(Vn["--background-color"]).forEach((e=>{r.appendChild(s(e,e))})),Object.keys(Wn["--background-color"]).forEach((e=>{o.appendChild(s(e,e))}));const c=()=>{const e=localStorage.getItem("selectedTheme")||"dark-soul";a=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",(()=>{i.cancel(),Zn(a)})),t.appendChild(r),t.appendChild(o),document.body.appendChild(t),zt(t,"show",1),c();const l=e=>{"Escape"===e.key&&(zt(t,"hide",0),document.removeEventListener("keydown",l),document.removeEventListener("click",d,!0))};document.addEventListener("keydown",l);const d=e=>{t.contains(e.target)||(zt(t,"hide",0),document.removeEventListener("click",d,!0),document.removeEventListener("keydown",l))};return document.addEventListener("click",d,!0),t},tr="usernameColors",nr=e=>{try{const t=e.getItem(tr);return t?JSON.parse(t):{}}catch(t){return Ft({en:`Error parsing ${e===sessionStorage?"sessionStorage":"localStorage"} data: ${t.message}`,ru:`Ошибка разбора данных ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`},"error"),{}}},rr=(e,t)=>{try{return e.setItem(tr,JSON.stringify(t)),!0}catch(t){return Ft({en:`Error saving data to ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`,ru:`Ошибка сохранения данных в ${e===sessionStorage?"sessionStorage":"localStorage"}: ${t.message}`},"error"),!1}},or=()=>nr(sessionStorage),ar=(e,t)=>{const n=nr(localStorage);return n[e]=t,rr(localStorage,n)},ir=e=>{const t=nr(localStorage);return e in t&&(delete t[e],rr(localStorage,t))},sr=e=>e in nr(localStorage),cr=(e,t,n)=>{const r=nr(localStorage);return e in r&&(delete r[e],r[t]=n,rr(localStorage,r))};function lr(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 dr(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 mr(e,t,n){e.style.color=n,Object.assign(t.style,{backgroundColor:dr(n,.4),color:n}),t.textContent=n}function ur(){const e=document.querySelector(".chat-username-color-picker");if(e)return e;const t=or();let n=null,r=null,o=null;const a=lr("div","chat-username-color-picker"),i=lr("div","username-colors");a.appendChild(i);const s=lr("h2",null,{text:te.usernameColorsHeader[ee]});i.appendChild(s);const c=lr("button","close-btn");c.innerHTML=at,de(c,{en:"Close panel",ru:"Закрыть панель"}),c.addEventListener("click",(()=>{zt(a,"hide",0)})),a.appendChild(c);const l=lr("div","generated-username-colors",{html:`<h3>${te.generatedColorsHeader[ee]} <span class="counter">0</span></h3>`});function d(){if(!n){n=lr("div","saved-username-colors",{html:`<h3>${te.savedColorsHeader[ee]} <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",sr(t))})),m()}function p(e,r,o=!1){const a=lr("div","username-entry"),i=lr("div","username",{text:e}),s=lr("div","color-box");de(s,{en:"[Click] Select new color [Hold (LMB)] Set hex color value",ru:"[Клик] Выбрать новый цвет [Удерживание (ЛКМ)] Установить hex значение цвета"}),mr(i,s,r);const c=lr("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=Ut((()=>{const r=c.value;mr(i,s,r),o?(ar(e,r),a._color=r,a._removeBtn&&a.contains(a._removeBtn)?Object.assign(a._removeBtn.style,{backgroundColor:dr(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:dr(r,.4),color:r}):a._editBtn=h(a,e,r)):(t[e]=r,rr(sessionStorage,t),ar(e,r),d(),g(),u())}),1e3);return c.addEventListener("input",l),a}function h(e,t,n){const r=lr("div","entry-btn edit-btn");return r.innerHTML=ot,de(r,{en:"Edit username",ru:"Редактировать имя пользователя"}),Object.assign(r.style,{backgroundColor:dr(n,.4),color:n}),r.addEventListener("click",(t=>{t.stopPropagation(),k(e,"username")})),e.appendChild(r),r}function g(){if(!n)return;const e=nr(localStorage);n.innerHTML=`<h3>${te.savedColorsHeader[ee]} <span class="counter">0</span></h3>`,n.appendChild(function(){const e=lr("div","username-entry"),t=lr("div","entry-btn remove-all-btn");t.innerHTML=at,de(t,{en:"Remove all saved colors",ru:"Удалить все сохранённые цвета"}),t.addEventListener("click",(e=>{e.stopPropagation(),k({_confirmation:!1},"removeAll",(()=>{localStorage.removeItem(tr);const e=document.querySelector(".chat-username-color-picker");e&&(e.remove(),ur()),Ft({en:"All saved username colors have been removed",ru:"Все сохранённые цвета имён пользователей удалены"},"info")}))}));const n=lr("div","entry-btn load-btn");n.innerHTML=ct,de(n,{en:"Load colors from GitHub",ru:"Загрузить цвета из GitHub"}),n.addEventListener("click",(e=>{e.stopPropagation(),fetch(Q).then((e=>{if(!e.ok)throw new Error(`Failed to load: ${e.statusText}`);return e.json()})).then((e=>{localStorage.setItem("usernameColors",JSON.stringify(e)),Ft({en:"Username colors loaded successfully",ru:"Цвета имён пользователей успешно загружены"},"success");const t=document.querySelector(".chat-username-color-picker");t&&(t.remove(),ur())})).catch((e=>{Ft(`Error loading colors: ${e.message}`,"error")}))}));const r=lr("div","entry-btn import-btn");r.innerHTML=it,de(r,{en:"Import colors",ru:"Импортировать цвета"}),r.addEventListener("click",(e=>{e.stopPropagation(),hr()}));const o=lr("div","entry-btn export-btn");o.innerHTML=st,de(o,{en:"Export colors",ru:"Экспортировать цвета"}),o.addEventListener("click",(e=>{e.stopPropagation(),pr()}));const a=lr("div","entry-btn add-btn");return a.innerHTML=rt,de(a,{en:"Add username",ru:"Добавить имя пользователя"}),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),zt(a,"show",1);const f=e=>{"Escape"===e.key&&(zt(a,"hide",0),document.removeEventListener("keydown",f))};document.addEventListener("keydown",f);const b=e=>{a.contains(e.target)||(zt(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=lr("div","confirmation"),i=lr("button","field-btn cancel-btn",{text:"Cancel"}),s=lr("button","field-btn confirm-btn",{text:"Confirm"});let c=null;function l(){a.remove(),e._confirmation=!1}"color"===t||"username"===t?(c=lr("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 Ft({en:"The field cannot be empty",ru:"Поле не может быть пустым"},"warning"),void y(c);if(!/^#[0-9A-Fa-f]{6}$/.test(t))return Ft({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 Ft({en:"The field cannot be empty",ru:"Поле не может быть пустым"},"warning"),void y(c);if(!await Ht(t))return Ft({en:`Could not find user "${t}"`,ru:`Не удалось найти пользователя "${t}"`},"error"),void y(c);if(e._add){return ar(t,"#cdcdcd"),d(),g(),u(),void l()}t!==e._username&&(cr(e._username,t,e._color),e.querySelector(".username").textContent=t,e._username=t,u())}else"remove"===t?(ir(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=lr("div","entry-btn remove-btn"),o.innerHTML=at,de(o,{en:"Remove entry",ru:"Удалить запись"}),Object.assign(o.style,{backgroundColor:dr(n,.4),color:n}),o.addEventListener("click",(n=>{n.stopPropagation(),e._confirmation||k(e,"remove",(()=>{ir(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 ir(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")}),H),o=n)})),a.addEventListener("pointerup",v),a.addEventListener("pointerleave",v),a.addEventListener("pointercancel",v),a}function pr(){const e=localStorage.getItem("usernameColors");if(!e)return void Ft({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),Ft({en:"Username colors exported as JSON file",ru:"Цвета имён пользователей экспортированы в JSON-файл"},"success")}function hr(){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 Ft({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)),Ft({en:"Username colors imported successfully",ru:"Цвета имён пользователей успешно импортированы"},"info")}catch(e){Ft({en:"Invalid JSON file",ru:"Некорректный JSON-файл"},"error")}},n.readAsText(t)})),e.click(),document.body.removeChild(e)}function gr(){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",qn),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.classList.add("emoji-button"),i.textContent=W[Math.floor(Math.random()*W.length)],de(i,{en:"[Ctrl + ;] Open emoji picker",ru:"[Ctrl + ;] Открыть панель эмодзи"});let s=null;i.addEventListener("click",(e=>{e.stopPropagation(),s&&document.querySelector(".emoji-panel")?s.destroy():(s=new Yn({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:()=>{s=null}}),s.init(),de(i,{en:"[Esc, qq] Close emoji picker",ru:"[Esc, qq] Закрыть панель эмодзи"}))}));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=Ke,de(l,{en:"[Enter] Send message",ru:"[Enter] Отправить сообщение"}),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=lt,de(p,{en:"[/events] View events",ru:"[/events] Просмотреть события"}),p.addEventListener("click",(()=>{wt()}));const h=document.createElement("button");h.className="button header-button chat-blocked-button",h.innerHTML=nt,de(h,{en:"[/ignored] Block user",ru:"[/ignored] Заблокировать пользователя"}),h.addEventListener("click",(()=>{tn()}));const g=document.createElement("button");g.className="button header-button chat-colors-button",g.innerHTML=tt,de(g,{en:"[/colors] Set username color",ru:"[/colors] Задать цвет пользователю"}),g.addEventListener("click",(()=>{ur()}));const f=document.createElement("button");f.className="button header-button chat-theme-button",f.innerHTML=et,de(f,{en:"[/themes] Change theme",ru:"[/themes] Сменить тему"}),f.addEventListener("click",(()=>{er()}));const b=document.createElement("button");b.className="button header-button chat-help-button",b.innerHTML=Ze,de(b,{en:"[/help] Show chat help",ru:"[/help] Показать справку чата"});let v=null;b.addEventListener("click",(e=>{if(e.stopPropagation(),v&&document.querySelector(".help-panel"))return v.remove(),de(b,{en:"[/help] Show chat help",ru:"[/help] Показать справку чата"}),void(v=null);v=new Jn({helpButton:b,onDestroy:()=>{de(b,{en:"[/help] Show chat help",ru:"[/help] Показать справку чата"}),v=null}}),v.init(),v.show(),de(b,{en:"[/help] Hide chat help",ru:"[/help] Скрыть справку чата"})}));const y=document.createElement("button");y.className="button header-button chat-maximize-button",y.addEventListener("click",Dn);const k=document.createElement("button");k.className="button header-button chat-toggle-button",k.addEventListener("click",qn),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}(),Bn(),Un(),_n(),requestAnimationFrame((()=>{c&&(c.value=""),Sn=o,Cn=document.createElement("div"),Cn.className="length-field-popup",Sn.appendChild(Cn),En=c,En?Cn?(En.addEventListener("input",Tn),En.addEventListener("keydown",zn)):Ft({en:"Length popup: Popup element is not created, skipping event listeners.",ru:"Длинномер сообщения: Всплывающее окно не создано, обработчики событий не добавлены."},"warning"):Ft({en:"Length popup: Chat field is null during initialization.",ru:"Длинномер сообщения: Поле чата равно null при инициализации."},"error"),function(e,t,n,r,o){if(_t()){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      #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),yt()}))}function fr(){localStorage.removeItem("klavoauth"),localStorage.removeItem("chatUsernameColor"),setTimeout((()=>{window.location.href="https://klavogonki.ru/gamelist/"}),500)}const br={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 vr(){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 yr=[{name:"reset",pattern:/^\/reset\s*$/,handler:()=>(fr(),localStorage.removeItem("userAvatarCache"),localStorage.removeItem("chatState"),localStorage.removeItem("chatEvents"),Ft({en:"Chat settings have been reset. Reloading...",ru:"Настройки чата сброшены. Перезагрузка..."},"info"),!0)},{name:"colors",pattern:/^\/colors\s*$/,handler:()=>(ur(),!0)},{name:"export colors",pattern:/^\/export\s+colors\s*$/,handler:()=>(pr(),!0)},{name:"import colors",pattern:/^\/import\s+colors\s*$/,handler:()=>(hr(),!0)},{name:"themes",pattern:/^\/themes\s*$/,handler:()=>(er(),!0)},{name:"help",pattern:/^\/help\s*$/,handler:()=>{if(Jn.instance)Jn.instance.remove();else{const e=new Jn({onDestroy:()=>{}});e.init(),e.show()}return!0}},{name:"ignored",pattern:/^\/ignored\s*$/,handler:()=>(tn(),!0)},{name:"events",pattern:/^\/events\s*$/,handler:()=>(wt(),!0)},{name:"list normal",pattern:/^\/list\s+normal\s*$/,handler:()=>(localStorage.setItem("userlistMode","normal"),xr(),Ft({en:"User list mode set to normal",ru:"Список пользователей: обычный режим"},"info"),!0)},{name:"list race",pattern:/^\/list\s+race\s*$/,handler:()=>(localStorage.setItem("userlistMode","race"),xr(),Ft({en:"User list mode set to race",ru:"Список пользователей: заезды сверху"},"info"),!0)},{name:"list chat",pattern:/^\/list\s+chat\s*$/,handler:()=>(localStorage.setItem("userlistMode","chat"),xr(),Ft({en:"User list mode set to general chat",ru:"Список пользователей: общий чат сверху"},"info"),!0)}];function kr(e){e&&e.addEventListener("input",(()=>{!function(e){if(!e)return!1;const t=e.value;for(const n of yr)if(n.pattern.test(t)){const t=n.handler();return t&&(e.value=""),t}}(e)}))}function xr(){const e=window.userManager;e?e.updateUI():console.warn("UserManager is not initialized")}let wr,Er,Sr,Cr,Lr=!1;let jr,$r,Mr,Ir,Ar,Tr,zr=!1,Nr=null,Pr=0;function Br(e,t,n,r){const o=e=>e&&t.updatePresence(e),a=e=>e&&n.processMessages(e);let i=function(){const e=Tt(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}=Yt.hexToHSL(e),o=e;for(;Yt.contrastRatio(o,"#FFFFFF")<4.5&&r>0;)o=Yt.hslToHex(t,n,--r);return o})(localStorage.getItem("chatUsernameColor"))||V,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 Rt(`\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)}catch(e){Ft({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=Rt(`\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=Rt(`\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&&(Ft({en:"Chat connected successfully.",ru:"Чат успешно подключён."},"success"),n.refreshMessages(!0),this.isReconnecting=!1),this.startHttpBinding(),this.processQueue(),this.checkConnection();break}catch(e){Ft({en:`XMPP Client: Connection error: ${e.message}`,ru:`XMPP клиент: ошибка соединения: ${e.message}`},"error"),t--,0===t?(Ft({en:`Scheduling reconnection attempt in ${B/1e3} seconds...`,ru:`Переподключение через ${B/1e3} секунд...`},"warning"),this.isReconnecting=!0,setTimeout((()=>this.connect()),B)):(Ft({en:`Retrying connection... (${t} attempts left)`,ru:`Повторное подключение... (осталось попыток: ${t})`},"warning"),await new Promise((e=>setTimeout(e,B))))}}catch(e){Ft({en:`XMPP Client: Final connection error: ${e.message}`,ru:`XMPP клиент: окончательная ошибка соединения: ${e.message}`},"error"),this.isConnected=!1,this.isReconnecting||(Ft({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&&(Ft({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(t){const r=`msg_${Date.now()}`;let o=!1,a=null,i=null;const s=!this.isConnected||this.isReconnecting;on.isPrivateMode&&on.fullJid?(o=!0,a=on.fullJid,i=on.targetUsername,n.addSentMessage(t,{isPrivate:!0,recipient:i,pending:s})):n.addSentMessage(t,{pending:s});const c=Date.now();if(this.lastSentMessage&&this.lastSentMessage.text===t&&c-this.lastSentMessage.timestamp<J)return void Ft({en:`Prevented duplicate message: ${t}`,ru:`Предотвращено дублирование сообщения: ${t}`},"warning");if(this.messageQueue.has(r))return void Ft({en:`Message already queued for sending: ${r}`,ru:`Сообщение уже в очереди на отправку: ${r}`},"warning");this.lastSentMessage={text:t,timestamp:c};const l={text:t,id:r,isPrivate:o,fullJid:a,recipient:i,pending:s,enqueueTime:c};if(this.isConnected&&!this.isReconnecting){const i=this._createMessageStanza(t,r,o,a);e.sendRequestWithRetry(i).then((()=>{n.updatePendingStatus(r,!1)})).catch((e=>{Ft({en:`Failed to send message (${r}): ${e.message}`,ru:`Не удалось отправить сообщение (${r}): ${e.message}`},"error"),this.messageQueue.set(r,l),n.updatePendingStatus(r,!0)}))}else this.messageQueue.set(r,l),n.updatePendingStatus(r,!0)},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){if(!this.shouldCheckConnection)return;Ft({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",(()=>{Ft({en:"Network connection lost.",ru:"Сетевое соединение потеряно."},"warning"),s.stopHttpBinding(),s.isConnected=!1,s.shouldCheckConnection=!1,s.clearCheckConnectionTimeout(),n.refreshMessages(!1,"network")})),window.addEventListener("online",(()=>{Ft({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 Or(){if(function(){try{return window!==window.top}catch(e){return!0}}())return Ft("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){Ft({en:`Authentication error: ${e.message}`,ru:`Ошибка аутентификации: ${e.message}`},"error"),fr()}}(),!1;return!!(localStorage.getItem("klavoauth")&&br.username&&br.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")}}(),!Or())return;gr(),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(),Dn()):e.ctrlKey&&"Space"===e.code&&(e.preventDefault(),qn())})),t&&t.addEventListener("click",qn),n&&n.addEventListener("dblclick",qn)}(),document.addEventListener("mousedown",(e=>{if(!e.target.closest(".chat-drag-area"))return;const t=document.getElementById("app-chat-container");let n=On();if(Lr=!0,wr=e.clientX,Er=e.clientY,Sr=t.offsetLeft,Cr=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"),Hn(n)}document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!Lr)return;const t=document.getElementById("app-chat-container"),n=window.innerWidth,r=window.innerHeight,o=e.clientX-wr,a=e.clientY-Er,i=Mt(Sr+o,0,n-t.offsetWidth),s=Mt(Cr+a,0,r-t.offsetHeight);t.style.left=i+"px",t.style.top=s+"px";let c=On();c.left=i,c.top=s,c.floating=!0,Hn(c)})),document.addEventListener("mouseup",(()=>{if(!Lr)return;Lr=!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=On();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")),Hn(i),document.body.style.userSelect=""})),document.addEventListener("mousedown",(e=>{const t=e.target.closest(".resize-handle");if(!t)return;zr=!0,Nr=t.classList[1];const n=document.getElementById("app-chat-container");jr=e.clientX,$r=e.clientY,Mr=n.offsetWidth,Ir=n.offsetHeight,Ar=n.offsetLeft,Tr=parseInt(n.style.top)||n.getBoundingClientRect().top,Pr=e.clientY-Tr,document.body.style.userSelect="none"})),document.addEventListener("mousemove",(e=>{if(!zr)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=On();if("left"===Nr){const r=Math.max(a,Mr-(e.clientX-jr)),o=Mt(Ar+(e.clientX-jr),0,n-r);t.style.width=r+"px",t.style.left=o+"px",s.width=r,s.left=o}else if("right"===Nr){const r=n-t.getBoundingClientRect().left,o=Math.min(r,Math.max(a,Mr+(e.clientX-jr)));t.style.width=o+"px",s.width=o}const c=e.clientY-Pr;if("top"===Nr)if(!1===s.floating){let e=Mt(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=Mt(c,0,Tr+Ir-i),n=Ir-(e-Tr);n=Math.min(n,r),t.style.top=e+"px",t.style.height=n+"px",s.top=e,s.height=n}if("left"===Nr||"right"===Nr)if(!1===s.floating){let e=Mt(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=Mt(c,0,Tr+Ir-i),n=Ir-(e-Tr);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),Hn(s),Je()})),document.addEventListener("mouseup",(()=>{zr=!1,document.body.style.userSelect=""})),window.addEventListener("resize",(()=>{Bn(),Je()})),$t();const t=new mn("user-list");window.userManager=t;const n=new wn("messages-panel",It(br.username));window.messageManager=n;const r=Br(new Xt({username:br.username,password:br.password}),t,n,br.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=>Pt(e)?Bt(e):e)))))),(e=o)&&e.addEventListener("input",(()=>{cn(e)})),kr(o),await r.connect(),window.xmppClient=r}catch(e){Ft(`App initialization error: ${e.message}`,"error"),fr()}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=>kn(e)))),n=JSON.parse(localStorage.getItem(fn)||"[]").filter((e=>t.has(e)));if(localStorage.setItem(fn,JSON.stringify(n)),0===n.length){const e=document.querySelector(".toggle-button");e&&e.remove()}}(),vr()}))})();