Dashboard Fellow z pełnym czatem, konfigurowalnym feedem i ustawieniami
// ==UserScript==
// @name Fellow Enhanced
// @namespace http://tampermonkey.net/
// @version 0.2
// @description Dashboard Fellow z pełnym czatem, konfigurowalnym feedem i ustawieniami
// @author Sznymo
// @match https://m.fll.pl/*
// @match https://m.fellow.pl/*
// @match https://fll.pl/*
// @match https://fellow.pl/*
// @license Apache License 2.0
// @supportURL https://gitgud.io/Sznymo/UserScripts
// @contributionURL https://www.paypal.com/paypalme/sznymo
// @compatible chrome
// @compatible firefox
// @compatible edge
// @compatible opera
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @grant GM_deleteValue
// @grant GM_notification
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @grant GM_download
// @grant window.close
// @grant window.focus
// @run-at document-start
// ==/UserScript==
!function(){const e={VERSION:"0.2",NAME:"Fellow Enhanced",COLOR_SCHEME_KEY:"fellow_color_scheme",SHOW_AVATARS_KEY:"fellow_avatars_enabled",SHOW_RECENT_COMMENTS_KEY:"fellow_show_recent_comments",USER_NAME_KEY:"fellow_user",USER_ID_KEY:"fellow_id",USER_AVATAR_KEY:"fellow_avatar",USER_TOKEN_KEY:"fellow_token",FEED_SECTIONS_KEY:"fellow_feed_sections",CHAT_POSITION_KEY:"fellow_chat_position",API_BASE:"https://m.fll.pl/profile.php",WS_URL:"wss://fll.pl/rcws/",SHOW_CALENDAR_WIDGET_KEY:"fellow_show_calendar_widget",SHOW_COMMENTS_WIDGET_KEY:"fellow_show_comments_widget",SHOW_NOTES_WIDGET_KEY:"fellow_show_notes_widget",SHOW_PLUS_WIDGET_KEY:"fellow_show_plus_widget",CACHE_TIMEOUT:3e5,ICONS:{SEND:"/_layout/send.svg",NO_FOTO:"/_layout/no-foto-red.svg",NO_FOTO_FULL:"/_layout/no-foto-red.svg",CHAT:"/_layout/fchat.svg",MESSAGES:"/_layout/messages.svg",LIST_FAVORITES:"/_layout/list-favorites.svg",LIST_FRIENDS:"/_layout/list-friends.svg",LIST_BLOCKED:"/_layout/list-blocked.svg",LIST_NOTIFY:"/_layout/list-notify.svg",HEAD_EDIT_PROFILE:"/_layout/head-edit-profile.svg",HEAD_EDIT_GALLERY:"/_layout/head-edit-gallery.svg",HEAD_EDIT_GPS:"/_layout/head-edit-gps.svg",HEAD_EDIT_PLUS:"/_layout/head-edit-plus.svg",HEAD_SETTINGS:"/_layout/head-settings.svg",SEARCH:"/_layout/search.svg",HOME_GPS:"/_layout/home_gps.svg",EMO_PATH:"/_layout/emo/"},EMOJI_LIST:["😀","😃","😄","😁","😆","😅","😂","🤣","😊","😇","🙂","🙃","😉","😌","😍","🥰","😘","😗","😙","😚","😋","😛","😝","😜","🤪","😎","🥳","😏","😞","😔","😟","😕","🙁","☹️","😣","😖","😫","😩","🥺","😢","😭","😤","😠","😡","🤬","🤯","😱","😨","😰","😥","😓","🤗","🤔","🤭","🤫","🤥","😶🌫️","🥴","🤤","😵💫","🫨","🤐","😮💨","😵","🫥","😑","😒","🙄","😬","😮","😯","😲","😳","😈","👿","🤓","🧐","😼","🙈","🙉","🙊","🫠","🥵","🥶","❤️","🧡","💛","💚","💙","💜","🖤","🤍","🤎","💔","❤️🔥","❤️🩹","💖","💘","💝","💕","💞","💓","💗","💋","👄","🫦","👍","👎","👏","🙌","🤝","👊","✌️","🤞","🫶","🤏","🫳","🫴","🫲","🫱","🤘","🤙","🫵","💅","🔥","💯","💢","💦","💨","🫧","🌟","⭐","✨","💫","🌈","☀️","🌙","⚡","🪐","💥","💤","🤌","🆒","🆕","🅿️","🚼","⚠️","♻️","✅","❌","❓","❗","🐶","🐱","🦊","🐻","🐼","🐨","🐸","🐧","🐷","🐽","🐮","🦁","🐺","🦜","🦩","🦚","🦢","🦥","🦔","🐿️","🦡","🦦","🦤","🍆","🍑","🍌","🍒","🍓","🍕","🍔","🌮","🍩","🍰","🧁","☕","🍷","🍺","🍹","🧃","🧊","🥢","🍜","🍣","🍙","🍤","🍥","🍡","🍪","🌸","🌺","🌻","🌼","🍀","🌊","🍂","🍁","🌲","🌵","⚽","🏀","🏈","🎱","🎯","🎲","🎮","🎵","🎧","📸","🕶️","✈️","🚗","🚲","🛵","🚀","🛸","🚢","🚁","🏁","🚩","🎌","🏳️🌈","🏳️⚧️","🔞","♈","♉","♊","♋","♌","♍","♎","♏","♐","♑","♒","♓","⛎","👅","👀","👁️","🧠","🫁","🦷","👂","🦾","🦿","👄","🧸","🎭","🩰","🧩","♟️","🧿","🪬","👨❤️👨","👬","💑","💏"],LIST_TYPES:{visitors:{title:"Odwiedzający",icon:"👥",url:"visitors"},history:{title:"Odwiedzone",icon:"📜",url:"history"},favorites:{title:"Ulubione",icon:"⭐",url:"favorites"},blocked:{title:"Zablokowani",icon:"🚫",url:"blocked"},friends:{title:"Znajomi",icon:"👤",url:"friends"},likes:{title:"W ulubionych",icon:"❤️",url:"likes"}},CONVERSATION_STARTERS:["👋 Hej! Jak leci? Szukam kogoś do pogadania i może czegoś więcej…","🔥 Widzę, że masz niezły profil. Chyba zaraz się spocę.","🍆 Podobno wielkość nie ma znaczenia – to prawda?","🫦 Masz taki opis, że aż usiadłem… i nie wstanę.","💅 Powiedz, że lubisz planszówki i długie spacery po lesie, a pęknie mi serce z miłości.","😏 Patrzę na Twoje zdjęcia i zastanawiam się, czy to już miłość, czy po prostu ruja.","🧸 Szukam misia do przytulania. Zgłaszasz się?","🍑 FLL mówi, że jestem w Twoim typie. Sprawdzimy to empirycznie?","🥂 Co powiesz na wirtualną randkę? Ja stawiam emotki.","🎮 Grasz w coś? Bo chętnie zagram w 'kto pierwszy się zakocha'.","🚿 Cześć! Właśnie wyszedłem spod prysznica – dosłownie i w przenośni.","💌 Podobno jesteśmy dopasowani w 69%… Chcesz sprawdzić, czy to nie oszustwo?"],COMMENT_STARTERS:["🔥 Twój profil jest tak gorący, że mój telefon zaczął się pocić.","👀 Odwiedziłem Twój profil i zapomniałem po co przyszedłem… Ah, żeby popatrzeć.","💪 Chyba muszę zmienić ustawienia geolokalizacji, bo ty jesteś poza moim zasięgiem… dosłownie i w przenośni.","🍕 Jesteś jak pizza – nawet jak zimny, to i tak bym zjadł.","🧸 Masz vibe przytulaka. Potrzebujesz certyfikowanego testera uścisków?","🕺 Twój profil sprawił, że zacząłem tańczyć w miejscu. Nie pytaj, po prostu daj znać, kiedy randka.","🌈 Fajnie, że Fellow istnieje, bo bez niego nigdy bym nie trafił na taki cud natury jak Twój profil.","📸 Jeśli Twoje zdjęcia to wina aparatu, to ja chcę taki sam.","😄 Uśmiechnąłem się jak głupi do ekranu. Mam nadzieję, że jesteś z tego dumny.","⭐ Daję gwiazdkę i nadstawiam drugi policzek, bo taki profil to dar od losu.","🍆 Piszę tylko dlatego, że kolega kazał… Ten kolega to ja 5 sekund temu.","💖 Jeśli to portal randkowy, to chyba właśnie znalazłem powód, żeby tu być."],CALENDAR_EVENTS_KEY:"fellow_calendar_events",CALENDAR_EMOJI:{spotkanie:"🤝",randka:"💕",urodziny:"🎂",impreza:"🎉",wyjazd:"✈️",kino:"🎬",kawa:"☕",spacer:"🌳","siłownia":"💪",zakupy:"🛍️",praca:"💼",nauka:"📚",lekarz:"🏥",restauracja:"🍽️","plaża":"🏖️",gry:"🎮",muzyka:"🎵",inny:"📅"},MAX_RECONNECT_ATTEMPTS:5,MAX_RECEIVED_MESSAGE_IDS:2e3,MESSAGE_ID_CLEANUP_THRESHOLD:1e3,RECEIVED_MESSAGE_TTL:3e5,AUTO_CONNECT_CHAT_KEY:"fellow_auto_connect_chat",MENTION_NOTIFY_KEY:"fellow_mention_notify"};let n="Fellow Enhanced - Dashboard";function t(e,t=!1){t?(document.title=e,window._originalTitleSaved||(n=document.title,window._originalTitleSaved=!0)):(document.title=e,n=e)}function o(){document.title=n}function r(){try{if(document.querySelector('link[rel="icon"][data-fellow="true"]'))return;const e="https://m.fll.pl/_layout/favicon.svg";if(document.querySelectorAll('link[rel="icon"]:not([data-fellow="true"]), link[rel="shortcut icon"]:not([data-fellow="true"]), link[rel="apple-touch-icon"]:not([data-fellow="true"])').forEach(e=>e.remove()),!document.querySelector('link[rel="icon"][data-fellow="true"]')){const n=document.createElement("link");n.rel="icon",n.type="image/svg+xml",n.href=e,n.setAttribute("data-fellow","true"),document.head.appendChild(n);const t=document.createElement("link");t.rel="icon",t.type="image/png",t.href="https://m.fll.pl/_layout/favicon.png",t.sizes="32x32",t.setAttribute("data-fellow","true"),document.head.appendChild(t);const o=document.createElement("link");o.rel="apple-touch-icon",o.href="https://m.fll.pl/_layout/favicon.png",o.setAttribute("data-fellow","true"),document.head.appendChild(o)}console.log("✅ Favicon zaktualizowany:",e)}catch(e){console.warn("Nie udało się zaktualizować favicon:",e)}}function a(){const e=window.location.pathname;let o="Fellow Enhanced";o="/dashboard"===e||"/dashboard/"===e?"🏠 Dashboard - Fellow Enhanced":e.includes("/profile")&&!e.includes("edit")?"👤 Profil użytkownika - Fellow Enhanced":e.includes("edit_profile")?"✏️ Edycja profilu - Fellow Enhanced":e.includes("search")?"🔍 Wyszukiwarka - Fellow Enhanced":e.includes("messages")?"✉️ Wiadomości - Fellow Enhanced":e.includes("chat")?"💬 Czat na żywo - Fellow Enhanced":e.includes("gallery")?"🖼️ Galeria - Fellow Enhanced":e.includes("settings")?"⚙️ Ustawienia - Fellow Enhanced":e.includes("plus")?"⭐ Fellow+ - Fellow Enhanced":"/"===e||"/index.php"===e?"📱 Fellow Enhanced - Nowoczesny portal randkowy":`✨ ${u.currentUserName||"Fellow Enhanced"} - Fellow Enhanced`,t(o,!1),window._originalTitleSaved=!0,n=o}function i(){const{canUse:n,timeLeft:t}=function(){const e=GM_getValue("fellow_destiny_last_use",0),n=Date.now(),t=864e5;return n-e>=t?{canUse:!0,timeLeft:0}:{canUse:!1,timeLeft:t-(n-e)}}();if(!n)return void m("🔮 Przeznaczenie dostępne za "+(o=t,`${Math.floor(o/36e5)}g ${Math.floor(o%36e5/6e4)}m ${Math.floor(o%6e4/1e3)}s`),"info",5e3);var o;const r=(new Date).toDateString(),a=GM_getValue("fellow_destiny_rerolls",{date:"",count:0});let i=1;i=a.date===r?Math.max(0,1-a.count):1;const s=document.createElement("div");s.className="destiny-fullscreen-overlay",s.style.cssText="\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n background: radial-gradient(ellipse at center, #1a0a2e 0%, #0d0015 30%, #000000 70%);\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n overflow: hidden;\n transition: background 0.5s ease;\n ",document.body.appendChild(s);const l=document.createElement("div");l.style.cssText="\n position: fixed;\n top: 30px;\n left: 0;\n right: 0;\n text-align: center;\n z-index: 20;\n color: var(--gold);\n font-size: 28px;\n font-weight: bold;\n text-shadow: 0 0 30px rgba(212, 175, 55, 0.6);\n letter-spacing: 2px;\n animation: glowPulse 2s ease-in-out infinite;\n pointer-events: none;\n ",l.innerHTML="✨ PRZEZNACZENIE ✨",s.appendChild(l);const d=document.createElement("div");d.style.cssText="\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);\n opacity: 0;\n transition: opacity 1s ease;\n pointer-events: none;\n animation: dreamPulse 3s ease-in-out infinite;\n ",s.appendChild(d);const c=document.createElement("div");c.style.cssText="\n position: absolute;\n width: 300px;\n height: 300px;\n border-radius: 50%;\n background: radial-gradient(circle at 30% 30%, rgba(200,200,255,0.3), rgba(100,100,200,0.1));\n box-shadow: 0 0 50px rgba(100,100,255,0.5), inset 0 0 30px rgba(255,255,255,0.3);\n z-index: 15;\n cursor: pointer;\n transition: all 0.5s ease;\n backdrop-filter: blur(5px);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 80px;\n animation: floatBall 3s ease-in-out infinite;\n ",c.innerHTML="🔮",s.appendChild(c);const p=document.createElement("div");p.style.cssText="\n position: absolute;\n bottom: 80px;\n left: 0;\n right: 0;\n text-align: center;\n color: rgba(255,255,255,0.5);\n font-size: 14px;\n z-index: 15;\n pointer-events: none;\n letter-spacing: 1px;\n ",p.textContent="Kliknij w kulę, aby rozpocząć",s.appendChild(p);const g=document.createElement("div");g.style.cssText="\n position: absolute;\n top: 50%;\n left: 50%;\n width: 350px;\n height: 350px;\n margin: -175px 0 0 -175px;\n border-radius: 50%;\n background: radial-gradient(circle, #000000 30%, transparent 65%);\n box-shadow: 0 0 60px 20px rgba(147, 51, 234, 0.3), 0 0 120px 40px rgba(79, 70, 229, 0.2), inset 0 0 100px 30px rgba(0, 0, 0, 0.9);\n z-index: 0;\n animation: blackHolePulse 3s ease-in-out infinite;\n opacity: 0;\n transform: scale(0);\n transition: all 0.5s ease;\n ",s.appendChild(g);const h=document.createElement("div");h.style.cssText="\n position: absolute;\n top: 50%;\n left: 50%;\n width: 450px;\n height: 450px;\n margin: -225px 0 0 -225px;\n border-radius: 50%;\n border: 2px solid transparent;\n border-top-color: rgba(192, 132, 252, 0.4);\n animation: accretionSpin 8s linear infinite;\n z-index: 0;\n opacity: 0;\n transition: all 0.5s ease;\n ",s.appendChild(h);const x=document.createElement("canvas");x.style.cssText="position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none;",s.appendChild(x);const b=x.getContext("2d");x.width=window.innerWidth,x.height=window.innerHeight;const f=[];for(let e=0;e<60;e++)f.push({x:Math.random()*x.width,y:Math.random()*x.height,size:3*Math.random()+1,speedX:2*(Math.random()-.5),speedY:2*(Math.random()-.5),emoji:["✨","⭐","💫","⚡","🔮","💜","🌌","🪐"][Math.floor(8*Math.random())]});!function e(){b.clearRect(0,0,x.width,x.height),f.forEach(e=>{e.x+=e.speedX,e.y+=e.speedY,e.x<0&&(e.x=x.width),e.x>x.width&&(e.x=0),e.y<0&&(e.y=x.height),e.y>x.height&&(e.y=0),b.font=8*e.size+"px Arial",b.textAlign="center",b.fillStyle=`rgba(255,255,255,${.3+.2*Math.sin(.001*Date.now())})`,b.fillText(e.emoji,e.x,e.y)}),s.parentNode&&requestAnimationFrame(e)}();const y=document.createElement("div");y.style.cssText="\n position: relative;\n z-index: 10;\n text-align: center;\n width: 90%;\n max-width: 900px;\n opacity: 0;\n transition: opacity 0.5s ease;\n pointer-events: none;\n ",s.appendChild(y);const w=document.createElement("div");w.style.cssText="\n display: flex;\n gap: 30px;\n justify-content: center;\n flex-wrap: wrap;\n margin-top: 30px;\n opacity: 0;\n transform: scale(0.8);\n transition: all 0.5s ease;\n pointer-events: none;\n ",y.appendChild(w);const k={younger:"radial-gradient(ellipse at center, #0a2e1a 0%, #051508 30%, #000000 70%)",balanced:"radial-gradient(ellipse at center, #2e1a4a 0%, #15082a 30%, #000000 70%)",older:"radial-gradient(ellipse at center, #4a2e0a 0%, #2a1505 30%, #000000 70%)",surprise:"radial-gradient(ellipse at center, #4a0a2e 0%, #2a0515 30%, #000000 70%)"};const S=[{id:"younger",emoji:"🧒",label:"Młodszy",description:"18 do mojego wieku",color:"#4CAF50",glow:"rgba(76, 175, 80, 0.5)"},{id:"balanced",emoji:"⚖️",label:"Zrównoważony",description:"Mój wiek ±5 lat",color:"#D4AF37",glow:"rgba(212, 175, 55, 0.5)"},{id:"older",emoji:"👴",label:"Starszy",description:"Mój wiek do 99 lat",color:"#FF9800",glow:"rgba(255, 152, 0, 0.5)"},{id:"surprise",emoji:"🎁",label:"Niespodzianka",description:"Całkowicie losowo",color:"#E91E63",glow:"rgba(233, 30, 99, 0.5)"}];let z=null,E=[],C=null,T=!1,L=i;function M(e,n=3,t=300){const o=e.style.transform||"",r=Date.now();!function a(){if(Date.now()-r>=t)return void(e.style.transform=o);const i=(Math.random()-.5)*n,s=(Math.random()-.5)*n;e.style.transform=`${o} translate(${i}px, ${s}px)`,requestAnimationFrame(a)}()}async function _(n,t=null){const o=await async function(){return z||new Promise(e=>{const n=`https://m.fll.pl/profile.php?profile=${encodeURIComponent(u.currentUserName)}`;GM_xmlhttpRequest({method:"GET",url:n,onload:n=>{if(200===n.status&&n.responseText){const e=n.responseText.match(/(\d+)\s*lat/);e&&(z=parseInt(e[1]))}e(z||30)},onerror:()=>e(30)})})}();let r=18,a=99;switch(n){case"younger":r=18,a=o;break;case"older":r=o,a=99;break;case"balanced":r=Math.max(18,o-5),a=Math.min(99,o+5);break;default:r=18,a=99}const i=`https://m.fll.pl/profile.php?p=result&form=1&main=1&online=1&gps=&profilename=&order=random&1[]=${r}&1[]=${a}`;return new Promise(n=>{GM_xmlhttpRequest({method:"GET",url:i,onload:o=>{if(200!==o.status||!o.responseText)return void n([]);const r=(new DOMParser).parseFromString(o.responseText,"text/html"),a=[];r.querySelectorAll(".list-box").forEach(n=>{const o=n.querySelector('a[href*="profile="]');if(!o)return;const r=o.href.match(/profile=([^&]+)/),i=r?decodeURIComponent(r[1]):"";if(t&&i===t)return;const s=n.querySelector(".profile-img img"),l=s?s.src:e.ICONS.NO_FOTO_FULL,d=n.querySelector(".list-age"),c=d?d.textContent.trim():"",p=!!n.querySelector(".online");i&&a.length<10&&a.push({name:i,avatar:l,age:c,isOnline:p})}),n(a)},onerror:()=>n([])})})}function q(n,t){var o;w.innerHTML="",w.style.pointerEvents="auto",k[o=t]&&(s.style.background=k[o]),d.style.opacity="0.3",setTimeout(()=>{d.style.opacity="0"},1e3),"younger"!==t&&"older"!==t||function(e){const n=document.createElement("div");n.style.cssText="\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: radial-gradient(circle, rgba(200,220,255,0.3) 0%, transparent 70%);\n pointer-events: none;\n z-index: 20;\n animation: iceBreak 0.8s ease-out forwards;\n ",e.style.position="relative",e.appendChild(n);for(let e=0;e<20;e++){const e=document.createElement("div");e.style.cssText=`\n position: absolute;\n width: 4px;\n height: 4px;\n background: white;\n border-radius: 50%;\n top: 50%;\n left: 50%;\n pointer-events: none;\n animation: sparkFly ${.5+.5*Math.random()}s ease-out forwards;\n `;const t=Math.random()*Math.PI*2,o=50+100*Math.random();e.style.setProperty("--tx",Math.cos(t)*o+"px"),e.style.setProperty("--ty",Math.sin(t)*o+"px"),n.appendChild(e)}setTimeout(()=>n.remove(),800)}(w),l.innerHTML="🔮 TWOJE PRZEZNACZENIE 🔮";const i=document.createElement("div");i.style.cssText="\n width: 300px;\n min-height: 420px;\n background: rgba(20, 20, 40, 0.95);\n border: 2px solid var(--gold);\n border-radius: 24px;\n padding: 20px;\n text-align: center;\n animation: cardAppear 0.5s ease-out;\n box-shadow: 0 0 40px rgba(212, 175, 55, 0.3);\n backdrop-filter: blur(10px);\n margin: 0 auto;\n cursor: pointer;\n ";const c=function(e,n){const t={younger:["💖 Młodość to energia – Twoje serce bije szybciej!","💕 Ta osoba wniesie świeżość do Twojego życia!","✨ Młody duch – wielkie możliwości."],older:["💖 Dojrzałość i doświadczenie – stabilne uczucie!","💕 Ta osoba może być Twoim mentorem i kochankiem!","✨ Starsza dusza – głębokie połączenie."],balanced:["💖 Jesteście jak dwie połówki tej samej duszy!","💕 Wasze energie idealnie się uzupełniają!","✨ Przeznaczenie naprawdę istnieje!"],surprise:["💖 Los lubi niespodzianki – to może być to!","💕 Kto wie? Może to właśnie ta jedna osoba?","✨ Magia przypadku – najpiękniejsze historie tak się zaczynają!"]},o=t[n]||t.balanced;return o[Math.floor(Math.random()*o.length)]}(0,t);i.innerHTML=`\n <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;">\n <span style="background: rgba(0,0,0,0.5); padding: 4px 12px; border-radius: 20px; font-size: 11px; color: var(--gold);">\n ${"younger"===t?"🧒 Młodszy":"older"===t?"👴 Starszy":"balanced"===t?"⚖️ Zrównoważony":"🎁 Niespodzianka"}\n </span>\n ${n.isOnline?'<span style="color:#4CAF50;">🟢 Online</span>':""}\n </div>\n <img src="${n.avatar}" style="width: 120px; height: 120px; border-radius: 50%; object-fit: cover; border: 3px solid var(--gold); margin-bottom: 15px; cursor: pointer;"\n onerror="this.src='${e.ICONS.NO_FOTO_FULL}'">\n <h3 style="color: var(--gold); margin: 10px 0 5px; font-size: 20px; cursor: pointer;">${v(n.name)}</h3>\n ${n.age?`<p style="color: var(--text-secondary); font-size: 14px;">🎂 ${n.age}</p>`:""}\n <div style="background: rgba(0,0,0,0.3); border-radius: 20px; padding: 10px; margin: 15px 0;">\n <div style="font-size: 20px; margin-bottom: 5px;">💖</div>\n <p style="color: var(--gold); font-size: 13px; font-style: italic; margin: 0;">${c}</p>\n </div>\n <div style="display: flex; flex-direction: column; gap: 8px; margin-top: 15px;">\n <button class="destiny-action-btn destiny-view-profile" style="padding: 10px; background: var(--blood-gradient); color: var(--gold); border: 1px solid var(--gold-dark); border-radius: 25px; cursor: pointer; font-weight: bold;">👤 Zobacz profil</button>\n <button class="destiny-action-btn destiny-message" style="padding: 8px; background: rgba(212,175,55,0.1); border: 1px solid rgba(212,175,55,0.3); color: var(--gold); border-radius: 25px; cursor: pointer;">💬 Wyślij wiadomość</button>\n ${L>0?`<button class="destiny-action-btn destiny-reroll" style="padding: 8px; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.2); color: rgba(255,255,255,0.6); border-radius: 25px; cursor: pointer;">🔄 Losuj ponownie (${L} pozostałe)</button>`:""}\n <button class="destiny-action-btn destiny-close" style="padding: 8px; background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.1); color: rgba(255,255,255,0.4); border-radius: 25px; cursor: pointer;">✕ Zamknij</button>\n </div>\n `,w.appendChild(i),i.querySelector(".destiny-view-profile").addEventListener("click",e=>{e.stopPropagation(),s.remove(),D.showProfile(n.name)}),i.querySelector(".destiny-message").addEventListener("click",e=>{e.stopPropagation(),s.remove(),W.openConversationDirect(n.name)}),i.querySelector(".destiny-close").addEventListener("click",e=>{e.stopPropagation(),s.style.opacity="0",setTimeout(()=>s.remove(),300)}),i.querySelector("img").addEventListener("click",e=>{e.stopPropagation(),s.remove(),D.showProfile(n.name)}),i.querySelector("h3").addEventListener("click",e=>{e.stopPropagation(),s.remove(),D.showProfile(n.name)});const p=i.querySelector(".destiny-reroll");p&&p.addEventListener("click",async e=>{if(e.stopPropagation(),L<=0)return void m("Brak dostępnych ponownych losowań na dziś!","error");L--,p.textContent="⏳ Losowanie...",p.disabled=!0;const t={date:r,count:a.date===r?a.count+1:1};GM_setValue("fellow_destiny_rerolls",t),M(i,5,300),setTimeout(async()=>{const e=await _(C,n.name);e.length>0?q(e[0],C):(m("Brak więcej profili w tej kategorii","error"),p.textContent=`🔄 Losuj ponownie (${L} pozostałe)`,p.disabled=!1)},400)})}function P(e){const n=document.createElement("div");return n.style.cssText=`\n width: 180px;\n padding: 20px;\n background: linear-gradient(135deg, ${e.color}22, ${e.color}44);\n border: 2px solid ${e.color};\n border-radius: 20px;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n transition: all 0.4s ease;\n backdrop-filter: blur(5px);\n `,n.innerHTML=`\n <div style="font-size: 70px; margin-bottom: 15px; filter: drop-shadow(0 0 15px ${e.glow});">${e.emoji}</div>\n <div style="color: ${e.color}; font-size: 18px; font-weight: bold;">${e.label}</div>\n <div style="color: var(--text-muted); font-size: 11px; margin-top: 8px;">${e.description}</div>\n `,n.onmouseenter=()=>{T||(n.style.transform="translateY(-10px) scale(1.05)",n.style.boxShadow=`0 20px 40px ${e.color}44`)},n.onmouseleave=()=>{T||(n.style.transform="",n.style.boxShadow="")},n.onclick=async()=>{if(T)return;T=!0,C=e.id,GM_setValue("fellow_destiny_last_use",Date.now()),M(w,8,400),c.style.opacity="0",c.style.transform="scale(0)",p&&(p.style.opacity="0"),g.style.opacity="1",g.style.transform="scale(1)",h.style.opacity="1",Array.from(w.children).forEach(e=>{e!==n&&(e.style.opacity="0",e.style.transform="scale(0.8)",e.style.pointerEvents="none")}),n.style.transform="translateY(-10px) scale(1.05)",n.style.boxShadow=`0 20px 40px ${e.color}88`;const t=await _(e.id);E=t,setTimeout(()=>{E.length>0?q(E[0],e.id):w.innerHTML='\n <div style="text-align: center; padding: 40px; color: var(--gold);">\n <div style="font-size: 60px; margin-bottom: 20px;">😔</div>\n <p>Nie znaleziono profili w tej kategorii</p>\n <button onclick="location.reload()" style="margin-top: 20px; padding: 10px 20px; background: var(--blood-gradient); color: var(--gold); border: none; border-radius: 25px; cursor: pointer;">Spróbuj ponownie</button>\n </div>\n '},500)},n}let A=!1;c.onclick=()=>{A||(A=!0,d.style.opacity="0.5",setTimeout(()=>{d.style.opacity="0"},1500),c.style.opacity="0",c.style.transform="scale(0)",c.style.pointerEvents="none",p&&(p.style.opacity="0"),g.style.opacity="1",g.style.transform="scale(1)",h.style.opacity="1",y.style.opacity="1",w.style.opacity="1",w.style.transform="scale(1)",w.style.pointerEvents="auto",y.style.pointerEvents="auto",l.innerHTML="🔮 WYBIERZ SWÓJ TYP 🔮",S.forEach(e=>{w.appendChild(P(e))}))};const $=document.createElement("style");$.textContent="\n @keyframes blackHolePulse {\n 0%, 100% { transform: scale(1); opacity: 0.8; }\n 50% { transform: scale(1.05); opacity: 1; }\n }\n @keyframes accretionSpin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n @keyframes floatBall {\n 0%, 100% { transform: translateY(0px); }\n 50% { transform: translateY(-15px); }\n }\n @keyframes dreamPulse {\n 0%, 100% { opacity: 0; }\n 50% { opacity: 0.3; }\n }\n @keyframes iceBreak {\n 0% { opacity: 0; transform: scale(0.5); }\n 50% { opacity: 1; transform: scale(1.2); background: radial-gradient(circle, rgba(200,230,255,0.6) 0%, transparent 70%); }\n 100% { opacity: 0; transform: scale(1); }\n }\n @keyframes sparkFly {\n 0% { transform: translate(0, 0) scale(1); opacity: 1; }\n 100% { transform: translate(var(--tx), var(--ty)) scale(0); opacity: 0; }\n }\n @keyframes cardAppear {\n 0% { opacity: 0; transform: scale(0.8) translateY(30px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n @keyframes glowPulse {\n 0%, 100% { text-shadow: 0 0 20px rgba(212, 175, 55, 0.4); }\n 50% { text-shadow: 0 0 40px rgba(212, 175, 55, 0.8); }\n }\n ",document.head.appendChild($),setTimeout(()=>{c.style.opacity="1",c.style.transform="scale(1)",y.style.opacity="1",y.style.pointerEvents="none"},500)}let s=null;function l(){if(!s){if(s=document.createElement("div"),s.id="fellow-loading-overlay",s.style.cssText="\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--dark-bg, #0A0A0A);\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n transition: background 0.3s ease;\n ",s.innerHTML=`\n <div style="text-align: center;">\n <div class="fellow-loader" style="\n width: 60px;\n height: 60px;\n border: 4px solid var(--dark-border, #2A1A1A);\n border-top: 4px solid var(--blood-red, #8B0000);\n border-right: 4px solid var(--gold, #D4AF37);\n border-radius: 50%;\n animation: fellow-spin 1s linear infinite;\n margin: 0 auto;\n "></div>\n <div style="color: var(--gold, #D4AF37); margin-top: 20px; font-size: 16px;">Ładowanie Fellow Enhanced...</div>\n <div style="color: var(--text-muted, #6B6B6B); margin-top: 10px; font-size: 12px;">Wersja ${e.VERSION}</div>\n </div>\n `,!document.getElementById("fellow-spin-keyframes")){const e=document.createElement("style");e.id="fellow-spin-keyframes",e.textContent="\n @keyframes fellow-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n ",document.head.appendChild(e)}document.body.firstChild?document.body.insertBefore(s,document.body.firstChild):document.body.appendChild(s)}}function d(){s&&(s.style.opacity="0",s.style.transition="opacity 0.3s ease",setTimeout(()=>{s&&s.remove&&(s.remove(),s=null)},300))}function c(){const e=document.head;e.querySelectorAll('link[rel="stylesheet"]').forEach(e=>e.remove()),e.querySelectorAll('link[rel="preload"][href*="spolecznosci"]').forEach(e=>e.remove()),e.querySelectorAll("style").forEach(e=>{if("Fellow Enhanced.user.js"===e.getAttribute("data-src"))return;const n=e.textContent||"";(n.includes("app_gdpr")||n.includes("ulheJb")||n.includes("Wgn87xi")||n.includes("spol-colorPrimary")||n.includes("spolecznosci")||n.includes("tri-table")||null===e.getAttribute("data-src")&&n.length<100)&&e.remove()}),e.querySelectorAll('script[src*="spolecznosci.net"], script[src*="cmp.spolecznosci"]').forEach(e=>e.remove());Array.from(document.body.children).forEach(e=>{"fellow-loading-overlay"!==e.id&&e.remove()});const n=new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{if("SCRIPT"===e.tagName){const n=e.src||"";if(n.includes("spolecznosci.net")||n.includes("tri-table.com")||n.includes("cmp.spolecznosci")||n.includes("googletagmanager")||n.includes("google-analytics")||n.includes("doubleclick"))return void e.remove()}if("IFRAME"===e.tagName){const n=e.name||"",t=e.src||"";if(n.includes("pb_locator")||n.includes("tcfapi")||t.includes("spolecznosci")||t.includes("tri-table"))return void e.remove()}if("STYLE"===e.tagName){if("Fellow Enhanced.user.js"===e.getAttribute("data-src"))return;const n=e.textContent||"";if(n.includes("app_gdpr")||n.includes("ulheJb")||n.includes("Wgn87xi")||n.includes("spol-colorPrimary")||n.includes("spolecznosci"))return void e.remove()}if("LINK"===e.tagName){const n=e.getAttribute("href")||"";if(n.includes("spolecznosci")||n.includes("tri-table"))return void e.remove()}if(e.classList&&1===e.nodeType){const n=e.classList.toString();if(n.includes("app_gdpr")||n.includes("ulheJb")||n.includes("Wgn87xi")||n.includes("Att3N8KM")||n.includes("NMxiZ8JX"))return void e.remove()}})})});n.observe(document.documentElement,{childList:!0,subtree:!0}),window._fellowAdBlockObserver=n}const p={dark:{name:"🖤 Mroczny Dukat (Fellow)","--dark-bg":"#0A0A0A","--dark-surface":"#111111","--dark-surface-light":"#1A1A1A","--dark-surface-lighter":"#222222","--dark-border":"#2A1A1A","--text-primary":"#E8E8E8","--text-secondary":"#B0B0B0","--text-muted":"#6B6B6B","--text-on-dark":"#FFFFFF","--blood-red":"#8B0000","--blood-red-light":"#B22222","--blood-red-dark":"#5C0000","--blood-red-glow":"rgba(139, 0, 0, 0.5)","--gold":"#D4AF37","--gold-dark":"#AA8A2E","--blood-gradient":"linear-gradient(135deg, #5C0000, #8B0000, #B22222)","--live-gradient":"linear-gradient(135deg, #8B0000 0%, #D4AF37 50%, #B22222 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #5C0000, #8B0000)","--svg-filter":"brightness(0) invert(1)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"},light:{name:"🏠 Fellow Classic (jasny)","--dark-bg":"#faf6f3","--dark-surface":"#f0eae5","--dark-surface-light":"#e8ded7","--dark-surface-lighter":"#dfd1c7","--dark-border":"#c4a89c","--text-primary":"#3b3430","--text-secondary":"#5c504a","--text-muted":"#7a6c64","--text-on-dark":"#FFFFFF","--blood-red":"#A93226","--blood-red-light":"#C0392B","--blood-red-dark":"#7B1A1A","--blood-red-glow":"rgba(169, 50, 38, 0.25)","--gold":"#D2691E","--gold-dark":"#A0522D","--blood-gradient":"linear-gradient(135deg, #7B1A1A, #A93226, #C0392B)","--live-gradient":"linear-gradient(135deg, #A93226 0%, #C0392B 50%, #7B1A1A 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #7B1A1A, #A93226)","--svg-filter":"brightness(0) invert(1)","--svg-opacity":"0.9","--modal-overlay":"rgba(0, 0, 0, 0.7)"},romeo:{name:"🌍 Planet Romeo","--dark-bg":"#0D1B2A","--dark-surface":"#1B2838","--dark-surface-light":"#253647","--dark-surface-lighter":"#2E4057","--dark-border":"#1E88E5","--text-primary":"#FFFFFF","--text-secondary":"#90CAF9","--text-muted":"#78909C","--text-on-dark":"#FFFFFF","--blood-red":"#1E88E5","--blood-red-light":"#42A5F5","--blood-red-dark":"#1565C0","--blood-red-glow":"rgba(30, 136, 229, 0.25)","--gold":"#FFFFFF","--gold-dark":"#E0E0E0","--blood-gradient":"linear-gradient(135deg, #1565C0, #1E88E5)","--live-gradient":"linear-gradient(135deg, #1E88E5 0%, #42A5F5 50%, #1565C0 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #1B2838, #253647)","--svg-filter":"brightness(0) saturate(100%) invert(60%) sepia(50%) saturate(500%) hue-rotate(180deg)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"},scruff:{name:"🐻 Scruff","--dark-bg":"#1A0D2E","--dark-surface":"#24183A","--dark-surface-light":"#2E1F47","--dark-surface-lighter":"#382854","--dark-border":"#6A1B9A","--text-primary":"#F3E5F5","--text-secondary":"#CE93D8","--text-muted":"#9575A0","--text-on-dark":"#FFFFFF","--blood-red":"#6A1B9A","--blood-red-light":"#8E24AA","--blood-red-dark":"#4A148C","--blood-red-glow":"rgba(106, 27, 154, 0.25)","--gold":"#FF9800","--gold-dark":"#F57C00","--blood-gradient":"linear-gradient(135deg, #4A148C, #6A1B9A, #8E24AA)","--live-gradient":"linear-gradient(135deg, #6A1B9A 0%, #FF9800 50%, #8E24AA 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #24183A, #2E1F47)","--svg-filter":"brightness(0) saturate(100%) invert(60%) sepia(40%) saturate(400%) hue-rotate(260deg)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"},hornet:{name:"🐝 Hornet","--dark-bg":"#0A0404","--dark-surface":"#140808","--dark-surface-light":"#1E0C0C","--dark-surface-lighter":"#281010","--dark-border":"#E53935","--text-primary":"#FFEBEE","--text-secondary":"#EF9A9A","--text-muted":"#B06D6D","--text-on-dark":"#FFFFFF","--blood-red":"#E53935","--blood-red-light":"#FF5252","--blood-red-dark":"#C62828","--blood-red-glow":"rgba(229, 57, 53, 0.25)","--gold":"#FFFFFF","--gold-dark":"#E0E0E0","--blood-gradient":"linear-gradient(135deg, #C62828, #E53935)","--live-gradient":"linear-gradient(135deg, #E53935 0%, #FF5252 50%, #C62828 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #140808, #1E0C0C)","--svg-filter":"brightness(0) invert(1)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.9)"},jackd:{name:"🦜 Jack'd","--dark-bg":"#051418","--dark-surface":"#0A1C22","--dark-surface-light":"#0E262D","--dark-surface-lighter":"#123038","--dark-border":"#00BCD4","--text-primary":"#E0F7FA","--text-secondary":"#80DEEA","--text-muted":"#5D9CA6","--text-on-dark":"#FFFFFF","--blood-red":"#00BCD4","--blood-red-light":"#26C6DA","--blood-red-dark":"#0097A7","--blood-red-glow":"rgba(0, 188, 212, 0.25)","--gold":"#E0F7FA","--gold-dark":"#B2EBF2","--blood-gradient":"linear-gradient(135deg, #0097A7, #00BCD4)","--live-gradient":"linear-gradient(135deg, #00BCD4 0%, #26C6DA 50%, #0097A7 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #0A1C22, #0E262D)","--svg-filter":"brightness(0) saturate(100%) invert(75%) sepia(30%) saturate(500%) hue-rotate(160deg)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"},tinder:{name:"🔥 Tinder","--dark-bg":"#150606","--dark-surface":"#220B0B","--dark-surface-light":"#2F1212","--dark-surface-lighter":"#3C1818","--dark-border":"#FD267A","--text-primary":"#FFF0F0","--text-secondary":"#FD7CA6","--text-muted":"#B05C6E","--text-on-dark":"#FFFFFF","--blood-red":"#FD267A","--blood-red-light":"#FF5C8A","--blood-red-dark":"#E91E63","--blood-red-glow":"rgba(253, 38, 122, 0.25)","--gold":"#FFFFFF","--gold-dark":"#E0E0E0","--blood-gradient":"linear-gradient(135deg, #FD267A, #E91E63)","--live-gradient":"linear-gradient(135deg, #FD267A 0%, #FF6036 50%, #E91E63 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #220B0B, #2F1212)","--svg-filter":"brightness(0) saturate(100%) invert(50%) sepia(80%) saturate(1000%) hue-rotate(320deg)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.9)"},bumble:{name:"🐝 Bumble","--dark-bg":"#1A1A1A","--dark-surface":"#242424","--dark-surface-light":"#2E2E2E","--dark-surface-lighter":"#383838","--dark-border":"#FFC629","--text-primary":"#FFFFFF","--text-secondary":"#E0C060","--text-muted":"#888888","--text-on-dark":"#000000","--blood-red":"#FFC629","--blood-red-light":"#FFD54F","--blood-red-dark":"#D4A80A","--blood-red-glow":"rgba(255, 198, 41, 0.3)","--gold":"#1A1A1A","--gold-dark":"#000000","--blood-gradient":"linear-gradient(135deg, #FFC629, #FFD54F)","--live-gradient":"linear-gradient(135deg, #FFC629 0%, #1A1A1A 50%, #FFC629 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #242424, #2E2E2E)","--svg-filter":"brightness(0) saturate(100%) invert(85%) sepia(90%) saturate(500%) hue-rotate(360deg)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.9)"},hinge:{name:"💜 Hinge","--dark-bg":"#0F0A1A","--dark-surface":"#181228","--dark-surface-light":"#211A36","--dark-surface-lighter":"#2A2244","--dark-border":"#6A1B9A","--text-primary":"#F3E5F5","--text-secondary":"#CE93D8","--text-muted":"#8E6B9E","--text-on-dark":"#FFFFFF","--blood-red":"#6A1B9A","--blood-red-light":"#9C27B0","--blood-red-dark":"#4A148C","--blood-red-glow":"rgba(106, 27, 154, 0.25)","--gold":"#FFFFFF","--gold-dark":"#E0E0E0","--blood-gradient":"linear-gradient(135deg, #4A148C, #6A1B9A, #9C27B0)","--live-gradient":"linear-gradient(135deg, #6A1B9A 0%, #FFFFFF 50%, #9C27B0 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #181228, #211A36)","--svg-filter":"brightness(0) invert(1)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"},rainbow:{name:"🏳️🌈 Tęczowy Pride","--dark-bg":"#0F0A14","--dark-surface":"#1A1124","--dark-surface-light":"#241A33","--dark-surface-lighter":"#302442","--dark-border":"#FF4D4D","--text-primary":"#F0E8FF","--text-secondary":"#D4B0FF","--text-muted":"#8A7AAA","--text-on-dark":"#FFFFFF","--blood-red":"#FF4D4D","--blood-red-light":"#FF8A8A","--blood-red-dark":"#CC3333","--blood-red-glow":"rgba(255, 77, 77, 0.3)","--gold":"#FFFFFF","--gold-dark":"#D0D0D0","--blood-gradient":"linear-gradient(135deg, #CC3333, #AA44FF, #44AAFF, #44FF44, #FFAA00, #FF4D4D)","--live-gradient":"linear-gradient(135deg, #FF4D4D 0%, #FFAA00 20%, #44FF44 40%, #44AAFF 60%, #AA44FF 80%, #FF4D4D 100%)","--bg-pattern":"none","--menu-gradient":"linear-gradient(135deg, #1A1124, #241A33)","--svg-filter":"brightness(0) invert(1)","--svg-opacity":"1","--modal-overlay":"rgba(0, 0, 0, 0.85)"}},u={currentUserId:null,currentUserName:null,currentUserAvatar:null,currentUserToken:null,activeColorScheme:"dark",shouldShowAvatars:!0,autoConnectChat:!0,mentionNotify:!0,showRecentComments:!0,feedSections:["top","new","random","visitors","favorites","friends"],requestCache:new Map,userStats:{messages:0,chat:0,visitors:0,comments:0,gallery:"0/15",favorites:0,blocked:0,visits:0,registration:""},recentComments:[],loadFromStorage(){this.currentUserId=GM_getValue(e.USER_ID_KEY,null),this.currentUserName=GM_getValue(e.USER_NAME_KEY,null),this.currentUserAvatar=GM_getValue(e.USER_AVATAR_KEY,null),this.currentUserToken=GM_getValue(e.USER_TOKEN_KEY,null),this.activeColorScheme=GM_getValue(e.COLOR_SCHEME_KEY,"dark"),this.shouldShowAvatars=GM_getValue(e.SHOW_AVATARS_KEY,!0),this.showRecentComments=GM_getValue(e.SHOW_RECENT_COMMENTS_KEY,!0),this.showCalendarWidget=GM_getValue(e.SHOW_CALENDAR_WIDGET_KEY,!0),this.showCommentsWidget=GM_getValue(e.SHOW_COMMENTS_WIDGET_KEY,!0),this.showNotesWidget=GM_getValue(e.SHOW_NOTES_WIDGET_KEY,!0),this.showPlusWidget=GM_getValue(e.SHOW_PLUS_WIDGET_KEY,!0),this.feedSections=GM_getValue(e.FEED_SECTIONS_KEY,["top","new","random","visitors","history","favorites","friends"]),this.autoConnectChat=GM_getValue(e.AUTO_CONNECT_CHAT_KEY,!0),this.mentionNotify=GM_getValue(e.MENTION_NOTIFY_KEY,!0)},saveUserData(n,t,o,r){n&&(this.currentUserId=n,GM_setValue(e.USER_ID_KEY,n)),t&&(this.currentUserName=t,GM_setValue(e.USER_NAME_KEY,t)),o&&(this.currentUserAvatar=o,GM_setValue(e.USER_AVATAR_KEY,o)),r&&(this.currentUserToken=r,GM_setValue(e.USER_TOKEN_KEY,r))},getCachedData(n){const t=this.requestCache.get(n);return t?Date.now()-t.timestamp>e.CACHE_TIMEOUT?(this.requestCache.delete(n),null):t.data:null},setCachedData(e,n){this.requestCache.set(e,{data:n,timestamp:Date.now()})},clearCache(e){e?this.requestCache.delete(e):this.requestCache.clear()},logout(){GM_deleteValue(e.USER_ID_KEY),GM_deleteValue(e.USER_NAME_KEY),GM_deleteValue(e.USER_AVATAR_KEY),GM_deleteValue(e.USER_TOKEN_KEY),this.currentUserId=null,this.currentUserName=null,this.currentUserAvatar=null,this.currentUserToken=null,this.clearCache();const n=document.querySelector(".dashboard-container");n&&n.remove(),X=!1,window.location.reload()}};function g(e){let n="";return[{icon:"🆔",title:"Dane podstawowe",id:"basic",selector:'.question-data:nth-child(1), [id*="a-1"], ul:first-of-type .accordion-content:first-of-type'},{icon:"👤",title:"Wygląd",id:"look",selector:'.question-data:nth-child(2), [id*="a-2"]'},{icon:"🎓",title:"Edukacja i zainteresowania",id:"edu",selector:'.question-data:nth-child(3), [id*="a-3"]'},{icon:"🔞",title:"Seks i używki",id:"sex",selector:'.question-data:nth-child(4), [id*="a-7"]'},{icon:"🔍",title:"Szukam...",id:"search",selector:'.question-data:nth-child(5), [id*="a-6"]'}].forEach((t,o)=>{const r=e.querySelector(t.selector);if(!r)return;const a=0===o;n+=`\n <div class="ep-card">\n <div class="ep-card-header ${a?"":"collapsed"}">\n <span class="ep-icon">${t.icon}</span>\n <span class="ep-title">${t.title}</span>\n <span class="ep-arrow">▼</span>\n </div>\n <div class="ep-card-body ${a?"":"collapsed"}">\n ${function(e){let n="";return e.querySelectorAll(".listline").forEach(e=>{const t=e.querySelector(".form-question"),o=e.querySelector(".form-answer");if(!t||!o)return;const r=t.textContent.trim(),a=t.classList.contains("mandatory"),i=o.querySelectorAll('select[name*="date"]');if(i.length>=3)return void(n+=`\n <div class="ep-row">\n <div class="ep-label ${a?"required":""}">${r}</div>\n <div class="ep-value">\n <div class="date-selects">\n ${Array.from(i).map(e=>e.outerHTML).join("")}\n </div>\n </div>\n </div>\n `);const s=o.querySelectorAll(".listcheckbox");if(s.length>1)return void(n+=`\n <div class="ep-row">\n <div class="ep-label ${a?"required":""}">${r}</div>\n <div class="ep-value">\n <div class="ep-checkbox-group">\n ${Array.from(s).map(e=>{const n=e.querySelector("input"),t=e.querySelector("label");if(!n||!t)return"";const o=n.checked?"checked":"";return"0"===n.value&&"hidden"===n.style.visibility?"":`\n <div class="ep-checkbox-item ${o?"checked":""}">\n ${n.outerHTML}\n <span>${t.textContent.trim()}</span>\n </div>\n `}).join("")}\n </div>\n </div>\n </div>\n `);const l=o.querySelector('select:not([name*="date"])'),d=o.querySelector('input[type="text"], input[type="number"]'),c=o.querySelector("textarea");let p="";if(l)p=l.outerHTML;else if(c){const e=c.cloneNode(!0),n=(c.value||"").split("\n").length,t=Math.max(n,3),o=12;p=e.outerHTML.replace("<textarea",`<textarea \n style="min-height: ${20*t}px; max-height: ${20*o}px; resize: vertical; overflow-y: auto; line-height: 1.5; padding: 10px 14px;" \n oninput="this.style.height='auto';this.style.height=Math.min(this.scrollHeight, ${20*o})+'px';" \n rows="${t}"`)}else d&&(p=d.outerHTML);p&&(n+=`\n <div class="ep-row">\n <div class="ep-label ${a?"required":""}">${r}</div>\n <div class="ep-value">${p}</div>\n </div>\n `)}),n}(r)}\n </div>\n </div>\n `}),n}function m(e,n="info",t=5e3){try{GM_notification({title:"error"===n?"❌ Błąd":"success"===n?"✅ Sukces":"ℹ️ Informacja",text:e,timeout:t,highlight:!0})}catch(o){const r=document.querySelector(".fellow-toast");r&&r.remove();const a=document.createElement("div");a.className=`fellow-toast fellow-toast-${n}`,a.textContent=e,a.style.cssText=`\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--dark-surface);\n color: var(--text-primary);\n border-left: 4px solid ${"error"===n?"#f44336":"success"===n?"#4caf50":"var(--blood-red)"};\n border-radius: 8px;\n padding: 12px 24px;\n z-index: 10010;\n font-size: 14px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\n animation: slideUp 0.3s ease;\n `,document.body.appendChild(a),setTimeout(()=>{a&&a.remove&&a.remove()},t)}}function h(n,t){const o=O("modal-settings-sub",t,"⚙️");o.classList.add("active"),F(o),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?box=${n}`,onload:t=>{if(200!==t.status||!t.responseText)return void I(o,"Błąd ładowania");const r=(new DOMParser).parseFromString(t.responseText,"text/html").querySelector("form"),a=o.querySelector(".modal-body");if(r){a.innerHTML="";const t=r.cloneNode(!0),i=document.createElement("button");i.type="button",i.className="form-button",i.textContent="💾 Zapisz",i.style.cssText="display: block; width: 100%; margin-top: 20px; padding: 14px;",i.addEventListener("click",()=>{const r=new FormData(t);GM_xmlhttpRequest({method:"POST",url:`${e.API_BASE}?box=${n}`,data:new URLSearchParams(r).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:()=>{o.remove(),m("Zapisano pomyślnie","success")},onerror:()=>m("Błąd zapisywania","error")})}),t.appendChild(i),a.appendChild(t)}else I(o,"Nie znaleziono formularza")},onerror:()=>I(o,"Błąd sieci")})}async function x(n,t){b();const o=O("modal-attachment-picker","Wybierz zdjęcia do wysłania","📸");o.classList.add("active"),F(o);const r=`${e.API_BASE}?box=attachment&re=${encodeURIComponent(n)}`;GM_xmlhttpRequest({method:"GET",url:r,onload:r=>{if(200!==r.status||!r.responseText)return void I(o,`Błąd ładowania galerii (${r.status})`);const a=(new DOMParser).parseFromString(r.responseText,"text/html");let i=[];if(a.querySelectorAll(".gallery-edit-box, .gallery-pick-item, [data-aid], form.gallery figure, .gallery-edit-img").forEach(e=>{let n=e.getAttribute("data-aid")||e.id;if(!n){const t=e.querySelector('input[type="checkbox"][name="aid[]"]');t&&(n=t.value)}const t=e.querySelector("img");n&&t&&t.src&&!t.src.includes("no-foto")&&!t.src.includes("no-foto-red")&&i.push({id:n,imgUrl:t.src})}),!i.length)return void I(o,"Brak zdjęć w galerii");const s=o.querySelector(".modal-body");s.style.padding="15px";let l='<div class="gallery-info-box"><h4>📸 Wybierz zdjęcia do wysłania</h4><p>Kliknij na zdjęcia, które chcesz wysłać. Możesz wybrać wiele zdjęć.</p></div>\n <div class="gallery-grid-4" style="grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));">';i.forEach(e=>{l+=`<div class="gallery-pick-item" data-aid="${e.id}" style="cursor:pointer; border: 3px solid transparent; border-radius: 12px; overflow:hidden; background: var(--dark-surface-light);">\n <img src="${e.imgUrl}" style="width:100%; aspect-ratio:1; object-fit:cover;">\n <div style="padding:8px; text-align:center; font-size:12px;">Zdjęcie</div>\n </div>`}),l+='</div><div style="margin-top:20px; text-align:center;"><button id="upload-new-photo" class="form-button" style="width:100%;">📤 Dodaj nowe zdjęcie z dysku</button></div>',s.innerHTML=l;const d=new Set;s.querySelectorAll(".gallery-pick-item").forEach(e=>{e.onclick=()=>{const n=e.dataset.aid;d.has(n)?(d.delete(n),e.style.borderColor="transparent"):(d.add(n),e.style.borderColor="var(--gold)")}}),s.querySelector("#upload-new-photo").onclick=()=>{const r=document.createElement("input");r.type="file",r.accept="image/*",r.onchange=async r=>{const a=r.target.files[0];if(!a)return;const i=new FormData;i.append("img",a);try{await fetch(`${e.API_BASE}?p=edit_gallery`,{method:"POST",body:i}),o.remove(),b(),x(n,t),m("Zdjęcie zostało dodane","success")}catch(e){m("Nie udało się dodać zdjęcia","error")}},r.click()};const c=document.createElement("button");c.id="attachment-send-btn",c.className="form-button",c.style.cssText="position:fixed; bottom:30px; right:30px; z-index:10002;",c.textContent="✅ Załącz zaznaczone zdjęcia",document.body.appendChild(c),c.onclick=()=>{if(0===d.size)return void m("Nie zaznaczyłeś żadnego zdjęcia","error");const e=Array.from(d);b(),o.remove(),t&&"function"==typeof t&&t(e)};const p=o.querySelector(".modal-close");p&&p.addEventListener("click",()=>{b()}),o.addEventListener("click",e=>{e.target===o&&b()})},onerror:()=>{b(),I(o,"Błąd sieci przy ładowaniu galerii.")}})}function b(){const e=document.querySelector('button#attachment-send-btn, button.form-button[style*="position: fixed"]');e&&(e.textContent.includes("Załącz zaznaczone zdjęcia")||"attachment-send-btn"===e.id)&&e.remove()}function v(e){return e?e.replace(/[&<>"']/g,e=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[e])):""}function f(e){e&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight,100)+"px")}function y(e){let n=0;for(let t=2;t<e.length;t++)n=e.charCodeAt(t)+((n<<5)-n);return`hsl(${n%360}, 50%, 40%)`}async function w(e,n,t={}){const o=u.getCachedData(n);return o&&!t.force?o:new Promise(o=>{GM_xmlhttpRequest({method:t.method||"GET",url:e,headers:t.headers||{},data:t.data||null,onload:function(e){if(200!==e.status)return void o(null);const r=t.parser?t.parser(e):e.responseText;u.setCachedData(n,r),o(r)},onerror:function(n){console.error(`Fetch error for ${e}:`,n),m("Błąd sieci: "+e.split("?")[0],"error"),o(null)}})})}async function k(){return new Promise(e=>{GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/profile.php?p=chat",onload:function(n){if(200!==n.status||!n.responseText)return console.warn("fetchCurrentUserData: Invalid response"),void e(!1);const t=n.responseText.match(/(?:const|let|var)\s+_id\s*=\s*(\d+);/),o=n.responseText.match(/(?:const|let|var)\s+_user\s*=\s*'([^']+)';/),r=n.responseText.match(/(?:const|let|var)\s+_avatar\s*=\s*'([^']+)';/),a=n.responseText.match(/(?:const|let|var)\s+_token\s*=\s*'([^']+)';/);t&&u.saveUserData(t[1],null,null,null),o&&u.saveUserData(null,o[1],null,null),r&&u.saveUserData(null,null,r[1],null),a&&u.saveUserData(null,null,null,a[1]),e(!0)},onerror:()=>{console.error("Failed to fetch user data"),e(!1)}})})}async function S(n,t=8){const o=e.LIST_TYPES[n];if(!o)return[];const r=`list_${n}`;return w(`${e.API_BASE}?p=list&l=${o.url}&page=1`,r,{parser:n=>{if(!n||!n.responseText)return[];const o=(new DOMParser).parseFromString(n.responseText,"text/html"),r=[];return o.querySelectorAll(".list-box").forEach(n=>{const o=n.querySelector(".list-info a"),a=o?o.textContent.trim():"",i=n.querySelector(".profile-img img"),s=i?i.src:e.ICONS.NO_FOTO,l=n.querySelector(".list-age")?.textContent.trim()||"",d=!!n.querySelector(".online");a&&r.length<t&&r.push({name:a,avatar:s,age:l,isOnline:d})}),r}})}u.loadFromStorage();let z=0,E=[];function C(e,n=null,t=0){n&&Array.isArray(n)&&n.length>0?(E=n,z=t):(E=[e],z=0);const o=document.querySelector(".image-preview-modal");o&&o.remove();const r=document.createElement("div");r.className="image-preview-modal",r.style.cssText="\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.95);\n z-index: 100000;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.3s ease;\n backdrop-filter: blur(10px);\n ",r.innerHTML=`\n <div class="preview-container" style="\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n ">\n <button class="preview-close-btn" style="\n position: fixed;\n top: 20px;\n right: 20px;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: white;\n font-size: 24px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n z-index: 10;\n backdrop-filter: blur(5px);\n " onmouseenter="this.style.background='rgba(139,0,0,0.8)';this.style.transform='scale(1.1)'" \n onmouseleave="this.style.background='rgba(255,255,255,0.1)';this.style.transform='scale(1)'">✕</button>\n \n <button class="preview-download-btn" style="\n position: fixed;\n top: 20px;\n right: 80px;\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: white;\n font-size: 20px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n z-index: 10;\n backdrop-filter: blur(5px);\n " onmouseenter="this.style.background='rgba(139,0,0,0.8)';this.style.transform='scale(1.1)'" \n onmouseleave="this.style.background='rgba(255,255,255,0.1)';this.style.transform='scale(1)'">📥</button>\n \n <div class="preview-image-wrapper" style="\n position: relative;\n max-width: 90vw;\n max-height: 85vh;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: zoom-in;\n ">\n <img class="preview-main-image" src="${E[z]}" style="\n max-width: 100%;\n max-height: 85vh;\n object-fit: contain;\n transition: transform 0.3s ease;\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.3);\n ">\n </div>\n \n ${E.length>1?`\n <div class="preview-nav" style="\n position: fixed;\n bottom: 30px;\n left: 0;\n right: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 20px;\n z-index: 10;\n ">\n <button class="preview-prev-btn" style="\n width: 50px;\n height: 50px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: white;\n font-size: 28px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n backdrop-filter: blur(5px);\n " onmouseenter="this.style.background='rgba(139,0,0,0.8)';this.style.transform='scale(1.1)'" \n onmouseleave="this.style.background='rgba(255,255,255,0.1)';this.style.transform='scale(1)'">◀</button>\n \n <div class="preview-counter" style="\n background: rgba(0,0,0,0.6);\n padding: 8px 18px;\n border-radius: 30px;\n color: var(--gold);\n font-size: 14px;\n font-weight: 600;\n backdrop-filter: blur(5px);\n border: 1px solid rgba(255,255,255,0.2);\n ">${z+1} / ${E.length}</div>\n \n <button class="preview-next-btn" style="\n width: 50px;\n height: 50px;\n border-radius: 50%;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n color: white;\n font-size: 28px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n backdrop-filter: blur(5px);\n " onmouseenter="this.style.background='rgba(139,0,0,0.8)';this.style.transform='scale(1.1)'" \n onmouseleave="this.style.background='rgba(255,255,255,0.1)';this.style.transform='scale(1)'">▶</button>\n </div>\n `:""}\n \n <div style="\n position: fixed;\n bottom: 20px;\n left: 20px;\n background: rgba(0,0,0,0.5);\n padding: 6px 12px;\n border-radius: 20px;\n color: rgba(255,255,255,0.5);\n font-size: 11px;\n backdrop-filter: blur(5px);\n pointer-events: none;\n ">🖱️ Kliknij aby powiększyć | ⌨️ ← → lub strzałki</div>\n </div>\n `,document.body.appendChild(r),setTimeout(()=>{r.style.opacity="1"},10);const a=r.querySelector(".preview-main-image"),i=r.querySelector(".preview-close-btn"),s=r.querySelector(".preview-download-btn"),l=r.querySelector(".preview-prev-btn"),d=r.querySelector(".preview-next-btn"),c=r.querySelector(".preview-counter"),p=r.querySelector(".preview-image-wrapper");let u,g,h=!1,x=1,b=0,v=0;function f(){const e=E[z];a.style.opacity="0.5";const n=new Image;n.onload=()=>{a.src=e,a.style.opacity="1",h=!1,x=1,b=0,v=0,a.style.transform="scale(1)",a.style.cursor="zoom-in",p.style.cursor="zoom-in"},n.src=e,c&&(c.textContent=`${z+1} / ${E.length}`)}function y(){h?(x=1,b=0,v=0,a.style.transform="scale(1) translate(0, 0)",a.style.cursor="zoom-in",p.style.cursor="zoom-in",h=!1):(x=2.5,a.style.transform=`scale(${x})`,a.style.cursor="zoom-out",p.style.cursor="zoom-out",h=!0)}p&&(p.addEventListener("click",y),p.addEventListener("mousedown",function(e){if(!h)return;e.preventDefault(),u=e.clientX-b,g=e.clientY-v;const n=e=>{e.preventDefault(),b=e.clientX-u,v=e.clientY-g;const n=200;b=Math.min(n,Math.max(-200,b)),v=Math.min(n,Math.max(-200,v)),a.style.transform=`scale(${x}) translate(${b/x}px, ${v/x}px)`},t=()=>{document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",t)};document.addEventListener("mousemove",n),document.addEventListener("mouseup",t)})),s&&s.addEventListener("click",e=>{e.stopPropagation(),function(){const e=E[z];if(!e)return void m("Nie można pobrać zdjęcia","error");const n=`zdjecie_${Date.now()}.jpg`;try{"undefined"!=typeof GM_download?(GM_download(e,n),m("Pobieranie zdjęcia...","info")):(window.open(e,"_blank"),m("Otwieranie zdjęcia w nowej karcie","info"))}catch(n){console.error("GM_download error:",n),window.open(e,"_blank"),m("Otwieranie zdjęcia w nowej karcie","info")}}()}),l&&l.addEventListener("click",e=>{e.stopPropagation(),z>0&&(z--,f())}),d&&d.addEventListener("click",e=>{e.stopPropagation(),z<E.length-1&&(z++,f())});const w=()=>{r.style.opacity="0",setTimeout(()=>r.remove(),300)};i.addEventListener("click",w),r.addEventListener("click",e=>{e.target===r&&w()});const k=e=>{"Escape"===e.key&&w(),"ArrowLeft"===e.key&&l&&l.click(),"ArrowRight"===e.key&&d&&d.click()};if(document.addEventListener("keydown",k),r.addEventListener("remove",()=>{document.removeEventListener("keydown",k)}),r.addEventListener("wheel",e=>{h?h&&x<4&&(e.preventDefault(),x=Math.min(4,x+(e.deltaY<0?.3:-.3)),x<=1?y():a.style.transform=`scale(${x}) translate(${b/x}px, ${v/x}px)`):(e.preventDefault(),e.deltaY<0&&y())},{passive:!1}),function(){if(z>0){(new Image).src=E[z-1]}if(z<E.length-1){(new Image).src=E[z+1]}}(),!document.getElementById("preview-global-styles")){const e=document.createElement("style");e.id="preview-global-styles",e.textContent="\n .image-preview-modal {\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n }\n .preview-main-image {\n transition: opacity 0.2s ease;\n }\n ",document.head.appendChild(e)}}function T(){const n=GM_getValue(e.CALENDAR_EVENTS_KEY,"[]");try{return JSON.parse(n)}catch(e){return[]}}function L(n){GM_setValue(e.CALENDAR_EVENTS_KEY,JSON.stringify(n))}function M(e){const n=new Date(e);return`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`}function _(n,t){const o=new Date;n=n||o.getFullYear(),t=void 0!==t?t:o.getMonth();const r=O("modal-calendar","Kalendarz","📅");r.classList.add("active");const a=r.querySelector(".modal-body"),i=["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],s=["Pon","Wto","Śro","Czw","Pią","Sob","Nie"],l=new Date(n,t,1),d=new Date(n,t+1,0),c=(l.getDay()+6)%7,p=d.getDate(),u=T(),g=(e,n,t)=>`${e}-${String(n+1).padStart(2,"0")}-${String(t).padStart(2,"0")}`,h=g(o.getFullYear(),o.getMonth(),o.getDate());let x=h;function b(){let o=`<div class="calendar-container">\n <div class="calendar-header">\n <button class="calendar-nav-btn" id="cal-prev-month" title="Poprzedni miesiąc">◀</button>\n <div class="calendar-title">${i[t]} ${n}</div>\n <button class="calendar-nav-btn" id="cal-next-month" title="Następny miesiąc">▶</button>\n </div>\n <div class="calendar-grid">`;s.forEach((e,n)=>{o+=`<div class="calendar-day-header ${n>=5?"weekend":""}">${e}</div>`});for(let e=0;e<c;e++)o+='<div class="calendar-day other-month"></div>';for(let r=1;r<=p;r++){const a=g(n,t,r),i=u.filter(e=>e.date===a);o+=`<div class="calendar-day ${a===h?"today":""} ${(c+r-1)%7>=5?"weekend":""}"\n style="${a===x?"border-color: var(--gold); box-shadow: 0 0 8px var(--gold-dark);":""}"\n data-date="${a}">\n <div class="calendar-day-number">${r}</div>\n <div class="calendar-day-events">`,i.slice(0,3).forEach(n=>{const t=e.CALENDAR_EMOJI[n.type]||"📅";o+=`<div class="calendar-event-dot" data-event-id="${n.id}" title="${v(n.title)}">\n <span class="emoji">${t}</span>\n <span class="time">${n.time||""}</span>\n <span style="overflow:hidden;text-overflow:ellipsis;">${v(n.title)}</span>\n </div>`}),i.length>3&&(o+=`<div class="calendar-event-dot" style="justify-content:center;">+${i.length-3} więcej</div>`),o+="</div></div>"}o+=`</div>\n <div class="calendar-events-panel">\n <div class="calendar-events-header">\n <span class="calendar-events-title" id="events-date-title">\n Wydarzenia: ${x===h?"Dziś":x}\n </span>\n <button class="calendar-add-btn" id="cal-add-event">+ Dodaj</button>\n </div>\n <div id="events-list"></div>\n </div>\n <div class="calendar-mood-section">\n <div class="calendar-mood-title">Jak się dziś czujesz?</div>\n <div class="calendar-mood-emojis" id="mood-emojis">\n ${["😊","😍","😎","🤗","😴","😤","😢","🥳","🤔","😱"].map(e=>`<span class="calendar-mood-btn" data-mood="${e}" title="Nastrój">${e}</span>`).join("")}\n </div>\n </div>\n </div>`,a.innerHTML=o,function(){const n=a.querySelector("#events-list"),t=u.filter(e=>e.date===x);if(0===t.length)return void(n.innerHTML='<div style="text-align:center;padding:20px;color:var(--text-muted);">Brak wydarzeń na ten dzień</div>');n.innerHTML=t.map(n=>`<div class="calendar-event-item">\n <div class="calendar-event-emoji">${e.CALENDAR_EMOJI[n.type]||"📅"}</div>\n <div class="calendar-event-info">\n <div class="calendar-event-title">${v(n.title)}</div>\n ${n.time?`<div class="calendar-event-meta">🕐 ${n.time} ${n.location?"📍 "+v(n.location):""}</div>`:""}\n ${n.description?`<div class="calendar-event-meta">📝 ${v(n.description.substring(0,60))}${n.description.length>60?"...":""}</div>`:""}\n </div>\n <button class="calendar-event-delete" data-event-id="${n.id}" title="Usuń">✕</button>\n </div>`).join(""),n.querySelectorAll(".calendar-event-delete").forEach(e=>{e.addEventListener("click",n=>{n.stopPropagation();const t=parseInt(e.dataset.eventId);if(confirm("Usunąć to wydarzenie?")){!function(e){let n=T();n=n.filter(n=>n.id!==e),L(n)}(t);const e=T();u.length=0,u.push(...e),b(),m("Wydarzenie usunięte","success")}})})}(),function(n,t){a.querySelector("#cal-prev-month")?.addEventListener("click",()=>{0===t?_(n-1,11):_(n,t-1),r.remove()}),a.querySelector("#cal-next-month")?.addEventListener("click",()=>{11===t?_(n+1,0):_(n,t+1),r.remove()}),a.querySelectorAll(".calendar-day:not(.other-month)").forEach(e=>{e.addEventListener("click",n=>{n.target.closest(".calendar-event-dot")||(x=e.dataset.date,b())})}),a.querySelectorAll(".calendar-event-dot").forEach(n=>{n.addEventListener("click",t=>{t.stopPropagation();const o=parseInt(n.dataset.eventId),r=u.find(e=>e.id===o);r&&function(n){const t=e.CALENDAR_EMOJI[n.type]||"📅",o=O("modal-event-detail",n.title,t);o.classList.add("active");const r=o.querySelector(".modal-body");r.innerHTML=`\n <div style="padding:20px;text-align:center;">\n <div style="font-size:60px;margin-bottom:15px;">${t}</div>\n <h3 style="color:var(--gold);margin:0 0 10px;">${v(n.title)}</h3>\n ${n.time?`<p style="color:var(--text-secondary);">🕐 ${n.time}</p>`:""}\n <p style="color:var(--text-muted);">📅 ${n.date}</p>\n ${n.location?`<p style="color:var(--text-secondary);">📍 ${v(n.location)}</p>`:""}\n ${n.description?`<p style="color:var(--text-primary);margin-top:15px;line-height:1.5;">${v(n.description)}</p>`:""}\n </div>\n `}(r)})}),a.querySelector("#cal-add-event")?.addEventListener("click",()=>{q(x,()=>{const e=T();u.length=0,u.push(...e),b()})}),a.querySelectorAll(".calendar-mood-btn").forEach(e=>{e.addEventListener("click",()=>{a.querySelectorAll(".calendar-mood-btn").forEach(e=>e.classList.remove("selected")),e.classList.add("selected");const n=e.dataset.mood,t=M(new Date),o=u.find(e=>e.date===t&&"nastroj"===e.type);o?(o.title=`Nastrój: ${n}`,o.emoji=n):u.push({id:Date.now(),date:t,time:"",title:`Nastrój: ${n}`,type:"nastroj",description:"",location:""}),L(u),b(),m(`Nastrój zapisany! ${n}`,"success")})})}(n,t)}const f=M(new Date),y=u.find(e=>e.date===f&&"nastroj"===e.type);if(y){const e=y.title.replace("Nastrój: ","");setTimeout(()=>{const n=a.querySelector(`.calendar-mood-btn[data-mood="${e}"]`);n&&(a.querySelectorAll(".calendar-mood-btn").forEach(e=>e.classList.remove("selected")),n.classList.add("selected"))},100)}b()}function q(n,t){const o=O("modal-add-event","Dodaj wydarzenie","📅");o.classList.add("active");const r=o.querySelector(".modal-body");r.innerHTML=`\n <div class="add-event-form">\n <div class="event-form-group">\n <label class="event-form-label">📅 Data</label>\n <input type="date" class="event-form-input" id="evt-date" value="${n}">\n </div>\n <div class="event-form-group">\n <label class="event-form-label">🕐 Godzina</label>\n <input type="time" class="event-form-input" id="evt-time">\n </div>\n <div class="event-form-group">\n <label class="event-form-label">📝 Tytuł</label>\n <input type="text" class="event-form-input" id="evt-title" placeholder="Np. Randka z..." maxlength="100">\n </div>\n <div class="event-form-group">\n <label class="event-form-label">🏷️ Typ</label>\n <div class="event-type-grid" id="evt-types">\n${Object.entries(e.CALENDAR_EMOJI).filter(([e])=>"inny"!==e&&"nastroj"!==e).map(([e,n])=>`<button class="event-type-btn" data-type="${e}">${n} ${e}</button>`).join("")}\n </div>\n </div>\n <div class="event-form-group">\n <label class="event-form-label">📍 Miejsce</label>\n <input type="text" class="event-form-input" id="evt-location" placeholder="Np. Kawiarnia na rynku">\n </div>\n <div class="event-form-group">\n <label class="event-form-label">📋 Opis (opcjonalnie)</label>\n <textarea class="event-form-input" id="evt-description" rows="3" placeholder="Dodatkowe informacje..." style="resize:vertical;"></textarea>\n </div>\n <button class="event-save-btn" id="evt-save">💾 Zapisz wydarzenie</button>\n </div>\n `;let a="spotkanie";r.querySelectorAll(".event-type-btn").forEach(e=>{e.addEventListener("click",()=>{r.querySelectorAll(".event-type-btn").forEach(e=>e.classList.remove("selected")),e.classList.add("selected"),a=e.dataset.type})}),r.querySelector(".event-type-btn")?.classList.add("selected"),r.querySelector("#evt-save").addEventListener("click",()=>{const e=r.querySelector("#evt-title").value.trim();if(!e)return void m("Podaj tytuł wydarzenia","error");!function(e){const n=T();e.id=Date.now(),n.push(e),L(n)}({date:r.querySelector("#evt-date").value,time:r.querySelector("#evt-time").value,title:e,type:a,location:r.querySelector("#evt-location").value.trim(),description:r.querySelector("#evt-description").value.trim()}),o.remove(),t&&t(),m("Wydarzenie dodane! 📅","success")})}const P="fellow_user_notes";function A(){const e=GM_getValue(P,"{}");try{return JSON.parse(e)}catch(e){return{}}}function $(e){GM_setValue(P,JSON.stringify(e))}function j(n){const t=function(e){const n=A();return n[e]?.text||""}(n),o=O("modal-note",`Notatka: ${n}`,"📝");o.classList.add("active");const r=o.querySelector(".modal-body");let a=e.ICONS.NO_FOTO_FULL;if(G.has(n))a=G.get(n);else{const e=GM_getValue(`avatar_${n}`,null);e&&(a=e,G.set(n,e))}r.innerHTML=`\n <div class="note-container">\n <div class="note-header-info">\n <img class="note-avatar"\n src="${a}"\n onerror="this.src='${e.ICONS.NO_FOTO_FULL}'"\n data-profile="${v(n)}"\n alt="${v(n)}">\n <div>\n <div class="note-profile-name" data-profile="${v(n)}">${v(n)}</div>\n </div>\n </div>\n <textarea class="note-textarea" id="note-textarea" placeholder="Wpisz swoją notatkę o tym użytkowniku...">${v(t)}</textarea>\n <div class="note-date" id="note-date"></div>\n <div class="note-actions">\n ${t?'<button class="note-btn note-delete-btn" id="note-delete-btn">🗑️ Usuń notatkę</button>':""}\n <button class="note-btn note-close-btn" id="note-close-btn">Anuluj</button>\n <button class="note-btn note-save-btn" id="note-save-btn">💾 Zapisz</button>\n </div>\n </div>\n `,a===e.ICONS.NO_FOTO_FULL&&Y(n).then(n=>{const t=r.querySelector(".note-avatar");t&&n&&n!==e.ICONS.NO_FOTO_FULL&&n.startsWith("http")&&(t.src=n)}).catch(()=>{});const i=r.querySelector("#note-textarea"),s=r.querySelector("#note-save-btn"),l=r.querySelector("#note-close-btn"),d=r.querySelector("#note-delete-btn");r.querySelector(".note-profile-name").addEventListener("click",()=>{o.remove(),D.showProfile(n)}),r.querySelector(".note-avatar").addEventListener("click",()=>{o.remove(),D.showProfile(n)}),s.addEventListener("click",()=>{const t=i.value;!function(n,t){const o=A();t.trim()?o[n]={text:t.trim(),avatar:G.get(n)||e.ICONS.NO_FOTO_FULL}:delete o[n],$(o)}(n,t),o.remove(),m(t.trim()?"Notatka zapisana ✅":"Notatka usunięta (pusta)","success")}),l.addEventListener("click",()=>o.remove()),d&&d.addEventListener("click",()=>{confirm("Usunąć notatkę?")&&(!function(e){const n=A();delete n[e],$(n)}(n),o.remove(),m("Notatka usunięta","success"))}),i.addEventListener("keydown",e=>{"Enter"===e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),s.click())}),setTimeout(()=>i.focus(),300)}let N=new Set;function O(e,n,t="",o=""){const r=`${e}_${Date.now()}`;let a=document.getElementById(e);a&&a.remove(),a=document.createElement("div"),a.id=r,a.className=`modal-overlay ${o}`,a.innerHTML=`\n <div class="modal">\n <div class="modal-header">\n <h3>${t} ${n}</h3>\n <div class="modal-header-actions">\n <span class="modal-expand" title="Rozszerz">⤢</span>\n <span class="modal-close">×</span>\n </div>\n </div>\n <div class="modal-body"></div>\n </div>\n `,document.body.appendChild(a),N.add(r);const i=()=>{N.delete(r);const e=document.querySelector(".modal-action-btn");e&&e.remove(),b(),a.remove()};return a.querySelector(".modal-close").addEventListener("click",i),a.querySelector(".modal-expand").addEventListener("click",()=>{const e=a.querySelector(".modal");if(e.classList.contains("expanded")){e.classList.remove("expanded");const n=a.querySelector(".modal-expand");n.innerHTML="⤢",n.title="Rozszerz",e.style.width="",e.style.height="",e.style.maxWidth="",e.style.maxHeight=""}else{e.classList.add("expanded");const n=a.querySelector(".modal-expand");n.innerHTML="⤡",n.title="Przywróć",e.style.width="95vw",e.style.height="90vh",e.style.maxWidth="95vw",e.style.maxHeight="90vh"}}),a.addEventListener("click",e=>{e.target===a&&i()}),a}function F(e){e.querySelector(".modal-body").innerHTML='<div class="modal-loading"><div class="spinner"></div><div>Ładowanie...</div></div>'}function I(e,n="Wystąpił błąd"){e.querySelector(".modal-body").innerHTML=`<div class="modal-error">${n}</div>`}const D={async showProfile(n){const r=O("modal-profile",`Profil: ${n}`,"👤");r.classList.add("active"),F(r),t(`👤 ${n} - Fellow Enhanced`,!0),GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/profile.php?profile=${encodeURIComponent(n)}`,onload:function(t){if(200!==t.status||!t.responseText)return void I(r,`Błąd HTTP ${t.status}`);const a=(new DOMParser).parseFromString(t.responseText,"text/html"),i=a.querySelector(".profile-header");if(!i)return void I(r,"Brak treści profilu");const s=r.querySelector(".modal-body");s.innerHTML="",s.style.padding="0";const l=document.createElement("style");l.textContent="\n .profile-modal-wrapper {\n font-family: 'Inter', 'Exo 2', 'Segoe UI', sans-serif;\n }\n\n /* Nagłówek profilu */\n .profile-modal-wrapper .profile-header {\n margin: 0 !important;\n border: 2px solid var(--gold-dark) !important;\n border-bottom: none !important;\n }\n .profile-modal-wrapper .profile-header::before {\n border-radius: 18px 18px 0 0;\n }\n .profile-modal-wrapper .profile-main a {\n font-size: 28px !important;\n }\n .profile-modal-wrapper .profile-act {\n font-size: 13px !important;\n padding: 4px 12px !important;\n background: rgba(0,0,0,0.4) !important;\n border-radius: 20px !important;\n display: inline-block !important;\n margin-top: 8px !important;\n backdrop-filter: blur(5px) !important;\n }\n\n /* Przyciski akcji */\n .pm-actions-bar {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n padding: 12px 15px;\n background: var(--dark-surface);\n border: 2px solid var(--gold-dark);\n border-top: none;\n border-bottom: none;\n justify-content: center;\n }\n .pm-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n color: var(--text-primary);\n font-size: 12px;\n cursor: pointer;\n text-decoration: none;\n transition: all 0.2s;\n }\n .pm-action-btn:hover {\n background: var(--blood-red);\n color: var(--gold);\n border-color: var(--gold);\n }\n .pm-action-btn img {\n width: 18px;\n height: 18px;\n filter: var(--svg-filter);\n }\n\n /* Sekcje danych */\n .profile-modal-wrapper .profile-sections-container {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 15px;\n margin: 15px !important;\n }\n @media (max-width: 600px) {\n .profile-modal-wrapper .profile-sections-container {\n grid-template-columns: 1fr;\n }\n }\n .profile-modal-wrapper .profile-data {\n margin: 0 !important;\n border: 1px solid var(--dark-border) !important;\n border-radius: 16px !important;\n background: var(--dark-surface-light) !important;\n transition: border-color 0.2s;\n }\n .profile-modal-wrapper .profile-data:hover {\n border-color: var(--blood-red) !important;\n }\n .profile-modal-wrapper .profile-data > img {\n left: -15px !important;\n top: 10px !important;\n height: 30px !important;\n width: 30px !important;\n }\n .profile-modal-wrapper .p1,\n .profile-modal-wrapper .p3 {\n width: 120px !important;\n font-size: 12px !important;\n }\n .profile-modal-wrapper .p2,\n .profile-modal-wrapper .p5 {\n margin-left: 130px !important;\n font-size: 13px !important;\n }\n ",s.appendChild(l),document.title=`👤 ${n} - Fellow Enhanced`;const d=document.createElement("div");d.className="profile-modal-wrapper";const c=i.cloneNode(!0),p=c.querySelector(".back");p&&p.remove(),d.appendChild(c);const g=W.mutedUsersMap&&W.mutedUsersMap[String(n)],h=document.createElement("div");h.className="pm-actions-bar",h.innerHTML=`\n <button class="pm-action-btn" data-action="gallery">\n <img src="${e.ICONS.HEAD_EDIT_GALLERY}" alt=""> Galeria\n </button>\n <button class="pm-action-btn" data-action="comments">\n <img src="${e.ICONS.CHAT}" alt=""> Komentarze\n </button>\n <button class="pm-action-btn" data-action="messages">\n <img src="${e.ICONS.MESSAGES}" alt=""> Wiadomość\n </button>\n ${n!==u.currentUserName?`\n <button class="pm-action-btn" data-action="favorites">\n <img src="${e.ICONS.LIST_FAVORITES}" alt=""> Ulubione\n </button>\n <button class="pm-action-btn" data-action="friends">\n <img src="${e.ICONS.LIST_FRIENDS}" alt=""> Znajomi\n </button>\n <button class="pm-action-btn" data-action="blocked">\n <img src="${e.ICONS.LIST_BLOCKED}" alt=""> Zablokuj\n </button>\n <button class="pm-action-btn" data-action="mute" style="${g?"background: var(--blood-red); color: var(--gold); border-color: var(--gold);":""}">\n ${g?"🔈 Odcisz":"🔇 Wycisz"}\n </button>\n <button class="pm-action-btn" data-action="note">\n 📝 Notatka\n </button>\n <button class="pm-action-btn" data-action="calendar-event" title="Dodaj do kalendarza">\n 📅 Wspólny termin\n </button>\n `:""}\n `,d.appendChild(h);const x=document.createElement("div");x.className="profile-sections-container";a.querySelectorAll(".profile-data").forEach(e=>{x.appendChild(e.cloneNode(!0))}),d.appendChild(x),s.appendChild(d);const b=r.querySelector(".modal-close");if(b){const e=b.onclick;b.onclick=()=>{o(),e&&e()}}r.addEventListener("click",e=>{e.target===r&&o()}),d.querySelectorAll(".pm-action-btn").forEach(e=>{e.addEventListener("click",t=>{t.preventDefault();const o=e.dataset.action,a={gallery:()=>{r.remove(),D.showUserGallery(n)},comments:()=>{r.remove(),D.showUserComments(n)},messages:()=>{r.remove(),W.openConversationDirect(n)},favorites:()=>{confirm("Dodać do ulubionych?")&&(window.location.href=`profile.php?profile=${encodeURIComponent(n)}&action=favorites`)},friends:()=>{r.remove(),D.showAddFriend(n)},blocked:()=>{confirm("Zablokować użytkownika?")&&(window.location.href=`profile.php?profile=${encodeURIComponent(n)}&action=blocked`)},mute:()=>{if(W.webSocket&&W.webSocket.readyState===WebSocket.OPEN){W.mutedUsersMap[String(n)]?(W.webSocket.send(JSON.stringify({type:"mute",user_id:n,mute:!1})),m(`Odciszono użytkownika ${n}`,"success")):(W.webSocket.send(JSON.stringify({type:"mute",user_id:n,mute:!0})),m(`Wyciszono użytkownika ${n} (cichy ban)`,"info"))}else m("Nie jesteś połączony z czatem","error")},note:()=>{j(n)},"calendar-event":()=>{r.remove();q(M(new Date),()=>{m("Dodaj spotkanie z "+n,"info")})}};a[o]&&a[o]()})})},onerror:()=>{I(r,"Nie udało się załadować profilu."),o()}})},async showAddFriend(n){const t=O("modal-add-friend",`Dodaj znajomego: ${n}`,"👥");t.classList.add("active"),F(t);const o=`${e.API_BASE}?profile=${encodeURIComponent(n)}&box=friends`;GM_xmlhttpRequest({method:"GET",url:o,onload:e=>{if(200!==e.status||!e.responseText)return void I(t,"Błąd ładowania");const n=(new DOMParser).parseFromString(e.responseText,"text/html").querySelector(".form-box");if(n){const e=n.cloneNode(!0),r=e.querySelector(".form-button");r&&(r.textContent="💾 Dodaj znajomość"),t.querySelector(".modal-body").innerHTML="",t.querySelector(".modal-body").appendChild(e);const a=e.querySelector("form");a&&(a.onsubmit=e=>{e.preventDefault();const n=new FormData(a);GM_xmlhttpRequest({method:"POST",url:o,data:n,onload:()=>{t.remove(),m("Dodano do znajomych","success")},onerror:()=>m("Błąd dodawania","error")})})}else I(t,"Nie znaleziono formularza")},onerror:()=>I(t,"Błąd sieci")})},async showUserGallery(n){const t=O("modal-gallery",`Galeria: ${n}`,"🖼️");t.classList.add("active"),F(t);const o=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=gallery`;GM_xmlhttpRequest({method:"GET",url:o,onload:e=>{if(200!==e.status||!e.responseText)return void I(t,"Błąd ładowania galerii");const o=(new DOMParser).parseFromString(e.responseText,"text/html"),r=[];let a="";const i=o.querySelector(".profile-add-pass");i&&(a=i.outerHTML),o.querySelectorAll(".picture figure a, .gallery-item a, .profile-gallery a").forEach(e=>{const n=e.querySelector("img"),t=e.getAttribute("href");let o=t;if(t&&t.startsWith("#")){const n=e.getAttribute("rel");if(n)try{o=atob(n)}catch(e){o=n}}n&&n.src&&!n.src.includes("no-foto")&&r.push({thumb:n.src,full:o||n.src})});const s=t.querySelector(".modal-body");if(s.innerHTML="",a){const e=document.createElement("div");e.innerHTML=a;const o=e.querySelector("a");o&&(o.href=`profile.php?profile=${n}&l=messages`,o.onclick=e=>{e.preventDefault(),t.remove(),W.openConversationDirect(n),m("Poproś użytkownika o udostępnienie galerii prywatnej","info")}),s.appendChild(e)}if(r.length||a){if(r.length){let e='<div class="gallery-grid-4" style="margin-top: 20px;">';r.forEach((n,t)=>{e+=`\n <div class="gallery-card" data-full="${n.full}" data-index="${t}">\n <div class="gallery-card-img">\n <img src="${n.thumb}" loading="lazy" style="cursor:pointer;">\n </div>\n </div>\n `}),e+="</div>",s.innerHTML+=e;const n=r.map(e=>e.full);s.querySelectorAll(".gallery-card").forEach(e=>{const t=e.dataset.full,o=parseInt(e.dataset.index);e.querySelector("img").onclick=e=>{e.stopPropagation(),C(t,n,o)}})}}else s.innerHTML='<div class="modal-loading">Brak zdjęć w galerii</div>'},onerror:()=>I(t,"Błąd sieci")})},async showUserComments(n){const t=O("modal-user-comments",`Komentarze: ${n}`,"💬");t.classList.add("active"),F(t);let o=1,r=1;const a=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=gb&page=1`;GM_xmlhttpRequest({method:"GET",url:a,onload:a=>{if(200!==a.status||!a.responseText)return void I(t,"Błąd ładowania komentarzy");const i=(new DOMParser).parseFromString(a.responseText,"text/html"),s=i.querySelector(".paginator select");if(s){r=s.querySelectorAll("option").length;const e=s.querySelector("option[selected]");if(e){const n=e.textContent.match(/(\d+)\s*\/\s*(\d+)/);n&&(o=parseInt(n[1]),r=parseInt(n[2]))}}const l=[];i.querySelectorAll(".message-box").forEach(n=>{let t="";const o=n.querySelector('.message-box > a, .profile-img a, a[href*="profile="]');if(o&&(t=o.textContent.trim(),!t)){const e=o.getAttribute("href");if(e){const n=e.match(/profile=([^&]+)/);n&&(t=decodeURIComponent(n[1]))}}let r=e.ICONS.NO_FOTO;const a=n.querySelector(".profile-img img");a&&a.src&&(r=a.src);let i="";const s=n.querySelector(".message-date");s&&(i=s.childNodes[0]?.textContent?.trim()||s.textContent.trim());let d="";const c=n.querySelector(".message-reader");c&&(d=c.innerHTML||c.textContent.trim());let p="";const u=n.querySelector(".message-reply");u&&(p=u.innerHTML);let g="",m="";const h=n.querySelector('a[onclick*="confirm"][href*="cid="]');if(h){let e=h.getAttribute("href");m=e.replace(/&/g,"&");const n=e.match(/cid=(\d+)/);n&&(g=n[1])}t&&d&&l.push({name:t,avatar:r,date:i,text:d,reply:p,commentId:g,deleteUrl:m})});const d=t.querySelector(".modal-body");d.innerHTML="";const c=document.createElement("style");c.textContent="\n .comments-container { display: flex; flex-direction: column; gap: 12px; }\n .comment-form-wrapper {\n background: var(--dark-surface-light); border: 1px solid var(--dark-border);\n border-radius: 16px; padding: 16px; margin-bottom: 8px;\n }\n .comment-form-title {\n color: var(--gold); font-size: 14px; font-weight: 600;\n margin: 0 0 12px 0; display: flex; align-items: center; gap: 8px;\n }\n .comment-input-row { display: flex; gap: 8px; align-items: flex-end; }\n .comment-textarea {\n flex: 1; background: var(--dark-surface); border: 1px solid var(--dark-border);\n border-radius: 20px; padding: 10px 16px; color: var(--text-primary);\n font-size: 13px; font-family: inherit; resize: none;\n min-height: 44px; max-height: 100px; transition: border-color 0.2s;\n }\n .comment-textarea:focus { outline: none; border-color: var(--gold); }\n .comment-tools { display: flex; gap: 6px; align-items: center; margin-top: 8px; }\n .comment-send-btn {\n width: 40px; height: 40px; border-radius: 50%;\n background: var(--blood-gradient); border: none; cursor: pointer;\n background-image: url('https://m.fll.pl/_layout/send.svg');\n background-size: 18px; background-position: center; background-repeat: no-repeat;\n filter: var(--svg-filter); flex-shrink: 0; transition: transform 0.2s;\n }\n .comment-send-btn:hover { transform: scale(1.1); }\n .comment-card {\n background: var(--dark-surface-light); border: 1px solid var(--dark-border);\n border-radius: 12px; padding: 12px; transition: border-color 0.2s;\n }\n .comment-card:hover { border-color: var(--blood-red); }\n .comment-card-header { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }\n .comment-avatar {\n width: 44px; height: 44px; border-radius: 50%; object-fit: cover;\n border: 2px solid var(--blood-red); flex-shrink: 0; cursor: pointer;\n }\n .comment-user-info { flex: 1; min-width: 0; }\n .comment-user-name { color: var(--gold); font-weight: 600; font-size: 14px; cursor: pointer; }\n .comment-user-name:hover { text-decoration: underline; }\n .comment-date { color: var(--text-muted); font-size: 11px; margin-top: 2px; }\n .comment-body { color: var(--text-primary); font-size: 14px; line-height: 1.5; padding-left: 54px; }\n .comment-body img[src*=\"emo\"] { width: 22px; height: 22px; vertical-align: middle; margin: 0 2px; }\n .comment-reply-new {\n margin-top: 8px; margin-left: 54px; padding: 8px 12px;\n background: var(--dark-surface); border-radius: 10px; border-left: 3px solid var(--gold);\n font-size: 13px; line-height: 1.4;\n }\n .comment-reply-new b { color: var(--gold); }\n .comment-reply-new img[src*=\"emo\"] { width: 18px; height: 18px; vertical-align: middle; }\n .comment-actions {\n display: flex; gap: 8px; margin-left: 54px; margin-top: 8px;\n }\n .comment-action-btn {\n padding: 5px 12px; border-radius: 12px; font-size: 11px; cursor: pointer;\n background: var(--dark-surface-lighter); border: 1px solid var(--dark-border);\n color: var(--text-muted); transition: all 0.2s;\n display: inline-flex; align-items: center; gap: 4px;\n }\n .comment-action-btn:hover { background: var(--blood-red); color: var(--gold); border-color: var(--gold); }\n .comment-action-btn.delete-btn { color: rgba(244,67,54,0.7); border-color: rgba(244,67,54,0.3); }\n .comment-action-btn.delete-btn:hover { background: #f44336; color: #fff; border-color: #f44336; }\n .comment-action-btn.reply-btn { color: var(--text-secondary); }\n .reply-form-inline {\n margin-left: 54px; margin-top: 8px; display: none; gap: 8px; align-items: flex-end; flex-wrap: wrap;\n }\n .reply-form-inline.active { display: flex; }\n .reply-form-inline textarea {\n flex: 1; background: var(--dark-surface); border: 1px solid var(--dark-border);\n border-radius: 20px; padding: 10px 16px; color: var(--text-primary);\n font-size: 13px; font-family: inherit; resize: none; min-height: 40px; max-height: 80px;\n }\n .reply-form-inline textarea:focus { outline: none; border-color: var(--gold); }\n .reply-form-inline .reply-tools {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n .reply-form-inline button.reply-send-inline {\n width: 36px; height: 36px; border-radius: 50%; background: var(--blood-gradient);\n border: none; cursor: pointer; flex-shrink: 0;\n background-image: url('https://m.fll.pl/_layout/send.svg');\n background-size: 16px; background-position: center; background-repeat: no-repeat;\n filter: var(--svg-filter);\n }\n .reply-emoji-btn, .reply-starters-btn {\n width: 36px; height: 36px; border-radius: 50%;\n background: var(--dark-surface-light); border: 1px solid var(--dark-border);\n display: flex; align-items: center; justify-content: center;\n cursor: pointer; font-size: 18px; transition: all 0.2s;\n }\n .reply-emoji-btn:hover, .reply-starters-btn:hover {\n background: var(--blood-red); border-color: var(--gold); transform: scale(1.05);\n }\n .comments-empty { text-align: center; padding: 40px 20px; color: var(--text-muted); }\n .load-more-btn {\n display: block; width: 100%; padding: 10px; text-align: center;\n border-radius: 20px; background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border); color: var(--text-secondary);\n cursor: pointer; font-size: 12px; transition: all 0.2s; margin-top: 8px;\n }\n .load-more-btn:hover { background: var(--blood-red); color: var(--gold); border-color: var(--gold); }\n .load-more-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n ",d.appendChild(c);const p=document.createElement("div");if(p.className="comments-container",n!==u.currentUserName){const o=document.createElement("div");o.className="comment-form-wrapper",o.style.position="relative";const r=document.createElement("form");r.method="POST",r.action=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=gb`,r.style.position="relative";const a=document.createElement("div");a.className="comment-form-title",a.textContent="✍️ Dodaj komentarz",r.appendChild(a);const i=document.createElement("div");i.className="comment-input-row";const s=document.createElement("textarea");s.name="comment",s.className="comment-textarea",s.placeholder="Napisz komentarz...",s.rows=1,s.oninput=function(){f(this)},i.appendChild(s);const l=document.createElement("button");l.type="submit",l.className="comment-send-btn",l.title="Wyślij",i.appendChild(l),r.appendChild(i);const d=document.createElement("div");d.className="comment-tools",d.style.position="relative",d.style.display="flex",d.style.gap="8px",d.style.marginTop="8px";const c=document.createElement("div");c.className="comment-emoji-btn",c.innerHTML="😀",c.title="Emoji",c.style.cssText="width:36px;height:36px;border-radius:50%;background:var(--dark-surface-light);border:1px solid var(--dark-border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;transition:all 0.2s;",c.onmouseenter=()=>{c.style.background="var(--blood-red)",c.style.borderColor="var(--gold)"},c.onmouseleave=()=>{c.style.background="var(--dark-surface-light)",c.style.borderColor="var(--dark-border)"},c.onclick=n=>{n.stopPropagation(),n.preventDefault(),function(n,t){const o=document.querySelector(".dynamic-emoji-picker");o&&o.remove();const r=document.createElement("div");r.className="dynamic-emoji-picker",r.style.cssText=`\n position: fixed;\n bottom: ${t.getBoundingClientRect().top-250}px;\n left: ${t.getBoundingClientRect().left}px;\n width: 320px;\n max-height: 250px;\n background: var(--dark-surface);\n border: 2px solid var(--blood-red);\n border-radius: 12px;\n padding: 10px;\n display: grid;\n grid-template-columns: repeat(8, 1fr);\n gap: 5px;\n z-index: 100000;\n box-shadow: 0 8px 25px rgba(0,0,0,0.5);\n overflow-y: auto;\n `,e.EMOJI_LIST.slice(0,64).forEach(e=>{const t=document.createElement("div");t.textContent=e,t.style.cssText="font-size:20px;text-align:center;cursor:pointer;padding:5px;border-radius:8px;transition:all 0.15s;",t.onmouseenter=()=>{t.style.background="var(--blood-red)",t.style.transform="scale(1.1)"},t.onmouseleave=()=>{t.style.background="transparent",t.style.transform="scale(1)"},t.onclick=()=>{const t=n.selectionStart,o=n.selectionEnd,a=n.value;n.value=a.substring(0,t)+e+a.substring(o),n.selectionStart=n.selectionEnd=t+e.length,n.focus(),n.dispatchEvent(new Event("input")),r.remove()},r.appendChild(t)}),document.body.appendChild(r);const a=e=>{r.contains(e.target)||e.target===t||(r.remove(),document.removeEventListener("click",a))};setTimeout(()=>document.addEventListener("click",a),100)}(s,c)},d.appendChild(c);const u=document.createElement("div");u.className="comment-starters-btn",u.innerHTML="💡",u.title="Gotowe teksty",u.style.cssText="width:36px;height:36px;border-radius:50%;background:var(--dark-surface-light);border:1px solid var(--dark-border);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:18px;transition:all 0.2s;",u.onmouseenter=()=>{u.style.background="var(--blood-red)",u.style.borderColor="var(--gold)"},u.onmouseleave=()=>{u.style.background="var(--dark-surface-light)",u.style.borderColor="var(--dark-border)"},u.onclick=n=>{n.stopPropagation(),n.preventDefault(),function(n,t){const o=document.querySelector(".dynamic-starters-picker");o&&o.remove();const r=document.createElement("div");r.className="dynamic-starters-picker",r.style.cssText=`\n position: fixed;\n bottom: ${t.getBoundingClientRect().top-300}px;\n left: ${t.getBoundingClientRect().left}px;\n width: 340px;\n max-height: 300px;\n background: var(--dark-surface);\n border: 2px solid var(--blood-red);\n border-radius: 12px;\n padding: 10px;\n overflow-y: auto;\n z-index: 100000;\n box-shadow: 0 8px 25px rgba(0,0,0,0.5);\n display: flex;\n flex-direction: column;\n gap: 6px;\n `,e.COMMENT_STARTERS.forEach(e=>{const t=document.createElement("div");t.textContent=e,t.style.cssText="padding:8px 12px;border-radius:20px;background:var(--dark-surface-light);cursor:pointer;font-size:12px;color:var(--text-secondary);transition:all 0.2s;",t.onmouseenter=()=>{t.style.background="var(--blood-red)",t.style.color="var(--gold)"},t.onmouseleave=()=>{t.style.background="var(--dark-surface-light)",t.style.color="var(--text-secondary)"},t.onclick=()=>{n.value=e,f(n),n.focus(),n.dispatchEvent(new Event("input")),r.remove()},r.appendChild(t)}),document.body.appendChild(r);const a=e=>{r.contains(e.target)||e.target===t||(r.remove(),document.removeEventListener("click",a))};setTimeout(()=>document.addEventListener("click",a),100)}(s,u)},d.appendChild(u),r.appendChild(d),r.onsubmit=e=>{e.preventDefault();const o=s.value.trim();if(!o)return void m("Wpisz treść komentarza","error");l.style.opacity="0.5",l.style.pointerEvents="none";const a=new URLSearchParams;a.append("comment",o),GM_xmlhttpRequest({method:"POST",url:r.action,data:a.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:e=>{200===e.status||302===e.status?(t.remove(),D.showUserComments(n),m("Komentarz dodany ✅","success")):(m("Błąd dodawania komentarza","error"),l.style.opacity="1",l.style.pointerEvents="")},onerror:()=>{m("Błąd sieci","error"),l.style.opacity="1",l.style.pointerEvents=""}})},o.appendChild(r),p.appendChild(o)}if(l.length>0){const a=document.createElement("div");if(a.style.cssText="display:flex;flex-direction:column;gap:8px;",l.forEach(o=>{const r=document.createElement("div");r.className="comment-card",r.innerHTML=`\n <div class="comment-card-header">\n <img class="comment-avatar" src="${o.avatar}"\n onerror="this.src='${e.ICONS.NO_FOTO_FULL}'"\n data-profile="${v(o.name)}">\n <div class="comment-user-info">\n <div class="comment-user-name" data-profile="${v(o.name)}">${v(o.name)}</div>\n <div class="comment-date">${v(o.date)}</div>\n </div>\n </div>\n <div class="comment-body">${o.text}</div>\n ${o.reply?`<div class="comment-reply-new">${o.reply}</div>`:""}\n <div class="comment-actions">\n <button class="comment-action-btn reply-btn" data-comment-id="${o.commentId}">💬 Odpowiedz</button>\n ${o.deleteUrl?`<button class="comment-action-btn delete-btn" data-delete-url="${v(o.deleteUrl)}">🗑️ Usuń</button>`:""}\n </div>\n <div class="reply-form-inline" data-comment-id="${o.commentId}">\n <textarea rows="1" placeholder="Napisz odpowiedź..."></textarea>\n <div class="reply-tools">\n <div class="reply-emoji-btn" title="Emoji">😀</div>\n <div class="reply-starters-btn" title="Gotowe teksty">💡</div>\n <button class="reply-send-inline" title="Wyślij"></button>\n </div>\n </div>\n `,r.querySelector(".comment-user-name").addEventListener("click",()=>{t.remove(),D.showProfile(o.name)}),r.querySelector(".comment-avatar").addEventListener("click",()=>{t.remove(),D.showProfile(o.name)});const i=r.querySelector(".reply-btn"),s=r.querySelector(".reply-form-inline"),l=s.querySelector("textarea"),d=s.querySelector(".reply-send-inline"),c=s.querySelector(".reply-emoji-btn"),p=s.querySelector(".reply-starters-btn");if(i&&o.commentId){i.addEventListener("click",()=>{a.querySelectorAll(".reply-form-inline.active").forEach(e=>{e!==s&&e.classList.remove("active")}),s.classList.toggle("active"),s.classList.contains("active")&&l.focus()}),l.addEventListener("input",function(){f(this)});let r=null;c.onclick=n=>{if(n.stopPropagation(),r)return r.remove(),void(r=null);r=document.createElement("div"),r.className="chat-emoji-picker",r.style.cssText="position:absolute;bottom:60px;left:0;width:320px;max-height:200px;background:var(--dark-surface);border:1px solid var(--blood-red);border-radius:12px;padding:10px;display:grid;grid-template-columns:repeat(8,1fr);gap:5px;z-index:100;",e.EMOJI_LIST.slice(0,48).forEach(e=>{const n=document.createElement("div");n.textContent=e,n.style.cssText="font-size:20px;text-align:center;cursor:pointer;padding:5px;border-radius:8px;",n.onclick=()=>{const n=l.selectionStart,t=l.selectionEnd;l.value=l.value.substring(0,n)+e+l.value.substring(t),l.selectionStart=l.selectionEnd=n+e.length,l.focus(),r&&(r.remove(),r=null)},r.appendChild(n)}),s.appendChild(r)};let u=null;p.onclick=n=>{if(n.stopPropagation(),u)return u.remove(),void(u=null);u=document.createElement("div"),u.className="chat-emoji-picker",u.style.cssText="position:absolute;bottom:60px;left:0;width:320px;max-height:250px;background:var(--dark-surface);border:1px solid var(--blood-red);border-radius:12px;padding:10px;overflow-y:auto;z-index:100;display:flex;flex-direction:column;gap:6px;",e.COMMENT_STARTERS.forEach(e=>{const n=document.createElement("div");n.textContent=e,n.style.cssText="padding:8px 12px;border-radius:20px;background:var(--dark-surface-light);cursor:pointer;font-size:12px;color:var(--text-secondary);transition:all 0.2s;",n.onmouseenter=()=>{n.style.background="var(--blood-red)",n.style.color="var(--gold)"},n.onmouseleave=()=>{n.style.background="var(--dark-surface-light)",n.style.color="var(--text-secondary)"},n.onclick=()=>{l.value=e,f(l),l.focus(),u&&(u.remove(),u=null)},u.appendChild(n)}),s.appendChild(u)},d.addEventListener("click",()=>{const e=l.value.trim();if(!e)return void m("Wpisz treść odpowiedzi","error");d.style.opacity="0.5",d.style.pointerEvents="none";const r=new URLSearchParams;r.append("form","1"),r.append("reply",o.commentId),r.append("comment",e),GM_xmlhttpRequest({method:"POST",url:"https://fll.pl/profile.php?box=reply",data:r.toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:e=>{200===e.status||302===e.status?(t.remove(),D.showUserComments(n),m("Odpowiedź dodana ✅","success")):(m("Błąd: status "+e.status,"error"),d.style.opacity="1",d.style.pointerEvents="")},onerror:()=>{m("Błąd sieci - spróbuj ponownie","error"),d.style.opacity="1",d.style.pointerEvents=""}})})}const u=r.querySelector(".delete-btn");u&&u.addEventListener("click",()=>{if(confirm("Czy na pewno chcesz usunąć ten komentarz?")){let e=u.dataset.deleteUrl;e=e.replace(/&/g,"&"),e.startsWith("http")||(e="https://m.fll.pl/"+e.replace(/^\//,"")),GM_xmlhttpRequest({method:"GET",url:e,onload:e=>{200===e.status||302===e.status?(t.remove(),D.showUserComments(n),m("Komentarz usunięty 🗑️","success")):m("Błąd usuwania","error")},onerror:()=>m("Błąd sieci","error")})}}),a.appendChild(r)}),p.appendChild(a),o<r){const i=document.createElement("button");i.className="load-more-btn",i.textContent=`⬇ Załaduj starsze komentarze (strona ${o+1} z ${r})`;const s=()=>{i.textContent="⏳ Ładowanie...",i.disabled=!0;const l=o+1,d=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=gb&page=${l}`;GM_xmlhttpRequest({method:"GET",url:d,onload:n=>{if(i.remove(),200!==n.status)return void m("Błąd ładowania","error");const d=(new DOMParser).parseFromString(n.responseText,"text/html");let c=r;const u=d.querySelector(".paginator select");if(u&&(c=u.querySelectorAll("option").length),d.querySelectorAll(".message-box").forEach(n=>{let o="";const r=n.querySelector('.message-box > a, .profile-img a, a[href*="profile="]');if(r&&(o=r.textContent.trim(),!o)){const e=r.getAttribute("href");if(e){const n=e.match(/profile=([^&]+)/);n&&(o=decodeURIComponent(n[1]))}}let i=e.ICONS.NO_FOTO;const s=n.querySelector(".profile-img img");s&&(i=s.src);let l="";const d=n.querySelector(".message-date");d&&(l=d.childNodes[0]?.textContent?.trim()||"");let c="";const p=n.querySelector(".message-reader");p&&(c=p.innerHTML||p.textContent.trim());let u="";const g=n.querySelector(".message-reply");if(g&&(u=g.innerHTML),o&&c){const n=document.createElement("div");n.className="comment-card",n.innerHTML=`\n <div class="comment-card-header">\n <img class="comment-avatar" src="${i}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'" data-profile="${v(o)}">\n <div class="comment-user-info">\n <div class="comment-user-name" data-profile="${v(o)}">${v(o)}</div>\n <div class="comment-date">${v(l)}</div>\n </div>\n </div>\n <div class="comment-body">${c}</div>\n ${u?`<div class="comment-reply-new">${u}</div>`:""}\n `,n.querySelector(".comment-user-name").addEventListener("click",()=>{t.remove(),D.showProfile(o)}),n.querySelector(".comment-avatar").addEventListener("click",()=>{t.remove(),D.showProfile(o)}),a.appendChild(n)}}),o=l,r=c,o<r){const e=document.createElement("button");e.className="load-more-btn",e.textContent=`⬇ Załaduj starsze komentarze (strona ${o+1} z ${r})`,e.addEventListener("click",s),p.appendChild(e)}},onerror:()=>{m("Błąd sieci","error"),i.textContent="⬇ Spróbuj ponownie",i.disabled=!1}})};i.addEventListener("click",s),p.appendChild(i)}}else p.innerHTML+='<div class="comments-empty"><div style="font-size:40px;margin-bottom:10px;">💬</div><p>Brak komentarzy</p></div>';d.appendChild(p)},onerror:()=>I(t,"Błąd sieci")})},async showComments(){D.showUserComments(u.currentUserName)},async showList(n,t=1){const o=e.LIST_TYPES[n]||{title:n,icon:"📋"},r=O(`modal-${n}`,o.title,o.icon);r.classList.add("active"),F(r);const a=`${e.API_BASE}?p=list&l=${o.url}&page=${t}`;GM_xmlhttpRequest({method:"GET",url:a,onload:t=>{if(200!==t.status||!t.responseText)return void I(r,"Błąd ładowania");const o=(new DOMParser).parseFromString(t.responseText,"text/html"),a=[];o.querySelectorAll(".list-box").forEach(n=>{const t=n.querySelector(".list-info a"),o=t?t.textContent.trim():"",r=n.querySelector(".profile-img img"),i=r?r.src:e.ICONS.NO_FOTO,s=n.querySelector(".list-city")?.textContent.trim()||"",l=n.querySelector(".list-region")?.textContent.trim()||"",d=n.querySelector(".list-age")?.textContent.trim()||"",c=!!n.querySelector(".online");o&&a.push({name:o,avatar:i,city:s,region:l,age:d,isOnline:c})});let i=1,s=1;const l=o.querySelector(".paginator select");if(l){i=l.querySelectorAll("option").length;const e=l.querySelector("option[selected]");if(e){const n=e.textContent.match(/(\d+)\s*\/\s*(\d+)/);n&&(s=parseInt(n[1]),i=parseInt(n[2]))}}const d=r.querySelector(".modal-body");if(d.innerHTML="",!a.length)return void(d.innerHTML='<div class="modal-loading">Brak użytkowników</div>');const c=document.createElement("div");if(c.className="modal-list",a.forEach(n=>{const t=document.createElement("div");t.className="modal-item",t.innerHTML=`\n <img class="modal-avatar" src="${n.avatar}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'">\n <div class="modal-info">\n <a class="modal-name" data-profile="${v(n.name)}">${v(n.name)}</a>\n <div class="modal-details">${v(n.age)} ${v(n.city)} ${v(n.region)}</div>\n </div>\n ${n.isOnline?'<span style="color:#4CAF50;">🟢 Online</span>':""}\n `,c.appendChild(t),t.querySelector(".modal-name").addEventListener("click",()=>{r.remove(),D.showProfile(n.name)})}),d.appendChild(c),i>1){const e=document.createElement("div");e.className="modal-paginator",e.innerHTML=`\n <button class="modal-btn pag-prev" ${1===s?"disabled":""}>← Poprzednia</button>\n <select class="pag-select">${Array.from({length:i},(e,n)=>n+1).map(e=>`<option value="${e}" ${e===s?"selected":""}>${e} / ${i}</option>`).join("")}</select>\n <button class="modal-btn pag-next" ${s===i?"disabled":""}>Następna →</button>\n `,e.querySelector(".pag-prev").addEventListener("click",()=>{r.remove(),D.showList(n,s-1)}),e.querySelector(".pag-next").addEventListener("click",()=>{r.remove(),D.showList(n,s+1)}),e.querySelector(".pag-select").addEventListener("change",e=>{r.remove(),D.showList(n,parseInt(e.target.value))}),d.appendChild(e)}},onerror:()=>I(r,"Błąd sieci")})},async showGps(){const n=O("modal-gps","Lokalizacje","📍");n.classList.add("active"),F(n),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=gps`,onload:e=>{if(200!==e.status||!e.responseText)return void I(n,"Błąd ładowania");const t=(new DOMParser).parseFromString(e.responseText,"text/html"),o=[];t.querySelectorAll(".gps-box").forEach(e=>{const n=e.querySelector(".gps-info");if(!n)return;const t=n.querySelector("b")?.textContent.trim()||"";let r="";n.childNodes.forEach(e=>{3===e.nodeType&&e.textContent.includes("•")&&(r=e.textContent.trim())});const a=n.querySelector(".gps-date"),i=a?a.textContent.trim():"",s=!!n.querySelector('a[style*="background-color: #E00201"]'),l=n.querySelector("img"),d=l?l.getAttribute("src"):"/_layout/home_gps.svg",c=n.querySelector('a[href*="p=result"]'),p=c?c.getAttribute("href"):null,u=n.querySelector('a[href*="dgid="]'),g=u?u.getAttribute("href"):null;o.push({name:t,details:r,date:i,isCurrent:s,icon:d,searchHref:p,deleteHref:g})});const r=n.querySelector(".modal-body");if(r.innerHTML="",!o.length)return void(r.innerHTML='<div class="modal-loading">Brak lokalizacji</div>');const a=document.createElement("div");a.style.cssText="\n padding: 10px 15px;\n margin-bottom: 15px;\n background: var(--dark-surface-light);\n border-radius: 12px;\n color: var(--text-secondary);\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 10px;\n ",a.innerHTML=`\n <img src="/_layout/head-edit-gps.svg" style="width: 24px; height: 24px; filter: var(--svg-filter);">\n <span>Twoje zapisane lokalizacje (${o.length})</span>\n `,r.appendChild(a);const i=document.createElement("div");i.className="modal-list",o.forEach(e=>{const n=document.createElement("div");n.className="modal-item",n.style.cssText=`\n flex-direction: column;\n align-items: stretch;\n padding: 15px;\n ${e.isCurrent?"border-left: 3px solid var(--blood-red);":""}\n background: ${e.isCurrent?"var(--dark-surface-light)":"var(--dark-surface)"};\n `;let t=`\n <div style="display: flex; align-items: center; gap: 15px;">\n <div class="gps-icon" style="flex-shrink: 0; ${e.isCurrent?"background: var(--blood-red);":""}">\n <img src="${e.icon}" style="width: 30px; height: 30px; filter: var(--svg-filter);">\n </div>\n <div class="modal-info" style="flex: 1;">\n <div class="modal-name" style="display: flex; align-items: center; gap: 10px;">\n ${v(e.name)}\n ${e.isCurrent?'<span class="gps-current-badge">⭐ Aktualna</span>':""}\n </div>\n <div class="modal-details">${v(e.details)}</div>\n ${e.date?`<div style="font-size: 11px; color: var(--text-muted); margin-top: 3px;">🕐 ${v(e.date)}</div>`:""}\n </div>\n </div>\n `,o='<div style="display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap;">';if(e.searchHref){Date.now(),Math.random();o+=`\n <button class="modal-btn gps-search-btn" data-href="${e.searchHref.replace(/&/g,"&").replace(/"/g,""")}" style="cursor: pointer;">\n 🔍 Szukaj w pobliżu\n </button>\n `}e.deleteHref&&(o+=`\n <button class="modal-btn gps-delete-btn" data-href="${e.deleteHref}" style="color: #f44336; cursor: pointer;">\n 🗑️ Usuń\n </button>\n `),o+="</div>",n.innerHTML=t+o,i.appendChild(n)}),r.appendChild(i),r.querySelectorAll(".gps-search-btn").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.href;t&&(n.remove(),function(e){const n=new URLSearchParams(e.split("?")[1]||"").get("gps");n?(D.showSearch(),setTimeout(()=>{const e=document.querySelector(".modal-overlay.active");if(e){const t=e.querySelector("#gps"),o=e.querySelector("#gpschk");t&&o&&(t.value=decodeURIComponent(n),o.checked=!0,m("GPS został ustawiony. Kliknij Szukaj aby znaleźć profile w pobliżu.","info"))}},1e3)):D.showSearch()}(t))})}),r.querySelectorAll(".gps-delete-btn").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.href;t&&confirm("Usunąć tę lokalizację?")&&GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/${t.replace(/^\//,"")}`,onload:()=>{m("Lokalizacja usunięta","success"),n.remove(),D.showGps()},onerror:()=>m("Błąd usuwania","error")})})});const s=document.createElement("div");s.style.cssText="\n margin-top: 15px;\n padding: 10px 15px;\n background: var(--dark-surface-light);\n border-radius: 12px;\n color: var(--text-muted);\n font-size: 12px;\n text-align: center;\n ",s.innerHTML='\n 💡 <b>Wskazówka:</b> Aby dodać lub zmienić lokalizację, przejdź do\n <a href="#" id="gps-edit-profile-link" style="color: var(--gold); cursor: pointer;">edycji profilu</a>\n ',r.appendChild(s);const l=r.querySelector("#gps-edit-profile-link");l&&l.addEventListener("click",e=>{e.preventDefault(),n.remove(),D.showEditProfile()})},onerror:()=>I(n,"Błąd sieci")})},async showEditProfile(){const n=O("modal-edit-profile","Edytuj profil","✏️");n.classList.add("active"),F(n),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=edit_profile`,onload:t=>{if(200!==t.status||!t.responseText)return void I(n,"Błąd ładowania");const o=(new DOMParser).parseFromString(t.responseText,"text/html").querySelector("#editprofileform"),r=n.querySelector(".modal-body");if(!o)return void I(n,"Nie znaleziono formularza");r.innerHTML=`\n\n <form id="edit-profile-form" method="post" action="${e.API_BASE}?p=edit_profile">\n <input type="hidden" name="form" value="1">\n <div class="edit-profile-container">\n ${g(o)}\n <button type="button" class="ep-save-btn" id="ep-save-btn">\n 💾 Zapisz zmiany\n </button>\n </div>\n </form>\n `,r.querySelectorAll(".ep-card-header").forEach(e=>{e.addEventListener("click",()=>{const n=e.nextElementSibling;e.classList.toggle("collapsed"),n.classList.toggle("collapsed")})}),r.querySelectorAll(".ep-checkbox-item").forEach(e=>{e.addEventListener("click",()=>{const n=e.querySelector('input[type="checkbox"]');n&&(n.checked=!n.checked,e.classList.toggle("checked",n.checked))})});const a=r.querySelector("#ep-save-btn");a.addEventListener("click",()=>{const t=r.querySelector("#edit-profile-form");if(!t)return;a.textContent="⏳ Zapisywanie...",a.disabled=!0;const o=new FormData(t);GM_xmlhttpRequest({method:"POST",url:`${e.API_BASE}?p=edit_profile`,data:new URLSearchParams(o).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:e=>{if(200===e.status){m("Profil został zaktualizowany","success"),n.remove();const e=document.querySelector(".dashboard-container");e&&e.remove(),X=!1,Q()}else m("Błąd zapisywania","error"),a.textContent="💾 Zapisz zmiany",a.disabled=!1},onerror:()=>{m("Błąd sieci","error"),a.textContent="💾 Zapisz zmiany",a.disabled=!1}})})},onerror:()=>I(n,"Błąd sieci")})},async showEditGallery(){const n=O("modal-edit-gallery","Edytuj galerię","🖼️");n.classList.add("active"),F(n);const t=document.createElement("style");t.setAttribute("data-src","Fellow Enhanced.user.js"),t.textContent="\n .gallery-desktop-container {\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 10px;\n }\n .gallery-upload-zone {\n border: 3px dashed var(--gold-dark);\n border-radius: 20px;\n padding: 40px 30px;\n text-align: center;\n cursor: pointer;\n transition: all 0.3s ease;\n background: var(--dark-surface-light);\n position: relative;\n overflow: hidden;\n }\n .gallery-upload-zone.drag-over {\n border-color: var(--gold);\n background: rgba(139, 0, 0, 0.15);\n transform: scale(1.02);\n box-shadow: 0 0 40px var(--blood-red-glow);\n }\n .gallery-upload-zone.drag-over .upload-icon {\n animation: uploadBounce 0.6s ease-in-out infinite;\n }\n @keyframes uploadBounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-10px); }\n }\n .gallery-upload-zone .upload-icon {\n font-size: 48px;\n margin-bottom: 12px;\n transition: transform 0.3s;\n }\n .gallery-upload-zone h3 {\n color: var(--gold);\n font-size: 18px;\n margin: 0 0 8px 0;\n }\n .gallery-upload-zone p {\n color: var(--text-muted);\n font-size: 12px;\n margin: 0;\n }\n .gallery-upload-zone .upload-progress {\n display: none;\n margin-top: 12px;\n }\n .upload-progress-bar {\n width: 100%;\n height: 6px;\n background: var(--dark-surface-lighter);\n border-radius: 3px;\n overflow: hidden;\n }\n .upload-progress-fill {\n width: 0%;\n height: 100%;\n background: var(--blood-gradient);\n border-radius: 3px;\n transition: width 0.3s;\n animation: progressPulse 1.5s ease-in-out infinite;\n }\n @keyframes progressPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n }\n .gallery-info-box {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 11px;\n color: var(--text-secondary);\n line-height: 1.5;\n }\n .gallery-info-box b {\n color: var(--gold);\n }\n .gallery-grid-desktop {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 12px;\n }\n .gallery-photo-card {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n overflow: hidden;\n transition: all 0.3s ease;\n }\n .gallery-photo-card:hover {\n border-color: var(--blood-red);\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(0,0,0,0.4);\n }\n .photo-img-container {\n position: relative;\n aspect-ratio: 1;\n overflow: hidden;\n background: var(--dark-surface-lighter);\n cursor: pointer;\n }\n .photo-img-container img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.4s ease;\n }\n .gallery-photo-card:hover .photo-img-container img {\n transform: scale(1.05);\n }\n .photo-badges {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n gap: 4px;\n z-index: 2;\n }\n .photo-badge {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0,0,0,0.75);\n border: 1.5px solid rgba(212,175,55,0.3);\n backdrop-filter: blur(8px);\n font-size: 12px;\n color: rgba(255,255,255,0.5);\n }\n .photo-badge.active {\n background: var(--blood-red);\n border-color: var(--gold);\n color: var(--gold);\n box-shadow: 0 0 10px rgba(139,0,0,0.5);\n }\n .photo-actions {\n padding: 8px 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n border-top: 1px solid var(--dark-border);\n }\n .photo-action-btn {\n padding: 5px 10px;\n border-radius: 6px;\n font-size: 10px;\n cursor: pointer;\n background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border);\n color: var(--text-secondary);\n text-decoration: none;\n transition: all 0.2s;\n white-space: nowrap;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n .photo-action-btn:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n color: var(--gold);\n }\n .photo-action-btn.active {\n background: var(--blood-red-dark);\n border-color: var(--gold);\n color: var(--gold);\n }\n .photo-action-btn.danger {\n border-color: rgba(244,67,54,0.3);\n color: rgba(244,67,54,0.7);\n }\n .photo-action-btn.danger:hover {\n background: #f44336;\n border-color: #f44336;\n color: #fff;\n }\n .photo-action-btn.download {\n background: rgba(212,175,55,0.1);\n border-color: rgba(212,175,55,0.2);\n }\n .photo-footer {\n padding: 6px 10px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 10px;\n color: var(--text-muted);\n background: var(--dark-surface);\n border-top: 1px solid var(--dark-border);\n }\n .photo-id {\n font-size: 9px;\n opacity: 0.5;\n }\n .upload-input { display: none; }\n @media (max-width: 768px) {\n .gallery-grid-desktop {\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 8px;\n }\n .gallery-upload-zone {\n padding: 25px 15px;\n }\n }\n ",document.head.appendChild(t),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=edit_gallery`,onload:o=>{if(200!==o.status||!o.responseText)return void I(n,"Błąd ładowania");const r=(new DOMParser).parseFromString(o.responseText,"text/html").querySelectorAll(".gallery-edit-box"),a=[];r.forEach(e=>{const n=e.id;if(!n)return;const t=e.querySelector(".gallery-edit-img img"),o=t?.src||"";if(!o||o.includes("no-foto"))return;const r=e.querySelector(".gallery-edit-img a"),i=r?.getAttribute("ref")||"",s=i?`https://fll.pl/profiles_data/${i}.jpg`:o,l=e.querySelector(".gallery-edit-legend");let d=!1,c=!1,p=!1,u=!1,g=!1;const m={};l&&l.querySelectorAll("a").forEach(e=>{const n=(e.textContent||"").trim(),t=e.getAttribute("href")||"",o=e.classList.contains("on");(n.includes("główne")||n.includes("Główne"))&&(d=o,t.includes("&main=")&&(m.main=t),t.includes("&cmain=")&&(m.cmain=t)),(n.includes("profilowe")||n.includes("Profilowe"))&&(c=o,t.includes("&main=")&&(m.main=t),t.includes("&cmain=")&&(m.cmain=t)),(n.includes("prywatne")||n.includes("Prywatne"))&&(p=o,t.includes("&cprivate=")&&(m.cprivate=t),t.includes("&private=")&&(m.private=t)),n.includes("dorosłych")&&(u=o,t.includes("&cadult=")&&(m.cadult=t),t.includes("&adult=")&&(m.adult=t)),(n.includes("ukryte")||n.includes("Ukryte"))&&(g=o,t.includes("&csuspend=")&&(m.csuspend=t),t.includes("&suspend=")&&(m.suspend=t))});let h="",x=e.nextElementSibling;for(;x;){if(x.classList.contains("gallery-date")){h=x.textContent.trim();break}x=x.nextElementSibling}let b="";for(x=e.nextElementSibling;x;){if(x.classList.contains("gallery-del-img")){const e=x.querySelector("a");b=e?.getAttribute("href")||"";break}x=x.nextElementSibling}let v="";for(x=e.nextElementSibling;x;){if(x.classList.contains("gallery-dl-img")){const e=x.querySelector("a");v=e?.getAttribute("href")||"";break}x=x.nextElementSibling}b&&(m.del=b),v&&(m.dl=v),a.push({id:n,imgUrl:o,fullUrl:s,dateText:h,isMain:d,isProfile:c,isPrivate:p,isAdult:u,isHidden:g,actions:m})});const i=n.querySelector(".modal-body");let s='<div class="gallery-desktop-container">\n <div class="gallery-upload-zone" id="gallery-upload-zone">\n <div class="upload-icon">📁</div>\n <h3>Przeciągnij i upuść zdjęcia tutaj</h3>\n <p>lub kliknij, aby wybrać pliki z dysku</p>\n <div class="upload-progress" id="upload-progress">\n <div class="upload-progress-bar">\n <div class="upload-progress-fill" id="upload-progress-fill"></div>\n </div>\n <div style="margin-top:8px;font-size:12px;color:var(--gold);">Przesyłanie...</div>\n </div>\n <input type="file" id="gallery-file-input" class="upload-input" accept="image/*" multiple>\n </div>\n <div class="gallery-info-box">\n <span style="font-size:20px;">⚠️</span>\n <span><b>Zdjęciem profilowym</b> może być wyłącznie zdjęcie przedstawiające <b>właściciela profilu</b>. Zdjęcie profilowe powinno przedstawiać <b>przede wszystkim twarz</b>.</span>\n </div>';0===a.length?s+='<div style="text-align:center;padding:40px;color:var(--text-muted);font-size:14px;">📭 Brak zdjęć w galerii</div>':(s+='<div class="gallery-grid-desktop">',a.forEach(e=>{const n=[];(e.isMain||e.isProfile)&&n.push("⭐"),e.isPrivate&&n.push("🔒"),e.isAdult&&n.push("🔞"),e.isHidden&&n.push("👁️");const t=e.actions.main||e.actions.cmain||"",o=e.actions.private||e.actions.cprivate||"",r=e.actions.adult||e.actions.cadult||"",a=e.actions.suspend||e.actions.csuspend||"";s+=`\n <div class="gallery-photo-card" data-id="${e.id}">\n <div class="photo-img-container" data-full="${e.fullUrl}" title="Kliknij, aby powiększyć">\n <img src="${e.imgUrl}" alt="Zdjęcie" loading="lazy">\n ${n.length?`<div class="photo-badges">${n.map(e=>`<span class="photo-badge active">${e}</span>`).join("")}</div>`:""}\n </div>\n <div class="photo-actions">\n ${t?`<a href="https://m.fll.pl/${t}" class="photo-action-btn ${e.isMain?"active":""}" data-action="main">⭐ Główne</a>`:""}\n ${o?`<a href="https://m.fll.pl/${o}" class="photo-action-btn ${e.isPrivate?"active":""}" data-action="private">🔒 Prywatne</a>`:""}\n ${r?`<a href="https://m.fll.pl/${r}" class="photo-action-btn ${e.isAdult?"active":""}" data-action="adult">🔞 18+</a>`:""}\n ${a?`<a href="https://m.fll.pl/${a}" class="photo-action-btn ${e.isHidden?"active":""}" data-action="suspend">👁️ Ukryj</a>`:""}\n ${e.actions.dl?`<span class="photo-action-btn download gallery-download-btn" data-dl="${e.actions.dl.replace(/"/g,""")}" data-id="${e.id}">📥 Pobierz</span>`:""}\n ${e.actions.del?`<a href="https://m.fll.pl/${e.actions.del}" class="photo-action-btn danger" data-action="delete">🗑️ Usuń</a>`:""}\n </div>\n ${e.dateText?`<div class="photo-footer"><span>🕐 ${e.dateText}</span><span class="photo-id">#${e.id}</span></div>`:""}\n </div>`}),s+="</div>"),s+="</div>",i.innerHTML=s;const l=i.querySelector("#gallery-upload-zone"),d=i.querySelector("#gallery-file-input"),c=i.querySelector("#upload-progress"),p=i.querySelector("#upload-progress-fill");async function g(t){const o=t.length;let r=0;const a=l.querySelector("h3"),i=l.querySelector("p"),s=l.querySelector(".upload-icon");l.style.pointerEvents="none",c.style.display="block",s.textContent="⏳";for(const n of t){if(!n.type.startsWith("image/")){m(`Pominięto: ${n.name} (nie jest obrazem)`,"error"),r++;continue}a.textContent=`Przesyłanie ${r+1} z ${o}...`;const t=new FormData;t.append("img",n);try{(await fetch(`${e.API_BASE}?p=edit_gallery&add=1`,{method:"POST",body:t})).ok?(r++,p.style.width=r/o*100+"%"):m(`Błąd przesyłania: ${n.name}`,"error")}catch(e){m(`Błąd sieci: ${n.name}`,"error")}}p.style.width="100%",s.textContent="✅",a.textContent=`Przesłano ${r} z ${o} zdjęć`,i.textContent="Za chwilę galeria zostanie odświeżona...",m(`Przesłano ${r} zdjęć pomyślnie!`,"success"),setTimeout(()=>{u.clearCache(`${e.API_BASE}?p=edit_gallery`),n.remove(),D.showEditGallery()},1500)}l&&d&&(l.addEventListener("click",e=>{e.target===c||e.target.closest("#upload-progress")||d.click()}),l.addEventListener("dragover",e=>{e.preventDefault(),e.stopPropagation(),l.classList.add("drag-over")}),l.addEventListener("dragleave",e=>{e.preventDefault(),e.stopPropagation(),l.classList.remove("drag-over")}),l.addEventListener("drop",e=>{e.preventDefault(),e.stopPropagation(),l.classList.remove("drag-over");const n=e.dataTransfer.files;n.length>0&&g(n)}),d.addEventListener("change",()=>{const e=d.files;e.length>0&&g(e)})),i.querySelectorAll(".photo-img-container").forEach(e=>{e.addEventListener("click",n=>{if(n.target.closest(".photo-badge"))return;const t=e.dataset.full;t&&C(t)})}),i.querySelectorAll(".gallery-download-btn").forEach(e=>{e.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const t=e.dataset.dl,o=e.dataset.id;t&&(GM_download(t,`zdjecie_${o}.jpg`),m("Pobieranie zdjęcia...","info"))})}),i.querySelectorAll(".photo-action-btn[data-action]").forEach(t=>{t.addEventListener("click",async o=>{o.preventDefault(),o.stopPropagation();const r=t.getAttribute("href"),a=t.dataset.action;if(r&&("delete"!==a||confirm("Czy na pewno chcesz usunąć wybrane zdjęcie?"))){t.style.opacity="0.5",t.style.pointerEvents="none";try{await fetch(r),u.clearCache(`${e.API_BASE}?p=edit_gallery`),n.remove(),D.showEditGallery();m({main:"Status zdjęcia zmieniony",private:"Status prywatności zmieniony",adult:"Status 18+ zmieniony",suspend:"Widoczność zdjęcia zmieniona",delete:"Zdjęcie usunięte"}[a]||"Zmiany zapisane","success")}catch(e){m("Błąd podczas zapisywania zmian","error"),t.style.opacity="1",t.style.pointerEvents=""}}})});const h=()=>{t.parentNode&&t.remove()};n.querySelector(".modal-close").addEventListener("click",h),n.addEventListener("click",e=>{e.target===n&&h()})},onerror:()=>I(n,"Błąd sieci")})},async showSettings(){const n=O("modal-settings","Ustawienia","⚙️");n.classList.add("active"),F(n),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=settings`,onload:t=>{if(200!==t.status||!t.responseText)return void I(n,"Błąd ładowania");const o=(new DOMParser).parseFromString(t.responseText,"text/html"),r=(o.querySelector("#settings"),n.querySelector(".modal-body"));r.innerHTML=`\n <div class="settings-container">\n\n <div class="settings-card">\n <h3><span class="icon">🔔</span> Powiadomienia</h3>\n <form id="settings-form" style="margin: 0;">\n <input type="hidden" name="form" value="1">\n <div class="settings-row">\n <input type="checkbox" name="outnewmail" id="outnewmail">\n <label for="outnewmail">Nowa wiadomość (adres e-mail)</label>\n </div>\n <div class="settings-row">\n <input type="checkbox" name="outnewgb" id="outnewgb" checked="">\n <label for="outnewgb">Nowy komentarz (adres e-mail)</label>\n </div>\n <div class="settings-row">\n <input type="checkbox" name="outnewfriend" id="outnewfriend">\n <label for="outnewfriend">Nowy znajomy (adres e-mail)</label>\n </div>\n <div class="settings-row">\n <input type="checkbox" name="outnewfav" id="outnewfav">\n <label for="outnewfav">Nowy ulubiony (adres e-mail)</label>\n </div>\n <hr class="settings-divider">\n <div class="settings-row">\n <input type="checkbox" name="innewgb" id="innewgb">\n <label for="innewgb">Nowy komentarz (wiadomość wewnętrzna)</label>\n </div>\n <div class="settings-row">\n <input type="checkbox" name="innewfav" id="innewfav">\n <label for="innewfav">Nowy ulubiony (wiadomość wewnętrzna)</label>\n </div>\n <hr class="settings-divider">\n <div class="settings-row">\n <input type="checkbox" name="alertmail" id="alertmail">\n <label for="alertmail">Dźwiękowe o nowej wiadomości wewnętrznej</label>\n </div>\n <input type="checkbox" name="blockfriend" style="display:none;">\n <input type="checkbox" name="blockmutualfriend" style="display:none;">\n <input type="checkbox" name="blockim" style="display:none;">\n <input type="checkbox" name="blockfriendadd" style="display:none;">\n </form>\n </div>\n\n <div class="settings-card">\n <h3><span class="icon">🚫</span> Blokady</h3>\n <div class="settings-row">\n <input type="checkbox" name="blockgb" id="blockgb" form="settings-form">\n <label for="blockgb">Zablokuj zakładkę komentarzy w profilu</label>\n </div>\n <div class="settings-row">\n <input type="checkbox" name="blockinforfav" id="blockinforfav" form="settings-form">\n <label for="blockinforfav">Powiadomienia o dodaniu do ulubionych</label>\n <p class="settings-description">Wyłącza wiadomości wewnętrzne o dodaniu do ulubionych</p>\n </div>\n </div>\n\n <div class="settings-card">\n <h3><span class="icon">🔑</span> Zmiana danych</h3>\n <div class="settings-btn-group">\n <button class="settings-btn" id="settings-chpass-btn">🔒 Zmień hasło</button>\n <button class="settings-btn" id="settings-chemail-btn">✉️ Zmień adres e-mail</button>\n <button class="settings-btn" id="settings-chname-btn">👤 Zmień nazwę profilu</button>\n </div>\n </div>\n\n <div class="settings-card">\n <h3><span class="icon">👁️</span> Widoczność profilu</h3>\n <div class="settings-radio-group" id="visibility-group">\n <div class="settings-radio-item active" data-value="1">\n <input type="radio" name="act" value="1" id="active" form="settings-form" checked="">\n <label for="active">🟢 Profil aktywny</label>\n </div>\n <div class="settings-radio-item" data-value="2">\n <input type="radio" name="act" value="2" id="suspend" form="settings-form">\n <label for="suspend">🟡 Profil zawieszony</label>\n </div>\n <div class="settings-radio-item danger" data-value="3">\n <input type="radio" name="act" value="3" id="remove" form="settings-form">\n <label for="remove">🔴 Usuń profil</label>\n </div>\n </div>\n </div>\n\n <div class="settings-card">\n <h3><span class="icon">🎨</span> Wygląd skryptu</h3>\n <div class="settings-radio-group" id="scheme-group">\n ${Object.entries(p).map(([e,n])=>`\n <div class="settings-radio-item ${u.activeColorScheme===e?"active":""}" data-value="${e}">\n <input type="radio" name="script_color_scheme" value="${e}" ${u.activeColorScheme===e?"checked":""}>\n <label>${n.name||e}</label>\n </div>\n `).join("")}\n</div>\n\n <hr class="settings-divider">\n <div class="settings-row">\n <input type="checkbox" id="show-avatars-checkbox" ${u.shouldShowAvatars?"checked":""}>\n <label for="show-avatars-checkbox">👤 Pokaż awatary użytkowników w czacie</label>\n </div>\n\n <p class="settings-description">Wyłączenie awatarów może przyspieszyć działanie czatu na wolniejszych urządzeniach.</p>\n <div class="settings-row" style="margin-top: 10px;">\n <input type="checkbox" id="show-recent-comments-checkbox" ${u.showRecentComments?"checked":""}>\n <label for="show-recent-comments-checkbox">💬 Pokaż ostatnie komentarze na dashboardzie</label>\n </div>\n <p class="settings-description">Wyświetlanie ostatnich komentarzy w prawym panelu.</p>\n <div class="settings-row">\n <input type="checkbox" id="auto-connect-chat-checkbox" ${u.autoConnectChat?"checked":""}>\n <label for="auto-connect-chat-checkbox">🔌 Auto-łącz z czatem po zalogowaniu</label>\n</div>\n<p class="settings-description">Wyłączenie sprawi, że czat nie połączy się automatycznie. Możesz połączyć ręcznie klikając ikonę 💬.</p>\n <div class="settings-row" style="margin-top: 10px;">\n <input type="checkbox" id="mention-notify-checkbox" ${u.mentionNotify?"checked":""}>\n <label for="mention-notify-checkbox">🔔 Powiadamiaj gdy ktoś mnie @wspomni na czacie</label>\n</div>\n<p class="settings-description">Dostaniesz powiadomienie gdy ktoś napisze @TwojaNazwa na czacie publicznym.</p>\n</div>\n\n\n\n<div class="settings-card">\n <h3><span class="icon">👁️</span> Widoczność widgetów</h3>\n <p style="color:var(--text-muted);font-size:12px;margin:0 0 15px 0;padding-left:15px;">Wybierz które widgety mają się wyświetlać w prawej kolumnie</p>\n\n <div class="settings-row">\n <input type="checkbox" id="show-calendar-widget-checkbox" ${u.showCalendarWidget?"checked":""}>\n <label for="show-calendar-widget-checkbox">📅 Kalendarz - nadchodzące wydarzenia</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="show-comments-widget-checkbox" ${u.showCommentsWidget?"checked":""}>\n <label for="show-comments-widget-checkbox">💬 Ostatnie komentarze</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="show-notes-widget-checkbox" ${u.showNotesWidget?"checked":""}>\n <label for="show-notes-widget-checkbox">📝 Notatki</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="show-plus-widget-checkbox" ${u.showPlusWidget?"checked":""}>\n <label for="show-plus-widget-checkbox">⭐ Fellow+</label>\n </div>\n</div>\n <div class="settings-card">\n <h3><span class="icon">📋</span> Ustawienia feedu</h3>\n <p style="color:var(--text-muted);font-size:12px;margin:0 0 15px 0;padding-left:15px;">Wybierz które sekcje profili mają się wyświetlać w środkowej kolumnie</p>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-top" ${u.feedSections.includes("top")?"checked":""}>\n <label for="feed-section-top">⭐ TOP Profile</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-new" ${u.feedSections.includes("new")?"checked":""}>\n <label for="feed-section-new">🆕 Nowe profile</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-random" ${u.feedSections.includes("random")?"checked":""}>\n <label for="feed-section-random">🎲 Losowe profile</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-visitors" ${u.feedSections.includes("visitors")?"checked":""}>\n <label for="feed-section-visitors">👥 Ostatnio odwiedzający</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-favorites" ${u.feedSections.includes("favorites")?"checked":""}>\n <label for="feed-section-favorites">⭐ Ulubione</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-friends" ${u.feedSections.includes("friends")?"checked":""}>\n <label for="feed-section-friends">👤 Znajomi</label>\n </div>\n\n <div class="settings-row">\n <input type="checkbox" id="feed-section-history" ${u.feedSections.includes("history")?"checked":""}>\n <label for="feed-section-history">📜 Odwiedzone</label>\n</div>\n </div>\n\n \x3c!-- PRZYCISK ZAPISZ W MODALU (nie floating) --\x3e\n <button type="button" class="settings-save-btn" id="settings-save-btn">\n 💾 Zapisz ustawienia\n </button>\n </div>\n `,document.title="⚙️ Ustawienia - Fellow Enhanced",r.querySelector("#show-calendar-widget-checkbox")?.addEventListener("change",n=>{u.showCalendarWidget=n.target.checked,GM_setValue(e.SHOW_CALENDAR_WIDGET_KEY,u.showCalendarWidget),J()}),r.querySelector("#show-comments-widget-checkbox")?.addEventListener("change",n=>{u.showCommentsWidget=n.target.checked,GM_setValue(e.SHOW_COMMENTS_WIDGET_KEY,u.showCommentsWidget),J()}),r.querySelector("#show-notes-widget-checkbox")?.addEventListener("change",n=>{u.showNotesWidget=n.target.checked,GM_setValue(e.SHOW_NOTES_WIDGET_KEY,u.showNotesWidget),J()}),r.querySelector("#show-plus-widget-checkbox")?.addEventListener("change",n=>{u.showPlusWidget=n.target.checked,GM_setValue(e.SHOW_PLUS_WIDGET_KEY,u.showPlusWidget),J()}),r.querySelector("#mention-notify-checkbox")?.addEventListener("change",n=>{u.mentionNotify=n.target.checked,GM_setValue(e.MENTION_NOTIFY_KEY,u.mentionNotify),m(n.target.checked?"Powiadomienia @ włączone":"Powiadomienia @ wyłączone","success")}),r.querySelector("#auto-connect-chat-checkbox")?.addEventListener("change",n=>{u.autoConnectChat=n.target.checked,GM_setValue(e.AUTO_CONNECT_CHAT_KEY,u.autoConnectChat),n.target.checked&&!W.wsInitialized?(W.initializeWebSocket(),m("Połączono z czatem","success")):!n.target.checked&&W.wsInitialized&&(W.intentionalClose=!0,W.cleanupWebSocket(),m("Rozłączono z czatem","info"))});const a=o.querySelector("#settings");a&&(a.querySelectorAll('input[type="checkbox"]').forEach(e=>{const n=e.getAttribute("name");if(n&&e.checked){const e=r.querySelector(`input[name="${CSS.escape(n)}"]`);e&&(e.checked=!0)}}),a.querySelectorAll('input[type="radio"]').forEach(e=>{const n=e.getAttribute("name");if(n&&e.checked){const t=r.querySelector(`input[name="${CSS.escape(n)}"][value="${e.value}"]`);if(t){t.checked=!0;const e=t.closest(".settings-radio-item");e&&(e.parentElement.querySelectorAll(".settings-radio-item").forEach(e=>e.classList.remove("active")),e.classList.add("active"))}}}));const i=r.querySelector("#settings-save-btn");i&&i.addEventListener("click",()=>{const t=r.querySelector("#settings-form");if(!t)return;const o=new FormData(t),a=r.querySelector("#blockgb");a&&a.checked&&o.append("blockgb","1");const s=r.querySelector("#blockinforfav");s&&s.checked&&o.append("blockinforfav","1");const l=r.querySelector('input[name="act"]:checked');l&&o.append("act",l.value),i.textContent="⏳ Zapisywanie...",i.disabled=!0,GM_xmlhttpRequest({method:"POST",url:`${e.API_BASE}?p=settings`,data:new URLSearchParams(o).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:e=>{200===e.status?(m("Ustawienia zostały zapisane","success"),n.remove()):(m("Błąd zapisywania ustawień","error"),i.textContent="💾 Zapisz ustawienia",i.disabled=!1)},onerror:()=>{m("Błąd sieci","error"),i.textContent="💾 Zapisz ustawienia",i.disabled=!1}})}),r.querySelector("#visibility-group").addEventListener("click",e=>{const n=e.target.closest(".settings-radio-item");if(n){r.querySelectorAll("#visibility-group .settings-radio-item").forEach(e=>e.classList.remove("active")),n.classList.add("active");const e=n.querySelector('input[type="radio"]');e&&(e.checked=!0)}}),r.querySelector("#scheme-group").addEventListener("click",e=>{const n=e.target.closest(".settings-radio-item");if(n){r.querySelectorAll("#scheme-group .settings-radio-item").forEach(e=>e.classList.remove("active")),n.classList.add("active");const e=n.querySelector('input[type="radio"]');e&&(e.checked=!0,U.applyTheme(e.value),m("Motyw został zmieniony","success"))}}),r.querySelector("#show-avatars-checkbox")?.addEventListener("change",n=>{u.shouldShowAvatars=n.target.checked,GM_setValue(e.SHOW_AVATARS_KEY,u.shouldShowAvatars),W.updateAvatarVisibility&&W.updateAvatarVisibility()}),r.querySelector("#show-recent-comments-checkbox")?.addEventListener("change",n=>{u.showRecentComments=n.target.checked,GM_setValue(e.SHOW_RECENT_COMMENTS_KEY,u.showRecentComments);const t=document.querySelector(".dashboard-container");t&&t.remove(),X=!1,Q()});const s=["top","new","random","visitors","history","favorites","friends"];s.forEach(n=>{r.querySelector(`#feed-section-${n}`)?.addEventListener("change",n=>{const t=[];s.forEach(e=>{const n=r.querySelector(`#feed-section-${e}`);n&&n.checked&&t.push(e)}),u.feedSections=t,GM_setValue(e.FEED_SECTIONS_KEY,t);const o=document.querySelector(".dashboard-container");o&&o.remove(),X=!1,Q(),m("Układ feedu zaktualizowany","success")})}),r.querySelector("#settings-chpass-btn")?.addEventListener("click",()=>{n.remove(),h("chpassword","Zmień hasło")}),r.querySelector("#settings-chemail-btn")?.addEventListener("click",()=>{n.remove(),h("chemail","Zmień adres e-mail")}),r.querySelector("#settings-chname-btn")?.addEventListener("click",()=>{n.remove(),h("chprofilename","Zmień nazwę profilu")});const l=()=>{n.remove()};n.querySelector(".modal-close").addEventListener("click",l),n.addEventListener("click",e=>{e.target===n&&l()})},onerror:()=>I(n,"Błąd sieci")})},async showMessages(n=1){const t=O("modal-messages","Wiadomości","✉️");t.classList.add("active"),F(t);const o=`${e.API_BASE}?p=messages&l=in&page=${n}`;GM_xmlhttpRequest({method:"GET",url:o,onload:n=>{if(200!==n.status||!n.responseText)return void I(t,"Błąd ładowania");const o=(new DOMParser).parseFromString(n.responseText,"text/html"),r=[];o.querySelectorAll(".message-box").forEach(n=>{let t="";const o=n.querySelector('a[href*="profile="]');if(o){const e=o.getAttribute("href").match(/profile=([^&]+)/);e&&(t=decodeURIComponent(e[1]))}let a=e.ICONS.NO_FOTO;const i=n.querySelector(".profile-img img");i&&(a=i.src);const s=n.querySelector(".message-reader");let l=s?s.textContent.trim():"";const d=n.querySelector(".message-date");let c=d?d.childNodes[0]?.textContent.trim():"";const p=n.classList.contains("message-new")||!!n.querySelector(".newchat");t&&r.push({name:t,avatar:a,preview:l,date:c,isUnread:p})});let a=1,i=1;const s=o.querySelector(".paginator select");if(s){a=s.querySelectorAll("option").length;const e=s.querySelector("option[selected]");if(e){const n=e.textContent.match(/(\d+)\s*\/\s*(\d+)/);n&&(i=parseInt(n[1]),a=parseInt(n[2]))}}const l=t.querySelector(".modal-body");if(l.innerHTML="",!r.length)return void(l.innerHTML='<div class="modal-loading">Brak wiadomości</div>');const d=document.createElement("div");if(d.className="modal-list",r.forEach(e=>{const n=document.createElement("div");n.className="modal-item "+(e.isUnread?"unread":""),n.style.cssText=e.isUnread?"border-left: 3px solid var(--blood-red);":"",n.innerHTML=`\n <img class="modal-avatar" src="${e.avatar}">\n <div class="modal-info">\n <a class="modal-name" data-profile="${v(e.name)}">${v(e.name)}</a>\n <div class="modal-details">${v(e.preview.substring(0,100))}</div>\n <div class="modal-date">${v(e.date)}</div>\n </div>\n <button class="modal-btn open-conv" data-profile="${v(e.name)}">💬 Otwórz</button>\n `,d.appendChild(n),n.querySelector(".modal-name").addEventListener("click",()=>{t.remove(),D.showProfile(e.name)}),n.querySelector(".open-conv").addEventListener("click",()=>{t.remove(),window.location.href=`https://m.fll.pl/profile.php?profile=${encodeURIComponent(e.name)}&l=messages`})}),l.appendChild(d),a>1){const e=document.createElement("div");e.className="modal-paginator",e.innerHTML=`\n <button class="modal-btn pag-prev" ${1===i?"disabled":""}>← Poprzednia</button>\n <select class="pag-select">${Array.from({length:a},(e,n)=>n+1).map(e=>`<option value="${e}" ${e===i?"selected":""}>${e} / ${a}</option>`).join("")}</select>\n <button class="modal-btn pag-next" ${i===a?"disabled":""}>Następna →</button>\n `,e.querySelector(".pag-prev").addEventListener("click",()=>{t.remove(),D.showMessages(i-1)}),e.querySelector(".pag-next").addEventListener("click",()=>{t.remove(),D.showMessages(i+1)}),e.querySelector(".pag-select").addEventListener("change",e=>{t.remove(),D.showMessages(parseInt(e.target.value))}),l.appendChild(e)}},onerror:()=>I(t,"Błąd sieci")})},async showSearch(){const n=O("modal-search","Wyszukiwarka","🔍");n.classList.add("active"),F(n);let t=1,o=1,r=!1,a=!1,i=null;function s(){const e=n.querySelector(".modal-close"),t=n.querySelector(".modal-expand");if(e){const t=e.cloneNode(!0);e.parentNode.replaceChild(t,e),t.addEventListener("click",()=>{n&&n.parentNode&&(n.remove(),N.delete(n.id))})}if(t){const e=t.cloneNode(!0);t.parentNode.replaceChild(e,t),e.addEventListener("click",()=>{const t=n.querySelector(".modal");t&&(t.classList.contains("expanded")?(t.classList.remove("expanded"),e.innerHTML="⤢",e.title="Rozszerz",t.style.width="",t.style.height=""):(t.classList.add("expanded"),e.innerHTML="⤡",e.title="Przywróć",t.style.width="95vw",t.style.height="90vh"))})}document.title="🔍 Wyszukiwarka - Fellow Enhanced",n.addEventListener("click",e=>{e.target===n&&n&&n.parentNode&&(n.remove(),N.delete(n.id))})}function l(e,t=!1){const o=n.querySelector(".modal-body");if(t){const e=o.querySelector(".search-loading-more");e&&e.remove()}else o.innerHTML="";if(e.length>0){let r;if(t)r=o.querySelector(".search-results-list");else{r=document.createElement("div"),r.className="search-results-list",r.style.cssText="display: flex; flex-direction: column; gap: 8px;",o.appendChild(r);const e=document.createElement("style");e.textContent="\n .search-results-list .list-box {\n background: var(--dark-surface-light) !important;\n border: 1px solid var(--dark-border) !important;\n border-radius: 12px !important;\n margin: 6px 0 !important;\n transition: all 0.2s !important;\n }\n .search-results-list .list-box:hover {\n border-color: var(--blood-red) !important;\n transform: translateX(3px) !important;\n }\n .search-results-list .list-box a {\n color: var(--gold) !important;\n }\n .search-results-list .list-box .online {\n color: #4CAF50 !important;\n }\n .search-results-list .list-distance {\n background: var(--blood-gradient) !important;\n color: var(--gold) !important;\n }\n .search-results-list .list-age {\n border-color: var(--blood-red) !important;\n color: var(--gold) !important;\n background: var(--dark-surface) !important;\n }\n ",o.appendChild(e)}e.forEach(e=>{const t=e.cloneNode(!0);t.querySelectorAll('#sp, [id^="spolecznosci"], script').forEach(e=>e.remove()),t.style.cursor="pointer";const o=t.querySelector('a[href*="profile="]');if(o){const e=o.getAttribute("href"),r=e.match(/profile=([^&]+)/)?.[1];t.addEventListener("click",e=>{"A"===e.target.tagName||e.target.closest("a")||r&&(n.remove(),D.showProfile(decodeURIComponent(r)))}),t.querySelectorAll("a").forEach(e=>{e.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation();const o=e.getAttribute("href")?.match(/profile=([^&]+)/)?.[1];o&&(n.remove(),D.showProfile(decodeURIComponent(o)))})})}r.appendChild(t)})}else t||(o.innerHTML='<div style="text-align:center;padding:40px;color:var(--text-muted);">Brak wyników dla podanych kryteriów</div>')}function d(){if(r||a)return;const s=n.querySelector(".modal-body");if(!s.querySelector(".search-results-list"))return;if(s.scrollHeight-s.scrollTop-s.clientHeight>200)return;r=!0,t++;const d=document.createElement("div");d.className="search-loading-more",d.style.cssText="text-align:center;padding:15px;color:var(--text-muted);",d.innerHTML='<div class="spinner" style="width:20px;height:20px;border-width:2px;margin:0 auto;"></div><div style="margin-top:5px;font-size:11px;">Ładowanie...</div>',s.appendChild(d);const c=new URLSearchParams(i);c.set("page",t);const p=`${e.API_BASE}?${c.toString()}`;GM_xmlhttpRequest({method:"GET",url:p,onload:e=>{if(d.parentNode&&d.remove(),200===e.status&&e.responseText){const n=(new DOMParser).parseFromString(e.responseText,"text/html"),r=n.querySelectorAll(".list-box"),i=n.querySelector(".paginator select");if(i){const e=i.querySelectorAll("option").length;e>0&&(o=e)}r.length>0&&l(r,!0),t>=o&&(a=!0)}r=!1},onerror:()=>{d.parentNode&&d.remove(),t--,r=!1}})}function c(n,c){const p=document.createElement("style");p.textContent='\n #question-form {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n padding: 10px;\n }\n #question-form .question-data {\n flex: 1 1 calc(33% - 12px);\n min-width: 250px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n overflow: hidden;\n margin: 0;\n }\n #question-form .question-data > a {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: var(--dark-surface);\n color: var(--gold);\n font-size: 14px;\n font-weight: 600;\n border-bottom: 1px solid var(--dark-border);\n text-decoration: none;\n }\n #question-form .question-data > a img {\n width: 20px;\n height: 20px;\n filter: var(--svg-filter);\n }\n #question-form .accordion-content {\n padding: 12px 15px;\n display: block;\n }\n #question-form .listline {\n border: none;\n padding: 8px 0;\n }\n #question-form .listline + .listline {\n border-top: 1px solid rgba(255,255,255,0.03);\n }\n #question-form .form-question {\n color: var(--gold);\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 6px;\n opacity: 0.9;\n }\n #question-form .form-answer {\n margin: 0;\n }\n #question-form input[type="text"],\n #question-form input[type="number"],\n #question-form select {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 8px;\n padding: 8px 12px;\n color: var(--text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.2s;\n }\n #question-form input[type="text"]:focus,\n #question-form input[type="number"]:focus,\n #question-form select:focus {\n border-color: var(--gold);\n outline: none;\n }\n #question-form input[type="number"] {\n width: 70px;\n text-align: center;\n }\n #question-form .listcheckbox {\n display: inline-block;\n margin: 2px 4px 2px 0;\n }\n #question-form .listcheckbox input[type="checkbox"] + label,\n #question-form .listcheckbox input[type="radio"] + label {\n display: inline-block;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 6px 12px;\n color: var(--text-secondary);\n cursor: pointer;\n font-size: 12px;\n transition: all 0.2s;\n }\n #question-form .listcheckbox input[type="checkbox"]:checked + label,\n #question-form .listcheckbox input[type="radio"]:checked + label {\n background: var(--blood-red-dark);\n color: var(--gold);\n border-color: var(--blood-red);\n }\n #question-form .listcheckbox input[type="checkbox"] + label:hover,\n #question-form .listcheckbox input[type="radio"] + label:hover {\n border-color: var(--gold);\n color: var(--text-primary);\n }\n .search-templates-new {\n flex: 1 1 100%;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n padding: 15px;\n margin-top: 5px;\n }\n .search-templates-new .form-question {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .search-templates {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 8px 0;\n }\n .search-templates span {\n background: var(--blood-red-dark);\n border-radius: 20px;\n padding: 6px 12px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .search-templates span a {\n color: var(--gold);\n text-decoration: none;\n font-size: 13px;\n }\n .search-templates span img {\n width: 12px;\n height: 12px;\n filter: var(--svg-filter);\n cursor: pointer;\n opacity: 0.6;\n }\n .search-submit-btn {\n position: sticky;\n bottom: 20px;\n display: block;\n width: 60px;\n height: 60px;\n margin: 20px auto 0;\n background: var(--blood-gradient);\n border: 2px solid var(--gold-dark);\n border-radius: 50%;\n cursor: pointer;\n transition: all 0.3s;\n box-shadow: 0 4px 20px rgba(0,0,0,0.4);\n }\n .search-submit-btn:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 30px var(--blood-red-glow);\n }\n .search-submit-btn img {\n width: 28px;\n height: 28px;\n filter: var(--svg-filter);\n }\n .gps-small {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 8px;\n padding: 8px 12px;\n font-size: 11px;\n color: var(--text-muted);\n margin-top: 6px;\n }\n /* === STYLE DLA REGIONÓW === */\n div[name="3[]"] {\n margin-top: 8px;\n padding: 10px;\n background: var(--dark-surface);\n border-radius: 8px;\n border: 1px solid var(--dark-border);\n }\n div[name="3[]"] .listcheckbox {\n display: inline-block;\n margin: 3px 6px;\n }\n div[name="3[]"] .listcheckbox label {\n font-size: 12px;\n padding: 6px 12px;\n background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-block;\n }\n div[name="3[]"] .listcheckbox input[type="checkbox"] {\n display: none;\n }\n div[name="3[]"] .listcheckbox input[type="checkbox"]:checked + label {\n background: var(--blood-red-dark);\n color: var(--gold);\n border-color: var(--blood-red);\n }\n div[name="3[]"] .listcheckbox label:hover {\n border-color: var(--gold);\n background: var(--dark-surface);\n }\n ',c.querySelector(".modal-body").appendChild(p);const u=[{id:2,name:"dolnośląski"},{id:3,name:"kujawsko-pomorski"},{id:4,name:"lubelski"},{id:5,name:"lubuski"},{id:6,name:"łódzki"},{id:7,name:"małopolski"},{id:184,name:"mazowiecki"},{id:185,name:"opolski"},{id:186,name:"podkarpacki"},{id:187,name:"podlaski"},{id:188,name:"pomorski"},{id:189,name:"zachodniopomorski"},{id:190,name:"śląski"},{id:191,name:"świętokrzyski"},{id:192,name:"warmińsko-mazurski"},{id:193,name:"wielkopolski"}];const g=n.querySelector("form"),h=n.querySelector('#search, .fly-submit, input[type="image"]');if(g&&h){const n=document.createElement("button");n.type="button",n.className="search-submit-btn",n.innerHTML='<img src="https://m.fll.pl/_layout/search-form.svg">',n.title="Szukaj",h.parentNode.replaceChild(n,h),n.addEventListener("click",()=>{const n=new URLSearchParams;n.append("p","result"),n.append("form","1"),g.querySelectorAll("input, select, textarea").forEach(e=>{const t=e.getAttribute("name");if(t&&"x"!==t&&"y"!==t)if("checkbox"===e.type||"radio"===e.type)e.checked&&e.value&&n.append(t,e.value);else{if("image"===e.type)return;if("hidden"===e.type)e.value&&n.append(t,e.value);else{const o=e.value;o&&n.append(t,o)}}}),g.querySelectorAll("select").forEach(e=>{const t=e.getAttribute("name");t&&e.value&&n.append(t,e.value)}),i=n.toString(),t=1,o=1,a=!1,r=!1;const p=`${e.API_BASE}?${n.toString()}`,u=c.querySelector(".modal-body");u.innerHTML='<div class="modal-loading"><div class="spinner"></div><div>Wyszukiwanie...</div></div>',GM_xmlhttpRequest({method:"GET",url:p,onload:e=>{if(200!==e.status||!e.responseText)return u.innerHTML='<div class="modal-error">Błąd ładowania wyników</div>',void s();const n=(new DOMParser).parseFromString(e.responseText,"text/html"),t=c.querySelector(".modal-header h3");t&&(t.innerHTML="🔍 Wyniki wyszukiwania"),u.innerHTML="";const r=document.createElement("button");r.className="form-button",r.textContent="← Powrót do wyszukiwarki",r.style.cssText="margin-bottom: 15px; width: 100%;",r.onclick=()=>{c.remove(),D.showSearch()},u.appendChild(r);const a=n.querySelector(".paginator select");if(a){const e=a.querySelectorAll("option").length;e>0&&(o=e)}l(n.querySelectorAll(".list-box"),!1),u.addEventListener("scroll",d),s()},onerror:()=>{u.innerHTML='<div class="modal-error">Błąd sieci. Spróbuj ponownie.</div>',s()}})})}n.querySelectorAll(".search-templates a").forEach(e=>{e.addEventListener("click",n=>{const p=e.getAttribute("href");if(p&&"#"!==p)if(n.preventDefault(),n.stopPropagation(),p.includes("&did="))confirm("Czy na pewno chcesz usunąć zaznaczony szablon wyszukiwarki?")&&GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/${p.replace(/^\//,"")}`,onload:()=>{m("Szablon został usunięty","success"),c.remove(),D.showSearch()},onerror:()=>m("Błąd usuwania szablonu","error")});else if(p.includes("p=result&tid=")){const e=c.querySelector(".modal-body");e.innerHTML='<div class="modal-loading"><div class="spinner"></div><div>Ładowanie szablonu...</div></div>';const n=c.querySelector(".modal-header h3");GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/${p.replace(/^\//,"")}`,onload:u=>{if(200===u.status&&u.responseText){const g=(new DOMParser).parseFromString(u.responseText,"text/html");e.innerHTML="",n&&(n.innerHTML="🔍 Wyniki szablonu");const m=document.createElement("button");m.className="form-button",m.textContent="← Powrót do wyszukiwarki",m.style.cssText="margin-bottom: 15px; width: 100%;",m.onclick=()=>{c.remove(),D.showSearch()},e.appendChild(m);const h=g.querySelector(".paginator select");if(h){const e=h.querySelectorAll("option").length;e>0&&(o=e)}t=1;l(g.querySelectorAll(".list-box"),!1);const x=new URLSearchParams(p.split("?")[1]||"");i=x.toString(),a=!1,r=!1,e.addEventListener("scroll",d),s()}}})}})}),n.querySelectorAll(".accordion-toggle").forEach(e=>{e.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const t=e.nextElementSibling;return t&&t.classList.contains("accordion-content")&&(t.style.display="none"===t.style.display?"block":"none"),!1})});const x=n.querySelector("#gpschk"),b=n.querySelector("#gps");x&&b&&x.addEventListener("change",()=>{x.checked?navigator.geolocation?navigator.geolocation.getCurrentPosition(e=>{b.value=`${e.coords.latitude},${e.coords.longitude}`,m("Lokalizacja GPS pobrana","success")},()=>{x.checked=!1,m("Nie udało się pobrać GPS","error")}):(x.checked=!1,m("Geolokalizacja niedostępna","error")):b.value=""});const v=n.querySelector('select[name="2[]"]'),f=n.querySelector('div[name="3[]"]');if(v&&f){const e=()=>{"1"===v.value?(f.innerHTML=function(){let e="";return u.forEach(n=>{e+=`\n <div class="listcheckbox">\n <input type="checkbox" id="region_${n.id}" name="3[]" value="${n.id}">\n <label for="region_${n.id}">${n.name}</label>\n </div>\n `}),e}(),f.style.display="block",f.style.marginTop="8px",f.style.padding="10px",f.style.background="var(--dark-surface)",f.style.borderRadius="8px",f.style.border="1px solid var(--dark-border)"):(f.innerHTML="",f.style.display="none")};e(),v.addEventListener("change",e)}}GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=search`,onload:e=>{if(200!==e.status||!e.responseText)return I(n,"Błąd ładowania"),void s();const t=(new DOMParser).parseFromString(e.responseText,"text/html").querySelector("#question-form");if(t){n.querySelector(".modal-body").innerHTML="";const e=t.cloneNode(!0);n.querySelector(".modal-body").appendChild(e),s(),c(e,n)}else I(n,"Nie udało się załadować wyszukiwarki"),s()},onerror:()=>{I(n,"Błąd sieci"),s()}})},async showFellowPlus(){const n=O("modal-fellow-plus","Fellow+","⭐");n.classList.add("active"),F(n),GM_xmlhttpRequest({method:"GET",url:`${e.API_BASE}?p=plus`,onload:e=>{if(200!==e.status||!e.responseText)return void I(n,"Błąd ładowania");const t=(new DOMParser).parseFromString(e.responseText,"text/html").querySelector("#question-form");t?(n.querySelector(".modal-body").innerHTML="",n.querySelector(".modal-body").appendChild(t.cloneNode(!0))):I(n,"Nie udało się załadować treści")},onerror:()=>I(n,"Błąd sieci")})}};const U={applyTheme(n){const t=document.documentElement;Object.entries(p[n]).forEach(([e,n])=>t.style.setProperty(e,n)),GM_setValue(e.COLOR_SCHEME_KEY,n),u.activeColorScheme=n,document.body.classList.toggle("light-scheme","light"===n),document.body.classList.toggle("dark-scheme","dark"===n)}},H='\n:root {\n --theme-transition-time: 0.25s;\n --blood-red: #8B0000;\n --blood-red-light: #B22222;\n --blood-red-dark: #5C0000;\n --blood-red-glow: rgba(139, 0, 0, 0.5);\n --blood-gradient: linear-gradient(135deg, #8B0000, #B22222);\n --gold: #FFD700;\n --gold-dark: #DAA520;\n --dark-bg: #0a0a0a;\n --dark-surface: #1a1a1a;\n --dark-surface-light: #2a2a2a;\n --dark-surface-lighter: #333333;\n --dark-border: #3a3a3a;\n --text-primary: #e0e0e0;\n --text-secondary: #b0b0b0;\n --text-muted: #808080;\n --text-on-dark: #ffffff;\n --modal-overlay: rgba(0, 0, 0, 0.7);\n --svg-filter: brightness(0) invert(1);\n --svg-opacity: 0.9;\n --checkbox-bg: #2a2a2a;\n --checkbox-border: #3a3a3a;\n --checkbox-text: #e0e0e0;\n --checkbox-checked-bg: #8B0000;\n --checkbox-checked-text: #FFD700;\n --gallery-btn-off: #2a2a2a;\n --gallery-btn-on: #8B0000;\n --gallery-btn-border: #3a3a3a;\n --gallery-btn-text: #e0e0e0;\n}\n\n* {\n box-sizing: border-box;\n scrollbar-width: thin;\n scrollbar-color: var(--blood-red) var(--dark-surface);\n}\n\n::-webkit-scrollbar { width: 6px; height: 6px; }\n::-webkit-scrollbar-track { background: var(--dark-surface); border-radius: 3px; }\n::-webkit-scrollbar-thumb { background: linear-gradient(135deg, var(--blood-red), var(--gold)); border-radius: 3px; }\n::-webkit-scrollbar-thumb:hover { background: var(--blood-red-light); }\n\n/* === WYMUSZENIE PEŁNEJ WYSOKOŚCI DLA DASHBOARDU === */\nhtml, body {\n height: 100%;\n overflow: hidden;\n}\n\nbody {\n display: flex;\n flex-direction: column;\n}\n\n/* Kontener główny - zajmuje całą dostępną wysokość po odjęciu menu */\nbody > main {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n margin-top: 60px;\n}\n\n/* Dashboard container - flex zamiast grid dla lepszej kontroli wysokości */\n.dashboard-container {\n display: flex;\n gap: 24px;\n max-width: 1600px;\n margin: 20px auto;\n padding: 0 20px;\n flex: 1;\n min-height: 0;\n height: 100%;\n width: 100%;\n}\n\n/* Lewa kolumna - sticky w obrębie flex kontenera */\n.dashboard-left {\n width: 320px;\n flex-shrink: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 4px;\n}\n\n/* Środkowa kolumna - jedyna z przewijaniem */\n.dashboard-center {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 8px;\n scroll-behavior: smooth;\n}\n\n/* Prawa kolumna */\n.dashboard-right {\n width: 280px;\n flex-shrink: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 4px;\n}\n\n/* Ukrywanie scrolla gdy nie jest potrzebny - opcjonalne */\n.dashboard-left::-webkit-scrollbar,\n.dashboard-right::-webkit-scrollbar {\n width: 4px;\n}\n\n.dashboard-center::-webkit-scrollbar {\n width: 6px;\n}\n/* Stały układ 3-kolumnowy - bez responsywności */\n.dashboard-container {\n display: flex;\n gap: 24px;\n max-width: 1600px;\n margin: 20px auto;\n padding: 0 20px;\n flex: 1;\n min-height: 0;\n height: 100%;\n width: 100%;\n min-width: 1100px; /* 👈 Minimalna szerokość - poniżej będzie scroll poziomy */\n}\n\n.dashboard-left {\n width: 320px;\n flex-shrink: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 4px;\n}\n\n.dashboard-center {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 8px;\n scroll-behavior: smooth;\n}\n\n.dashboard-right {\n width: 280px;\n flex-shrink: 0;\n overflow-y: auto;\n height: 100%;\n padding-right: 4px;\n}\n\n/* === STYL STRONY LOGOWANIA === */\nbody.logowanie-page {\n margin: 0 auto;\n background-color: #E00201;\n background-image: url(\'https://m.fll.pl/_layout/fll-background-best.png\');\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100% auto;\n width: 100%;\n height: 100%;\n font-family: \'Exo 2\', sans-serif;\n overflow: auto;\n}\nbody.logowanie-page footer,\nbody.logowanie-page li,\nbody.logowanie-page form { color: #E1D9D9; }\nbody.logowanie-page main { margin-top: 0; background: transparent; }\n\n/* === RESZTA STYLÓW === */\nbody:not(.logowanie-page) {\n margin: 0;\n padding: 0;\n font-family: \'Inter\', \'Exo 2\', \'Segoe UI\', sans-serif;\n background: var(--dark-bg);\n color: var(--text-primary);\n line-height: 1.5;\n background-image: radial-gradient(at 0% 0%, rgba(139,0,0,0.08) 0%, transparent 70%);\n background-attachment: fixed;\n max-width: 100%;\n}\nbody:not(.logowanie-page).light-scheme { background-image: none; }\nbody:not(.logowanie-page) > .banner,\nbody:not(.logowanie-page) > .spolecznoscinet,\nbody:not(.logowanie-page) .centerad,\nbody:not(.logowanie-page) .centeradtop,\nbody:not(.logowanie-page) .centeradbox { display: none; }\n\nmain { background: transparent; flex: 1; }\nmain.black { background: transparent; }\nmain.top { margin-top: 0; padding-bottom: 0; }\n\n/* === MENU GŁÓWNE === */\n#main-menu {\n background: var(--blood-gradient);\n height: 60px;\n padding: 10px 0;\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n max-width: 100%;\n z-index: 1000;\n border-bottom: 2px solid var(--blood-red);\n backdrop-filter: blur(10px);\n box-shadow: 0 2px 15px rgba(0,0,0,0.4);\n display: flex;\n justify-content: space-around;\n align-items: center;\n flex-shrink: 0;\n}\nbody:not(.logowanie-page).light-scheme #main-menu {\n background: var(--menu-gradient, linear-gradient(135deg, #8B0000, #B22222));\n box-shadow: 0 2px 15px rgba(0,0,0,0.2);\n border-bottom: 2px solid var(--blood-red-dark);\n}\n#main-menu a,\n#panel-dropdown,\n#profile-dropdown {\n text-align: center;\n position: relative;\n transition: all var(--theme-transition-time);\n}\n#main-menu a:hover,\n#panel-dropdown:hover,\n#profile-dropdown:hover { transform: translateY(-2px); }\n#main-menu .nav-bar-icon { height: 24px; width: 24px; filter: var(--svg-filter); opacity: var(--svg-opacity); }\n#main-menu .letter,\n#main-menu .letter-red {\n color: var(--gold);\n font-weight: bold;\n font-size: 13px;\n position: absolute;\n right: calc(50% - 10px);\n padding: 11px 8px;\n}\nbody:not(.logowanie-page).light-scheme #main-menu .letter,\nbody:not(.logowanie-page).light-scheme #main-menu .letter-red { color: var(--text-on-dark); }\n\n.newmessage,\n.chat-counter-badge,\n.newchat {\n background: var(--blood-gradient);\n color: var(--gold);\n border: 1.5px solid var(--gold-dark);\n font-weight: bold;\n font-size: 10px;\n min-width: 18px;\n height: 18px;\n line-height: 15px;\n border-radius: 9px;\n position: absolute;\n right: calc(50% - 22px);\n top: 10px;\n box-shadow: 0 2px 5px rgba(0,0,0,0.3);\n}\nbody:not(.logowanie-page).light-scheme .newmessage,\nbody:not(.logowanie-page).light-scheme .newchat { color: var(--text-on-dark); }\n@keyframes newMessageGlow {\n 0%, 100% { box-shadow: inset 0 0 0 rgba(139,0,0,0); }\n 50% { box-shadow: inset 0 0 10px rgba(139,0,0,0.2); }\n}\n\n@keyframes pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.05); }\n}\n#panel-dropdown,\n#profile-dropdown { position: relative; }\n#panel-dropdown-btn,\n#profile-dropdown-btn { cursor: pointer; }\n#panel-dropdown-menu,\n#profile-dropdown-menu {\n display: none;\n position: absolute;\n top: 50px;\n right: 0;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 12px;\n padding: 8px;\n min-width: 220px;\n z-index: 1001;\n box-shadow: 0 4px 20px rgba(0,0,0,0.5);\n}\nbody:not(.logowanie-page).light-scheme #panel-dropdown-menu,\nbody:not(.logowanie-page).light-scheme #profile-dropdown-menu {\n box-shadow: 0 4px 20px rgba(0,0,0,0.25);\n background: var(--dark-surface-light);\n}\n\n/* === WIDGET KALENDARZA === */\n.right-widget-calendar {\n border-color: var(--gold-dark);\n}\n.cal-widget-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 250px;\n overflow-y: auto;\n}\n.cal-widget-event {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 12px;\n background: var(--dark-surface-lighter);\n cursor: pointer;\n transition: all 0.2s;\n border-left: 3px solid transparent;\n}\n.cal-widget-event:hover {\n background: var(--dark-surface-light);\n transform: translateX(3px);\n border-left-color: var(--blood-red);\n}\n.cal-widget-event.urgent {\n border-left-color: var(--blood-red);\n background: var(--dark-surface);\n animation: urgentPulse 2s ease-in-out infinite;\n}\n.cal-widget-event.soon {\n border-left-color: var(--gold-dark);\n}\n.cal-widget-emoji {\n font-size: 22px;\n flex-shrink: 0;\n width: 32px;\n text-align: center;\n}\n.cal-widget-info {\n flex: 1;\n min-width: 0;\n}\n.cal-widget-title {\n font-size: 12px;\n color: var(--text-primary);\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.cal-widget-meta {\n display: flex;\n gap: 8px;\n margin-top: 3px;\n font-size: 10px;\n color: var(--text-muted);\n}\n.cal-widget-day {\n color: var(--gold);\n font-weight: 600;\n}\n.cal-widget-time {\n color: var(--text-muted);\n}\n.cal-widget-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--blood-red);\n box-shadow: 0 0 6px var(--blood-red-glow);\n flex-shrink: 0;\n}\n@keyframes urgentPulse {\n 0%, 100% { border-left-color: var(--blood-red); }\n 50% { border-left-color: var(--gold); }\n}\n\n#panel-dropdown-menu.active,\n#profile-dropdown-menu.active { display: block; }\n#panel-dropdown-menu a,\n#profile-dropdown-menu a {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 15px;\n color: var(--text-primary);\n text-decoration: none;\n font-size: 14px;\n border-radius: 8px;\n transition: all 0.2s;\n width: 100%;\n text-align: left;\n}\n#panel-dropdown-menu a:hover,\n#profile-dropdown-menu a:hover {\n background: var(--blood-red);\n color: var(--gold);\n}\nbody:not(.logowanie-page).light-scheme #panel-dropdown-menu a:hover { color: var(--text-on-dark); }\n#panel-dropdown-menu img,\n#profile-dropdown-menu img {\n width: 20px;\n height: 20px;\n filter: var(--svg-filter);\n opacity: var(--svg-opacity);\n}\n\n/* === SUB MENU === */\n#sub-menu,\n#sub-menu-profile {\n background: var(--dark-surface-light);\n height: 40px;\n padding-top: 8px;\n border-bottom: 1px solid var(--dark-border);\n white-space: nowrap;\n overflow-x: auto;\n width: 100%;\n border-radius: 0 0 20px 20px;\n}\n#sub-menu a,\n#sub-menu-profile a {\n color: var(--text-secondary);\n font-size: 13px;\n padding: 8px 14px;\n margin: 0 2px;\n border-radius: 20px;\n text-transform: uppercase;\n display: inline-block;\n}\n#sub-menu a:hover,\n#sub-menu-profile a:hover {\n background: var(--blood-red-dark);\n color: var(--gold);\n}\nbody:not(.logowanie-page).light-scheme #sub-menu a:hover,\nbody:not(.logowanie-page).light-scheme #sub-menu-profile a:hover { color: var(--text-on-dark); }\n#sub-menu > .selected,\n#sub-menu-profile > .selected {\n color: var(--gold);\n border-bottom: 3px solid var(--blood-red);\n}\n\n.counter {\n background: var(--dark-surface-lighter);\n color: var(--gold);\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 10px;\n margin-left: 5px;\n}\n\n/* === KOMPONENTY DASHBOARDU === */\n.user-sidebar {\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 20px;\n padding: 10px;\n transition: all 0.3s ease;\n}\n.user-avatar-large { text-align: center; margin-bottom: 20px; }\n.user-avatar-large img {\n width: 160px;\n height: 160px;\n border-radius: 50%;\n object-fit: cover;\n border: 3px solid var(--blood-red);\n box-shadow: 0 0 20px var(--blood-red-glow);\n cursor: pointer;\n}\n.user-name-large { text-align: center; margin-bottom: 8px; }\n.user-name-large h2 { color: var(--gold); font-size: 22px; margin: 0; cursor: pointer; }\n.user-location { text-align: center; color: var(--text-secondary); font-size: 13px; margin-bottom: 20px; }\n\n.main-stats-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n margin-bottom: 24px;\n}\n.stat-card {\n background: var(--dark-surface-lighter);\n padding: 5px;\n border-radius: 12px;\n text-align: center;\n cursor: pointer;\n border: 1px solid var(--dark-border);\n}\n.stat-card:hover { border-color: var(--blood-red); transform: translateY(-2px); background: var(--dark-surface-light); }\n.stat-value { font-size: 24px; font-weight: bold; color: var(--gold); }\n.stat-label { font-size: 11px; color: var(--text-secondary); margin-top: 4px; }\n\n.profile-lists-section { margin-bottom: 24px; }\n.profile-lists-section h3 { color: var(--gold); font-size: 16px; margin-bottom: 12px; border-bottom: 1px solid var(--dark-border); padding-bottom: 6px; }\n.lists-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }\n.list-item {\n background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border);\n border-radius: 10px;\n padding: 10px;\n display: flex;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n font-size: 13px;\n}\n.list-item:hover { border-color: var(--blood-red); background: var(--dark-surface-light); transform: translateX(3px); }\n\n.quick-actions h3 { color: var(--gold); font-size: 16px; margin-bottom: 12px; border-bottom: 1px solid var(--dark-border); padding-bottom: 6px; }\n.actions-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }\n.action-card {\n background: var(--dark-surface-lighter);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n padding: 12px;\n text-align: center;\n cursor: pointer;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n}\n.action-card:hover { border-color: var(--blood-red); background: var(--dark-surface-light); transform: translateY(-2px); }\n.action-card img { width: 24px; height: 24px; filter: var(--svg-filter); }\n.action-card span { font-size: 11px; }\n\n.welcome-message {\n background: var(--dark-surface);\n border-radius: 16px;\n padding: 15px 10px;\n border-left: 4px solid var(--blood-red);\n margin-bottom: 20px;\n}\n.welcome-message h1 { color: var(--gold); font-size: 26px; margin: 0 0 5px 0; }\n.welcome-message p { color: var(--text-secondary); margin: 0; }\n\n.feed-section { margin-bottom: 20px; }\n.section-header { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 20px; }\n.section-header h2 { color: var(--gold); font-size: 20px; margin: 0; }\n\n.profiles-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 10px; }\n.profile-card {\n background: var(--dark-surface-light);\n border-radius: 16px;\n overflow: hidden;\n border: 1px solid var(--dark-border);\n cursor: pointer;\n}\n.profile-card:hover { transform: translateY(-6px); box-shadow: 0 12px 30px rgba(139,0,0,0.35); border-color: var(--blood-red); }\n.profile-card-img { position: relative; aspect-ratio: 1; overflow: hidden; }\n.profile-card-img img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.3s; }\n.profile-card:hover .profile-card-img img { transform: scale(1.05); }\n.profile-card-badge {\n position: absolute;\n top: 8px;\n right: 8px;\n background: var(--blood-red);\n color: var(--gold);\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 12px;\n}\n.profile-card-online {\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 10px;\n height: 10px;\n background: #4CAF50;\n border-radius: 50%;\n}\n.profile-card-info { padding: 12px; text-align: center; }\n.profile-card-name { color: var(--gold); font-weight: bold; font-size: 13px; }\n.profile-card-age { color: var(--text-secondary); font-size: 11px; }\n\n.right-widget {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 16px;\n padding: 10px;\n margin-bottom: 10px;\n}\n.right-widget h3 { color: var(--gold); font-size: 16px; margin-bottom: 16px; border-bottom: 1px solid var(--dark-border); padding-bottom: 8px; }\n.right-stats-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }\n.right-stat {\n background: var(--dark-surface-lighter);\n padding: 12px;\n border-radius: 12px;\n text-align: center;\n cursor: pointer;\n border: 1px solid var(--dark-border);\n}\n.right-stat:hover { border-color: var(--blood-red); background: var(--dark-surface-light); }\n.right-stat-value { font-size: 18px; font-weight: bold; color: var(--gold); }\n.right-stat-label { font-size: 10px; color: var(--text-secondary); }\n\n.comments-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.comment-item-small {\n padding: 10px;\n background: var(--dark-surface-lighter);\n border-radius: 10px;\n border: 1px solid var(--dark-border);\n cursor: pointer;\n transition: all 0.2s;\n}\n.comment-item-small:hover {\n border-color: var(--blood-red);\n background: var(--dark-surface-light);\n}\n.comment-reply-small {\n margin-top: 6px;\n padding: 6px 10px;\n background: var(--dark-surface);\n border-radius: 8px;\n border-left: 3px solid var(--gold);\n font-size: 11px;\n color: var(--text-secondary);\n line-height: 1.4;\n}\n.comment-reply-author {\n color: var(--gold);\n font-weight: 600;\n}\n.comment-author-small { color: var(--gold); font-weight: bold; font-size: 13px; margin-bottom: 5px; }\n.comment-text-small {\n color: var(--text-secondary);\n font-size: 12px;\n line-height: 1.4;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.comment-date-small { font-size: 10px; color: var(--text-muted); margin-top: 5px; }\n\n.plus-widget {\n background: var(--blood-gradient);\n text-align: center;\n cursor: pointer;\n}\n.plus-widget h4 { color: var(--gold); font-size: 18px; margin: 5px; }\n.plus-widget p { color: var(--text-on-dark); font-size: 12px; margin: 5px;}\n.plus-btn {\n background: var(--dark-surface);\n border: none;\n border-radius: 25px;\n padding: 8px 20px;\n color: var(--gold);\n cursor: pointer;\n margin-top: 5px;\n}\n\n/* === PROFIL === */\n.profile-header {\n background-color: var(--dark-surface);\n background-size: cover;\n background-position: center 31%;\n min-height: 200px;\n padding: 15px 20px;\n border-bottom: 1px solid var(--dark-border);\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n position: relative;\n}\n.profile-header::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(to top, rgba(0,0,0,0.7) 0%, transparent 100%);\n z-index: 1;\n}\nbody:not(.logowanie-page).light-scheme .profile-header::before {\n background: linear-gradient(to top, rgba(26, 26, 26, 0.5) 0%, transparent 100%);\n}\n.profile-header .back,\n.profile-header .profile-main,\n.profile-header .profile-main-normal,\n.profile-header a,\n.profile-header .profile-act,\n.profile-header .profile-actions,\n.profile-header .profile-img { position: relative; z-index: 2; }\n.profile-header .back { margin-right: 15px; align-self: flex-start; }\n.profile-header .back img { filter: var(--svg-filter); opacity: var(--svg-opacity); }\n.profile-header .profile-img { margin-right: 15px; }\n.profile-header .profile-img img {\n border: 2px solid var(--blood-red);\n border-radius: 50%;\n object-fit: cover;\n width: 60px;\n height: 60px;\n}\n.profile-header .gallery-counter {\n position: absolute;\n bottom: 0;\n left: 0;\n background: var(--blood-red);\n color: var(--gold);\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n}\n.profile-main a,\n.profile-main-normal a {\n color: var(--gold);\n font-size: 24px;\n font-weight: 700;\n text-shadow: 0 2px 4px rgba(0,0,0,0.5);\n text-decoration: none;\n}\n.profile-act {\n color: var(--text-primary);\n font-size: 14px;\n text-shadow: 0 1px 2px rgba(0,0,0,0.5);\n margin-top: 5px;\n}\n.profile-actions {\n display: flex;\n gap: 10px;\n margin-left: auto;\n}\n.profile-actions .list-edit-0 {\n height: 40px;\n width: 40px;\n background: rgba(0,0,0,0.5);\n backdrop-filter: blur(5px);\n}\n.profile-actions .list-edit-0 img { width: 20px; height: 20px; }\n\n.profile-data {\n margin: 15px;\n padding: 15px;\n position: relative;\n border: 2px solid var(--blood-red);\n background: var(--dark-surface);\n border-radius: 12px;\n word-wrap: break-word;\n overflow: visible;\n}\n.profile-data > img {\n height: 35px;\n width: 35px;\n display: block;\n border-radius: 50%;\n background: var(--blood-gradient);\n position: absolute;\n left: -19px;\n top: 10px;\n padding: 5px;\n border: 2px solid var(--gold-dark);\n}\n.p1 {\n width: 160px;\n float: left;\n text-align: right;\n padding: 5px 15px 5px 5px;\n color: var(--gold);\n font-weight: 500;\n clear: left;\n}\n.p2 {\n margin-left: 160px;\n padding: 5px;\n color: var(--text-primary);\n min-height: 30px;\n word-wrap: break-word;\n}\n.p3 {\n width: 160px;\n float: left;\n text-align: right;\n padding: 5px 15px 5px 5px;\n color: var(--gold);\n font-weight: 500;\n clear: left;\n border-bottom: 1px solid var(--dark-border);\n}\n.p5 {\n width: auto;\n margin-left: 160px;\n padding: 5px;\n color: var(--text-primary);\n line-height: 1.6;\n border-bottom: 1px solid var(--dark-border);\n}\n.profile-distance {\n background: var(--blood-gradient);\n border-radius: 15px;\n padding: 3px 12px;\n font-weight: bold;\n display: inline-block;\n}\n\n.profile-sections-container {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n margin: 15px;\n}\n\n.profile-top-form {\n position: sticky;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n margin-top: 20px;\n padding: 16px 12px;\n background: var(--dark-surface);\n border-top: 2px solid var(--blood-red);\n border-radius: 20px 20px 0 0;\n box-sizing: border-box;\n clear: both;\n z-index: 100;\n}\n.profile-top-input {\n background: var(--dark-surface);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.profile-top-input form {\n display: flex;\n align-items: center;\n width: 100%;\n gap: 12px;\n}\n.profile-top-textarea {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 30px;\n padding: 14px 18px;\n color: var(--text-primary);\n font-size: 15px;\n resize: none;\n flex: 1;\n min-height: 50px;\n max-height: 120px;\n font-family: inherit;\n}\n.profile-top-textarea:focus {\n border-color: var(--blood-red);\n box-shadow: 0 0 0 3px var(--blood-red-glow);\n}\n.profile-top-button {\n background: var(--blood-gradient);\n border: none;\n border-radius: 50%;\n width: 50px;\n height: 50px;\n cursor: pointer;\n background-image: url(\'https://m.fll.pl/_layout/send.svg\');\n background-size: 22px;\n background-position: center;\n background-repeat: no-repeat;\n filter: var(--svg-filter);\n flex-shrink: 0;\n border: 1px solid var(--gold-dark);\n}\n.profile-top-button:hover {\n transform: scale(1.05);\n box-shadow: 0 4px 15px var(--blood-red-glow);\n}\n\n.profile-add-pass {\n background: var(--blood-gradient);\n border-radius: 50px;\n padding: 8px 15px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n margin-bottom: 15px;\n}\n.profile-add-pass img { filter: var(--svg-filter); }\n.profile-add-counter {\n background: var(--gold);\n color: var(--blood-red-dark);\n border-radius: 20px;\n padding: 2px 8px;\n font-size: 12px;\n font-weight: bold;\n}\n\n/* === HOME === */\n.home-line {\n background: transparent;\n border-top: 1px solid var(--dark-border);\n padding: 15px 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 15px;\n}\n.home-profile-img {\n display: flex;\n align-items: center;\n padding: 5px;\n}\n.home-profile-img img {\n width: 100px;\n height: 100px;\n border-radius: 50%;\n border: 3px solid var(--blood-red);\n object-fit: cover;\n box-shadow: 0 4px 12px rgba(139,0,0,0.3);\n}\n.home-box-top { margin-left: 15px; }\n.home-box-top a {\n color: var(--gold);\n font-size: 28px;\n font-weight: 700;\n text-decoration: none;\n display: block;\n text-shadow: 0 1px 3px rgba(0,0,0,0.3);\n}\n.home-box-top { color: var(--text-secondary); font-size: 14px; }\n.home-box {\n display: inline-block;\n width: 140px;\n margin: 10px 2px;\n text-align: center;\n padding: 10px 5px;\n border-radius: 12px;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n transition: all var(--theme-transition-time);\n}\n.home-box:hover {\n background: var(--dark-surface-light);\n border-color: var(--blood-red);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(139,0,0,0.2);\n}\n.home-box a {\n color: var(--text-primary);\n text-decoration: none;\n font-size: 12px;\n display: block;\n}\n.home-box img {\n width: 35px;\n height: 35px;\n margin-bottom: 5px;\n filter: var(--svg-filter);\n opacity: var(--svg-opacity);\n}\n.home-ctn {\n display: inline-block;\n width: 130px;\n margin: 10px 2px;\n text-align: center;\n}\n.home-ctn a {\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 12px;\n}\n.home-ctn span {\n display: block;\n width: 55px;\n height: 55px;\n margin: 0 auto 5px;\n padding-top: 16px;\n border-radius: 50%;\n background: var(--dark-surface);\n border: 2px solid var(--blood-red);\n color: var(--gold);\n font-weight: bold;\n font-size: 16px;\n box-shadow: 0 2px 8px rgba(139,0,0,0.2);\n}\n\n.home-head {\n background: var(--blood-gradient);\n height: auto;\n min-height: 60px;\n width: 100%;\n color: var(--checkbox-checked-text);\n padding: 16px 20px;\n font-size: 20px;\n border-bottom: 1px solid var(--dark-border);\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.home-head img { width: 28px; height: 28px; filter: var(--svg-filter); margin-right: 10px; }\n.home-head a img { width: 24px; height: 24px; cursor: pointer; }\n\n.home-panel-profile {\n display: flex;\n align-items: center;\n gap: 15px;\n padding: 15px;\n background: var(--dark-surface-light);\n border-radius: 16px;\n margin-bottom: 20px;\n}\n.home-panel-avatar {\n width: 70px;\n height: 70px;\n border-radius: 50%;\n border: 3px solid var(--blood-red);\n}\n.home-panel-info h4 {\n color: var(--gold);\n font-size: 20px;\n margin: 0 0 5px 0;\n}\n.home-panel-info p {\n color: var(--text-secondary);\n margin: 0;\n}\n.home-panel-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 12px;\n margin-bottom: 20px;\n}\n.home-panel-card {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n padding: 15px;\n text-align: center;\n transition: all 0.2s;\n cursor: pointer;\n text-decoration: none;\n color: var(--text-primary);\n display: block;\n}\n.home-panel-card:hover {\n border-color: var(--blood-red);\n background: var(--dark-surface);\n transform: translateY(-2px);\n}\n.home-panel-stats {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 10px;\n padding: 15px;\n background: var(--dark-surface-light);\n border-radius: 16px;\n}\n.home-panel-stat { text-align: center; }\n.home-panel-stat .value {\n font-size: 20px;\n font-weight: bold;\n color: var(--gold);\n}\n.home-panel-stat .label {\n font-size: 11px;\n color: var(--text-secondary);\n}\n\n/* === INDEX === */\n.index-line {\n background: transparent;\n padding: 10px;\n border-top: 1px solid var(--dark-border);\n text-align: left;\n}\n.index-line h2 {\n color: var(--gold);\n font-size: 22px;\n text-transform: uppercase;\n margin: 20px 10px 15px;\n padding-bottom: 8px;\n border-bottom: 2px solid var(--blood-red);\n}\n.index-line .profile-img {\n display: inline-block;\n margin: 4px;\n width: 100px;\n height: 100px;\n position: relative;\n cursor: pointer;\n}\n.index-line .profile-img img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 8px;\n border: 2px solid var(--dark-border);\n}\n.index-line .profile-img:hover img {\n border-color: var(--blood-red);\n transform: scale(1.02);\n box-shadow: 0 4px 15px rgba(139,0,0,0.3);\n}\n\n.gallery-counter {\n position: absolute;\n bottom: 3px;\n left: 3px;\n background: var(--blood-red);\n color: var(--gold);\n font-size: 8px;\n padding: 1px 4px;\n border-radius: 10px;\n font-weight: bold;\n z-index: 2;\n opacity: 0.9;\n}\n.gallery-online {\n position: absolute;\n top: 3px;\n right: 3px;\n background: #4CAF50;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n border: 1px solid var(--dark-surface);\n z-index: 2;\n}\n\n.list-add-box {\n display: inline-block;\n margin: 4px;\n width: 100px;\n height: 100px;\n background: var(--dark-surface-light);\n border: 2px dashed var(--blood-red);\n border-radius: 8px;\n position: relative;\n}\n.list-add-box:hover { background: var(--blood-red-dark); border-color: var(--gold); }\n.list-add-box::before {\n content: "+";\n font-size: 30px;\n color: var(--gold);\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n/* === LISTA === */\n.listline { border-bottom: 1px solid var(--dark-border); }\n.list-box {\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n margin: 8px 0;\n overflow: hidden;\n display: flex;\n}\n.list-box:hover {\n border-color: var(--blood-red);\n box-shadow: 0 4px 12px rgba(139,0,0,0.2);\n}\n.list-box .profile-img img {\n width: 180px;\n height: 120px;\n border-radius: 12px 0 0 12px;\n object-fit: cover;\n filter: brightness(0.9);\n}\n.list-info {\n background: var(--dark-surface);\n padding: 12px;\n width: calc(100% - 180px);\n}\n.list-info a {\n color: var(--gold);\n font-size: 18px;\n font-weight: 600;\n}\n.list-info .online { color: #4CAF50; }\n.list-info .offline { color: var(--text-muted); }\n.list-city,\n.list-region { color: var(--text-secondary); }\n.list-act {\n border-top: 1px solid var(--dark-border);\n padding-top: 8px;\n}\n.list-act img { filter: var(--svg-filter); opacity: var(--svg-opacity); }\n.list-act a {\n background-color: transparent;\n float: right;\n margin: 0px;\n}\n.list-distance {\n background: var(--blood-gradient);\n color: var(--gold);\n border-radius: 12px;\n padding: 4px 10px;\n font-weight: bold;\n}\n.list-age {\n float: right;\n border: 1px solid var(--blood-red);\n padding: 4px 10px;\n border-radius: 20px;\n color: var(--gold);\n font-size: 13px;\n font-weight: bold;\n background: var(--dark-surface-light);\n}\n\n.list-edit-0 {\n height: 50px;\n width: 50px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--dark-border);\n transition: all var(--theme-transition-time);\n}\n.list-edit-0:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n transform: scale(1.1);\n}\n.list-edit-0 img {\n width: 24px;\n height: 24px;\n filter: var(--svg-filter);\n}\n\n/* === WIADOMOŚCI === */\n.message-box {\n width: 100%;\n margin: 5px 0px 5px 0px;\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n.message-box .profile-img {\n border-radius: 50%;\n width: 65px;\n height: 65px;\n object-fit: cover;\n flex-shrink: 0;\n position: relative;\n}\n.message-box .profile-img img {\n border-radius: 50%;\n width: 65px;\n height: 65px;\n object-fit: cover;\n border: 2px solid var(--blood-red);\n}\n.triangle-read {\n border-color: var(--dark-surface) var(--dark-surface) transparent transparent;\n border-style: solid;\n border-width: 8px;\n display: inline-block;\n vertical-align: top;\n margin-top: 15px;\n flex-shrink: 0;\n}\n.triangle-new {\n border-color: var(--dark-surface-light) var(--dark-surface-light) transparent transparent;\n border-style: solid;\n border-width: 8px;\n display: inline-block;\n vertical-align: top;\n margin-top: 15px;\n flex-shrink: 0;\n}\n.message-read {\n overflow: hidden;\n display: inline-block;\n width: calc(100% - 75px);\n padding: 10px 5px 10px 10px;\n background-color: var(--dark-surface);\n border-radius: 0px 5px 5px 5px;\n border: 1px solid var(--dark-border);\n flex: 1;\n}\n.message-new {\n overflow: hidden;\n display: inline-block;\n width: calc(100% - 75px);\n padding: 10px 5px 10px 10px;\n background-color: var(--dark-surface-light);\n border-radius: 0px 5px 5px 5px;\n border: 1px solid var(--blood-red);\n flex: 1;\n}\n.message-date {\n font-size: 12px;\n color: var(--text-muted);\n float: right;\n height: 15px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.message-date img {\n height: 16px;\n width: 16px;\n filter: var(--svg-filter);\n cursor: pointer;\n}\n.message-box a {\n font-size: 14px;\n color: var(--gold);\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-right: 5px;\n font-weight: 600;\n margin-bottom: 3px;\n}\n.message-reader {\n text-decoration: none;\n padding: 8px 0px 0px 0px;\n margin-top: 5px;\n font-size: 14px;\n border-top: 1px solid var(--dark-border);\n color: var(--text-primary);\n overflow-wrap: break-word;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n.message-reader b { color: var(--gold); margin-left: auto; }\n.message-reader img { width: 24px; height: 24px; vertical-align: middle; }\n.message-reply {\n padding: 8px 0px 0px 0px;\n margin-top: 5px;\n font-size: 14px;\n border-top: 1px solid var(--dark-border);\n color: var(--text-primary);\n overflow-wrap: break-word;\n}\n.message-reply b { color: var(--gold); }\n.message-reply img { width: 24px; height: 24px; vertical-align: middle; }\n\n.messagesth {\n width: 100%;\n padding: 20px 15px;\n margin: 0 auto;\n overflow-y: visible;\n position: relative;\n top: 0;\n bottom: auto;\n background: transparent;\n display: flex;\n flex-direction: column;\n min-height: 50vh;\n}\n.message-th {\n padding: 0;\n overflow: visible;\n margin: 0;\n display: block;\n clear: both;\n}\n.message-seen {\n float: right;\n margin: 5px 15px 10px 0;\n clear: both;\n}\n.message-seen .profile-img { background-color: transparent; padding: 0; }\n.message-seen .gallery-counter { display: none; }\n.message-seen .gallery-online { display: none; }\n.message-seen .profile-img img {\n height: 24px;\n width: 24px;\n border-radius: 50%;\n border: 2px solid var(--blood-red);\n}\n.message-left {\n margin: 5px 0;\n padding: 12px 16px;\n background: var(--dark-surface-light);\n border-radius: 18px 18px 18px 4px;\n max-width: 60%;\n float: left;\n clear: both;\n font-size: 15px;\n line-height: 1.5;\n overflow-wrap: break-word;\n color: var(--text-primary);\n border: 1px solid var(--dark-border);\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\n}\n.message-right {\n margin: 5px 0;\n padding: 12px 16px;\n background: var(--blood-gradient);\n border-radius: 18px 18px 4px 18px;\n max-width: 60%;\n float: right;\n clear: both;\n font-size: 15px;\n line-height: 1.5;\n overflow-wrap: break-word;\n color: var(--gold);\n border: 1px solid var(--gold-dark);\n box-shadow: 0 2px 8px rgba(139,0,0,0.2);\n}\n.message-left img[src*="emo"],\n.message-right img[src*="emo"] {\n width: 24px;\n height: 24px;\n vertical-align: middle;\n margin: 0 2px;\n}\n.message-date-left {\n font-size: 11px;\n color: var(--text-muted);\n padding: 4px 0 8px 16px;\n clear: both;\n float: left;\n width: 100%;\n text-align: left;\n}\n.message-date-right {\n font-size: 11px;\n color: var(--text-muted);\n padding: 4px 16px 8px 0;\n clear: both;\n float: right;\n width: 100%;\n text-align: right;\n}\n.message-counter-new {\n border: 2px solid var(--blood-red);\n margin: 0px 5px 0px 0px;\n border-radius: 50%;\n color: var(--gold);\n font-size: 10px;\n width: 17px;\n height: 17px;\n text-align: center;\n font-weight: bold;\n float: left;\n background: var(--dark-surface);\n}\n\n.message-attachments {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 10px 0;\n}\n.message-attachment {\n padding: 8px 15px;\n border-radius: 25px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s;\n}\n.message-attachment:hover {\n background: var(--blood-red-dark);\n border-color: var(--gold);\n}\n.message-attachment a {\n font-size: 14px;\n color: var(--gold);\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.message-attachment img {\n height: 22px;\n width: 22px;\n filter: var(--svg-filter);\n}\n\n/* === FORMULARZE === */\n.form-box {\n max-width: 900px;\n margin: 30px auto;\n padding: 30px;\n background: var(--dark-surface);\n border-radius: 20px;\n border: 1px solid var(--dark-border);\n}\n.form-box h3 {\n color: var(--gold);\n font-size: 20px;\n margin: 30px 0 20px;\n padding-bottom: 10px;\n border-bottom: 2px solid var(--blood-red);\n}\n.form-box h3:first-of-type { margin-top: 0; }\n.form-box label {\n display: inline-block;\n margin: 8px 25px 8px 0;\n color: var(--text-primary);\n font-size: 15px;\n cursor: pointer;\n}\n.form-box input[type="checkbox"],\n.form-box input[type="radio"] {\n margin-right: 8px;\n accent-color: var(--blood-red);\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n.form-box hr {\n border: none;\n border-top: 1px solid var(--dark-border);\n margin: 25px 0;\n}\n.form-button {\n display: inline-block;\n background: var(--blood-gradient);\n color: var(--gold);\n border: 1px solid var(--gold-dark);\n border-radius: 30px;\n padding: 12px 25px;\n margin: 10px 15px 10px 0;\n font-weight: bold;\n cursor: pointer;\n text-decoration: none;\n font-size: 15px;\n transition: all 0.2s;\n}\nbody:not(.logowanie-page).light-scheme .form-button { color: var(--text-on-dark); }\n.form-button.button {\n background: var(--dark-surface-light);\n color: var(--text-primary);\n border: 1px solid var(--dark-border);\n}\n.form-button:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 15px var(--blood-red-glow);\n}\n.form-button.button:hover {\n background: var(--blood-red);\n color: var(--gold);\n border-color: var(--gold);\n}\n/* === EDYCJA PROFILU === */\n.edit-profile-container { display: flex; flex-direction: column; gap: 15px; }\n.ep-card { background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 16px; overflow: hidden; }\n.ep-card-header { background: var(--dark-surface); padding: 15px 20px; display: flex; align-items: center; gap: 12px; cursor: pointer; border-bottom: 1px solid var(--dark-border); transition: background 0.2s; }\n.ep-card-header:hover { background: var(--dark-surface-lighter); }\n.ep-card-header .ep-icon { font-size: 22px; flex-shrink: 0; }\n.ep-card-header .ep-title { color: var(--gold); font-size: 16px; font-weight: 600; flex: 1; }\n.ep-card-header .ep-arrow { color: var(--text-muted); font-size: 14px; transition: transform 0.3s; }\n.ep-card-body { padding: 15px 20px; display: block; }\n.ep-card-body.collapsed { display: none; }\n.ep-card-header.collapsed .ep-arrow { transform: rotate(-90deg); }\n.ep-row { display: flex; align-items: center; gap: 15px; padding: 10px 0; border-bottom: 1px solid rgba(255,255,255,0.05); }\n.ep-row:last-child { border-bottom: none; }\n.ep-label { width: 160px; flex-shrink: 0; color: var(--gold); font-size: 13px; font-weight: 500; text-align: right; }\n.ep-label.required::after { content: " *"; color: #f44336; }\n.ep-value { flex: 1; min-width: 0; }\n.ep-value select, .ep-value input[type="text"], .ep-value input[type="number"], .ep-value textarea { width: 100%; padding: 10px 14px; background: var(--dark-surface); border: 1px solid var(--dark-border); border-radius: 10px; color: var(--text-primary); font-size: 13px; font-family: inherit; transition: border-color 0.2s; }\n.ep-value select:focus, .ep-value input:focus, .ep-value textarea:focus { border-color: var(--gold); outline: none; }\n.ep-value .date-selects { display: flex; gap: 8px; }\n.ep-value .date-selects select { flex: 1; }\n.ep-checkbox-group { display: flex; flex-wrap: wrap; gap: 6px; }\n.ep-checkbox-item { display: flex; align-items: center; gap: 6px; padding: 7px 12px; background: var(--dark-surface); border: 1px solid var(--dark-border); border-radius: 20px; cursor: pointer; font-size: 12px; transition: all 0.2s; user-select: none; }\n.ep-checkbox-item:hover { border-color: var(--gold); }\n.ep-checkbox-item.checked { background: var(--blood-red-dark); border-color: var(--blood-red); color: var(--gold); }\n.ep-checkbox-item input { display: none; }\n.ep-save-btn { display: block; width: 100%; padding: 16px; margin-top: 10px; background: var(--blood-gradient); color: var(--gold); border: 2px solid var(--gold-dark); border-radius: 30px; font-size: 16px; font-weight: bold; cursor: pointer; text-align: center; transition: all 0.3s; }\n.ep-save-btn:hover { transform: translateY(-3px); box-shadow: 0 10px 30px var(--blood-red-glow); }\n.ep-save-btn:disabled { opacity: 0.6; cursor: not-allowed; }\n/* === USTAWIENIA === */\n.settings-container { display: flex; flex-direction: column; gap: 20px; }\n.settings-card { background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 16px; padding: 20px; }\n.settings-card h3 { color: var(--gold); font-size: 18px; margin: 0 0 15px 0; padding-bottom: 10px; border-bottom: 1px solid var(--dark-border); display: flex; align-items: center; gap: 10px; }\n.settings-row { display: flex; align-items: center; gap: 15px; padding: 12px 15px; margin: 4px 0; border-radius: 10px; transition: background 0.2s; }\n.settings-row:hover { background: var(--dark-surface); }\n.settings-row label { flex: 1; cursor: pointer; color: var(--text-primary); font-size: 14px; }\n.settings-row input[type="checkbox"] { width: 20px; height: 20px; accent-color: var(--blood-red); cursor: pointer; flex-shrink: 0; }\n.settings-divider { border: none; border-top: 1px solid var(--dark-border); margin: 10px 0; }\n.settings-btn-group { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; }\n.settings-btn { padding: 10px 20px; border-radius: 25px; font-size: 14px; cursor: pointer; border: 1px solid var(--dark-border); background: var(--dark-surface); color: var(--text-primary); text-decoration: none; display: inline-flex; align-items: center; gap: 8px; transition: all 0.2s; }\n.settings-btn:hover { background: var(--blood-red); color: var(--gold); border-color: var(--gold); }\n.settings-btn.danger { border-color: #f44336; color: #f44336; }\n.settings-btn.danger:hover { background: #f44336; color: white; }\n.settings-description { font-size: 12px; color: var(--text-muted); margin-top: 5px; padding-left: 35px; }\n.settings-radio-group { display: flex; flex-wrap: wrap; gap: 10px; padding: 10px 0; }\n.settings-radio-item { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-radius: 25px; border: 1px solid var(--dark-border); cursor: pointer; transition: all 0.2s; }\n.settings-radio-item:hover { border-color: var(--gold); }\n.settings-radio-item.active { background: var(--blood-red-dark); border-color: var(--blood-red); }\n.settings-radio-item input { display: none; }\n.settings-radio-item label { cursor: pointer; font-size: 14px; }\n.settings-save-btn { position: sticky; bottom: 20px; display: block; width: calc(100% - 40px); margin: 30px auto 0; padding: 16px; background: var(--blood-gradient); color: var(--gold); border: 2px solid var(--gold-dark); border-radius: 30px; font-size: 16px; font-weight: bold; cursor: pointer; text-align: center; transition: all 0.3s; }\n.settings-save-btn:hover { transform: translateY(-3px); box-shadow: 0 10px 30px var(--blood-red-glow); }\n/* === NOTATKI === */\n.note-container { display: flex; flex-direction: column; gap: 15px; padding: 10px; }\n.note-header-info { display: flex; align-items: center; gap: 12px; padding: 12px 16px; background: var(--dark-surface-light); border-radius: 12px; margin-bottom: 10px; }\n.note-avatar { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--blood-red); }\n.note-avatar-placeholder { width: 48px; height: 48px; border-radius: 50%; background: var(--dark-surface-lighter); border: 2px solid var(--dark-border); display: flex; align-items: center; justify-content: center; font-size: 20px; flex-shrink: 0; }\n.note-profile-name { color: var(--gold); font-size: 16px; font-weight: 600; cursor: pointer; }\n.note-profile-name:hover { text-decoration: underline; }\n.note-textarea { width: 100%; min-height: 150px; background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 12px; padding: 15px; color: var(--text-primary); font-size: 14px; font-family: inherit; resize: vertical; line-height: 1.5; transition: border-color 0.2s; }\n.note-textarea:focus { outline: none; border-color: var(--gold); }\n.note-actions { display: flex; gap: 10px; justify-content: flex-end; }\n.note-btn { padding: 10px 20px; border-radius: 25px; font-size: 14px; cursor: pointer; border: 1px solid var(--dark-border); transition: all 0.2s; font-weight: 500; }\n.note-save-btn { background: var(--blood-gradient); color: var(--gold); border-color: var(--gold-dark); }\n.note-save-btn:hover { transform: translateY(-2px); box-shadow: 0 4px 15px var(--blood-red-glow); }\n.note-delete-btn { background: transparent; color: #f44336; border-color: #f44336; }\n.note-delete-btn:hover { background: #f44336; color: white; }\n.note-close-btn { background: var(--dark-surface-light); color: var(--text-secondary); }\n.note-close-btn:hover { background: var(--dark-surface-lighter); }\n.note-date { font-size: 11px; color: var(--text-muted); margin-top: 5px; }\n/* === LOADING === */\n.fellow-loader { width: 60px; height: 60px; border: 4px solid #2A1A1A; border-top: 4px solid #8B0000; border-right: 4px solid #D4AF37; border-radius: 50%; animation: fellow-spin 1s linear infinite; margin: 0 auto; }\n@keyframes fellow-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\n#question-form {\n display: flex;\n flex-wrap: wrap;\n gap: 20px;\n padding: 15px;\n}\n.question-data {\n flex: 1 1 calc(25% - 20px);\n min-width: 280px;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 16px;\n overflow: hidden;\n margin: 0;\n padding-bottom: 10px;\n}\n.question-data > a {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 18px;\n background: var(--dark-surface-light);\n color: var(--gold);\n font-size: 16px;\n font-weight: 600;\n border-bottom: 1px solid var(--dark-border);\n}\n.question-data > a img {\n width: 24px;\n height: 24px;\n filter: var(--svg-filter);\n}\n\n.right-widget-comments {\n position: relative;\n}\n.right-widget-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--dark-border);\n padding-bottom: 8px;\n margin-bottom: 12px;\n}\n.right-widget-header h3 {\n color: var(--gold);\n font-size: 16px;\n margin: 0;\n border-bottom: none;\n padding-bottom: 0;\n}\n.right-widget-badge {\n background: var(--blood-red);\n color: var(--gold);\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: bold;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n}\n.right-widget-badge:hover {\n background: var(--blood-red-light);\n transform: scale(1.05);\n box-shadow: 0 0 10px var(--blood-red-glow);\n}\n.accordion-content { padding: 10px 15px; display: block; }\n.form-question {\n margin: 10px 0 5px;\n font-weight: 600;\n color: var(--gold);\n font-size: 14px;\n}\n.form-answer { margin-bottom: 10px; }\n#question-form .listcheckbox {\n display: inline-block;\n margin: 3px 8px 3px 0;\n}\n#question-form .listcheckbox input[type="checkbox"],\n#question-form input[type="radio"] { display: none; }\n#question-form .listcheckbox input[type="checkbox"] + label,\n#question-form input[type="radio"] + label {\n display: inline-block;\n background-color: var(--checkbox-bg);\n border: 1px solid var(--checkbox-border);\n border-radius: 25px;\n padding: 8px 12px;\n color: var(--checkbox-text);\n cursor: pointer;\n font-size: 14px;\n transition: all 0.2s;\n margin: 2px;\n}\n#question-form .listcheckbox input[type="checkbox"]:checked + label,\n#question-form input[type="radio"]:checked + label {\n background-color: var(--checkbox-checked-bg);\n color: var(--checkbox-checked-text);\n border-color: var(--gold-dark);\n}\n#question-form .listcheckbox input[type="checkbox"] + label:hover,\n#question-form input[type="radio"] + label:hover {\n background-color: var(--blood-red-dark);\n color: var(--gold);\n}\n\n/* === GALERIA === */\n.gallery-upload-hero {\n background: linear-gradient(135deg, var(--blood-red-dark), var(--blood-red));\n border-radius: 24px;\n padding: 40px;\n text-align: center;\n border: 2px solid var(--gold-dark);\n cursor: pointer;\n transition: all 0.3s;\n margin-bottom: 20px;\n}\n.gallery-upload-hero:hover {\n transform: scale(1.01);\n box-shadow: 0 10px 40px var(--blood-red-glow);\n}\n.gallery-upload-hero .upload-icon { font-size: 80px; margin-bottom: 20px; }\n.gallery-upload-hero h3 {\n color: var(--gold);\n font-size: 28px;\n margin-bottom: 15px;\n}\n.gallery-upload-hero p {\n color: var(--text-on-dark);\n opacity: 0.9;\n max-width: 600px;\n margin: 0 auto 20px;\n}\n\n.gallery-grid-4 {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 20px;\n}\n.gallery-card {\n background: var(--dark-surface-light);\n border-radius: 16px;\n overflow: hidden;\n border: 1px solid var(--dark-border);\n transition: all 0.3s;\n}\n.gallery-card:hover {\n transform: translateY(-5px);\n box-shadow: 0 10px 30px rgba(0,0,0,0.3);\n border-color: var(--blood-red);\n}\n.gallery-card-img {\n position: relative;\n aspect-ratio: 1;\n overflow: hidden;\n background: var(--dark-surface);\n}\n.gallery-card-img img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.3s;\n cursor: pointer;\n}\n.gallery-card:hover .gallery-card-img img { transform: scale(1.05); }\n.gallery-card-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);\n padding: 15px 10px 10px;\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n opacity: 0;\n transition: opacity 0.3s;\n}\n.gallery-card:hover .gallery-card-overlay { opacity: 1; }\n.gallery-overlay-btn {\n padding: 6px 10px;\n border-radius: 20px;\n font-size: 11px;\n cursor: pointer;\n background: rgba(0,0,0,0.7);\n border: 1px solid var(--gold-dark);\n color: var(--text-on-dark);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n backdrop-filter: blur(5px);\n}\n.gallery-overlay-btn:hover {\n background: var(--blood-red);\n color: var(--gold);\n}\n.gallery-overlay-btn.on {\n background: var(--blood-red);\n color: var(--gold);\n}\n.gallery-card-badge {\n position: absolute;\n top: 10px;\n right: 10px;\n display: flex;\n gap: 5px;\n z-index: 2;\n}\n.gallery-badge {\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(0,0,0,0.7);\n border: 1px solid var(--gold-dark);\n backdrop-filter: blur(5px);\n color: var(--gold);\n font-size: 14px;\n}\n.gallery-badge.on { background: var(--blood-red); }\n.gallery-card-footer {\n padding: 10px 15px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid var(--dark-border);\n font-size: 11px;\n color: var(--text-muted);\n background: var(--dark-surface-light);\n}\n\n.gallery-edit-legend a {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 12px;\n text-decoration: none;\n margin: 2px;\n transition: all 0.2s;\n}\n.gallery-edit-legend a.off {\n background-color: var(--gallery-btn-off);\n border: 1px solid var(--gallery-btn-border);\n color: var(--gallery-btn-text);\n}\n.gallery-edit-legend a.on {\n background-color: var(--gallery-btn-on);\n border: 1px solid var(--gold-dark);\n color: var(--gold);\n}\n.gallery-edit-legend a.off:hover {\n background-color: var(--blood-red-dark);\n color: var(--gold);\n}\n.gallery-edit-legend a.on:hover { background-color: var(--blood-red); }\n.gallery-edit-legend a img { width: 16px; height: 16px; filter: var(--svg-filter); }\n.gallery-edit-legend a.on img { filter: brightness(0) invert(1); }\n\n.upload-input {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 25px;\n padding: 10px 15px;\n color: var(--text-primary);\n cursor: pointer;\n width: 100%;\n display: none;\n}\n.upload-input::file-selector-button {\n background: var(--blood-gradient);\n color: var(--gold);\n border: 1px solid var(--gold-dark);\n border-radius: 20px;\n padding: 8px 16px;\n margin-right: 15px;\n cursor: pointer;\n font-weight: bold;\n}\n.upload-input::file-selector-button:hover { background: var(--blood-red); }\n\n/* === MODAL === */\n.modal-overlay {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--modal-overlay);\n backdrop-filter: blur(8px);\n z-index: 10001;\n align-items: center;\n justify-content: center;\n}\n.modal-overlay.active { display: flex; }\n.modal {\n width: 90%;\n max-width: 800px;\n max-height: 85vh;\n background: var(--dark-surface);\n border: 2px solid var(--blood-red);\n border-radius: 24px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transition: all 0.3s ease;\n}\n.modal.expanded {\n width: 95vw !important;\n height: 90vh !important;\n max-width: 95vw !important;\n max-height: 90vh !important;\n}\n.modal-header {\n padding: 20px 25px;\n background: var(--blood-gradient);\n color: var(--text-on-dark);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--gold-dark);\n}\n.modal-header h3 { margin: 0; font-size: 20px; }\n.modal-header-actions {\n display: flex;\n gap: 15px;\n align-items: center;\n}\n.modal-close { cursor: pointer; font-size: 28px; color: var(--gold); transition: all 0.2s; }\n.modal-close:hover {\n color: var(--text-on-dark);\n transform: scale(1.1);\n}\n/* Menu kontekstowe czatu */\n.chat-context-menu {\n animation: fadeIn 0.15s ease;\n}\n.chat-context-menu .context-separator {\n border-top: 1px solid var(--dark-border);\n margin: 4px 0;\n}\n.modal-expand {\n cursor: pointer;\n font-size: 18px;\n color: var(--gold);\n}\n.modal-expand:hover { opacity: 0.8; }\n.modal-body { padding: 10px; overflow-y: auto; flex: 1; }\n.modal-list { display: flex; flex-direction: column; gap: 10px; }\n.modal-item {\n display: flex;\n align-items: center;\n gap: 15px;\n padding: 12px 15px;\n background: var(--dark-surface-light);\n border-radius: 12px;\n border: 1px solid var(--dark-border);\n}\n.comment-item { flex-direction: column; align-items: flex-start; }\n.comment-header {\n display: flex;\n align-items: center;\n gap: 15px;\n width: 100%;\n}\n.modal-avatar {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--blood-red);\n}\n.gps-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--blood-red-dark);\n width: 50px;\n height: 50px;\n border-radius: 50%;\n}\n.gps-icon img {\n width: 30px;\n height: 30px;\n filter: var(--svg-filter);\n}\n.modal-info { flex: 1; }\n.modal-name {\n color: var(--gold);\n font-weight: bold;\n font-size: 16px;\n cursor: pointer;\n text-decoration: none;\n}\n.modal-name:hover { text-decoration: underline; }\n.modal-details {\n color: var(--text-secondary);\n font-size: 12px;\n margin-top: 3px;\n}\n.comment-text {\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--dark-border);\n word-wrap: break-word;\n color: var(--text-primary);\n font-size: 14px;\n line-height: 1.5;\n}\n.comment-text img { width: 24px; height: 24px; vertical-align: middle; margin: 0 2px; }\n.comment-reply {\n margin-top: 8px;\n padding: 8px 12px;\n background: var(--dark-surface);\n border-radius: 8px;\n border-left: 3px solid var(--gold);\n}\n.comment-reply b { color: var(--gold); }\n.modal-actions { display: flex; gap: 8px; }\n.modal-btn {\n padding: 8px 12px;\n border-radius: 20px;\n background: var(--dark-surface);\n color: var(--text-primary);\n border: 1px solid var(--dark-border);\n cursor: pointer;\n}\n.modal-btn:hover { background: var(--blood-red); color: var(--text-on-dark); }\n.gps-current-badge {\n background: var(--blood-red);\n color: var(--text-on-dark);\n padding: 4px 10px;\n border-radius: 20px;\n font-size: 11px;\n margin-left: 10px;\n}\n.modal-paginator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 15px;\n margin-top: 20px;\n padding-top: 15px;\n border-top: 1px solid var(--dark-border);\n}\n.modal-paginator select,\n.modal-paginator button {\n background: var(--dark-surface-light);\n color: var(--gold);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 8px 15px;\n cursor: pointer;\n}\n.modal-paginator button:hover {\n background: var(--blood-red);\n color: var(--text-on-dark);\n}\n.modal-loading {\n text-align: center;\n padding: 40px;\n color: var(--text-muted);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 15px;\n}\n.modal-error {\n text-align: center;\n padding: 40px;\n color: var(--blood-red);\n font-weight: bold;\n}\n\n.comment-form-container textarea {\n width: 100%;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 10px 15px;\n color: var(--text-primary);\n resize: none;\n min-height: 40px;\n}\n.comment-form-container .profile-top-button {\n background: var(--blood-gradient);\n border: none;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n cursor: pointer;\n background-image: url(\'https://m.fll.pl/_layout/send.svg\');\n background-size: 20px;\n background-position: center;\n background-repeat: no-repeat;\n filter: var(--svg-filter);\n}\n.custom-emoji-btn {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 20px;\n}\n.custom-emoji-btn:hover { background: var(--blood-red); }\n\n/* === SKRYPT USTAWIENIA === */\n#script-settings-modal {\n display: none;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--modal-overlay);\n backdrop-filter: blur(8px);\n z-index: 10001;\n align-items: center;\n justify-content: center;\n}\n#script-settings-modal.active { display: flex; }\n.script-settings-modal {\n width: 90%;\n max-width: 500px;\n background: var(--dark-surface);\n border: 2px solid var(--blood-red);\n border-radius: 24px;\n overflow: hidden;\n box-shadow: 0 20px 60px rgba(0,0,0,0.5);\n}\n.script-settings-header {\n padding: 20px 25px;\n background: var(--blood-gradient);\n color: var(--gold);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--gold-dark);\n}\n.script-settings-header h3 {\n margin: 0;\n font-size: 20px;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.script-settings-close {\n cursor: pointer;\n font-size: 28px;\n color: var(--gold);\n transition: all 0.2s;\n}\n.script-settings-close:hover {\n color: var(--text-on-dark);\n transform: scale(1.1);\n}\n.script-settings-body { padding: 25px; }\n.script-settings-selector {\n background: var(--dark-surface-light);\n border-radius: 16px;\n padding: 20px;\n border: 1px solid var(--dark-border);\n}\n.script-settings-selector h4 {\n color: var(--gold);\n margin: 0 0 20px 0;\n font-size: 18px;\n}\n.script-scheme-options {\n display: flex;\n flex-direction: column;\n gap: 15px;\n}\n.script-scheme-option {\n display: flex;\n align-items: center;\n gap: 12px;\n cursor: pointer;\n padding: 10px 15px;\n background: var(--dark-surface);\n border-radius: 12px;\n border: 1px solid var(--dark-border);\n}\n.script-scheme-option:hover {\n border-color: var(--blood-red);\n background: var(--dark-surface-light);\n}\n.script-scheme-option input[type="radio"] {\n width: 18px;\n height: 18px;\n accent-color: var(--blood-red);\n cursor: pointer;\n}\n.script-scheme-option label {\n color: var(--text-primary);\n font-size: 16px;\n cursor: pointer;\n flex: 1;\n}\n.avatar-toggle {\n display: flex;\n align-items: center;\n gap: 15px;\n cursor: pointer;\n padding: 10px 15px;\n background: var(--dark-surface);\n border-radius: 12px;\n border: 1px solid var(--dark-border);\n}\n.avatar-toggle:hover {\n border-color: var(--blood-red);\n background: var(--dark-surface-light);\n}\n.avatar-toggle input {\n width: 18px;\n height: 18px;\n accent-color: var(--blood-red);\n cursor: pointer;\n}\n.avatar-toggle label {\n color: var(--text-primary);\n font-size: 15px;\n cursor: pointer;\n flex: 1;\n}\n.avatar-toggle .avatar-preview {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n}\n\n/* === CZAT === */\n.floating-chat-window {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 445px;\n height: 600px;\n background: var(--dark-surface);\n border-radius: 16px;\n box-shadow: 0 8px 30px rgba(0,0,0,0.4);\n z-index: 10001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border: 1px solid var(--blood-red);\n transition: all 0.3s ease;\n font-family: \'Inter\', \'Exo 2\', \'Segoe UI\', sans-serif;\n}\n.floating-chat-window.minimized {\n height: 48px;\n width: 300px;\n}\n.floating-chat-window.minimized .chat-body,\n.floating-chat-window.minimized .chat-footer { display: none; }\n.floating-chat-window.expanded {\n width: 90vw;\n height: 90vh;\n bottom: 5vh;\n right: 5vw;\n}\n.floating-chat-window .chat-header { cursor: pointer; }\n.chat-header {\n background: var(--blood-gradient);\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid var(--gold-dark);\n flex-shrink: 0;\n}\n.chat-header-info { display: flex; align-items: center; gap: 10px; }\n.chat-header-info img { width: 24px; height: 24px; filter: var(--svg-filter); }\n.chat-header-info span { color: var(--gold); font-weight: bold; font-size: 14px; }\n.chat-header-badge {\n background: var(--blood-red);\n color: var(--gold);\n border-radius: 12px;\n padding: 2px 8px;\n font-size: 11px;\n font-weight: bold;\n}\n\n.chat-header-actions {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n.chat-header-btn {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: var(--gold);\n background: transparent;\n border: none;\n font-size: 16px;\n transition: all 0.2s;\n position: relative;\n}\n\n.chat-header-btn:hover {\n background: rgba(139, 0, 0, 0.4);\n color: #fff;\n}\n\n.chat-header-btn:active {\n transform: scale(0.95);\n}\n\n.chat-minimize-btn:hover {\n background: rgba(220, 38, 38, 0.4);\n color: #ef4444;\n}\n\n/* Wskaźnik online */\n.chat-header-online {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: 8px;\n padding: 3px 10px;\n background: rgba(34, 197, 94, 0.15);\n border-radius: 12px;\n font-size: 11px;\n color: #4ade80;\n font-weight: 600;\n}\n\n.online-dot {\n width: 8px;\n height: 8px;\n background: #22c55e;\n border-radius: 50%;\n animation: onlinePulse 2s ease-in-out infinite;\n box-shadow: 0 0 6px rgba(34, 197, 94, 0.5);\n}\n\n@keyframes onlinePulse {\n 0%, 100% { box-shadow: 0 0 6px rgba(34, 197, 94, 0.5); }\n 50% { box-shadow: 0 0 12px rgba(34, 197, 94, 0.8); }\n}\n\n/* Menu rozwijane */\n.chat-dropdown-menu {\n position: absolute;\n top: 48px;\n right: 8px;\n width: 280px;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n padding: 8px;\n z-index: 10010;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);\n animation: dropdownIn 0.2s ease;\n}\n\n@keyframes dropdownIn {\n from {\n opacity: 0;\n transform: translateY(-8px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n.chat-dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n color: var(--text-primary);\n font-size: 13px;\n transition: all 0.15s;\n position: relative;\n}\n\n.chat-dropdown-item:hover {\n background: var(--dark-surface-light);\n color: var(--gold);\n}\n\n.chat-dropdown-item.chat-dropdown-danger:hover {\n background: rgba(220, 38, 38, 0.2);\n color: #ef4444;\n}\n\n.dropdown-icon {\n font-size: 16px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.dropdown-toggle {\n margin-left: auto;\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 10px;\n background: rgba(34, 197, 94, 0.2);\n color: #4ade80;\n font-weight: 600;\n transition: all 0.2s;\n}\n\n.dropdown-toggle.off {\n background: rgba(239, 68, 68, 0.2);\n color: #ef4444;\n}\n\n.dropdown-badge {\n margin-left: auto;\n background: var(--blood-red);\n color: var(--gold);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.chat-divider {\n height: 1px;\n background: var(--dark-border);\n margin: 4px 8px;\n}\n.chat-header-actions .chat-minimize:hover,\n.chat-header-actions .chat-expand:hover,\n.chat-header-actions .chat-close:hover {\n background: rgba(0,0,0,0.2);\n transform: scale(1.1);\n}\n.chat-body {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: var(--dark-surface);\n position: relative;\n}\n.chat-tabs {\n display: flex;\n border-bottom: 1px solid var(--dark-border);\n background: var(--dark-surface);\n}\n.chat-tab {\n flex: 1;\n text-align: center;\n padding: 10px;\n cursor: pointer;\n color: var(--text-secondary);\n transition: all 0.2s;\n font-weight: bold;\n}\n.chat-tab.active {\n color: var(--gold);\n border-bottom: 2px solid var(--blood-red);\n}\n.chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 15px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.chat-message { display: flex; align-items: flex-start; gap: 10px; animation: fadeIn 0.2s ease; }\n.chat-message.system { justify-content: center; }\n.chat-message.system .chat-message-content {\n background: var(--dark-surface-light);\n color: var(--text-muted);\n font-size: 12px;\n padding: 6px 12px;\n border-radius: 20px;\n max-width: 90%;\n text-align: center;\n}\n.chat-message-avatar {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--blood-red);\n flex-shrink: 0;\n}\n.chat-message-avatar.hide-avatar { display: none; }\n.chat-message-content {\n flex: 1;\n background: var(--dark-surface-light);\n padding: 10px 14px;\n border-radius: 18px;\n border: 1px solid var(--dark-border);\n max-width: calc(100% - 50px);\n}\n.chat-message-header {\n display: flex;\n align-items: baseline;\n gap: 8px;\n margin-bottom: 4px;\n flex-wrap: wrap;\n}\n.chat-message-nick {\n font-weight: bold;\n cursor: pointer;\n color: var(--gold);\n}\n.chat-message-nick:hover { text-decoration: underline; }\n.chat-message-time {\n font-size: 10px;\n color: var(--text-muted);\n margin-left: 8px;\n}\n.chat-message-text { word-wrap: break-word; line-height: 1.4; }\n.chat-message-text .emoticons { width: 24px; height: 24px; vertical-align: middle; }\n\n.chat-sidebar {\n position: absolute;\n right: 0;\n top: 0;\n width: 200px;\n height: 100%;\n background: var(--dark-surface-light);\n border-left: 1px solid var(--dark-border);\n transform: translateX(100%);\n transition: transform 0.3s ease;\n z-index: 10;\n display: flex;\n flex-direction: column;\n}\n.chat-sidebar.active { transform: translateX(0); }\n.chat-sidebar-header {\n padding: 10px;\n border-bottom: 1px solid var(--dark-border);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.chat-sidebar-header span { font-weight: bold; color: var(--gold); }\n.chat-sidebar-close { cursor: pointer; font-size: 18px; color: var(--text-muted); }\n.chat-users-list { flex: 1; overflow-y: auto; padding: 5px; }\n.chat-user-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.2s;\n}\n.chat-user-item:hover { background: var(--dark-surface); }\n.chat-user-item.active { background: var(--blood-red-dark); }\n.chat-user-avatar { width: 28px; height: 28px; border-radius: 50%; object-fit: cover; }\n.chat-user-name { flex: 1; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.chat-user-badge {\n background: var(--blood-red);\n color: var(--gold);\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n}\n.chat-online-count {\n padding: 8px;\n text-align: center;\n font-size: 11px;\n color: var(--text-muted);\n border-top: 1px solid var(--dark-border);\n}\n\n.chat-pm-container {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n background: var(--dark-surface);\n z-index: 20;\n transform: translateX(100%);\n transition: transform 0.3s ease;\n display: flex;\n flex-direction: column;\n}\n.chat-pm-container.active { transform: translateX(0); }\n.chat-pm-header {\n padding: 12px;\n background: var(--dark-surface-light);\n border-bottom: 1px solid var(--dark-border);\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.chat-pm-header span { font-weight: bold; color: var(--gold); }\n.chat-pm-close { cursor: pointer; font-size: 18px; color: var(--text-muted); }\n.chat-pm-messages {\n flex: 1;\n overflow-y: auto;\n padding: 15px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.chat-pm-message { display: flex; flex-direction: column; max-width: 80%; }\n.chat-pm-message.me { align-self: flex-end; }\n.chat-pm-message.other { align-self: flex-start; }\n.chat-pm-bubble {\n padding: 8px 12px;\n border-radius: 18px;\n word-wrap: break-word;\n}\n.chat-pm-message.me .chat-pm-bubble {\n background: var(--blood-gradient);\n color: var(--gold);\n border-bottom-right-radius: 4px;\n}\n.chat-pm-message.other .chat-pm-bubble {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-bottom-left-radius: 4px;\n}\n.chat-pm-time {\n font-size: 10px;\n color: var(--text-muted);\n margin-top: 2px;\n padding: 0 4px;\n}\n\n.chat-input-area {\n padding: 12px;\n border-top: 1px solid var(--dark-border);\n background: var(--dark-surface);\n display: flex;\n gap: 8px;\n align-items: flex-end;\n position: relative;\n}\n.chat-main-input,\n.chat-pm-input {\n flex: 1;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 10px 15px;\n color: var(--text-primary);\n font-family: inherit;\n font-size: 13px;\n resize: none;\n min-height: 40px;\n max-height: 100px;\n}\n.chat-main-input:focus,\n.chat-pm-input:focus { outline: none; border-color: var(--blood-red); }\n.chat-main-send-btn,\n.chat-pm-send-btn {\n background: var(--blood-gradient);\n border: none;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n cursor: pointer;\n background-image: url(\'https://m.fll.pl/_layout/send.svg\');\n background-size: 20px;\n background-position: center;\n background-repeat: no-repeat;\n filter: var(--svg-filter);\n flex-shrink: 0;\n}\n.chat-main-send-btn:hover,\n.chat-pm-send-btn:hover { transform: scale(1.05); }\n\n.chat-emoji-btn {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 20px;\n transition: all 0.2s;\n flex-shrink: 0;\n}\n.chat-emoji-btn:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n transform: scale(1.05);\n}\n.chat-emoji-picker {\n position: absolute;\n bottom: 70px;\n left: 10px;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 16px;\n padding: 12px;\n width: max-content;\n max-height: 250px;\n overflow-y: auto;\n z-index: 10002;\n display: grid;\n grid-template-columns: repeat(8, 1fr);\n gap: 6px;\n box-shadow: 0 8px 25px rgba(0,0,0,0.5);\n}\n.chat-emoji-picker .emoji-item {\n font-size: 22px;\n text-align: center;\n cursor: pointer;\n padding: 6px;\n border-radius: 8px;\n transition: all 0.15s;\n}\n.chat-emoji-picker .emoji-item:hover {\n background: var(--blood-red);\n transform: scale(1.15);\n}\n\n.chat-sidebar-toggle {\n position: absolute;\n right: 10px;\n top: 60px;\n width: 32px;\n height: 32px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 15;\n transition: all 0.2s;\n}\n.chat-sidebar-toggle:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n}\n\n.chat-footer {\n padding: 6px 12px;\n background: var(--dark-surface-light);\n border-top: 1px solid var(--dark-border);\n font-size: 10px;\n color: var(--text-muted);\n text-align: center;\n flex-shrink: 0;\n}\n\n.conversations-list {\n flex: 1;\n overflow-y: auto;\n padding: 10px;\n}\n.conversation-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n border-radius: 12px;\n cursor: pointer;\n transition: background 0.2s;\n border-bottom: 1px solid var(--dark-border);\n}\n.conversation-item:hover { background: var(--dark-surface-light); }\n.conversation-avatar {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n object-fit: cover;\n}\n.conversation-info { flex: 1; }\n.conversation-name { font-weight: bold; color: var(--gold); }\n.conversation-preview {\n font-size: 12px;\n color: var(--text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.conversation-date { font-size: 10px; color: var(--text-muted); }\n.unread-badge {\n background: var(--blood-red);\n color: var(--gold);\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.conversation-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n.conversation-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px;\n background: var(--dark-surface-light);\n border-bottom: 1px solid var(--dark-border);\n}\n.conversation-back { cursor: pointer; font-size: 20px; color: var(--gold); }\n.conversation-messages {\n flex: 1;\n overflow-y: auto;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.conv-message {\n max-width: 80%;\n padding: 8px 12px;\n border-radius: 18px;\n word-wrap: break-word;\n}\n.conv-message.me {\n align-self: flex-end;\n background: var(--blood-gradient);\n color: var(--gold);\n}\n.conv-message.other {\n align-self: flex-start;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n}\n.conv-message-time {\n font-size: 10px;\n color: var(--text-muted);\n margin-top: 4px;\n text-align: right;\n}\n.conv-reply-area {\n padding: 10px;\n border-top: 1px solid var(--dark-border);\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.conv-reply-input {\n flex: 1;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 8px 12px;\n color: var(--text-primary);\n resize: none;\n}\n.conv-send-btn {\n background: var(--blood-gradient);\n border: none;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n cursor: pointer;\n background-image: url(\'https://m.fll.pl/_layout/send.svg\');\n background-size: 20px;\n background-position: center;\n background-repeat: no-repeat;\n filter: var(--svg-filter);\n}\n\n.conversation-starters {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 10px;\n border-top: 1px solid var(--dark-border);\n background: var(--dark-surface);\n}\n.conversation-starters button {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n padding: 6px 12px;\n font-size: 11px;\n color: var(--text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 200px;\n}\n.conversation-starters button:hover {\n background: var(--blood-red);\n color: var(--gold);\n border-color: var(--gold);\n}\n\n.conversation-starters-picker {\n position: absolute;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 16px;\n padding: 12px;\n width: 320px;\n max-height: 350px;\n overflow-y: auto;\n z-index: 10003;\n box-shadow: 0 4px 20px rgba(0,0,0,0.3);\n}\n\n/* === PRZYCISK PŁYWAJĄCY === */\n.floating-action-btn {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: var(--blood-gradient);\n border: 2px solid var(--gold);\n box-shadow: 0 4px 20px rgba(0,0,0,0.3);\n cursor: pointer;\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 28px;\n transition: all 0.3s ease;\n}\n.floating-action-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 0 15px var(--blood-red-glow);\n}\n\n/* === PAGINACJA === */\n.paginator { background: transparent; margin: 10px 0; }\n.forward,\n.backward { background: var(--dark-surface); }\n.backward {\n width: 35%;\n background-color: var(--dark-surface);\n border-radius: 5px 0px 0px 5px;\n height: 80px;\n float: left;\n padding: 24px 0px 0px 20px;\n}\n.forward {\n width: 35%;\n background-color: var(--dark-surface);\n border-radius: 0px 5px 5px 0px;\n height: 80px;\n float: left;\n padding: 24px 20px 0px 0px;\n text-align: right;\n}\n.forward img { filter: var(--svg-filter); }\n.pager {\n width: 30%;\n background-color: var(--dark-surface);\n float: left;\n text-align: center;\n}\n.pager select {\n background: var(--dark-surface-light);\n color: var(--gold);\n border: 1px solid var(--dark-border);\n height: 40px;\n font-size: 20px;\n margin: 20px 0px;\n font-family: inherit;\n}\n\n/* === STOPKA === */\nfooter {\n background: var(--dark-surface);\n border-top: 2px solid var(--blood-red);\n padding: 25px 20px;\n color: var(--text-secondary);\n margin-top: 0;\n max-width: 100%;\n clear: both;\n flex-shrink: 0;\n}\nfooter ul {\n display: flex;\n justify-content: center;\n gap: 50px;\n margin-bottom: 20px;\n padding: 0;\n list-style: none;\n}\nfooter li {\n text-align: center;\n font-size: 12px;\n color: var(--text-secondary);\n}\n.counter-box {\n width: 70px;\n height: 70px;\n border-radius: 50%;\n padding-top: 18px;\n margin: 0 auto 8px;\n border: 2px solid var(--blood-red);\n color: var(--gold);\n font-weight: bold;\n font-size: 16px;\n background: var(--dark-surface-light);\n box-shadow: 0 2px 10px rgba(139,0,0,0.2);\n}\nfooter nav {\n border-top: 1px solid var(--dark-border);\n padding-top: 15px;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 30px;\n}\nfooter nav a {\n color: var(--text-secondary);\n padding: 8px 0;\n text-align: center;\n}\nfooter nav a:hover { color: var(--gold); }\nfooter section {\n border-top: 1px solid var(--dark-border);\n padding: 20px 0;\n text-align: center;\n}\nfooter section img { height: 45px; margin: 5px; }\n.copyright {\n border-top: 1px solid var(--dark-border);\n padding-top: 15px;\n color: var(--text-muted);\n font-size: 11px;\n text-align: center;\n}\n.copyright a { color: var(--text-muted); }\n.copyright a:hover { color: var(--gold); }\nfooter nav a[href*="mobile=1"] { display: none; }\n\n/* === INNE === */\n.spinner {\n border: 3px solid var(--gold);\n border-left: 3px solid var(--blood-red);\n border-radius: 50%;\n width: 30px;\n height: 30px;\n animation: spin 0.8s linear infinite;\n margin: 0 auto;\n}\n\n.emoji-picker-btn {\n padding: 8px 15px;\n border-radius: 25px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n color: var(--gold);\n font-size: 18px;\n cursor: pointer;\n}\n.emoji-picker-btn:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n transform: scale(1.05);\n}\n.emoji-picker-popup {\n position: absolute;\n bottom: 80px;\n left: 15px;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 16px;\n padding: 15px;\n width: 400px;\n max-height: 350px;\n overflow-y: auto;\n z-index: 1000;\n display: grid;\n grid-template-columns: repeat(10, 1fr);\n gap: 8px;\n}\n.emoji-picker-popup .emoji-item {\n font-size: 24px;\n text-align: center;\n cursor: pointer;\n padding: 5px;\n border-radius: 8px;\n transition: all 0.15s;\n}\n.emoji-picker-popup .emoji-item:hover {\n background: var(--blood-red);\n transform: scale(1.2);\n}\n\ninput[type="text"],\ninput[type="password"],\ninput[type="number"],\ntextarea,\nselect {\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n color: var(--text-primary);\n border-radius: 8px;\n padding: 10px;\n font-family: inherit;\n}\ninput:focus,\ntextarea:focus,\nselect:focus {\n border-color: var(--blood-red);\n box-shadow: 0 0 0 2px var(--blood-red-glow);\n}\n\n.alert {\n background: var(--blood-gradient);\n color: var(--gold);\n border-radius: 12px;\n padding: 15px 45px 15px 20px;\n font-size: 14px;\n border: 1px solid var(--gold-dark);\n box-shadow: 0 4px 20px rgba(0,0,0,0.4);\n}\n.alert img { filter: var(--svg-filter); }\n\n.hashtag {\n background: var(--blood-red-dark);\n color: var(--gold);\n border-radius: 15px;\n padding: 3px 10px;\n margin: 2px;\n display: inline-block;\n font-size: 13px;\n text-decoration: none;\n}\n\n.counterprofile {\n text-align: right;\n margin: 10px 15px 20px;\n}\n.counterprofilebg {\n background: var(--blood-red);\n color: var(--gold);\n padding: 5px 15px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: bold;\n}\n\n.search-templates-new {\n flex: 1 1 100%;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 16px;\n padding: 20px;\n margin-top: 10px;\n}\n.search-templates {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n padding: 10px 0;\n}\n/* === FORMULARZ DODAWANIA WYDARZENIA === */\n.add-event-form { display: flex; flex-direction: column; gap: 15px; padding: 15px; }\n.event-form-group { display: flex; flex-direction: column; gap: 5px; }\n.event-form-label { color: var(--gold); font-size: 13px; font-weight: 600; }\n.event-form-input { background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 10px; padding: 10px 14px; color: var(--text-primary); font-family: inherit; font-size: 14px; }\n.event-form-input:focus { border-color: var(--gold); outline: none; }\n.event-type-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }\n.event-type-btn { padding: 8px 6px; border-radius: 12px; background: var(--dark-surface-light); border: 1px solid var(--dark-border); color: var(--text-secondary); cursor: pointer; font-size: 12px; text-align: center; transition: all 0.2s; }\n.event-type-btn:hover { background: var(--blood-red-dark); border-color: var(--gold); color: var(--gold); }\n.event-type-btn.selected { background: var(--blood-red); border-color: var(--gold); color: var(--gold); font-weight: bold; }\n.event-save-btn { padding: 14px; background: var(--blood-gradient); color: var(--gold); border: 1px solid var(--gold-dark); border-radius: 25px; cursor: pointer; font-size: 16px; font-weight: bold; margin-top: 10px; transition: all 0.2s; }\n.event-save-btn:hover { transform: translateY(-2px); box-shadow: 0 4px 15px var(--blood-red-glow); }\n/* === KALENDARZ === */\n.calendar-container { display: flex; flex-direction: column; gap: 15px; padding: 15px; }\n.calendar-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 0; }\n.calendar-title { font-size: 20px; color: var(--gold); font-weight: bold; }\n.calendar-nav-btn { width: 40px; height: 40px; border-radius: 50%; background: var(--dark-surface-light); border: 1px solid var(--dark-border); color: var(--gold); cursor: pointer; font-size: 18px; display: flex; align-items: center; justify-content: center; transition: all 0.2s; }\n.calendar-nav-btn:hover { background: var(--blood-red); border-color: var(--gold); transform: scale(1.1); }\n.calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }\n.calendar-day-header { text-align: center; color: var(--text-muted); font-size: 12px; font-weight: bold; padding: 8px 0; border-bottom: 1px solid var(--dark-border); }\n.calendar-day-header.weekend { color: var(--blood-red-light); }\n.calendar-day { aspect-ratio: 1; background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 10px; padding: 6px; cursor: pointer; transition: all 0.2s; position: relative; min-height: 80px; display: flex; flex-direction: column; }\n.calendar-day:hover { background: var(--dark-surface-lighter); border-color: var(--blood-red); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(139,0,0,0.2); }\n.calendar-day.today { border-color: var(--gold); background: var(--dark-surface); }\n.calendar-day.other-month { opacity: 0.3; }\n.calendar-day-number { font-size: 12px; font-weight: bold; color: var(--text-secondary); margin-bottom: 2px; }\n.calendar-day.today .calendar-day-number { color: var(--gold); background: var(--blood-red); width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }\n.calendar-day.weekend .calendar-day-number { color: var(--blood-red-light); }\n.calendar-day-events { display: flex; flex-direction: column; gap: 2px; overflow: hidden; flex: 1; }\n.calendar-event-dot { display: flex; align-items: center; gap: 4px; font-size: 10px; padding: 2px 5px; border-radius: 8px; background: var(--blood-red-dark); color: var(--gold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }\n.calendar-event-dot:hover { background: var(--blood-red); }\n.calendar-events-panel { background: var(--dark-surface-light); border: 1px solid var(--dark-border); border-radius: 12px; padding: 15px; max-height: 300px; overflow-y: auto; }\n.calendar-events-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 10px; border-bottom: 1px solid var(--dark-border); margin-bottom: 10px; }\n.calendar-events-title { color: var(--gold); font-weight: bold; font-size: 14px; }\n.calendar-add-btn { padding: 6px 12px; border-radius: 15px; background: var(--blood-gradient); color: var(--gold); border: 1px solid var(--gold-dark); cursor: pointer; font-size: 12px; transition: all 0.2s; }\n.calendar-add-btn:hover { transform: scale(1.05); box-shadow: 0 2px 8px var(--blood-red-glow); }\n.calendar-event-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: 10px; background: var(--dark-surface); margin-bottom: 6px; transition: all 0.2s; }\n.calendar-event-item:hover { background: var(--dark-surface-lighter); }\n.calendar-event-emoji { font-size: 24px; flex-shrink: 0; }\n.calendar-event-info { flex: 1; min-width: 0; }\n.calendar-event-title { color: var(--text-primary); font-size: 13px; font-weight: 500; }\n.calendar-event-meta { font-size: 11px; color: var(--text-muted); margin-top: 2px; }\n.calendar-event-delete { width: 28px; height: 28px; border-radius: 50%; background: transparent; border: 1px solid #f44336; color: #f44336; cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; transition: all 0.2s; flex-shrink: 0; }\n.calendar-event-delete:hover { background: #f44336; color: white; }\n.calendar-mood-section { margin-top: 15px; padding: 12px; background: var(--dark-surface-light); border-radius: 12px; text-align: center; }\n.calendar-mood-title { color: var(--gold); font-size: 14px; margin-bottom: 8px; }\n.calendar-mood-emojis { display: flex; justify-content: center; gap: 10px; flex-wrap: wrap; }\n.calendar-mood-btn { font-size: 28px; cursor: pointer; padding: 8px; border-radius: 50%; transition: all 0.2s; background: transparent; border: 2px solid transparent; }\n.calendar-mood-btn:hover { background: var(--dark-surface); border-color: var(--gold); transform: scale(1.2); }\n.calendar-mood-btn.selected { background: var(--blood-red-dark); border-color: var(--gold); }\n\n.search-templates span {\n background: var(--blood-red-dark);\n border-radius: 20px;\n padding: 5px 12px;\n}\n.search-templates span a {\n color: var(--gold);\n text-decoration: none;\n}\n.search-templates span img {\n width: 14px;\n height: 14px;\n margin-left: 5px;\n filter: var(--svg-filter);\n}\n\n.fly-submit {\n position: fixed;\n bottom: 30px;\n right: 30px;\n width: 60px;\n height: 60px;\n background: var(--blood-gradient);\n border-radius: 50%;\n padding: 12px;\n border: 2px solid var(--gold-dark);\n box-shadow: 0 4px 20px var(--blood-red-glow);\n cursor: pointer;\n z-index: 100;\n}\n.fly-progress {\n background: var(--dark-surface);\n padding: 10px 15px;\n border-radius: 20px;\n margin: 10px 15px;\n text-align: center;\n color: var(--gold);\n font-weight: bold;\n}\n.fly-progress .procount { font-size: 24px; margin-right: 5px; }\n\ndiv[style*="background-color: #DFDBDB"],\n#sp,\ndiv[id="sp"] {\n background-color: var(--dark-surface-light);\n color: var(--text-muted);\n}\n\n.attachment-icon { cursor: pointer; font-size: 24px; color: var(--gold); }\n#attachment {\n display: block;\n cursor: pointer;\n padding: 8px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n transition: all 0.2s;\n}\n#attachment:hover { background: var(--blood-red); }\n#attachment img { width: 24px; height: 24px; filter: var(--svg-filter); }\n#attachment-close {\n cursor: pointer;\n padding: 8px;\n border-radius: 50%;\n background: var(--dark-surface-light);\n}\n#attachment-close:hover { background: var(--blood-red); }\n#attachment-close img { width: 24px; height: 24px; filter: var(--svg-filter); }\n/* Grupowanie wiadomości */\n.chat-message.grouped {\n margin-top: -4px;\n}\n.chat-message.grouped .chat-message-content {\n border-top-left-radius: 4px !important;\n border-top-right-radius: 18px !important;\n}\n\n/* Wiadomości z @wzmianką - trwałe podświetlenie */\n.chat-message.mentioned-message {\n background: rgba(212, 175, 55, 0.06) !important;\n border-left: 3px solid var(--gold);\n padding-left: 8px;\n}\n.chat-message.mentioned-message .chat-message-content {\n box-shadow: inset 0 0 0 1px rgba(212, 175, 55, 0.2);\n}\n\n/* Cytowanie - kursor */\n.chat-message-text {\n cursor: pointer;\n transition: background 0.15s;\n}\n.chat-message-text:hover {\n background: rgba(212, 175, 55, 0.03);\n border-radius: 4px;\n}\n/* === ANIMACJE === */\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n@keyframes slideUp {\n from { transform: translate(-50%, 100%); opacity: 0; }\n to { transform: translate(-50%, 0); opacity: 1; }\n}\n@keyframes slideDown {\n from { transform: translate(-50%, 0); opacity: 1; }\n to { transform: translate(-50%, 100%); opacity: 0; }\n}\n@keyframes chatPulse {\n 0% { box-shadow: 0 0 0 0 var(--blood-red-glow); }\n 70% { box-shadow: 0 0 0 8px rgba(139,0,0,0); }\n 100% { box-shadow: 0 0 0 0 rgba(139,0,0,0); }\n}\n\n.floating-chat-window.has-notification { animation: chatPulse 1s ease-in-out 3; }\n\n.fellow-toast-error { border-left: 4px solid #f44336 !important; }\n.fellow-toast-success { border-left: 4px solid #4caf50 !important; }\n\n.home-box,\n.home-ctn,\n.list-box,\n.index-line .profile-img,\n.profile-data,\n.question-data {\n animation: fadeIn 0.3s ease-out;\n}\n\n.accordion-content { display: block; }\n.accordion-toggle { pointer-events: none; cursor: default; text-decoration: none; }\n.accordion-toggle::after { display: none; }\n\n.chat-quick-btn {\n cursor: pointer;\n transition: all 0.2s;\n}\n.chat-quick-btn:hover {\n transform: translateY(-2px);\n filter: drop-shadow(0 0 8px var(--blood-red-glow));\n}\n\n.conv-message-left {\n align-self: flex-start;\n max-width: 80%;\n margin: 5px 0;\n}\n.conv-message-right {\n align-self: flex-end;\n max-width: 80%;\n margin: 5px 0;\n}\n\n.conversation-avatar {\n width: 50px;\n height: 50px;\n border-radius: 50%;\n border: 2px solid var(--gold);\n object-fit: cover;\n}\n.conversation-name {\n color: var(--gold);\n font-size: 18px;\n font-weight: bold;\n text-decoration: none;\n}\n.conversation-name:hover { text-decoration: underline; }\n.conversation-status {\n color: var(--text-secondary);\n font-size: 13px;\n}\n.conversation-actions {\n display: flex;\n gap: 10px;\n}\n.conv-action-btn {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n color: var(--gold);\n font-size: 18px;\n text-decoration: none;\n}\n.conv-action-btn:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n color: var(--text-on-dark);\n}\n.conv-action-btn img {\n width: 20px;\n height: 20px;\n filter: var(--svg-filter);\n}\n\n.modal-action-btn {\n position: fixed;\n bottom: 30px;\n right: 30px;\n z-index: 10001;\n}\n.modal-action-btn .form-button {\n margin: 0;\n padding: 16px 32px;\n font-size: 16px;\n box-shadow: 0 4px 20px var(--blood-red-glow);\n border-radius: 40px;\n}\n#modal-attachment-btn {\n width: 50px;\n height: 50px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 24px;\n}\n#modal-attachment-btn:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n color: var(--gold);\n}\n.side-notes {\n border-color: var(--gold-dark);\n}\n.side-notes-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--dark-border);\n color: var(--gold);\n font-weight: bold;\n font-size: 14px;\n}\n.side-notes-count {\n background: var(--blood-red);\n color: var(--gold);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n}\n.side-notes-empty {\n text-align: center;\n padding: 10px;\n color: var(--text-muted);\n font-size: 12px;\n}\n.side-notes-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 250px;\n overflow-y: auto;\n}\n.side-note-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 10px;\n background: var(--dark-surface-lighter);\n cursor: pointer;\n transition: all 0.15s;\n}\n.side-note-item:hover {\n background: var(--dark-surface-light);\n transform: translateX(3px);\n}\n.side-note-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n overflow: hidden;\n flex-shrink: 0;\n}\n.side-note-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.side-note-info {\n flex: 1;\n min-width: 0;\n}\n.side-note-name {\n color: var(--gold);\n font-size: 12px;\n font-weight: 600;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.side-note-preview {\n color: var(--text-muted);\n font-size: 11px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n}\n.side-note-actions {\n display: flex;\n gap: 6px;\n flex-shrink: 0;\n}\n.side-note-view,\n.side-note-edit {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n cursor: pointer;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n transition: all 0.15s;\n}\n.side-note-view:hover,\n.side-note-edit:hover {\n background: var(--blood-red);\n border-color: var(--gold);\n}\nbody:not(.logowanie-page).light-scheme .profile-act { color: var(--text-on-dark); }\nbody:not(.logowanie-page).light-scheme .profile-act img { filter: brightness(0) invert(1); }\nbody:not(.logowanie-page).light-scheme .message-right { color: var(--text-on-dark); }\n';GM_addStyle(H);const R=document.querySelector("style:not([data-src])");R&&R.setAttribute("data-src","Fellow Enhanced.user.js");const W={webSocket:null,chatPanel:null,onlineUsersList:[],mutedUsersMap:{},privateMessagesData:{},activePrivateChat:null,receivedMessageIds:new Map,wsInitialized:!1,wsConnecting:!1,heartbeatInterval:null,reconnectAttempts:0,lastPongTime:null,currentTab:"messages",refreshInterval:null,currentConversationName:null,originalPageTitle:document.title,pmBlinkTimer:null,unreadMessagesCount:0,intentionalClose:!1,pendingMessages:[],maxPendingMessages:200,chatPanelCreated:!1,_savedChatHTML:null,_savedMessagesHTML:null,_scrollButton:null,_scrollCheck:null,showGMNotification(e,n,t=null,o=null){try{const r={title:e,text:n,timeout:1e4,highlight:!0};o&&(r.tag=o),t&&(r.url=t),r.onclick=function(e){e&&e.preventDefault&&e.preventDefault(),t&&window.open(t,"_blank"),W.chatPanel&&W.chatPanel.classList.contains("minimized")&&W.chatPanel.classList.remove("minimized"),W.show()},GM_notification(r)}catch(e){console.warn("GM_notification error:",e),m(n,"info",8e3)}},requestNotificationPermission(){"undefined"!=typeof GM_notification&&console.log("GM_notification dostępne")},updateUnreadBadge(e){const n=W.chatPanel?.querySelector("#chat-unread-badge");n&&(e>0?(n.textContent=e,n.style.display="inline-block",n.style.animation="pulse 1.5s ease-in-out infinite"):(n.textContent="0",n.style.display="none",n.style.animation="")),void 0===e||window._updatingFromFab||(window._updatingFromFab=!0,ge(e,W.onlineUsersList.length),window._updatingFromFab=!1),e>0&&!document.hasFocus()?document.title=`(${e}) 📩 Nowe wiadomości - ${W.originalPageTitle}`:document.hasFocus()&&(document.title=W.originalPageTitle)},replaceEmoticons(n){if(!n)return"";if(n.includes("_layout/emo/"))return n;const t={"O:-)":"santa.svg","O:)":"santa.svg",":-D":"happy.svg",":D":"happy.svg",XD:"happy.svg",xD:"happy.svg",xd:"happy.svg",":-*":"kiss.svg",":*":"kiss.svg",":-)":"smile.svg",":)":"smile.svg",";-)":"wink.svg",";)":"wink.svg",":-(":"sad.svg",":(":"sad.svg",";-(":"cry.svg",";(":"cry.svg",":-P":"yuck.svg",":P":"yuck.svg",";-P":"yuck.svg",";P":"yuck.svg",":-p":"yuck.svg",":p":"yuck.svg",";-p":"yuck.svg",";p":"yuck.svg",":-@":"angry.svg",":@":"angry.svg",":-/":"hmm.svg",":/":"hmm.svg",":-$":"red.svg",":$":"red.svg",":-O":"what.svg",":O":"what.svg",":-X":"dontspeak.svg",":X":"dontspeak.svg",":-]":"glass.svg",":]":"glass.svg",";]":"glass.svg",";-]":"glass.svg","???":"question.svg","!!!":"interjection.svg","<3":"love.svg"};let o=n;for(const[n,r]of Object.entries(t)){const t=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");o=o.replace(new RegExp(t,"g"),`<img src="${e.ICONS.EMO_PATH}${r}" class="emoticons" style="width:20px;height:20px;vertical-align:middle;">`)}return o},formatMessageContent(e){if(!e)return"";if(e.includes("_layout/emo/"))return e.replace(/@(\w+)/g,(e,n)=>`<span class="mention" style="color:${y(n)};font-weight:bold;">@${n}</span>`);let n=v(e);return n=this.replaceEmoticons(n),n=n.replace(/@(\w+)/g,(e,n)=>`<span class="mention" style="color:${y(n)};font-weight:bold;">@${v(n)}</span>`),n=n.replace(/\n/g,"<br>"),n},escapeHtmlExceptTags(e){if(!e)return"";const n=[];let t=v(e.replace(/<img[^>]*>/gi,e=>(n.push(e),`\0IMG${n.length-1}\0`)));return n.forEach((e,n)=>{t=t.replace(`\0IMG${n}\0`,e)}),t},formatMessageContent(e){if(!e)return"";if(e.includes("<img")||e.includes("_layout/emo/"))return e.replace(/@(\w+)/g,(e,n)=>`<span class="mention" style="color:${y(n)};font-weight:bold;">@${n}</span>`);let n=this.replaceEmoticons(e);return n=this.escapeHtmlExceptTags(n),n=n.replace(/@(\w+)/g,(e,n)=>`<span class="mention" style="color:${y(n)};font-weight:bold;">@${v(n)}</span>`),n=n.replace(/\n/g,"<br>"),n},initializeWebSocket(){if("complete"!==document.readyState)return console.log("WebSocket: Strona jeszcze się ładuje, czekam..."),void setTimeout(()=>W.initializeWebSocket(),1e3);if(W.wsConnecting)return void console.log("WebSocket: Already connecting, skipping...");if(W.webSocket&&W.webSocket.readyState===WebSocket.OPEN)return void console.log("WebSocket: Already connected");if(!u.currentUserId||!u.currentUserToken)return console.log("WebSocket: Missing credentials, fetching..."),void k().then(e=>{e&&u.currentUserId&&u.currentUserToken?(W.wsConnecting=!1,W.initializeWebSocket()):(console.error("WebSocket: Failed to get credentials"),W.wsConnecting=!1)});if(W.wsConnecting=!0,W.webSocket){try{W.webSocket.onclose=null,W.webSocket.close()}catch(e){}W.webSocket=null}const n=`${e.WS_URL}?id=${u.currentUserId}&user=${encodeURIComponent(u.currentUserName)}&avatar=${u.currentUserAvatar}&token=${u.currentUserToken}&mobile=1`;console.log("WebSocket: Connecting to",n);try{W.webSocket=new WebSocket(n)}catch(e){return console.error("WebSocket: Creation error:",e),W.wsConnecting=!1,void W.scheduleReconnect()}W.webSocket.onopen=()=>{console.log("WebSocket: Connected successfully"),W.wsConnecting=!1,W.wsInitialized=!0,W.reconnectAttempts=0,W.lastPongTime=Date.now(),W.addSystemNotification("ⓘ Połączono z czatem Fellow"),W.heartbeatInterval&&(clearInterval(W.heartbeatInterval),W.heartbeatInterval=null),W.heartbeatInterval=setInterval(()=>{if(W.webSocket&&W.webSocket.readyState===WebSocket.OPEN)try{W.webSocket.send(JSON.stringify({type:"ping"})),W.lastPongTime=Date.now()}catch(e){console.warn("WebSocket: Heartbeat send failed")}W.lastPongTime&&Date.now()-W.lastPongTime>9e4&&(console.warn("WebSocket: Heartbeat timeout, reconnecting..."),W.cleanupWebSocket(),W.scheduleReconnect())},3e4),B()},W.webSocket.onclose=e=>{if(console.log("WebSocket: Closed with code",e.code,"reason:",e.reason),W.wsConnecting=!1,W.wsInitialized=!1,W.heartbeatInterval&&(clearInterval(W.heartbeatInterval),W.heartbeatInterval=null),W.intentionalClose)return console.log("WebSocket: Intentional close, not reconnecting"),W.intentionalClose=!1,void B();switch(e.code){case 1e3:console.log("WebSocket: Normal closure"),W.addSystemNotification("ⓘ Rozłączono z czatem");break;case 1001:console.log("WebSocket: Browser closed");break;case 1006:console.log("WebSocket: Abnormal closure - network issue"),W.addSystemNotification("⚠️ Utracono połączenie z czatem"),W.scheduleReconnect();break;default:console.log("WebSocket: Unexpected close"),W.scheduleReconnect()}B()},W.webSocket.onerror=e=>{console.error("WebSocket: Error occurred")},W.webSocket.onmessage=n=>{let t;try{t=JSON.parse(n.data)}catch{return void console.warn("WebSocket: Invalid message format")}if("pong"!==t.type){if(t.id){if(W.receivedMessageIds.has(t.id))return;if(W.receivedMessageIds.set(t.id,Date.now()),W.receivedMessageIds.size>e.MAX_RECEIVED_MESSAGE_IDS){const n=Date.now(),t=[];if(W.receivedMessageIds.forEach((o,r)=>{n-o>e.RECEIVED_MESSAGE_TTL&&t.push(r)}),t.forEach(e=>W.receivedMessageIds.delete(e)),W.receivedMessageIds.size>e.MESSAGE_ID_CLEANUP_THRESHOLD){const e=Array.from(W.receivedMessageIds.entries());e.sort((e,n)=>e[1]-n[1]);const n=Math.floor(e.length/2);e.slice(0,n).forEach(([e])=>W.receivedMessageIds.delete(e))}}}switch(t.type){case"msg":if(W.mutedUsersMap[t.user_id])return;!1!==u.mentionNotify&&W.checkMention(t.user_id,t.user,t.text);const n=W.chatPanel?.querySelector(".chat-messages");n?W.appendChatMessage(t.user_id,t.user,t.text,t.time):W.bufferMessage(t.user_id,t.user,t.text,t.time);break;case"history":const o=document.querySelector(".chat-history-loading");if(o&&o.remove(),W._loadingHistory=!1,t.messages&&Array.isArray(t.messages)){const e=W.chatPanel?.querySelector(".chat-messages");if(!e)break;const n=e.scrollTop+e.clientHeight>=e.scrollHeight-30,o=e.scrollHeight;t.messages.reverse().forEach(n=>{const t=W.appendChatMessageToContainer(e,n.user_id,n.user,n.text,n.time,!0);t&&t.parentNode===e&&e.insertBefore(t,e.firstChild)});const r=document.createElement("div");r.className="chat-message system",r.innerHTML='<div class="chat-message-content">⬆ Starsze wiadomości ⬆</div>',e.insertBefore(r,e.firstChild),e.scrollTop=n?e.scrollHeight:e.scrollHeight-o}else t.text&&t.user_id&&W.appendChatMessage(t.user_id,t.user,t.text,t.time,!0);break;case"users":W.onlineUsersList=t.list.map(n=>({id:n.id,name:n.name,avatar:n.avatar||e.ICONS.NO_FOTO_FULL,online:!0})),W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&W.renderUsersSidebar(),ge(W.unreadMessagesCount,W.onlineUsersList.length),B();break;case"join":{const n=W.onlineUsersList.find(e=>e.id==t.user_id);n?n.online=!0:W.onlineUsersList.push({id:t.user_id,name:t.user,avatar:t.avatar||e.ICONS.NO_FOTO_FULL,online:!0}),W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&W.renderUsersSidebar(),ge(W.unreadMessagesCount,W.onlineUsersList.length),B();break}case"leave":{const e=W.onlineUsersList.find(e=>e.id==t.user_id);e&&(e.online=!1),W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&W.renderUsersSidebar(),ge(W.unreadMessagesCount,W.onlineUsersList.length),B();break}case"pm":W.receivePrivateMessage(t.from_id,t.from,t.text);break;case"history_pm":W.privateMessagesData[t.from_id]||(W.privateMessagesData[t.from_id]={name:t.from,messages:[],unread:0}),t.messages.forEach(e=>{W.privateMessagesData[t.from_id].messages.push({from:e.from,text:e.text,time:e.time})}),W.activePrivateChat==t.from_id&&W.renderPrivateMessages(),W.updateTotalPMCount();break;case"mute_list":W.mutedUsersMap={},(t.list||[]).forEach(e=>W.mutedUsersMap[String(e)]=!0),W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&W.renderUsersSidebar(),B();break;case"mute_update":t.muted?W.mutedUsersMap[String(t.user)]=!0:delete W.mutedUsersMap[String(t.user)],W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&W.renderUsersSidebar(),B()}}else W.lastPongTime=Date.now()},setTimeout(()=>{W.wsConnecting&&W.webSocket&&W.webSocket.readyState===WebSocket.CONNECTING&&(console.warn("WebSocket: Connection timeout"),W.cleanupWebSocket(),W.scheduleReconnect())},15e3)},cleanupWebSocket(){if(W._loadingHistory=!1,W.heartbeatInterval&&(clearInterval(W.heartbeatInterval),W.heartbeatInterval=null),W.webSocket){try{W.webSocket.onclose=null,W.webSocket.onerror=null,W.webSocket.onmessage=null,W.webSocket.onopen=null,W.webSocket.readyState!==WebSocket.OPEN&&W.webSocket.readyState!==WebSocket.CONNECTING||W.webSocket.close()}catch(e){}W.webSocket=null}W.wsConnecting=!1,W.wsInitialized=!1},scheduleReconnect(){if(W.intentionalClose)return;if(W.reconnectAttempts>=e.MAX_RECONNECT_ATTEMPTS)return W.addSystemNotification("⚠️ Nie udało się połączyć z czatem. Spróbuj odświeżyć stronę."),void(W.reconnectAttempts=0);W.reconnectAttempts++;const n=Math.min(2e3*W.reconnectAttempts,3e4);console.log(`WebSocket: Reconnecting in ${n/1e3}s (attempt ${W.reconnectAttempts}/${e.MAX_RECONNECT_ATTEMPTS})`),W.addSystemNotification(`ⓘ Ponowne łączenie za ${Math.round(n/1e3)}s...`),setTimeout(()=>{W.intentionalClose||W.wsConnecting||W.webSocket&&W.webSocket.readyState===WebSocket.OPEN||(console.log("WebSocket: Attempting reconnect..."),W.initializeWebSocket())},n)},bufferMessage(e,n,t,o){W.pendingMessages.push({userId:e,userName:n,messageText:t,timestamp:o||Math.floor(Date.now()/1e3)}),W.pendingMessages.length>W.maxPendingMessages&&W.pendingMessages.shift()},flushPendingMessages(){const e=W.chatPanel?.querySelector(".chat-messages");if(e&&0!==W.pendingMessages.length){if(console.log(`Odtwarzanie ${W.pendingMessages.length} buforowanych wiadomości...`),W.pendingMessages.length>0){const n=document.createElement("div");n.className="chat-message system",n.innerHTML=`<div class="chat-message-content" style="background:var(--dark-surface-lighter);color:var(--text-muted);font-size:11px;padding:4px 12px;">\n ⬇ ${W.pendingMessages.length} wiadomości z bufora ⬇\n </div>`,e.appendChild(n)}W.pendingMessages.forEach(n=>{W.appendChatMessageToContainer(e,n.userId,n.userName,n.messageText,n.timestamp)}),W.pendingMessages=[],e.scrollTop=e.scrollHeight}},addSystemNotification(e){const n=W.chatPanel?.querySelector(".chat-messages");if(!n)return;const t=document.createElement("div");t.className="chat-message system",t.innerHTML=`<div class="chat-message-content">${e}</div>`,n.appendChild(t),n.scrollTop=n.scrollHeight},sendPublicMessage(){const e=W.chatPanel?.querySelector(".chat-main-input");if(!e)return;const n=e.value.trim();n&&(W.webSocket&&W.webSocket.readyState===WebSocket.OPEN?(W.webSocket.send(JSON.stringify({type:"msg",text:n})),e.value="",f(e)):m("Nie jesteś połączony z czatem","error"))},sendPrivateMessage(){if(!W.activePrivateChat)return;const e=W.chatPanel?.querySelector(".chat-pm-input");if(!e)return;const n=e.value.trim();n&&(W.webSocket&&W.webSocket.readyState===WebSocket.OPEN?(W.webSocket.send(JSON.stringify({type:"pm",to:W.activePrivateChat,text:n})),W.privateMessagesData[W.activePrivateChat]||(W.privateMessagesData[W.activePrivateChat]={name:"Unknown",messages:[],unread:0}),W.privateMessagesData[W.activePrivateChat].messages.push({from:u.currentUserName,text:n,time:Math.floor(Date.now()/1e3)}),W.renderPrivateMessages(),e.value="",f(e)):m("Nie jesteś połączony z czatem","error"))},checkMention(e,n,t){if(e==u.currentUserId)return;const o=u.currentUserName;if(!o)return;if(new RegExp(`@${o}(?![\\w])`,"i").test(t)){if(W.chatPanel&&"none"!==W.chatPanel.style.display&&!W.chatPanel.classList.contains("minimized")&&document.hasFocus())return;m(`📢 ${n} wspomniał Cię na czacie: ${t.substring(0,80)}`,"info",8e3),le&&(le.style.animation="chatPulse 0.5s ease-in-out 3",setTimeout(()=>{le&&(le.style.animation="")},1500)),document.hasFocus()||(document.title=`📢 ${n} woła Cię! - ${W.originalPageTitle}`,setTimeout(()=>{document.title!==W.originalPageTitle&&(document.title=W.originalPageTitle)},3e3))}},appendChatMessageToContainer(n,t,o,r,a,i=!1){if(!n)return;const s=n.querySelectorAll(".chat-message:not(.system)"),l=s.length>0?s[s.length-1]:null;let d=!1;if(l&&!i){const e=l.dataset.userId,n=parseInt(l.dataset.timestamp||"0"),o=a||Math.floor(Date.now()/1e3);e===String(t)&&o-n<120&&(d=!0)}const c=n.scrollTop+n.clientHeight>=n.scrollHeight-30,p=document.createElement("div");if(p.className=`chat-message ${i?"history":""} ${d?"grouped":""}`,p.dataset.userId=t,p.dataset.timestamp=a||Math.floor(Date.now()/1e3),p.dataset.userName=o,p.dataset.messageText=r,!i&&String(t)!==String(u.currentUserId)){const e=u.currentUserName;if(e){new RegExp(`@${e}(?![\\w])`,"i").test(r)&&p.classList.add("mentioned-message")}}const g=document.createElement("img");g.className="chat-message-avatar "+(u.shouldShowAvatars?"":"hide-avatar"),g.src=W.onlineUsersList.find(e=>e.id==t)?.avatar||e.ICONS.NO_FOTO_FULL,g.onerror=()=>{g.src=e.ICONS.NO_FOTO_FULL},g.style.cursor="context-menu",g.title="Prawy klik: menu",d&&(g.style.visibility="hidden",g.style.height="0",g.style.width="36px",g.style.minHeight="0"),g.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation();const n=W.chatPanel?.querySelector(".chat-sidebar");n&&n.classList.remove("active"),W.showUserContextMenu(e.clientX,e.clientY,t,o)};const m=document.createElement("div");if(m.className="chat-message-content",d&&(m.style.paddingTop="2px",m.style.paddingBottom="2px"),!d){const e=document.createElement("div");e.className="chat-message-header";const n=document.createElement("span");n.className="chat-message-nick",n.style.color=y(o),n.textContent=o,n.style.cursor="context-menu",n.title="Lewy klik: @wspomnij | Prawy klik: menu",n.onclick=()=>{const e=W.chatPanel?.querySelector(".chat-main-input");e&&(e.value=`@${o} `+e.value,e.focus())},n.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,t,o)};const r=document.createElement("span");r.className="chat-message-time";const i=a?new Date(1e3*a):new Date;r.textContent=`${i.getHours().toString().padStart(2,"0")}:${i.getMinutes().toString().padStart(2,"0")}`,e.append(n,r),m.append(e)}const h=document.createElement("div");return h.className="chat-message-text",h.innerHTML=W.formatMessageContent(r),h.style.cursor="pointer",h.title="Kliknij, aby zacytować",h.onclick=()=>{const e=W.chatPanel?.querySelector(".chat-main-input");if(e){const n=`"@${o} ${r}"`;e.value.trim()?e.value=e.value.trim()+" "+n:e.value=n,e.focus(),e.selectionStart=e.selectionEnd=e.value.length,f(e)}},m.append(h),p.append(g,m),n.appendChild(p),(c||i)&&(n.scrollTop=n.scrollHeight),p},appendChatMessage(e,n,t,o,r=!1){const a=W.chatPanel?.querySelector(".chat-messages");if(!a){return void(W.pendingMessages.some(n=>n.userId===e&&n.messageText===t&&Math.abs((n.timestamp||0)-(o||0))<2)||W.bufferMessage(e,n,t,o))}W.appendChatMessageToContainer(a,e,n,t,o,r)},renderUsersSidebar(){const n=W.chatPanel?.querySelector(".chat-users-list");n&&(n.innerHTML="",W.onlineUsersList.filter(e=>e.id!=u.currentUserId).forEach(t=>{const o=W.mutedUsersMap[String(t.id)],r=W.privateMessagesData[t.id]?.unread||0,a=document.createElement("div");a.className=`chat-user-item ${W.activePrivateChat==t.id?"active":""} ${o?"muted":""}`,o&&(a.style.opacity="0.6");const i=document.createElement("img");i.className="chat-user-avatar",i.src=t.avatar,i.onerror=()=>{i.src=e.ICONS.NO_FOTO_FULL},i.style.cursor="context-menu",i.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,t.id,t.name)},a.appendChild(i);const s=document.createElement("span");if(s.className="chat-user-name",s.textContent=t.name,s.style.opacity=t.online?"1":"0.5",s.style.cursor="context-menu",s.title="Kliknij: otwórz PM | Prawy klik: menu",s.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,t.id,t.name)},a.appendChild(s),r>0){const e=document.createElement("span");e.className="chat-user-badge",e.textContent=r,a.appendChild(e)}a.addEventListener("click",e=>{e.target!==i&&e.target!==s&&W.openPrivateChat(t.id,t.name)}),a.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,t.id,t.name)},n.appendChild(a)}),B())},openPrivateChat(e,n){if("chat"!==W.currentTab){W.currentTab="chat";const e=W.chatPanel?.querySelectorAll(".chat-tab");e?.forEach(e=>e.classList.remove("active"));const n=W.chatPanel?.querySelector('[data-tab="chat"]');n&&n.classList.add("active"),W.renderCurrentTab()}setTimeout(()=>{W.activePrivateChat=e,W.privateMessagesData[e]||(W.privateMessagesData[e]={name:n,messages:[],unread:0}),W.privateMessagesData[e].unread=0,W.renderUsersSidebar();const t=W.chatPanel?.querySelector(".chat-pm-header span");t&&(t.textContent=n,W.mutedUsersMap[String(e)]&&(t.textContent=n+" 🔇",t.title="Ten użytkownik jest wyciszony"));const o=W.chatPanel?.querySelector(".chat-pm-container");o&&(o.classList.add("active"),o.style.transition="transform 0.3s ease");const r=W.chatPanel?.querySelector(".chat-sidebar");r&&r.classList.remove("active"),W.renderPrivateMessages();const a=W.chatPanel?.querySelector(".chat-pm-input");a&&setTimeout(()=>a.focus(),400),W.mutedUsersMap[String(e)]&&m(`ⓘ Użytkownik ${n} jest wyciszony`,"info",3e3)},200)},closePrivateChat(){const e=W.chatPanel?.querySelector(".chat-pm-container");e&&(e.style.transition="transform 0.3s ease",e.classList.remove("active")),setTimeout(()=>{W.activePrivateChat=null},300)},showUserContextMenu(n,t,o,r){const a=document.querySelector(".chat-context-menu");a&&a.remove();const i=!!o&&W.mutedUsersMap[String(o)],s=document.createElement("div");s.className="chat-context-menu",s.style.cssText=`\n position: fixed;\n left: ${n}px;\n top: ${t}px;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 10px;\n padding: 4px;\n min-width: 220px;\n max-width: 280px;\n z-index: 10010;\n box-shadow: 0 8px 30px rgba(0,0,0,0.5);\n display: flex;\n flex-direction: column;\n gap: 1px;\n max-height: 80vh;\n overflow-y: auto;\n `;[{icon:"👤",label:"Zobacz profil",action:()=>D.showProfile(r)},{icon:"💬",label:"Wyślij PM (czat)",action:()=>{if(!o)return void m("Nie można wysłać PM - brak ID użytkownika","error");const e=W.chatPanel?.querySelector(".chat-sidebar");e&&e.classList.remove("active"),W.openPrivateChat(o,r)}},{icon:"✉️",label:"Wyślij tradycyjną wiadomość",action:async()=>{W.chatPanel?(W.chatPanel.classList.remove("minimized"),W.chatPanel.style.display="flex"):await W.create(),W.currentTab="messages";const n=W.chatPanel?.querySelectorAll(".chat-tab");n?.forEach(e=>e.classList.remove("active"));const t=W.chatPanel?.querySelector('[data-tab="messages"]');t&&t.classList.add("active");let o=e.ICONS.NO_FOTO_FULL;try{o=await Y(r)}catch(e){}await W.openConversation(r,o)}},{icon:"📝",label:"Notatka",action:()=>j(r)},{icon:i?"🔈":"🔇",label:i?"Odcisz":"Wycisz (cichy ban)",action:()=>{o?W.webSocket&&W.webSocket.readyState===WebSocket.OPEN?(i?(W.webSocket.send(JSON.stringify({type:"mute",user_id:o,mute:!1})),delete W.mutedUsersMap[String(o)],m(`Odciszono ${r}`,"success")):(W.webSocket.send(JSON.stringify({type:"mute",user_id:o,mute:!0})),W.mutedUsersMap[String(o)]=!0,m(`Wyciszono ${r}`,"info")),W.renderUsersSidebar()):m("Nie jesteś połączony z czatem","error"):m("Brak ID użytkownika","error")}},{separator:!0},{icon:"🚫",label:"Zablokuj użytkownika",danger:!0,action:()=>{confirm(`Zablokować ${r}?`)&&GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/profile.php?profile=${encodeURIComponent(r)}&action=blocked`,onload:()=>{m(`Zablokowano ${r} 🚫`,"success"),W.mutedUsersMap[String(o)]&&(delete W.mutedUsersMap[String(o)],W.renderUsersSidebar())},onerror:()=>m("Błąd blokowania","error")})}}].forEach(e=>{if(e.separator){const e=document.createElement("div");return e.style.cssText="border-top: 1px solid var(--dark-border); margin: 2px 4px;",void s.appendChild(e)}const n=document.createElement("div");n.style.cssText=`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 7px 10px;\n border-radius: 6px;\n cursor: pointer;\n color: ${e.danger?"#f44336":"var(--text-primary)"};\n font-size: 12px;\n transition: all 0.15s;\n white-space: nowrap;\n `,n.innerHTML=`\n <span style="font-size:14px;width:18px;text-align:center;flex-shrink:0;">${e.icon}</span>\n <span>${e.label}</span>\n `,n.onmouseenter=()=>{n.style.background=e.danger?"rgba(220, 38, 38, 0.2)":"var(--blood-red)",n.style.color=e.danger?"#ef4444":"var(--gold)"},n.onmouseleave=()=>{n.style.background="",n.style.color=e.danger?"#f44336":"var(--text-primary)"},n.onclick=()=>{s.remove(),e.action()},s.appendChild(n)});const l=document.createElement("div");l.style.cssText="border-top: 1px solid var(--dark-border); margin: 4px 0;",s.appendChild(l);const d=document.createElement("div");d.style.cssText="\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 5px 10px;\n border-radius: 6px;\n cursor: pointer;\n color: var(--text-muted);\n font-size: 11px;\n transition: all 0.15s;\n",d.innerHTML='<span style="font-size:12px;">✕</span><span>Zamknij</span>',d.onmouseenter=()=>{d.style.background="var(--dark-surface-lighter)"},d.onmouseleave=()=>{d.style.background=""},d.onclick=()=>s.remove(),s.appendChild(d),document.body.appendChild(s);const c=s.getBoundingClientRect();c.right>window.innerWidth&&(s.style.left=n-c.width+"px"),c.bottom>window.innerHeight&&(s.style.top=t-c.height+"px");const p=e=>{s.contains(e.target)||(s.remove(),document.removeEventListener("click",p),document.removeEventListener("contextmenu",p))};setTimeout(()=>{document.addEventListener("click",p),document.addEventListener("contextmenu",p)},100)},renderPrivateMessages(){const e=W.chatPanel?.querySelector(".chat-pm-messages");if(!e||!W.activePrivateChat)return;const n=W.privateMessagesData[W.activePrivateChat]?.messages||[];e.innerHTML="",n.forEach(n=>{const t=n.from===u.currentUserName,o=document.createElement("div");o.className="chat-pm-message "+(t?"me":"other");const r=document.createElement("div");r.className="chat-pm-bubble",r.innerHTML=W.formatMessageContent(n.text);const a=document.createElement("div");a.className="chat-pm-time";const i=n.time?new Date(1e3*n.time):new Date;a.textContent=`${i.getHours().toString().padStart(2,"0")}:${i.getMinutes().toString().padStart(2,"0")}`,o.appendChild(r),o.appendChild(a),e.appendChild(o)}),e.scrollTop=e.scrollHeight},receivePrivateMessage(e,n,t){e&&W.mutedUsersMap[String(e)]?console.log(`PM od wyciszonego użytkownika ${n} (ID: ${e}) - ukryto`):(W.privateMessagesData[e]||(W.privateMessagesData[e]={name:n,messages:[],unread:0}),W.privateMessagesData[e].messages.push({from:n,text:t,time:Math.floor(Date.now()/1e3)}),W.activePrivateChat!=e&&W.privateMessagesData[e].unread++,W.renderUsersSidebar(),W.activePrivateChat==e&&W.renderPrivateMessages(),W.updateTotalPMCount(),document.hasFocus()||W.activePrivateChat==e||W.triggerNotification(n,!0))},updateTotalPMCount(){const e=Object.values(W.privateMessagesData).reduce((e,n)=>e+(n.unread||0),0);W.updateUnreadBadge(e)},startTitleBlinking(e){W.pmBlinkTimer||(W.pmBlinkTimer=setInterval(()=>{document.title=document.title===W.originalPageTitle?`⬤ Nowa wiadomość... (${e})`:W.originalPageTitle},1e3))},stopTitleBlinking(){W.pmBlinkTimer&&(clearInterval(W.pmBlinkTimer),W.pmBlinkTimer=null),document.title=W.originalPageTitle},triggerNotification(e,n=!1){W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&(W.chatPanel.classList.add("has-notification"),setTimeout(()=>{W.chatPanel&&W.chatPanel.classList.remove("has-notification")},2e3)),document.hasFocus()||(document.title=`📩 ${e}... ${W.originalPageTitle}`,setTimeout(()=>{document.title!==W.originalPageTitle&&(document.title=W.originalPageTitle)},3e3))},createEmojiSelector(n,t){const o=document.createElement("div");o.className="chat-emoji-btn",o.innerHTML="😀";let r=null;return o.onclick=o=>{if(o.stopPropagation(),r)return r.remove(),void(r=null);r=document.createElement("div"),r.className="chat-emoji-picker",e.EMOJI_LIST.forEach(e=>{const n=document.createElement("div");n.className="emoji-item",n.textContent=e,n.onclick=()=>{const n=t.selectionStart,o=t.selectionEnd,a=t.value;t.value=a.substring(0,n)+e+a.substring(o),t.selectionStart=t.selectionEnd=n+e.length,t.focus(),r&&(r.remove(),r=null)},r.appendChild(n)}),n.appendChild(r)},o},async loadConversationsList(){const n=`${e.API_BASE}?p=messages&l=in`;return new Promise(t=>{GM_xmlhttpRequest({method:"GET",url:n,onload:n=>{if(200===n.status&&n.responseText){const o=(new DOMParser).parseFromString(n.responseText,"text/html"),r=[];o.querySelectorAll(".message-box").forEach(n=>{const t=n.id||"";let o="";const a=n.querySelector('a[href*="profile="]');if(a){const e=a.href.match(/profile=([^&]+)/);e&&(o=decodeURIComponent(e[1]))}let i=e.ICONS.NO_FOTO;const s=n.querySelector(".profile-img img");s&&(i=s.src);const l=n.querySelector(".message-reader");let d=l?l.textContent.trim():"";const c=n.querySelector(".message-date");let p=c?c.childNodes[0]?.textContent?.trim():"",u="";const g=n.querySelector('a[onclick*="confirm"][href*="cid="]');g&&(u=g.getAttribute("href"));let m=0;const h=n.querySelector(".message-counter-new");h&&(m=parseInt(h.textContent.trim())||0);const x=n.classList.contains("message-new")||!!n.querySelector(".newchat")||!!n.querySelector(".message-counter-new")||!!n.querySelector(".triangle-new");let b="0";const v=n.querySelector(".gallery-counter");v&&(b=v.textContent.trim());const f=!!n.querySelector(".gallery-online");o&&r.push({id:t,name:o,avatar:i,preview:d,date:p,isUnread:x,deleteUrl:u,newCount:m,photosCount:b,isOnline:f})});const a=r.filter(e=>e.isUnread).length;if(W.unreadMessagesCount=a,ge(a,W.onlineUsersList.length),W.chatPanel){const e=W.chatPanel.querySelector("#chat-unread-badge");e&&(a>0?(e.textContent=a,e.style.display="inline-block"):(e.textContent="0",e.style.display="none"))}t(r)}else t([])},onerror:()=>t([])})})},async loadConversation(n,t=1){const o=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=messages&page=${t}`;return new Promise(e=>{GM_xmlhttpRequest({method:"GET",url:o,onload:n=>{if(200===n.status&&n.responseText){const o=(new DOMParser).parseFromString(n.responseText,"text/html"),r=[],a=o.getElementById("messagesth")||o.querySelector(".messagesth");let i=1,s=t;const l=o.querySelector(".paginator select");if(l){i=l.querySelectorAll("option").length;const e=l.querySelector("option[selected]");if(e){const n=e.textContent.match(/(\d+)\s*\/\s*(\d+)/);n&&(s=parseInt(n[1]),i=parseInt(n[2]))}}a&&a.querySelectorAll(".message-th").forEach(e=>{const n=!!e.querySelector(".message-right, .triangle-right"),t=e.querySelector(".message-left, .message-right"),o=t?t.innerHTML.trim():"";let a="";const i=e.nextElementSibling;i&&(i.classList.contains("message-date-left")||i.classList.contains("message-date-right"))&&(a=i.childNodes[0]?.textContent?.trim()||i.textContent.trim()),o&&r.push({isMine:n,html:o,date:a})}),e({messages:r,totalPages:i,currentPage:s,hasMore:s<i})}else e({messages:[],totalPages:1,currentPage:1,hasMore:!1})},onerror:()=>e({messages:[],totalPages:1,currentPage:1,hasMore:!1})})})},sendMessage:async(n,t,o)=>new Promise(r=>{const a=new URLSearchParams;if(t&&t.trim()&&a.append("message",t),o&&o.length&&o.forEach(e=>a.append("aid[]",e)),!(t&&t.trim()||o&&0!==o.length))return void r(!1);const i=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=messages`;GM_xmlhttpRequest({method:"POST",url:i,headers:{"Content-Type":"application/x-www-form-urlencoded"},data:a.toString(),onload:e=>{200!==e.status||!e.responseText||e.responseText.includes("error")||e.responseText.includes("błąd")?r(!1):r(!0)},onerror:()=>r(!1)})}),async create(){if(W.chatPanel)return W.chatPanel.classList.remove("minimized"),W.chatPanel.classList.remove("expanded"),W.chatPanel.style.display="flex",setTimeout(()=>{W.flushPendingMessages()},300),W.chatPanel;await k(),W.requestNotificationPermission(),W.chatPanel=document.createElement("div"),W.chatPanel.className="floating-chat-window",W.chatPanel.innerHTML=`\n <div class="chat-header">\n <div class="chat-header-info">\n <img src="${e.ICONS.CHAT}?1" alt="Chat">\n <span>Chat Fellow</span>\n <span class="chat-header-badge" id="chat-unread-badge" style="display: none;">0</span>\n <span class="chat-header-online" id="chat-online-indicator" title="Użytkownicy online">\n <span class="online-dot"></span>\n <span id="chat-online-count">0</span>\n </span>\n </div>\n <div class="chat-header-actions">\n <div class="chat-header-btn chat-menu-btn" title="Opcje czatu">\n <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <circle cx="12" cy="12" r="1"></circle>\n <circle cx="12" cy="5" r="1"></circle>\n <circle cx="12" cy="19" r="1"></circle>\n </svg>\n </div>\n <div class="chat-header-btn chat-popout-btn" title="Rozszerz">⤢</div>\n <div class="chat-header-btn chat-minimize-btn" title="Schowaj do ikony">✕</div>\n </div>\n </div>\n <div class="chat-dropdown-menu" id="chat-dropdown-menu" style="display:none;">\n <div class="chat-dropdown-item" data-action="notifications">\n <span class="dropdown-icon">🔔</span>\n <span>Powiadomienia dźwiękowe</span>\n <span class="dropdown-toggle" id="notif-toggle">ON</span>\n </div>\n <div class="chat-dropdown-item" data-action="onlinelist">\n <span class="dropdown-icon">👥</span>\n <span>Lista online</span>\n <span class="dropdown-badge" id="online-badge">0</span>\n </div>\n <div class="chat-dropdown-item" data-action="muted">\n <span class="dropdown-icon">🔇</span>\n <span>Wyciszeni użytkownicy</span>\n <span class="dropdown-badge" id="muted-badge">0</span>\n </div>\n <div class="chat-divider"></div>\n <div class="chat-dropdown-item" data-action="allmessages">\n <span class="dropdown-icon">✉️</span>\n <span>Otwórz wszystkie wiadomości</span>\n </div>\n <div class="chat-dropdown-item" data-action="stats">\n <span class="dropdown-icon">📊</span>\n <span>Statystyki czatu</span>\n </div>\n <div class="chat-divider"></div>\n <div class="chat-dropdown-item" data-action="reconnect">\n <span class="dropdown-icon">🔄</span>\n <span>Połącz ponownie</span>\n </div>\n <div class="chat-dropdown-item chat-dropdown-danger" data-action="close">\n <span class="dropdown-icon">❌</span>\n <span>Zamknij chat</span>\n </div>\n </div>\n <div class="chat-tabs">\n <div class="chat-tab ${"messages"===W.currentTab?"active":""}" data-tab="messages">✉️ Wiadomości</div>\n <div class="chat-tab ${"chat"===W.currentTab?"active":""}" data-tab="chat">💬 Chat na żywo</div>\n </div>\n <div class="chat-body" id="chat-body-container"></div>\n <div class="chat-footer">Czat Fellow • Połącz z innymi użytkownikami</div>\n `,document.body.appendChild(W.chatPanel),W.chatPanelCreated=!0;const n=W.chatPanel.querySelectorAll(".chat-tab");n.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.tab;if(t===W.currentTab)return;const o=W.chatPanel.querySelector("#chat-body-container");o&&("chat"===W.currentTab?W._savedChatHTML=o.innerHTML:"messages"===W.currentTab&&(W._savedMessagesHTML=o.innerHTML)),W.currentTab=t,n.forEach(e=>e.classList.remove("active")),e.classList.add("active"),"chat"!==t||W.wsInitialized||W.initializeWebSocket(),W.renderCurrentTab()})}),setTimeout(()=>{W.renderCurrentTab()},100),W._fabRefreshInterval=setInterval(async()=>{const e=await W.loadConversationsList();if(W.chatPanel&&"none"!==W.chatPanel.style.display&&"messages"===W.currentTab){const n=W.chatPanel.querySelector("#chat-body-container");if(n&&!n.querySelector(".conversation-view")){const t=n.scrollTop,o=n.scrollHeight-n.scrollTop<=n.clientHeight+50,r=Array.from(n.querySelectorAll(".conversation-item")).map(e=>e.dataset.profile),a=e.map(e=>e.name),i=r.length!==a.length||r.some(e=>!a.includes(e))||a.some(e=>!r.includes(e)),s=e.some(e=>e.isUnread),l=null!==n.querySelector('.conversation-item[style*="border-left"]');(i||s&&!l)&&(0===e.length?n.innerHTML='\n <div class="conversations-list" style="display:flex;align-items:center;justify-content:center;min-height:200px;">\n <div style="text-align:center;color:var(--text-muted);">\n <span style="font-size:48px;display:block;margin-bottom:12px;">📭</span>\n <p style="margin:0;font-size:14px;">Brak wiadomości</p>\n <p style="margin:5px 0 0 0;font-size:11px;">Nowe wiadomości pojawią się tutaj</p>\n </div>\n </div>':(W._buildConversationsHTML(n,e),W._attachMessagesEvents(),W._savedMessagesHTML=n.innerHTML,n.scrollTop=o?n.scrollHeight:t))}}},3e4);const t=W.chatPanel.querySelector(".chat-menu-btn"),o=W.chatPanel.querySelector(".chat-popout-btn"),r=W.chatPanel.querySelector(".chat-minimize-btn"),a=W.chatPanel.querySelector("#chat-dropdown-menu");t.onclick=e=>{e.stopPropagation();const n="block"===a.style.display;a.style.display=n?"none":"block",B()},document.addEventListener("click",e=>{a&&!W.chatPanel.contains(e.target)&&(a.style.display="none")}),o.onclick=e=>{e.stopPropagation(),a.style.display="none",W.chatPanel.classList.toggle("expanded"),W.chatPanel.classList.contains("expanded")?(o.innerHTML="⤡",o.title="Przywróć rozmiar"):(o.innerHTML="⤢",o.title="Rozszerz")},r.onclick=e=>{e.stopPropagation(),a.style.display="none";const n=W.chatPanel.querySelector("#chat-body-container");if(n){const e=n.innerHTML;"chat"!==W.currentTab||e.includes("spinner")?"messages"!==W.currentTab||e.includes("spinner")||(W._savedMessagesHTML=e):W._savedChatHTML=e}W.chatPanel.classList.remove("expanded"),W.chatPanel.style.display="none"},a.querySelectorAll(".chat-dropdown-item").forEach(e=>{e.onclick=n=>{n.stopPropagation();const t=e.dataset.action;switch(a.style.display="none",t){case"notifications":const n=e.querySelector(".dropdown-toggle");n.classList.contains("off")?(n.classList.remove("off"),n.textContent="ON",m("Powiadomienia dźwiękowe: WŁĄCZONE","success")):(n.classList.add("off"),n.textContent="OFF",m("Powiadomienia dźwiękowe: WYŁĄCZONE","info"));break;case"onlinelist":"chat"!==W.currentTab&&(W.currentTab="chat",W.chatPanel.querySelectorAll(".chat-tab").forEach(e=>e.classList.remove("active")),W.chatPanel.querySelector('[data-tab="chat"]').classList.add("active"),W.renderCurrentTab());const t=W.chatPanel.querySelector(".chat-sidebar");t&&t.classList.add("active");break;case"muted":const o=Object.keys(W.mutedUsersMap);0===o.length?m("Brak wyciszonych użytkowników","info"):m(`Wyciszeni: ${o.join(", ")}`,"info",5e3);break;case"allmessages":W.currentTab="messages",W.chatPanel.querySelectorAll(".chat-tab").forEach(e=>e.classList.remove("active")),W.chatPanel.querySelector('[data-tab="messages"]').classList.add("active"),W.renderCurrentTab();break;case"stats":m(`📊 Statystyki czatu:\n👥 Online: ${W.onlineUsersList.filter(e=>e.online).length}\n🔇 Wyciszeni: ${Object.keys(W.mutedUsersMap).length}\n💬 Konwersacje PM: ${Object.keys(W.privateMessagesData).length}\n🟢 Status: ${W.wsInitialized?"Połączono":"Rozłączono"}`,"info",6e3);break;case"reconnect":W.intentionalClose=!1,W.cleanupWebSocket(),W.initializeWebSocket(),m("Ponowne łączenie z czatem...","info");break;case"close":confirm("Zamknąć czat? Możesz go ponownie otworzyć klikając ikonę 💬")&&(W.intentionalClose=!0,W.cleanupWebSocket(),W._messageListRefreshInterval&&(clearInterval(W._messageListRefreshInterval),W._messageListRefreshInterval=null),W.chatPanel.remove(),W.chatPanel=null,W.wsInitialized=!1)}}});return W.chatPanel.querySelector(".chat-header").addEventListener("click",e=>{e.target.closest(".chat-header-btn")||e.target.closest(".chat-dropdown-menu")||W.chatPanel.classList.contains("minimized")&&W.chatPanel.classList.remove("minimized")}),window.addEventListener("focus",()=>{W.stopTitleBlinking(),document.title=W.originalPageTitle}),W.renderCurrentTab(),setTimeout(()=>{W.flushPendingMessages()},400),W.chatPanel},_buildConversationsHTML(n,t){t.sort((e,n)=>e.isUnread&&!n.isUnread?-1:!e.isUnread&&n.isUnread?1:0);let o='<div class="conversations-list">';t.forEach(n=>{const t=n.isUnread?'style="background:linear-gradient(90deg, rgba(139,0,0,0.15) 0%, var(--dark-surface-light) 100%);border-left:4px solid var(--blood-red);animation:newMessageGlow 2.5s ease-in-out infinite;"':"";o+=`\n <div class="conversation-item" data-profile="${v(n.name)}" ${t}>\n <div style="position:relative;flex-shrink:0;">\n <img class="conversation-avatar" src="${n.avatar}" \n onerror="this.src='${e.ICONS.NO_FOTO_FULL}'"\n style="width:50px;height:50px;border-radius:50%;object-fit:cover;cursor:context-menu;"\n title="Prawy klik: menu"\n data-profile="${v(n.name)}">\n ${n.isOnline?'<span style="position:absolute;bottom:2px;right:2px;width:12px;height:12px;background:#4CAF50;border-radius:50%;border:2px solid var(--dark-surface);"></span>':""}\n </div>\n <div class="conversation-info" style="flex:1;min-width:0;">\n <div class="conversation-name" style="color:var(--gold);${n.isUnread?"font-weight:700;font-size:15px;":""}cursor:context-menu;" title="Prawy klik: menu">\n ${n.isUnread?"🔵 ":""}${v(n.name)}\n </div>\n <div class="conversation-preview" style="${n.isUnread?"color:var(--text-primary);font-weight:600;":"color:var(--text-muted);"}">\n ${v(n.preview.substring(0,80))}${n.preview.length>80?"...":""}\n </div>\n <div style="font-size:11px;color:var(--text-muted);margin-top:2px;">${v(n.date)}</div>\n </div>\n ${n.deleteUrl?`\n <div style="display:flex;flex-direction:column;align-items:center;gap:8px;flex-shrink:0;">\n <button class="conv-delete-btn" data-delete-url="${v(n.deleteUrl)}" title="Usuń konwersację" style="\n width:30px;height:30px;border-radius:50%;\n background:transparent;border:1px solid rgba(244,67,54,0.3);\n color:rgba(244,67,54,0.6);cursor:pointer;font-size:14px;\n display:flex;align-items:center;justify-content:center;\n transition:all 0.2s;\n " onmouseenter="this.style.background='rgba(244,67,54,0.2)';this.style.color='#f44336';this.style.borderColor='#f44336';"\n onmouseleave="this.style.background='transparent';this.style.color='rgba(244,67,54,0.6)';this.style.borderColor='rgba(244,67,54,0.3)';">🗑️</button>\n </div>\n `:""}\n </div>`}),o+="</div>",n.innerHTML=o;ge(t.filter(e=>e.isUnread).length,W.onlineUsersList.length)},_attachMessagesEvents(){const n=W.chatPanel.querySelector("#chat-body-container");n&&n.querySelectorAll(".conversation-item").forEach(n=>{const t=n.cloneNode(!0);n.parentNode.replaceChild(t,n);const o=t.dataset.profile,r=t.querySelector(".conversation-avatar")?.src||e.ICONS.NO_FOTO_FULL;t.addEventListener("click",e=>{e.target.closest(".conv-delete-btn")||o&&W.openConversation(o,r)});const a=t.querySelector(".conv-delete-btn");a&&a.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault();const n=a.dataset.deleteUrl;if(n&&confirm("Czy na pewno chcesz usunąć cały wątek wiadomości?")){const e="https://m.fll.pl/"+n.replace(/^\//,"");a.textContent="⏳",a.style.pointerEvents="none",GM_xmlhttpRequest({method:"GET",url:e,onload:()=>{m("Konwersacja usunięta","success"),W.renderCurrentTab()},onerror:()=>{m("Błąd usuwania","error"),a.textContent="🗑️",a.style.pointerEvents=""}})}});const i=t.querySelector(".conversation-avatar");i&&o&&(i.style.cursor="context-menu",i.title="Prawy klik: menu",i.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,null,o)}));const s=t.querySelector(".conversation-name");s&&o&&(s.style.cursor="context-menu",s.title="Prawy klik: menu",s.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,null,o)})),t.addEventListener("contextmenu",e=>{e.target.closest("button")||e.target.closest(".conv-delete-btn")||(e.preventDefault(),e.stopPropagation(),o&&W.showUserContextMenu(e.clientX,e.clientY,null,o))})})},_attachConversationEvents(){const e=W.chatPanel?.querySelector("#chat-body-container");if(!e)return;const n=e.querySelector(".conversation-view");if(!n)return;let t=W.currentConversationName;if(!t){const e=n.querySelector(".conversation-name");e&&(t=e.getAttribute("data-profile")||e.textContent.trim())}if(!t)return void console.warn("_attachConversationEvents: Nie można ustalić nazwy profilu");W.currentConversationName=t;const o=n.querySelector(".conversation-back");if(o){const e=o.cloneNode(!0);o.parentNode.replaceChild(e,o),e.style.cursor="pointer",e.style.fontSize="20px",e.style.color="var(--gold)",e.textContent="←",e.onclick=e=>{e.preventDefault(),e.stopPropagation(),W.refreshInterval&&(clearInterval(W.refreshInterval),W.refreshInterval=null),W.currentConversationName=null,W._savedMessagesHTML=null,W.renderCurrentTab()}}const r=n.querySelector(".conversation-avatar");if(r){const e=r.cloneNode(!0);r.parentNode.replaceChild(e,r),e.style.cursor="pointer",e.title="Kliknij aby zobaczyć profil",e.setAttribute("data-profile",t),e.onclick=e=>{e.preventDefault(),e.stopPropagation(),D.showProfile(t)},e.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,null,t)}}const a=n.querySelector(".conversation-name");if(a){const e=a.cloneNode(!0);a.parentNode.replaceChild(e,a),e.style.cursor="pointer",e.title="Kliknij aby zobaczyć profil",e.setAttribute("data-profile",t),e.onclick=e=>{e.preventDefault(),e.stopPropagation(),D.showProfile(t)},e.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,null,t)}}const i=n.querySelector("#conv-messages-container");if(i){i.querySelectorAll(".conv-message").forEach(e=>{if(e.classList.contains("other")){const n=e.cloneNode(!0);e.parentNode.replaceChild(n,e),n.style.cursor="pointer",n.title="Kliknij aby zobaczyć profil nadawcy",n.onclick=e=>{"A"===e.target.tagName||e.target.closest("a")||(e.preventDefault(),e.stopPropagation(),D.showProfile(t))}}});new MutationObserver(()=>{i.querySelectorAll(".conv-message.other:not([data-click-bound])").forEach(e=>{e.setAttribute("data-click-bound","true"),e.style.cursor="pointer",e.title="Kliknij aby zobaczyć profil nadawcy",e.onclick=e=>{"A"===e.target.tagName||e.target.closest("a")||(e.preventDefault(),e.stopPropagation(),D.showProfile(t))}})}).observe(i,{childList:!0,subtree:!0})}console.log("_attachConversationEvents: Podpięto eventy dla",t)},_loadOlderChatMessages(){const e=W.chatPanel?.querySelector(".chat-messages");if(!e||!W.webSocket||W.webSocket.readyState!==WebSocket.OPEN)return;if(W._loadingHistory)return;const n=e.querySelector(".chat-message:not(.system)");if(!n)return;const t=parseInt(n.dataset.timestamp||"0");if(!t||t<1e9)return;W._loadingHistory=!0;const o=document.createElement("div");o.className="chat-message system chat-history-loading",o.innerHTML='<div class="chat-message-content"><div class="spinner" style="width:16px;height:16px;border-width:2px;display:inline-block;margin-right:8px;"></div>Ładowanie historii...</div>',e.insertBefore(o,e.firstChild),W.webSocket.send(JSON.stringify({type:"history",before:t,limit:20})),setTimeout(()=>{o.parentNode&&o.remove(),W._loadingHistory=!1},1e4)},async renderCurrentTab(){const e=W.chatPanel.querySelector("#chat-body-container");if(e)if("messages"===W.currentTab){if(W._savedMessagesHTML&&W._savedMessagesHTML.includes("conversation-view"))return e.innerHTML=W._savedMessagesHTML,void setTimeout(()=>{W._attachConversationEvents()},100);if(W._savedMessagesHTML&&W._savedMessagesHTML.includes("conversation-item"))return e.innerHTML=W._savedMessagesHTML,void setTimeout(()=>{W._attachMessagesEvents()},100);e.innerHTML='<div class="conversations-list">\n <div style="text-align:center;padding:20px;color:var(--text-muted);">\n <div class="spinner"></div>\n <div style="margin-top:10px;">Ładowanie wiadomości...</div>\n </div>\n </div>';const n=await W.loadConversationsList();0===n.length?e.innerHTML='\n <div class="conversations-list" style="display:flex;align-items:center;justify-content:center;min-height:200px;">\n <div style="text-align:center;color:var(--text-muted);">\n <span style="font-size:48px;display:block;margin-bottom:12px;">📭</span>\n <p style="margin:0;font-size:14px;">Brak wiadomości</p>\n <p style="margin:5px 0 0 0;font-size:11px;">Nowe wiadomości pojawią się tutaj</p>\n </div>\n </div>':(W._buildConversationsHTML(e,n),W._attachMessagesEvents(),W._savedMessagesHTML=e.innerHTML)}else if("chat"===W.currentTab){if(W._savedChatHTML&&W._savedChatHTML.includes("chat-messages"))return e.innerHTML=W._savedChatHTML,W.attachChatEvents(),W.onlineUsersList.length&&W.renderUsersSidebar(),B(),void setTimeout(()=>{const n=e.querySelector(".chat-messages");n&&(n.scrollTop=n.scrollHeight)},150);e.innerHTML=`\n <div class="chat-messages">\n <div style="text-align:center;padding:20px;color:var(--text-muted);">\n ${W.wsInitialized?"<span>👋 Witaj na czacie! Rozpocznij rozmowę.</span>":'<div class="spinner"></div><div style="margin-top:10px;">Łączenie z czatem...</div>'}\n </div>\n </div>\n <div class="chat-sidebar">\n <div class="chat-sidebar-header">\n <span>👥 Użytkownicy online</span>\n <span class="chat-sidebar-close" title="Zamknij panel">✕</span>\n </div>\n <div class="chat-users-list"></div>\n <div class="chat-online-count">\n Online: <span id="sidebar-online-count">${W.onlineUsersList.length}</span>\n </div>\n </div>\n <div class="chat-pm-container">\n <div class="chat-pm-header">\n <span>💬 Wiadomość prywatna</span>\n <span class="chat-pm-close" title="Zamknij">✕</span>\n </div>\n <div class="chat-pm-messages"></div>\n <div class="chat-input-area">\n <textarea class="chat-pm-input" rows="1" placeholder="Wpisz wiadomość prywatną..."></textarea>\n <div class="chat-emoji-btn-pm"></div>\n <button class="chat-pm-send-btn" title="Wyślij (Enter)"></button>\n </div>\n </div>\n <div class="chat-sidebar-toggle" title="Pokaż/ukryj listę online">👥</div>\n <div class="chat-input-area">\n <textarea class="chat-main-input" rows="1" placeholder="Wpisz wiadomość na czacie..."></textarea>\n <div class="chat-emoji-btn-main"></div>\n <div class="chat-starters-btn-main"></div>\n <button class="chat-main-send-btn" title="Wyślij (Enter)"></button>\n </div>\n `,W.attachChatEvents(),W.onlineUsersList.length&&W.renderUsersSidebar(),B(),W._savedChatHTML=e.innerHTML,setTimeout(()=>{const n=e.querySelector(".chat-messages");n&&(n.scrollTop=n.scrollHeight)},150)}},attachChatEvents(){const n=W.chatPanel.querySelector(".chat-sidebar-toggle"),t=W.chatPanel.querySelector(".chat-sidebar"),o=W.chatPanel.querySelector(".chat-sidebar-close");n&&(n.onclick=()=>t.classList.toggle("active")),o&&(o.onclick=()=>t.classList.remove("active"));const r=W.chatPanel.querySelector(".chat-pm-close");r&&(r.onclick=()=>W.closePrivateChat());const a=W.chatPanel.querySelector(".chat-main-input"),i=W.chatPanel.querySelector(".chat-main-send-btn");i&&(i.onclick=()=>W.sendPublicMessage()),a&&(a.onkeypress=e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),W.sendPublicMessage())},a.oninput=function(){f(this)});const s=W.chatPanel.querySelector(".chat-pm-input"),l=W.chatPanel.querySelector(".chat-pm-send-btn");l&&(l.onclick=()=>W.sendPrivateMessage()),s&&(s.onkeypress=e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),W.sendPrivateMessage())},s.oninput=function(){f(this)});const d=W.chatPanel.querySelector(".chat-emoji-btn-main");if(d){d.innerHTML="";const e=W.createEmojiSelector(d,a);d.appendChild(e)}const c=W.chatPanel.querySelector(".chat-starters-btn-main");if(c){c.innerHTML="";const n=document.createElement("div");n.className="chat-emoji-btn",n.innerHTML="💡",n.title="Gotowe teksty",n.onmouseenter=()=>{n.style.background="var(--blood-red)",n.style.color="var(--gold)",n.style.borderColor="var(--gold)"},n.onmouseleave=()=>{n.style.background="var(--dark-surface-light)",n.style.color="var(--text-secondary)",n.style.borderColor="var(--dark-border)"};let t=null;n.onclick=n=>{if(n.stopPropagation(),t)return t.remove(),void(t=null);t=document.createElement("div"),t.className="chat-emoji-picker",t.style.width="340px",t.style.maxHeight="350px",t.style.display="flex",t.style.flexDirection="column",t.style.gap="4px",t.style.padding="10px",t.style.gridTemplateColumns="none",e.CONVERSATION_STARTERS.forEach(e=>{const n=document.createElement("div");n.style.cssText="\n padding: 8px 12px;\n border-radius: 20px;\n background: var(--dark-surface-light);\n cursor: pointer;\n font-size: 12px;\n color: var(--text-secondary);\n transition: all 0.2s;\n ",n.textContent=e,n.onmouseenter=()=>{n.style.background="var(--blood-red)",n.style.color="var(--gold)"},n.onmouseleave=()=>{n.style.background="var(--dark-surface-light)",n.style.color="var(--text-secondary)"},n.onclick=()=>{a.value=e,f(a),a.focus(),t&&(t.remove(),t=null)},t.appendChild(n)}),c.appendChild(t)},c.appendChild(n)}const p=W.chatPanel.querySelector(".chat-emoji-btn-pm");if(p){p.innerHTML="";const e=W.createEmojiSelector(p,s);p.appendChild(e)}W._setupScrollToBottomButton();const u=W.chatPanel?.querySelector(".chat-messages");u&&u.addEventListener("scroll",()=>{u.scrollTop<=50&&!W._loadingHistory&&W._loadOlderChatMessages()});const g=W.chatPanel?.querySelectorAll(".chat-message:not(.system)");g&&g.forEach(e=>{const n=e.querySelector(".chat-message-text"),t=e.dataset.userName,o=e.dataset.messageText;if(n&&t&&o){const e=n.cloneNode(!0);n.parentNode.replaceChild(e,n),e.style.cursor="pointer",e.title="Kliknij, aby zacytować",e.onclick=()=>{const e=W.chatPanel?.querySelector(".chat-main-input");if(e){const n=`"@${t} ${o}"`;e.value.trim()?e.value=e.value.trim()+" "+n:e.value=n,e.focus(),e.selectionStart=e.selectionEnd=e.value.length,f(e)}}}});const m=W.chatPanel?.querySelectorAll(".chat-message:not(.system)");m&&m.forEach(e=>{const n=e.querySelector(".chat-message-avatar"),t=e.querySelector(".chat-message-nick"),o=e.dataset.userId,r=e.dataset.userName;if(n&&o&&r){const e=n.cloneNode(!0);n.parentNode.replaceChild(e,n),e.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,o,r)}}if(t&&o&&r){const e=t.cloneNode(!0);t.parentNode.replaceChild(e,t),e.onclick=()=>{const e=W.chatPanel?.querySelector(".chat-main-input");e&&(e.value=`@${r} `+e.value,e.focus())},e.oncontextmenu=e=>{e.preventDefault(),e.stopPropagation(),W.showUserContextMenu(e.clientX,e.clientY,o,r)}}})},_setupScrollToBottomButton(){const e=W.chatPanel?.querySelector(".chat-body"),n=W.chatPanel?.querySelector(".chat-messages");if(!e||!n)return;const t=e.querySelector(".chat-scroll-bottom-btn");t&&t.remove();const o=document.createElement("div");o.className="chat-scroll-bottom-btn",o.innerHTML="⬇",o.title="Przewiń do najnowszych wiadomości",o.style.cssText="\n position: absolute;\n bottom: 80px;\n right: 20px;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: var(--blood-gradient);\n border: 2px solid var(--gold-dark);\n color: var(--gold);\n display: none;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n z-index: 25;\n box-shadow: 0 4px 15px rgba(0,0,0,0.4);\n transition: all 0.3s ease;\n animation: fadeIn 0.2s ease;\n ",o.onmouseenter=()=>{o.style.transform="scale(1.1)",o.style.boxShadow="0 6px 20px var(--blood-red-glow)"},o.onmouseleave=()=>{o.style.transform="scale(1)",o.style.boxShadow="0 4px 15px rgba(0,0,0,0.4)"},o.onclick=()=>{n.scrollTo({top:n.scrollHeight,behavior:"smooth"})},e.appendChild(o);const r=()=>{const e=n.scrollHeight-n.scrollTop-n.clientHeight<100;o.style.display=e?"none":"flex"};n.addEventListener("scroll",r),setTimeout(r,200),W._scrollButton=o,W._scrollCheck=r},async openConversation(n,t){W.refreshInterval&&(clearInterval(W.refreshInterval),W.refreshInterval=null),W.currentConversationName=n;const o=W.chatPanel.querySelector("#chat-body-container");if(!o)return;let r=1,a=1,i=!1,s=!1;function l(e,n=!1){const t=o.querySelector("#conv-messages-container");if(!t)return;n||(t.innerHTML="");const r=document.createDocumentFragment();if(e.forEach(e=>{const n=document.createElement("div");n.className="conv-message "+(e.isMine?"me":"other"),n.innerHTML=`<div>${e.html}</div><div class="conv-message-time">${e.date}</div>`,r.appendChild(n)}),n){const e=t.scrollHeight;t.insertBefore(r,t.firstChild);const n=t.scrollHeight;t.scrollTop=n-e}else t.appendChild(r),t.scrollTop=t.scrollHeight}function d(e){e.querySelectorAll('a[rel="facebox"], a[href*="box=invite"]').forEach(e=>{const o=e.cloneNode(!0);e.parentNode.replaceChild(o,e),o.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const r=o.getAttribute("href");if(!r)return;const a=o.innerHTML;o.innerHTML="⏳ Przetwarzanie...",o.style.pointerEvents="none",GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/${r.replace(/^\//,"")}`,onload:e=>{200===e.status?(m("Zaproszenie zaakceptowane! ✅","success"),setTimeout(()=>{W.openConversation(n,t)},1e3)):(o.innerHTML=a,o.style.pointerEvents="",m("Błąd podczas przetwarzania","error"))},onerror:()=>{o.innerHTML=a,o.style.pointerEvents="",m("Błąd sieci","error")}})})})}o.innerHTML=`\n <div class="conversation-view">\n <div class="conversation-header">\n <span class="conversation-back">←</span>\n <img class="conversation-avatar" src="${t}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'"\n style="cursor:context-menu;" title="Prawy klik: menu"\n data-profile="${v(n)}">\n <span class="conversation-name" style="cursor:context-menu;" title="Prawy klik: menu"\n data-profile="${v(n)}">${v(n)}</span>\n </div>\n <div class="conversation-messages" id="conv-messages-container">\n <div style="text-align:center;padding:20px;color:var(--text-muted);">\n <div class="spinner"></div>\n <div style="margin-top:10px;">Ładowanie wiadomości...</div>\n </div>\n </div>\n <div class="conv-reply-area">\n <textarea class="conv-reply-input" rows="1" placeholder="Napisz odpowiedź..."></textarea>\n <div class="conv-gallery-btn" title="Udostępnij galerię prywatną na 60 minut" style="\n width:36px;height:36px;border-radius:50%;\n background:var(--dark-surface-light);border:1px solid var(--dark-border);\n display:flex;align-items:center;justify-content:center;\n cursor:pointer;font-size:16px;transition:all 0.2s;flex-shrink:0;\n ">🔓</div>\n <div class="attachment-icon" title="Załącz zdjęcie">📎</div>\n <div class="chat-emoji-btn-conv"></div>\n <div class="chat-starters-btn-conv"></div>\n <button class="conv-send-btn"></button>\n </div>\n </div>\n `,W._attachConversationEvents();const c=await W.loadConversation(n,1);if(c&&c.messages&&c.messages.length>0){r=c.currentPage,a=c.totalPages,s=!c.hasMore,l(c.messages);const e=o.querySelector("#conv-messages-container");if(e){if(d(e),c.hasMore){const n=document.createElement("div");n.id="load-more-hint",n.style.cssText="text-align:center;padding:10px;color:var(--text-muted);font-size:11px;",n.textContent=`⬆ Przewiń wyżej, aby załadować starsze wiadomości (strona ${r} z ${a})`,e.insertBefore(n,e.firstChild)}e.addEventListener("scroll",()=>{e.scrollTop<=50&&!i&&!s&&async function(){if(i||s)return;const e=o.querySelector("#conv-messages-container");if(!e)return;if(e.scrollTop>100)return;i=!0,r++;const t=document.createElement("div");t.className="conv-loading-older",t.style.cssText="text-align:center;padding:10px;color:var(--text-muted);font-size:12px;",t.innerHTML='<div class="spinner" style="width:20px;height:20px;border-width:2px;"></div><div>Ładowanie starszych wiadomości...</div>',e.insertBefore(t,e.firstChild);const c=await W.loadConversation(n,r);if(t.parentNode&&t.remove(),c&&c.messages&&c.messages.length>0){if(a=c.totalPages,s=!c.hasMore,c.messages.length>0){const n=document.createElement("div");n.style.cssText="text-align:center;padding:8px;color:var(--text-muted);font-size:11px;border-top:1px solid var(--dark-border);margin:10px 0;",n.textContent=`Strona ${c.currentPage} z ${c.totalPages}`,e.insertBefore(n,e.firstChild)}l(c.messages,!0),d(e)}else s=!0,r--;i=!1}()})}}else{const e=o.querySelector("#conv-messages-container");e&&(e.innerHTML='<div style="text-align:center;padding:30px;color:var(--text-muted);">Brak wiadomości</div>')}const p=o.querySelector(".conv-reply-input"),u=o.querySelector(".conv-send-btn"),g=o.querySelector(".attachment-icon");let h=[];const y=o.querySelector("#conv-messages-container"),w=o.querySelector(".conv-gallery-btn");w&&(w.addEventListener("mouseenter",()=>{w.style.background="var(--blood-red)",w.style.borderColor="var(--gold)",w.style.transform="scale(1.05)"}),w.addEventListener("mouseleave",()=>{w.style.background="var(--dark-surface-light)",w.style.borderColor="var(--dark-border)",w.style.transform=""}),w.addEventListener("click",()=>{if(confirm(`Czy udostępnić użytkownikowi "${n}" galerię prywatną na 60 minut?`)){const t=`${e.API_BASE}?profile=${encodeURIComponent(n)}&l=messages&ga=1`;w.textContent="⏳",w.style.pointerEvents="none",w.style.opacity="0.7",GM_xmlhttpRequest({method:"GET",url:t,onload:e=>{200===e.status?(m("Galeria prywatna udostępniona na 60 minut ✅","success"),w.textContent="✅",w.style.background="var(--blood-red-dark)",w.style.borderColor="var(--gold)",setTimeout(()=>{w.textContent="🔓",w.style.background="var(--dark-surface-light)",w.style.borderColor="var(--dark-border)",w.style.pointerEvents="",w.style.opacity="1"},3e3)):(m("Błąd udostępniania galerii","error"),w.textContent="🔓",w.style.pointerEvents="",w.style.opacity="1")},onerror:()=>{m("Błąd sieci","error"),w.textContent="🔓",w.style.pointerEvents="",w.style.opacity="1"}})}}));const k=async()=>{const e=await W.loadConversation(n,1);if(e&&e.messages&&y&&(r=e.currentPage,a=e.totalPages,s=!e.hasMore,l(e.messages),d(y),e.hasMore)){const e=document.createElement("div");e.id="load-more-hint",e.style.cssText="text-align:center;padding:10px;color:var(--text-muted);font-size:11px;",e.textContent=`⬆ Przewiń wyżej, aby załadować starsze wiadomości (strona ${r} z ${a})`,y.insertBefore(e,y.firstChild)}};u.onclick=async()=>{const e=p.value.trim();if(!e&&0===h.length)return void m("Napisz wiadomość lub wybierz zdjęcie","error");await W.sendMessage(n,e,h)?(h=[],p.value="",f(p),g.style.color="var(--gold)",await k(),m("Wiadomość wysłana","success")):m("Błąd wysyłania","error")},g.onclick=()=>{b(),x(window.location.href,e=>{h=e,e&&e.length&&(g.style.color="var(--blood-red)",g.style.transform="scale(1.1)",u.click(),setTimeout(()=>{g.style.color="var(--gold)",g.style.transform="scale(1)"},3e3))})},p.onkeypress=e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),u.click())},p.oninput=function(){f(this)};const S=o.querySelector(".chat-emoji-btn-conv");if(S){S.innerHTML="";const e=W.createEmojiSelector(S,p);S.appendChild(e)}const z=o.querySelector(".chat-starters-btn-conv");if(z){z.innerHTML="";const n=document.createElement("div");n.className="chat-emoji-btn",n.innerHTML="💡",n.title="Gotowe teksty",n.onmouseenter=()=>{n.style.background="var(--blood-red)",n.style.color="var(--gold)",n.style.borderColor="var(--gold)"},n.onmouseleave=()=>{n.style.background="var(--dark-surface-light)",n.style.color="var(--text-secondary)",n.style.borderColor="var(--dark-border)"};let t=null;n.onclick=n=>{if(n.stopPropagation(),t)return t.remove(),void(t=null);t=document.createElement("div"),t.className="chat-emoji-picker",t.style.width="340px",t.style.maxHeight="350px",t.style.display="flex",t.style.flexDirection="column",t.style.gap="4px",t.style.padding="10px",t.style.gridTemplateColumns="none",e.CONVERSATION_STARTERS.forEach(e=>{const n=document.createElement("div");n.style.cssText="\n padding: 8px 12px;\n border-radius: 20px;\n background: var(--dark-surface-light);\n cursor: pointer;\n font-size: 12px;\n color: var(--text-secondary);\n transition: all 0.2s;\n ",n.textContent=e,n.onmouseenter=()=>{n.style.background="var(--blood-red)",n.style.color="var(--gold)"},n.onmouseleave=()=>{n.style.background="var(--dark-surface-light)",n.style.color="var(--text-secondary)"},n.onclick=()=>{p.value=e,f(p),p.focus(),t&&(t.remove(),t=null)},t.appendChild(n)}),z.appendChild(t)},z.appendChild(n)}W.refreshInterval=setInterval(async()=>{W.currentConversationName===n&&W.chatPanel&&!W.chatPanel.classList.contains("minimized")&&document.hasFocus()?await k():W.currentConversationName!==n&&(clearInterval(W.refreshInterval),W.refreshInterval=null)},1e4),W._savedMessagesHTML=o.innerHTML},async openConversationDirect(n){W.chatPanel?(W.chatPanel.classList.remove("minimized"),W.chatPanel.classList.remove("expanded"),W.chatPanel.style.display="flex"):await W.create(),setTimeout(async()=>{let t=e.ICONS.NO_FOTO_FULL;if(G.has(n))t=G.get(n);else try{t=await Y(n)}catch(e){console.warn("Nie udało się pobrać avataru dla:",n)}W.currentTab="messages";W.chatPanel.querySelectorAll(".chat-tab").forEach(e=>e.classList.remove("active"));const o=W.chatPanel.querySelector('[data-tab="messages"]');o&&o.classList.add("active"),await W.openConversation(n,t)},300)},show(){if(!W.chatPanel)return void W.create();W.chatPanel.classList.remove("minimized"),W.chatPanel.classList.remove("expanded"),W.chatPanel.style.display="flex";const e=W.chatPanel.querySelector("#chat-body-container");if(!e)return;const n="chat"===W.currentTab?W._savedChatHTML:W._savedMessagesHTML;n&&n.length>100&&!n.includes("spinner")?(e.innerHTML=n,"chat"===W.currentTab?(W.attachChatEvents(),W.onlineUsersList.length&&W.renderUsersSidebar(),B(),setTimeout(()=>{const n=e.querySelector(".chat-messages");n&&(n.scrollTop=n.scrollHeight)},150)):e.querySelector(".conversation-view")?W._attachConversationEvents():W._attachMessagesEvents()):W.renderCurrentTab()},toggle(){if(W.chatPanel&&"none"!==W.chatPanel.style.display){const e=W.chatPanel.querySelector("#chat-body-container");e&&("chat"===W.currentTab?W._savedChatHTML=e.innerHTML:"messages"===W.currentTab&&(W._savedMessagesHTML=e.innerHTML)),W.chatPanel.classList.contains("minimized")?W.show():W.chatPanel.classList.add("minimized")}else W.show()},updateAvatarVisibility(){document.querySelectorAll(".chat-message-avatar").forEach(e=>{u.shouldShowAvatars?e.classList.remove("hide-avatar"):e.classList.add("hide-avatar")})},cleanupAllIntervals(){W.heartbeatInterval&&(clearInterval(W.heartbeatInterval),W.heartbeatInterval=null),W.refreshInterval&&(clearInterval(W.refreshInterval),W.refreshInterval=null),W._messageListRefreshInterval&&(clearInterval(W._messageListRefreshInterval),W._messageListRefreshInterval=null),W._fabRefreshInterval&&(clearInterval(W._fabRefreshInterval),W._fabRefreshInterval=null),W.stopTitleBlinking(),W._settingsListeners&&(W._settingsListeners.forEach(e=>{try{GM_removeValueChangeListener(e)}catch(e){}}),W._settingsListeners=[])}};function B(){const e=document.getElementById("online-badge"),n=document.getElementById("muted-badge");if(e){const n=W.onlineUsersList.filter(e=>e.online).length;e.textContent=n,e.style.display=n>0?"inline":"none"}if(n){const e=Object.keys(W.mutedUsersMap).length;n.textContent=e,n.style.display=e>0?"inline":"none"}const t=document.getElementById("chat-online-count");if(t){const e=W.onlineUsersList.filter(e=>e.online).length;t.textContent=e}}const G=new Map;async function Y(n){if(G.has(n))return G.get(n);const t=GM_getValue(`avatar_${n}`,null);return t?(G.set(n,t),t):new Promise(t=>{GM_xmlhttpRequest({method:"GET",url:`https://m.fll.pl/profile.php?profile=${encodeURIComponent(n)}`,timeout:8e3,onload:o=>{if(200===o.status&&o.responseText){const a=(new DOMParser).parseFromString(o.responseText,"text/html");let i=null;const s=a.querySelector(".profile-header");if(s){const e=(s.getAttribute("style")||"").match(/url\(['"]?([^'"]+)['"]?\)/);if(e&&!e[1].includes("no-foto")&&(i=e[1]),!i){const e=s.querySelector(".profile-img img");e&&e.src&&!e.src.includes("no-foto")&&(i=e.src)}}if(!i){const e=a.querySelector(".list-box .profile-img img");e&&e.src&&!e.src.includes("no-foto")&&(i=e.src)}if(!i){const e=a.querySelector(".home-profile-img img");e&&e.src&&!e.src.includes("no-foto")&&(i=e.src)}if(!i){const e=a.querySelector(".message-box .profile-img img");e&&e.src&&!e.src.includes("no-foto")&&(i=e.src)}if(i)return i=(r=i)&&"null"!==r&&"undefined"!==r?r.replace("https://fellow.pl/","https://fll.pl/"):e.ICONS.NO_FOTO_FULL,GM_setValue(`avatar_${n}`,i),G.set(n,i),void t(i)}var r;const a=e.ICONS.NO_FOTO_FULL;G.set(n,a),t(a)},onerror:()=>{const o=e.ICONS.NO_FOTO_FULL;G.set(n,o),t(o)},ontimeout:()=>{const o=e.ICONS.NO_FOTO_FULL;G.set(n,o),t(o)}})})}function K(){const n=function(e=5){const n=T(),t=M(new Date),o=new Date,r=`${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}`;return n.filter(e=>e.date>t||!!(e.date===t&&e.time&&e.time>r)||e.date===t&&!e.time).sort((e,n)=>e.date!==n.date?e.date.localeCompare(n.date):(e.time||"99:99").localeCompare(n.time||"99:99")).slice(0,e)}(5);if(0===n.length)return'\n <div class="right-widget right-widget-calendar">\n <div class="right-widget-header">\n <h3>📅 Kalendarz</h3>\n <span class="right-widget-badge" data-action="calendar" title="Otwórz kalendarz">📅</span>\n </div>\n <div style="text-align:center;padding:20px;color:var(--text-muted);font-size:12px;">\n <span style="font-size:32px;display:block;margin-bottom:8px;">📭</span>\n Brak nadchodzących wydarzeń\n </div>\n </div>\n ';const t=n.map(n=>{const t=e.CALENDAR_EMOJI[n.type]||"📅",o=n.date===M(new Date),r=n.date===M(new Date(Date.now()+864e5));return`\n <div class="cal-widget-event ${o?"urgent":r?"soon":""}" data-date="${n.date}" title="Kliknij by otworzyć kalendarz">\n <div class="cal-widget-emoji">${t}</div>\n <div class="cal-widget-info">\n <div class="cal-widget-title">${v(n.title)}</div>\n <div class="cal-widget-meta">\n <span class="cal-widget-day">${function(e){const n=M(new Date),t=M(new Date(Date.now()+864e5));if(e===n)return"Dziś";if(e===t)return"Jutro";const o=new Date(e);return`${["Niedz","Pon","Wto","Śro","Czw","Pią","Sob"][o.getDay()]}, ${o.getDate()} ${["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"][o.getMonth()]}`}(n.date)}</span>\n ${n.time?`<span class="cal-widget-time">🕐 ${n.time}</span>`:""}\n </div>\n </div>\n ${o?'<span class="cal-widget-dot"></span>':""}\n </div>\n `}).join("");return`\n <div class="right-widget right-widget-calendar">\n <div class="right-widget-header">\n <h3>📅 Nadchodzące</h3>\n <span class="right-widget-badge" data-action="calendar" title="Otwórz kalendarz">${n.length}</span>\n </div>\n <div class="cal-widget-list">\n ${t}\n </div>\n <div style="text-align:center;padding:6px 0 0;">\n <span style="font-size:11px;color:var(--text-muted);cursor:pointer;" data-action="calendar">📅 Otwórz kalendarz →</span>\n </div>\n </div>\n `}function Z(){const n=function(){const n=A();return Object.entries(n).filter(([e,n])=>{const t="string"==typeof n?n:n?.text;return t&&t.trim()}).map(([n,t])=>({name:n,text:"string"==typeof t?t:t.text,avatar:"string"==typeof t?e.ICONS.NO_FOTO_FULL:t.avatar||e.ICONS.NO_FOTO_FULL}))}();if(0===n.length)return'\n <div class="side-card side-notes">\n <div class="side-notes-header">\n <span>📝 Notatki</span>\n <span class="side-notes-count">0</span>\n </div>\n <div class="side-notes-empty">\n <span style="font-size:28px;">📭</span>\n <p>Brak notatek</p>\n <p style="font-size:10px;color:var(--text-muted);">Kliknij 📝 przy profilu by dodać</p>\n </div>\n </div>\n ';const t=n.map(n=>`\n <div class="side-note-item" data-profile="${v(n.name)}">\n <div class="side-note-avatar" data-profile="${v(n.name)}">\n <img src="${n.avatar||e.ICONS.NO_FOTO_FULL}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'">\n </div>\n <div class="side-note-info">\n <div class="side-note-name">${v(n.name)}</div>\n <div class="side-note-preview">${v(n.text.substring(0,50))}${n.text.length>50?"...":""}</div>\n </div>\n <div class="side-note-actions">\n <span class="side-note-view" title="Zobacz profil">👤</span>\n <span class="side-note-edit" title="Edytuj notatkę">✏️</span>\n </div>\n </div>\n `).join("");return`\n <div class="side-card side-notes">\n <div class="side-notes-header">\n <span>📝 Notatki</span>\n <span class="side-notes-count">${n.length}</span>\n </div>\n <div class="side-notes-list">\n ${t}\n </div>\n </div>\n `}function V(e){const n=document.querySelector(".dashboard-right");if(!n)return null;switch(e){case"calendar":if(u.showCalendarWidget){const e=K(),t=document.querySelector(".right-widget-calendar");t?t.outerHTML=e:n.insertAdjacentHTML("afterbegin",e)}else document.querySelector(".right-widget-calendar")?.remove();break;case"comments":if(u.showCommentsWidget&&window._cachedCommentsHtml){const e=document.querySelector(".right-widget-comments");if(e)e.outerHTML=window._cachedCommentsHtml;else{const e=document.querySelector(".right-widget-calendar");e?e.insertAdjacentHTML("afterend",window._cachedCommentsHtml):n.insertAdjacentHTML("afterbegin",window._cachedCommentsHtml)}}else document.querySelector(".right-widget-comments")?.remove();break;case"notes":if(u.showNotesWidget){const e=Z(),t=document.querySelector(".side-notes");t?t.outerHTML=e:n.insertAdjacentHTML("beforeend",e)}else document.querySelector(".side-notes")?.remove();break;case"plus":if(u.showPlusWidget){const e='\n <div class="right-widget plus-widget" data-action="plus" title="Fellow+">\n <h4>⭐ Fellow+</h4>\n <p>Odblokuj dodatkowe funkcje!</p>\n <button class="plus-btn">Sprawdź →</button>\n </div>\n ',t=document.querySelector(".plus-widget");t?t.outerHTML=e:n.insertAdjacentHTML("beforeend",e)}else document.querySelector(".plus-widget")?.remove()}te()}function J(e=!1){document.querySelector(".dashboard-right")&&(!e&&ee.isFresh()||ee.invalidate(),u.showCalendarWidget&&!ee.calendar?(V("calendar"),ee.calendar=!0):u.showCalendarWidget||V("calendar"),u.showCommentsWidget&&!ee.comments?window._cachedCommentsHtml&&(V("comments"),ee.comments=!0):u.showCommentsWidget||V("comments"),u.showNotesWidget&&!ee.notes?(V("notes"),ee.notes=!0):u.showNotesWidget||V("notes"),u.showPlusWidget&&!ee.plus?(V("plus"),ee.plus=!0):u.showPlusWidget||V("plus"),ee.lastUpdate=Date.now())}let X=!1;async function Q(){if(X)return;X=!0;const n=await S("history",8);try{await k();const t=await async function(){return new Promise(e=>{GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/profile.php?p=home",onload:function(n){if(200!==n.status||!n.responseText)return void e(null);const t=(new DOMParser).parseFromString(n.responseText,"text/html"),o={},r=t.querySelector('.home-ctn a[href*="p=messages"] span');o.messages=r?r.textContent.trim():"0";const a=t.querySelector('.home-box a[href*="p=chat"] .newchat');o.chat=a?a.textContent.trim():"0";const i=t.querySelector('.home-ctn a[href*="p=edit_gallery"] span');o.gallery=i?i.textContent.trim():"0/15";const s=t.querySelector('.home-ctn a[href*="l=gb"] span');o.comments=s?s.textContent.trim():"0";const l=t.querySelector('.home-ctn a[href*="l=visitors"] span');o.visitors=l?l.textContent.trim():"0";const d=t.querySelector('.home-ctn a[href*="l=favorites"] span');o.favorites=d?d.textContent.trim():"0";const c=t.querySelector('.home-ctn a[href*="l=blocked"] span');o.blocked=c?c.textContent.trim():"0";const p=t.querySelector('.home-ctn a[href*="profile="] span');o.visits=p?p.textContent.trim():"0";const u=t.querySelector('.home-ctn a[href*="p=edit_profile"] span');o.registration=u?u.getAttribute("title")||u.textContent.trim():"",e(o)},onerror:()=>{console.error("Failed to fetch user stats"),e(null)}})})}(),o=await async function(){return w("https://m.fll.pl/profile.php?p=index","top_profiles",{parser:e=>{if(!e||!e.responseText)return[];const n=(new DOMParser).parseFromString(e.responseText,"text/html"),t=[],o=["TOP Profil","Nowe profile","Losowe profile"];let r=null;return n.querySelectorAll(".index-line").forEach(e=>{const n=e.querySelector("h2");n&&o.includes(n.textContent.trim())&&(r=n.textContent.trim(),e.querySelectorAll(".profile-img").forEach(e=>{const n=e.querySelector("a"),o=e.querySelector("img"),a=e.querySelector(".gallery-counter"),i=e.querySelector(".gallery-online"),s=o&&o.getAttribute("alt")||"";let l="",d="";const c=s.match(/([^·]+)·/);c&&(l=c[1].trim());const p=s.match(/(\d+)\s*lat/);p&&(d=p[1]),n&&o&&l&&t.push({section:r,name:l,age:d,avatar:o.src,profileUrl:n.href,photosCount:a?a.textContent.trim():"0",isOnline:!!i})}))}),t}})}(),i=await async function(n=5){return new Promise(t=>{const o=`${e.API_BASE}?profile=${encodeURIComponent(u.currentUserName)}&l=gb&page=1`;GM_xmlhttpRequest({method:"GET",url:o,onload:e=>{if(200!==e.status||!e.responseText)return void t([]);const o=(new DOMParser).parseFromString(e.responseText,"text/html"),r=[];o.querySelectorAll(".message-box").forEach(e=>{let t="";const o=e.querySelector(".message-box > a, .profile-img a");if(o&&(t=o.textContent.trim(),!t)){const e=o.getAttribute("href");if(e){const n=e.match(/profile=([^&]+)/);n&&(t=decodeURIComponent(n[1]))}}let a="";const i=e.querySelector(".message-reader");i&&(a=i.textContent.trim());let s="";const l=e.querySelector(".message-date");l&&(s=l.childNodes[0]?.textContent?.trim()||"");let d="",c="";const p=e.querySelector(".message-reply");if(p){const e=p.querySelector("b");e&&(c=e.textContent.trim());const n=p.textContent.trim();d=n.replace(/^[^▸]*▸\s*/,"").trim(),d||(d=n.substring(n.indexOf("▸")+1).trim())}t&&a&&r.length<n&&r.push({name:t,text:a,date:s,replyText:d,replyAuthor:c})}),t(r)},onerror:()=>{console.error("Failed to fetch recent comments"),t([])}})})}(5),s=await S("visitors",8),l=await S("favorites",8),c=await S("friends",8);t&&(u.userStats={messages:t.messages,chat:t.chat,visitors:t.visitors,comments:t.comments,gallery:t.gallery,favorites:t.favorites,blocked:t.blocked,visits:t.visits,registration:t.registration});const p=o.filter(e=>"TOP Profil"===e.section).slice(0,8),g=o.filter(e=>"Nowe profile"===e.section).slice(0,8),m=o.filter(e=>"Losowe profile"===e.section).slice(0,8),h=document.querySelector(".dashboard-container");h&&h.remove();let x=u.currentUserAvatar;if(x&&"string"==typeof x&&x.length>100&&!x.startsWith("http"))try{x=atob(x)}catch(n){x=e.ICONS.NO_FOTO_FULL}x&&!x.includes("_m.jpg")&&x.includes(".jpg")&&(x=x.replace(/\.jpg$/,"_m.jpg")),x&&"null"!==x&&"undefined"!==x&&x.startsWith("http")||(x=e.ICONS.NO_FOTO_FULL);const b=u.currentUserName||"Użytkownik",f=function(){const e=[{emoji:"👋",text:"Miło Cię widzieć. Sprawdź co nowego w Fellow!"},{emoji:"🌟",text:"Świetnie, że jesteś! Co dziś planujesz?"},{emoji:"🔥",text:"Nowe znajomości czekają! Sprawdź profile."},{emoji:"💪",text:"Aktywność popłaca! Zobacz kto odwiedził Twój profil."},{emoji:"🎯",text:"Masz nowe powiadomienia? Sprawdź!"},{emoji:"✨",text:"Twój profil przyciąga uwagę. Świetnie wygląda!"},{emoji:"🏆",text:"Jesteś w Topce! Tak trzymaj."},{emoji:"💬",text:"Ktoś czeka na Twoją odpowiedź w wiadomościach."},{emoji:"📸",text:"Dodałeś nowe zdjęcia? Pokaż je innym!"},{emoji:"🎉",text:"Nowy dzień, nowe możliwości. Znajdź kogoś wyjątkowego!"},{emoji:"💖",text:"Ktoś dodał Cię do ulubionych! Sprawdź kto."},{emoji:"👀",text:"Twój profil jest popularny! Ktoś Cię obserwuje."}];return e[Math.floor(Math.random()*e.length)]}(),y=u.userStats.gallery||"0/15",z=[],E={top:{title:"⭐ TOP Profile",profiles:p},new:{title:"🆕 Nowe profile",profiles:g},random:{title:"🎲 Losowe profile",profiles:m},visitors:{title:"👥 Ostatnio odwiedzający",profiles:s},history:{title:"📜 Odwiedzone",profiles:n},favorites:{title:"⭐ Ulubione",profiles:l},friends:{title:"👤 Znajomi",profiles:c}};for(const e of u.feedSections){const n=E[e];n&&n.profiles&&n.profiles.length>0?z.push(`\n <div class="feed-section" style="margin-bottom:28px;">\n <div class="section-header" style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;">\n <h2 style="color:var(--gold);font-size:17px;margin:0;">${n.title}</h2>\n <span style="color:var(--text-muted);font-size:12px;">${n.profiles.length} profili</span>\n </div>\n <div class="profiles-grid" style="display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px;">\n ${ie(n.profiles)}\n </div>\n </div>\n `):n&&n.profiles&&z.push(`\n <div class="feed-section" style="margin-bottom:28px;">\n <div class="section-header" style="display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;">\n <h2 style="color:var(--gold);font-size:17px;margin:0;">${n.title}</h2>\n </div>\n <div style="text-align:center;padding:30px;color:var(--text-muted);font-size:13px;">Brak profili do wyświetlenia</div>\n </div>\n `),r(),a()}let C="";u.showRecentComments&&i.length>0?C=`\n <div class="right-widget right-widget-comments">\n <div class="right-widget-header">\n <h3>💬 Komentarze</h3>\n <span class="right-widget-badge" data-action="comments" title="Zobacz wszystkie komentarze">💭 ${u.userStats.comments}</span>\n </div>\n <div class="comments-list">\n ${i.map(e=>`\n <div class="comment-item-small" data-profile="${v(e.name)}">\n <div class="comment-author-small">${v(e.name)}</div>\n <div class="comment-text-small">${v(e.text.substring(0,100))}${e.text.length>100?"...":""}</div>\n ${e.replyText?`\n <div class="comment-reply-small">\n <span class="comment-reply-author">${v(e.replyAuthor||"Ty")}</span> ▸ ${v(e.replyText.substring(0,80))}${e.replyText.length>80?"...":""}\n </div>`:""}\n <div class="comment-date-small">${v(e.date)}</div>\n </div>\n `).join("")}\n </div>\n </div>\n `:u.showRecentComments&&(C=`\n <div class="right-widget right-widget-comments">\n <div class="right-widget-header">\n <h3>💬 Ostatnie komentarze</h3>\n <span class="right-widget-badge" data-action="comments" title="Zobacz wszystkie komentarze">💭 ${u.userStats.comments}</span>\n </div>\n <div style="text-align:center;padding:15px;color:var(--text-muted);font-size:12px;">Brak ostatnich komentarzy</div>\n </div>\n `);const T=`\n <div class="dashboard-container">\n \x3c!-- ========== LEWA KOLUMNA ========== --\x3e\n <div class="dashboard-left">\n \x3c!-- KARTA PROFILU --\x3e\n <div class="side-card side-profile">\n <div class="side-profile-banner">\n <img src="${x}" alt="${v(b)}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'">\n <div class="side-profile-overlay">\n <h3>${v(b)}</h3>\n <span class="side-online-dot"></span>\n </div>\n </div>\n </div>\n\n \x3c!-- KARTA LIST --\x3e\n <div class="side-card side-lists">\n <div class="side-lists-row">\n <div class="side-list-chip" data-list="visitors" title="Odwiedzający">\n <span class="chip-icon">👥</span><span class="chip-num">${u.userStats.visitors}</span>\n </div>\n <div class="side-list-chip" data-list="favorites" title="Ulubione">\n <span class="chip-icon">⭐</span><span class="chip-num">${u.userStats.favorites}</span>\n </div>\n <div class="side-list-chip" data-list="friends" title="Znajomi">\n <span class="chip-icon">👤</span><span class="chip-num">0</span>\n </div>\n <div class="side-list-chip" data-list="blocked" title="Zablokowani">\n <span class="chip-icon">🚫</span><span class="chip-num">${u.userStats.blocked}</span>\n </div>\n </div>\n </div>\n\n \x3c!-- KARTA AKCJI --\x3e\n <div class="side-card side-actions">\n <button class="side-act-btn" data-action="editProfile" title="Edytuj profil">\n <span class="act-icon-circle">✏️</span><span>Edytuj profil</span>\n </button>\n <button class="side-act-btn" data-action="editGallery" title="Galeria">\n <span class="act-icon-circle">🖼️</span><span>Galeria</span>\n <span class="act-badge">${y}</span>\n </button>\n <button class="side-act-btn" data-action="gps" title="Lokalizacje">\n <span class="act-icon-circle">📍</span><span>Lokalizacje</span>\n </button>\n <button class="side-act-btn" data-action="search" title="Wyszukiwarka">\n <span class="act-icon-circle">🔍</span><span>Wyszukiwarka</span>\n </button>\n <button class="side-act-btn" data-action="settings" title="Ustawienia">\n <span class="act-icon-circle">⚙️</span><span>Ustawienia</span>\n </button>\n <button class="side-act-btn side-act-destiny" data-action="destiny" title="Przeznaczenie">\n <span class="act-icon-circle">🔮</span><span>Przeznaczenie</span>\n </button>\n <button class="side-act-btn side-act-logout" data-action="logout" title="Wyloguj się">\n <span class="act-icon-circle">🚪</span><span>Wyloguj się</span>\n </button>\n </div>\n </div>\n\n \x3c!-- ========== ŚRODEK ========== --\x3e\n <div class="dashboard-center">\n <div class="welcome-message" style="display:flex;align-items:center;gap:16px;padding:16px 20px;">\n <span style="font-size:40px;flex-shrink:0;">${f.emoji}</span>\n <div>\n <h1 style="margin:0 0 4px 0;font-size:20px;">Cześć, ${v(b)}!</h1>\n <p style="margin:0;font-size:13px;">${f.text}</p>\n </div>\n </div>\n ${z.join("")}\n </div>\n\n \x3c!-- ========== PRAWA KOLUMNA ========== --\x3e\n <div class="dashboard-right">\n ${u.showCalendarWidget?K():""}\n ${u.showCommentsWidget?C:""}\n ${u.showNotesWidget?Z():""}\n ${u.showPlusWidget?'\n <div class="right-widget plus-widget" data-action="plus" title="Fellow+">\n <h4>⭐ Fellow+</h4>\n <p>Odblokuj dodatkowe funkcje!</p>\n <button class="plus-btn">Sprawdź →</button>\n </div>\n ':""}\n </div>\n </div>\n\n <style>\n .side-card{background:var(--dark-surface);border:1px solid var(--dark-border);border-radius:16px;padding:14px;margin-bottom:8px;}\n .side-profile {\n padding: 0 !important;\n overflow: hidden;\n }\n .side-profile-banner {\n position: relative;\n width: 100%;\n aspect-ratio: 16/9;\n overflow: hidden;\n cursor: pointer;\n }\n .side-profile-banner img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n transition: transform 0.3s;\n }\n .side-profile-banner:hover img {\n transform: scale(1.05);\n }\n .side-profile-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 30px 15px 12px;\n background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, transparent 100%);\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n }\n .side-profile-overlay h3 {\n color: #fff;\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n text-shadow: 0 2px 4px rgba(0,0,0,0.5);\n letter-spacing: 0.5px;\n }\n .side-online-dot {\n width: 10px;\n height: 10px;\n background: #4CAF50;\n border-radius: 50%;\n border: 2px solid rgba(255,255,255,0.8);\n box-shadow: 0 0 8px rgba(76,175,80,0.6);\n flex-shrink: 0;\n margin-bottom: 4px;\n }\n .side-lists-row{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;}\n .side-list-chip{display:flex;flex-direction:column;align-items:center;gap:2px;padding:8px 2px;background:var(--dark-surface-lighter);border-radius:10px;cursor:pointer;transition:all 0.2s;}\n .side-list-chip:hover{background:var(--dark-surface-light);transform:translateY(-2px);}\n .chip-icon{font-size:18px;}.chip-num{font-size:15px;font-weight:bold;color:var(--gold);}\n .side-actions{display:flex;flex-direction:column;gap:4px;}\n .side-act-btn{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--dark-surface-lighter);border:1px solid var(--dark-border);border-radius:12px;color:var(--text-secondary);font-size:13px;cursor:pointer;transition:all 0.15s;width:100%;text-align:left;}\n .side-act-btn:hover{background:var(--blood-red-dark);border-color:var(--gold);color:var(--gold);}\n .act-icon-circle{width:28px;height:28px;border-radius:50%;background:var(--dark-surface);display:flex;align-items:center;justify-content:center;font-size:14px;flex-shrink:0;}\n .act-badge{margin-left:auto;background:var(--blood-red);color:var(--gold);padding:2px 7px;border-radius:8px;font-size:11px;font-weight:bold;}\n </style>\n `;document.body.insertAdjacentHTML("afterbegin",T),window._cachedCommentsHtml=C,function(){if(ae)return;ae=!0,console.log("Dashboard events attached once");const n=document.querySelector(".dashboard-left");n&&n.addEventListener("click",e=>{const n=e.target.closest("[data-action]");if(n&&n.dataset.action)return e.preventDefault(),e.stopPropagation(),void se(n.dataset.action);const t=e.target.closest("[data-list]");return t&&t.dataset.list?(e.preventDefault(),e.stopPropagation(),void D.showList(t.dataset.list)):void 0});const t=document.querySelector(".dashboard-center");t&&t.addEventListener("click",e=>{const n=e.target.closest(".profile-card");if(n&&n.dataset.profile)return e.preventDefault(),e.stopPropagation(),void D.showProfile(n.dataset.profile)});const o=document.querySelector(".side-profile-banner");if(o){const e=o.cloneNode(!0);o.parentNode.replaceChild(e,o),e.addEventListener("click",()=>D.showProfile(u.currentUserName))}!async function(){if(oe)return;oe=!0;const n=document.querySelectorAll(".side-note-avatar[data-profile]"),t=Array.from(n).map(async n=>{const t=n.dataset.profile;if(t)try{const o=await Y(t),r=n.querySelector("img");r&&o&&o!==e.ICONS.NO_FOTO_FULL&&o.startsWith("http")&&(r.src=o,r.classList.add("note-avatar-loaded"))}catch(e){console.warn(`Nie udało się pobrać avataru dla ${t}`,e)}});await Promise.allSettled(t)}()}(),te(),d(),ge(u.userStats.messages,W.onlineUsersList.length)}catch(e){console.error("Dashboard render error:",e),X=!1,d(),m("Wystąpił błąd podczas ładowania dashboardu","error")}}const ee={calendar:null,comments:null,notes:null,plus:null,lastUpdate:0,CACHE_TTL:3e4,invalidate(){this.calendar=null,this.comments=null,this.notes=null,this.plus=null,this.lastUpdate=0},isFresh(){return Date.now()-this.lastUpdate<this.CACHE_TTL}};let ne=!1;function te(){if(ne)return;ne=!0,console.log("Widget events attached once");const e=document.querySelector(".dashboard-right");e&&e.addEventListener("click",e=>{if(e.target.closest('[data-action="calendar"], .cal-widget-event'))return e.preventDefault(),e.stopPropagation(),void _();if(e.target.closest('.right-widget-badge[data-action="comments"]'))return e.preventDefault(),e.stopPropagation(),void se("comments");const n=e.target.closest(".comment-item-small");if(n&&n.dataset.profile)return e.preventDefault(),e.stopPropagation(),void D.showProfile(n.dataset.profile);const t=e.target.closest(".side-note-item");if(t&&t.dataset.profile){e.preventDefault(),e.stopPropagation();const n=t.dataset.profile;return void(e.target.closest(".side-note-edit")?j(n):e.target.closest(".side-note-view")?D.showProfile(n):j(n))}return e.target.closest(".plus-widget")?(e.preventDefault(),e.stopPropagation(),void D.showFellowPlus()):void 0})}let oe=!1;let re,ae=!1;function ie(n){return n.length?n.map(n=>`\n <div class="profile-card" data-profile="${v(n.name)}" style="background:var(--dark-surface);border-radius:14px;overflow:hidden;border:1px solid var(--dark-border);cursor:pointer;transition:all 0.2s;" onmouseenter="this.style.transform='translateY(-4px)';this.style.borderColor='var(--blood-red)';this.style.boxShadow='0 8px 20px rgba(139,0,0,0.3)'" onmouseleave="this.style.transform='';this.style.borderColor='var(--dark-border)';this.style.boxShadow=''">\n <div style="position:relative;aspect-ratio:3/4;overflow:hidden;background:var(--dark-surface-lighter);">\n <img src="${n.avatar}" onerror="this.src='${e.ICONS.NO_FOTO_FULL}'" style="width:100%;height:100%;object-fit:cover;" loading="lazy">\n ${n.isOnline?'<span style="position:absolute;top:8px;right:8px;width:10px;height:10px;background:#4CAF50;border-radius:50%;border:2px solid rgba(0,0,0,0.5);box-shadow:0 0 6px rgba(76,175,80,0.5);"></span>':""}\n ${n.photosCount&&"0"!==n.photosCount?`<span style="position:absolute;bottom:8px;left:8px;background:rgba(0,0,0,0.7);color:var(--gold);font-size:10px;padding:3px 7px;border-radius:10px;backdrop-filter:blur(4px);">📸 ${n.photosCount}</span>`:""}\n </div>\n <div style="padding:10px 8px;text-align:center;">\n <div style="color:var(--gold);font-weight:600;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;" title="${v(n.name)}">${v(n.name)}</div>\n ${n.age?`<div style="color:var(--text-muted);font-size:11px;margin-top:2px;">${v(n.age)} lat</div>`:""}\n </div>\n </div>\n `).join(""):""}function se(e){const n={messages:()=>{W.show(),setTimeout(()=>{W.chatPanel&&(W.currentTab="messages",W.renderCurrentTab())},100)},chat:()=>W.show(),visitors:()=>D.showList("visitors"),comments:()=>D.showComments(),editProfile:()=>D.showEditProfile(),editGallery:()=>D.showEditGallery(),gps:()=>D.showGps(),plus:()=>D.showFellowPlus(),settings:()=>D.showSettings(),search:()=>D.showSearch(),profile:()=>D.showProfile(u.currentUserName),gallery:()=>D.showEditGallery(),destiny:()=>i(),calendar:()=>_(),logout:()=>{confirm("Czy na pewno chcesz się wylogować?")&&(he&&he.disconnect(),GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/index.php?logout=1",onload:()=>{u.logout(),W.wsInitialized&&(W.intentionalClose=!0,W.cleanupWebSocket()),document.body.innerHTML="",X=!1,W.chatPanel=null,W.wsInitialized=!1,le=null,document.body.classList.add("logowanie-page"),l(),be();const e=window.location.hostname;e.includes("fll.pl")&&!e.includes("m.fll.pl")?history.pushState({},"Fellow.pl • Logowanie","https://fll.pl/"):history.pushState({},"Fellow.pl • Logowanie","https://m.fll.pl/"),document.title="Fellow.pl • Logowanie",m("Wylogowano pomyślnie 👋","success")},onerror:()=>{m("Błąd wylogowywania","error")}}))}};n[e]&&n[e]()}window.addEventListener("resize",()=>{re&&clearTimeout(re),re=setTimeout(()=>{W.chatPanel&&W.chatPanel.classList.contains("expanded")},150)});let le=null;function de(){if(le)return;le=document.createElement("div"),le.className="floating-action-btn",le.title="Lewy klik: otwórz czat | Prawy klik: menu",le.innerHTML='\n <div class="fab-content">\n <span class="fab-icon">💬</span>\n <div class="fab-badges">\n <span class="fab-badge fab-badge-chat" id="fab-chat-count" title="Online na czacie">0</span>\n <span class="fab-badge fab-badge-msg" id="fab-msg-count" title="Nieprzeczytane wiadomości">0</span>\n </div>\n </div>\n ',le.addEventListener("click",()=>{if(W.chatPanel&&"none"!==W.chatPanel.style.display&&!W.chatPanel.classList.contains("minimized")){const e=W.chatPanel.querySelector("#chat-body-container");if(e){const n=e.innerHTML;n.length>100&&!n.includes("spinner")&&("chat"===W.currentTab?W._savedChatHTML=n:W._savedMessagesHTML=n)}W.chatPanel.style.display="none"}else W.show()}),le.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation(),W.chatPanel?ce(e):W.create().then(()=>{ce(e)})}),document.body.appendChild(le);const e=document.createElement("style");e.textContent='\n .floating-action-btn {\n width: 62px !important;\n height: 62px !important;\n overflow: visible !important;\n }\n .fab-content {\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .fab-icon {\n font-size: 26px;\n position: relative;\n z-index: 1;\n }\n .fab-badges {\n position: absolute;\n top: -10px;\n right: -10px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n align-items: flex-end;\n }\n .fab-badge {\n min-width: 22px;\n height: 20px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1px 7px;\n color: #fff;\n box-shadow: 0 2px 8px rgba(0,0,0,0.5);\n transition: all 0.3s;\n line-height: 1;\n }\n .fab-badge-msg {\n background: #e53935;\n border: 2px solid #ffcdd2;\n font-size: 12px;\n min-width: 24px;\n height: 22px;\n }\n .fab-badge-chat {\n background: #43a047;\n border: 2px solid #c8e6c9;\n font-size: 10px;\n min-width: 20px;\n height: 18px;\n }\n .fab-badge[data-count="0"] {\n display: none !important;\n }\n .fab-context-menu {\n position: fixed;\n background: var(--dark-surface);\n border: 1px solid var(--blood-red);\n border-radius: 12px;\n padding: 8px;\n min-width: 240px;\n z-index: 10020;\n box-shadow: 0 8px 30px rgba(0,0,0,0.5);\n }\n .fab-context-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n color: var(--text-primary);\n font-size: 13px;\n transition: all 0.15s;\n }\n .fab-context-item:hover {\n background: var(--blood-red);\n color: var(--gold);\n }\n .fab-context-item.danger:hover {\n background: rgba(220, 38, 38, 0.3);\n color: #ef4444;\n }\n .fab-context-separator {\n border-top: 1px solid var(--dark-border);\n margin: 4px 0;\n }\n ',document.head.appendChild(e)}function ce(e){const n=document.querySelector(".fab-context-menu");n&&n.remove();const t=document.createElement("div");t.className="fab-context-menu";[{icon:"💬",label:"Otwórz czat",action:()=>W.show()},{icon:"👥",label:`Online: ${W.onlineUsersList.filter(e=>e.online).length}`,action:()=>{W.show(),setTimeout(()=>{"chat"!==W.currentTab&&(W.currentTab="chat",W.chatPanel.querySelectorAll(".chat-tab").forEach(e=>e.classList.remove("active")),W.chatPanel.querySelector('[data-tab="chat"]').classList.add("active"),W.renderCurrentTab()),setTimeout(()=>{const e=W.chatPanel.querySelector(".chat-sidebar");e&&e.classList.add("active")},300)},200)}},{icon:"✉️",label:"Wiadomości",action:()=>{W.show(),setTimeout(()=>{W.currentTab="messages",W.chatPanel.querySelectorAll(".chat-tab").forEach(e=>e.classList.remove("active")),W.chatPanel.querySelector('[data-tab="messages"]').classList.add("active"),W.renderCurrentTab()},200)}},{separator:!0},{icon:"🔇",label:`Wyciszeni: ${Object.keys(W.mutedUsersMap).length}`,action:()=>{const e=Object.keys(W.mutedUsersMap);0===e.length?m("Brak wyciszonych użytkowników","info"):m(`Wyciszeni: ${e.join(", ")}`,"info",5e3)}},{icon:"🔄",label:"Połącz ponownie",action:()=>{W.intentionalClose=!1,W.cleanupWebSocket(),W.initializeWebSocket(),m("Ponowne łączenie...","info")}},{separator:!0},{icon:"❌",label:"Zamknij czat",danger:!0,action:()=>{confirm("Zamknąć czat?")&&(W.intentionalClose=!0,W.cleanupWebSocket(),W.chatPanel&&(W.chatPanel.remove(),W.chatPanel=null),W.wsInitialized=!1)}}].forEach(e=>{if(e.separator){const e=document.createElement("div");return e.className="fab-context-separator",void t.appendChild(e)}const n=document.createElement("div");n.className="fab-context-item "+(e.danger?"danger":""),n.innerHTML=`<span style="font-size:16px;">${e.icon}</span><span>${e.label}</span>`,n.onclick=()=>{t.remove(),e.action()},t.appendChild(n)}),document.body.appendChild(t);const o=t.getBoundingClientRect();let r=e.clientX,a=e.clientY;r+o.width>window.innerWidth&&(r-=o.width),a+o.height>window.innerHeight&&(a-=o.height),t.style.left=r+"px",t.style.top=a+"px";const i=e=>{t.contains(e.target)||(t.remove(),document.removeEventListener("click",i))};setTimeout(()=>document.addEventListener("click",i),100)}let pe=-1,ue=-1;function ge(e,n){const t=document.getElementById("fab-msg-count"),o=document.getElementById("fab-chat-count");if(e!==pe||n!==ue){if(pe=e,ue=n,o){const e=parseInt(n)||0;o.textContent=e,o.dataset.count=e,o.style.display=e>0?"flex":"none"}if(t){const n=parseInt(e)||0;n>0?(t.textContent=n,t.style.display="flex",t.style.animation="pulse 1.5s ease-in-out infinite"):(t.textContent="0",t.style.display="none",t.style.animation="none"),t.dataset.count=n}}}function me(){const e=window.location.href,n=new URL(e),t=n.pathname,o=n.search;if("/dashboard"===t||"/dashboard/"===t)return;if("/profile.php"===t&&o.includes("p=index"))return void(window.location.href="https://m.fll.pl/dashboard");const r="/"===t||"/index.php"===t||"/logowanie"===t||t.endsWith("/index.php"),a=o.includes("logout");if(!r||a||!u.currentUserId||!u.currentUserToken){if(!(u.currentUserId||u.currentUserToken||r||a)){const e=document.querySelector(".dashboard-container");return e&&(e.remove(),X=!1),void(document.body.classList.contains("logowanie-page")||(document.body.classList.add("logowanie-page"),l(),be()))}return a?(u.logout(),W.wsInitialized&&(W.intentionalClose=!0,W.cleanupWebSocket()),document.body.innerHTML="",document.body.classList.add("logowanie-page"),X=!1,W.chatPanel=null,W.wsInitialized=!1,le=null,l(),void be()):void 0}window.location.href="https://m.fll.pl/dashboard"}let he=null;function xe(e,n){const t=O("modal-content",e,"📄");t.classList.add("active"),F(t),GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/"+n,onload:e=>{if(200!==e.status||!e.responseText)return void I(t,"Nie udało się załadować treści");const n=(new DOMParser).parseFromString(e.responseText,"text/html"),o=t.querySelector(".modal-body"),r=n.querySelector("main")||n.querySelector(".box")||n.body;if(r){o.innerHTML="",o.style.padding="20px",o.style.color="var(--text-primary)",o.style.fontSize="14px",o.style.lineHeight="1.7";const e=r.cloneNode(!0);e.querySelectorAll(".spolecznoscinet, script, .home-head, nav, .alert").forEach(e=>e.remove()),e.querySelectorAll("h1, h2, h3").forEach(e=>{e.style.color="var(--gold)",e.style.marginTop="20px"}),e.querySelectorAll("a").forEach(e=>{e.style.color="var(--gold)"}),o.appendChild(e)}else I(t,"Nie znaleziono treści")},onerror:()=>I(t,"Błąd sieci")})}function be(){const n=["https://m.fll.pl/index.php","https://m.fll.pl/"];let t=0;!function o(){if(t>=n.length)return d(),void(window.location.href="https://m.fll.pl/");const r=n[t];t++,GM_xmlhttpRequest({method:"GET",url:r,timeout:1e4,onload:n=>{if(200===n.status&&n.responseText){const t=n.responseText;(t.includes("profilename")||t.includes("Nazwa profilu"))&&t.includes("password")&&(t.includes("form=login")||t.includes("Zaloguj"))?function(){d(),document.body.innerHTML="",document.body.classList.add("logowanie-page");const n=u.activeColorScheme||"dark";U.applyTheme(n);const t=document.createElement("div");t.className="login-page-container",t.innerHTML=`\n <div class="login-bg-decor"></div>\n\n <div class="login-wrapper">\n <div class="login-logo-section">\n <img src="https://m.fll.pl/_layout/logo-fellow.svg" class="login-logo-img" alt="Fellow.pl">\n <p class="login-tagline">Randki dla gejów • Najwięcej nowych znajomości</p>\n </div>\n\n <div class="login-card">\n <div class="login-card-inner">\n <h2 class="login-title">Witaj ponownie</h2>\n <p class="login-subtitle">Zaloguj się do swojego konta</p>\n\n <form method="POST" action="https://m.fll.pl/index.php" class="login-form" id="login-form">\n <input type="hidden" name="form" value="login">\n <input type="hidden" name="return" value="">\n\n <div class="login-field">\n <input type="text" name="profilename" placeholder="Nazwa profilu lub e-mail"\n autocomplete="username" required class="login-input">\n </div>\n\n <div class="login-field">\n <input type="password" name="password" placeholder="Hasło"\n autocomplete="current-password" required class="login-input">\n </div>\n\n <div class="login-options-row">\n <label class="login-checkbox-label">\n <input type="checkbox" name="rem" checked>\n <span class="login-checkbox-custom"></span>\n <span>Zapamiętaj mnie</span>\n </label>\n <a href="#" class="login-forgot-link" data-action="reset-password">Nie pamiętasz hasła?</a>\n </div>\n\n <button type="submit" class="login-submit-button">Zaloguj się</button>\n </form>\n\n <div class="login-divider"><span>lub</span></div>\n\n <a href="#" class="login-register-button" data-action="register">Utwórz nowe konto</a>\n </div>\n </div>\n\n <div class="login-bottom-links">\n <a href="#" data-action="terms">Regulamin</a><span>•</span>\n <a href="#" data-action="cookies-policy">Polityka prywatności</a><span>•</span>\n \x3c!-- LINK DO BLOGA USUNIĘTY --\x3e\n <a href="#" data-action="contact">Kontakt</a>\n </div>\n\n <p class="login-version">Fellow Enhanced v${e.VERSION}</p>\n </div>\n `,document.body.appendChild(t);const o=document.createElement("style");o.textContent="\n body {\n max-width: none;\n }\n .login-page-container {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n background: var(--dark-bg);\n position: relative;\n overflow: hidden;\n }\n .login-bg-decor {\n position: fixed;\n top: -50%; left: -50%;\n width: 200%; height: 200%;\n background:\n radial-gradient(circle at 20% 80%, var(--blood-red-glow) 0%, transparent 40%),\n radial-gradient(circle at 80% 20%, rgba(212,175,55,0.05) 0%, transparent 40%);\n animation: bgFloat 25s ease-in-out infinite;\n pointer-events: none;\n z-index: 0;\n }\n @keyframes bgFloat {\n 0%, 100% { transform: translate(0, 0) rotate(0deg); }\n 25% { transform: translate(-1%, 1%) rotate(0.5deg); }\n 50% { transform: translate(1%, -1%) rotate(-0.5deg); }\n 75% { transform: translate(1%, 1%) rotate(0.5deg); }\n }\n .login-wrapper {\n position: relative;\n z-index: 1;\n width: 100%;\n max-width: 420px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 24px;\n }\n .login-logo-section {\n text-align: center;\n animation: fadeDown 0.7s ease-out;\n }\n .login-logo-img {\n height: 44px;\n margin-bottom: 8px;\n filter: drop-shadow(0 0 15px var(--blood-red-glow));\n }\n .login-tagline {\n color: var(--text-muted);\n font-size: 12px;\n margin: 0;\n }\n @keyframes fadeDown {\n from { opacity: 0; transform: translateY(-20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes fadeUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .login-card {\n width: 100%;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 20px;\n overflow: hidden;\n box-shadow: 0 20px 60px rgba(0,0,0,0.5);\n animation: fadeUp 0.7s ease-out 0.1s both;\n }\n .login-card-inner {\n padding: 35px 30px;\n }\n .login-title {\n color: var(--gold);\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 6px 0;\n text-align: center;\n }\n .login-subtitle {\n color: var(--text-muted);\n font-size: 13px;\n margin: 0 0 28px 0;\n text-align: center;\n }\n .login-form {\n display: flex;\n flex-direction: column;\n gap: 14px;\n }\n .login-input {\n width: 100%;\n padding: 14px 18px;\n background: var(--dark-surface-light);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n color: var(--text-primary);\n font-size: 15px;\n font-family: 'Inter', 'Exo 2', sans-serif;\n transition: all 0.25s;\n outline: none;\n }\n .login-input:focus {\n border-color: var(--blood-red);\n box-shadow: 0 0 0 3px var(--blood-red-glow);\n background: var(--dark-surface);\n }\n .login-input::placeholder {\n color: var(--text-muted);\n opacity: 0.6;\n }\n .login-options-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 10px;\n }\n .login-checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-secondary);\n }\n .login-checkbox-label input { display: none; }\n .login-checkbox-custom {\n width: 18px; height: 18px;\n border: 2px solid var(--dark-border);\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n .login-checkbox-label input:checked + .login-checkbox-custom {\n background: var(--blood-red);\n border-color: var(--blood-red);\n }\n .login-checkbox-label input:checked + .login-checkbox-custom::after {\n content: '✓';\n color: var(--gold);\n font-size: 11px;\n font-weight: bold;\n }\n .login-forgot-link {\n color: var(--text-muted);\n font-size: 13px;\n text-decoration: none;\n cursor: pointer;\n transition: color 0.2s;\n }\n .login-forgot-link:hover {\n color: var(--gold);\n }\n .login-submit-button {\n width: 100%;\n padding: 15px;\n background: var(--blood-gradient);\n color: var(--gold);\n border: 1px solid var(--blood-red);\n border-radius: 12px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s;\n font-family: inherit;\n }\n .login-submit-button:hover {\n background: linear-gradient(135deg, var(--blood-red-light), var(--blood-red-dark));\n transform: translateY(-1px);\n box-shadow: 0 8px 25px var(--blood-red-glow);\n }\n .login-divider {\n display: flex;\n align-items: center;\n gap: 15px;\n margin: 20px 0;\n }\n .login-divider::before, .login-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--dark-border);\n }\n .login-divider span {\n color: var(--text-muted);\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 1px;\n }\n .login-register-button {\n display: block;\n width: 100%;\n padding: 13px;\n background: transparent;\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n color: var(--text-secondary);\n font-size: 14px;\n text-align: center;\n text-decoration: none;\n cursor: pointer;\n transition: all 0.3s;\n font-family: inherit;\n }\n .login-register-button:hover {\n border-color: var(--gold);\n color: var(--gold);\n background: rgba(212,175,55,0.03);\n }\n .login-bottom-links {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n animation: fadeUp 0.7s ease-out 0.3s both;\n }\n .login-bottom-links a {\n color: var(--text-muted);\n text-decoration: none;\n cursor: pointer;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n }\n .login-bottom-links a:hover {\n color: var(--gold);\n }\n .login-bottom-links span {\n color: var(--dark-border);\n user-select: none;\n }\n .login-version {\n color: var(--text-muted);\n font-size: 10px;\n margin: 0;\n opacity: 0.5;\n animation: fadeUp 0.7s ease-out 0.4s both;\n }\n @media (max-width: 480px) {\n .login-card-inner { padding: 25px 20px; }\n .login-title { font-size: 22px; }\n .login-input { padding: 12px 16px; font-size: 14px; }\n .login-options-row { flex-direction: column; align-items: flex-start; gap: 8px; }\n }\n ",document.head.appendChild(o),o.setAttribute("data-src","Fellow Enhanced.user.js"),document.querySelectorAll("[data-action]").forEach(e=>{e.addEventListener("click",n=>{n.preventDefault();switch(e.dataset.action){case"register":!function(){const e=O("modal-register","Rejestracja","✨");e.classList.add("active"),F(e),GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/index.php?p=join",onload:n=>{if(200!==n.status||!n.responseText)return void I(e,"Nie udało się załadować formularza rejestracji");const t=(new DOMParser).parseFromString(n.responseText,"text/html").querySelector('form[action*="join"]');if(!t)return void I(e,"Nie znaleziono formularza rejestracji");const o=e.querySelector(".modal-body");o.innerHTML="";const r=document.createElement("div");r.className="auth-modal-form";const a=t.cloneNode(!0);a.action="https://m.fll.pl/index.php?p=join",a.querySelectorAll('input[type="text"], input[type="email"], input[type="password"]').forEach(e=>{e.classList.add("auth-input")});const i=a.querySelector('input[type="submit"]');i&&(i.classList.add("form-button"),i.style.cssText="width:100%;margin-top:15px;padding:14px;font-size:16px;",i.value="✨ Zarejestruj się");const s=a.querySelector(".pnc");s&&(s.style.display="none");const l=document.createElement("div");l.style.cssText="text-align:center;margin-top:15px;padding-top:15px;border-top:1px solid var(--dark-border);",l.innerHTML='<span style="color:var(--text-muted);font-size:13px;">Masz już konto? </span><a href="#" style="color:var(--gold);cursor:pointer;" id="switch-to-login">Zaloguj się</a>',a.appendChild(l),r.appendChild(a),o.appendChild(r);const d=document.createElement("style");d.textContent='\n .auth-modal-form {\n padding: 10px;\n }\n .auth-modal-form form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .auth-input {\n width: 100%;\n padding: 12px 16px;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n color: var(--text-primary);\n font-size: 14px;\n font-family: inherit;\n transition: all 0.2s;\n }\n .auth-input:focus {\n border-color: var(--blood-red);\n box-shadow: 0 0 0 3px var(--blood-red-glow);\n outline: none;\n }\n .auth-modal-form label {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--text-secondary);\n font-size: 13px;\n cursor: pointer;\n }\n .auth-modal-form label a {\n color: var(--gold);\n }\n .auth-modal-form input[type="checkbox"] {\n accent-color: var(--blood-red);\n width: 18px;\n height: 18px;\n }\n ',o.appendChild(d),o.querySelector("#switch-to-login")?.addEventListener("click",n=>{n.preventDefault(),e.remove()}),a.addEventListener("submit",n=>{n.preventDefault();const t=new FormData(a);GM_xmlhttpRequest({method:"POST",url:"https://m.fll.pl/index.php?p=join",data:new URLSearchParams(t).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:n=>{200===n.status&&n.responseText?n.responseText.includes("został utworzony")||n.responseText.includes("zalogowano")||n.responseText.includes("Witaj")?(e.remove(),m("Konto zostało utworzone! Logowanie...","success"),setTimeout(()=>window.location.reload(),1500)):m("Sprawdź poprawność danych","error"):m("Błąd rejestracji","error")},onerror:()=>m("Błąd sieci","error")})})},onerror:()=>I(e,"Błąd sieci")})}();break;case"reset-password":!function(){const e=O("modal-reset","Nie pamiętasz hasła?","🔒");e.classList.add("active"),F(e),GM_xmlhttpRequest({method:"GET",url:"https://m.fll.pl/profile.php?box=reset&re=Lw==",onload:n=>{if(200!==n.status||!n.responseText)return void I(e,"Nie udało się załadować formularza");const t=(new DOMParser).parseFromString(n.responseText,"text/html").querySelector('.form-box form, form[action*="reset"]');if(!t)return void I(e,"Nie znaleziono formularza");const o=e.querySelector(".modal-body");o.innerHTML="";const r=document.createElement("div");r.className="auth-modal-form",r.innerHTML='\n <p style="color:var(--text-secondary);font-size:13px;margin-bottom:20px;text-align:center;">\n Podaj adres e-mail powiązany z profilem, a wyślemy Ci instrukcję resetowania hasła.\n </p>\n ';const a=t.cloneNode(!0);a.querySelectorAll('input[type="text"]').forEach(e=>{e.classList.add("auth-input"),e.placeholder="Twój adres e-mail"});const i=a.querySelector('input[type="submit"], .form-button');i&&(i.classList.add("form-button"),i.style.cssText="width:100%;margin-top:15px;padding:14px;font-size:16px;",i.value="📧 Wyślij instrukcję"),r.appendChild(a),o.appendChild(r);const s=document.createElement("style");s.textContent="\n .auth-modal-form {\n padding: 10px;\n }\n .auth-input {\n width: 100%;\n padding: 12px 16px;\n background: var(--dark-surface);\n border: 1px solid var(--dark-border);\n border-radius: 12px;\n color: var(--text-primary);\n font-size: 14px;\n font-family: inherit;\n transition: all 0.2s;\n }\n .auth-input:focus {\n border-color: var(--blood-red);\n box-shadow: 0 0 0 3px var(--blood-red-glow);\n outline: none;\n }\n ",o.appendChild(s),a.addEventListener("submit",n=>{n.preventDefault();const t=new FormData(a);GM_xmlhttpRequest({method:"POST",url:"https://m.fll.pl/profile.php?box=reset&re=Lw==",data:new URLSearchParams(t).toString(),headers:{"Content-Type":"application/x-www-form-urlencoded"},onload:()=>{e.remove(),m("Instrukcja resetowania hasła została wysłana na podany adres e-mail","success")},onerror:()=>m("Błąd sieci","error")})})},onerror:()=>I(e,"Błąd sieci")})}();break;case"terms":xe("Regulamin serwisu","profile.php?box=reg&re=Lw==");break;case"cookies-policy":xe("Polityka prywatności","profile.php?box=cookies&re=Lw==");break;case"contact":xe("Kontakt","profile.php?box=contact&re=Lw==")}})}),setTimeout(()=>{const e=document.querySelector(".login-input");e&&e.focus()},600)}():t.includes("_id")||t.includes("_token")||t.includes("logout")||t.includes("chat")?window.location.href="https://m.fll.pl/profile.php?p=index":o()}else o()},onerror:()=>o(),ontimeout:()=>o()})}()}function ve(){document.documentElement.style.display="none",l(),document.documentElement.style.display="",U.applyTheme(u.activeColorScheme),document.body.classList.add("dark-scheme");const e=window.location.href,n=new URL(e),t=n.pathname,o=n.search,i=window.location.hostname;if(!("fll.pl"!==i&&"fellow.pl"!==i||i.includes("m.fll.pl")||i.includes("m.fellow.pl")))return u.currentUserId&&u.currentUserToken?void(window.location.href="https://m.fll.pl/dashboard"):void(window.location.href="https://m.fll.pl/");if("/dashboard"===t||"/dashboard/"===t){if(function(){let e=window.location.href;const n=new MutationObserver(()=>{const n=window.location.href;n!==e&&(e=n,setTimeout(()=>{a(),r()},500))});n.observe(document,{subtree:!0,childList:!0}),window._urlObserver=n}(),!document.querySelector(".dashboard-container")){if(c(),!document.querySelector('style[data-src="Fellow Enhanced.user.js"]')){GM_addStyle(H);const e=document.querySelector("head style:not([data-src])");e&&e.textContent&&e.textContent.length>1e3&&e.setAttribute("data-src","Fellow Enhanced.user.js")}de(),Q(),r(),a(),u.autoConnectChat&&setTimeout(()=>W.initializeWebSocket(),2e3)}let e;return d(),window.addEventListener("popstate",()=>me()),he=new MutationObserver(()=>{e&&clearTimeout(e),e=setTimeout(()=>me(),500)}),he.observe(document.body,{childList:!0,subtree:!0}),void fe()}if("/profile.php"===t&&o.includes("p=index"))return void(window.location.href="https://m.fll.pl/dashboard");const s=("/"===t||"/index.php"===t||t.endsWith("/index.php"))&&"/dashboard"!==t,p=o.includes("p=login")||o.includes("p=join")||""===o&&"/"===t||"?"===o,g=o.includes("logout");if(s&&!g&&(!u.currentUserId||p)||p&&!u.currentUserId)return u.currentUserId&&u.currentUserToken?void(window.location.href="https://m.fll.pl/dashboard"):(document.body.classList.add("logowanie-page"),d(),void be());if(c(),!document.querySelector('style[data-src="Fellow Enhanced.user.js"]')){GM_addStyle(H);const e=document.querySelector("head style:not([data-src])");e&&e.textContent&&e.textContent.length>1e3&&e.setAttribute("data-src","Fellow Enhanced.user.js")}let m;document.getElementById("fellow-loading-overlay")||l(),u.currentUserId?(de(),Q(),u.autoConnectChat&&setTimeout(()=>W.initializeWebSocket(),2e3)):k().then(()=>{u.currentUserId?(de(),Q(),setTimeout(async()=>{ge((await W.loadConversationsList()).filter(e=>e.isUnread).length,W.onlineUsersList.length)},2e3),u.autoConnectChat&&setTimeout(()=>W.initializeWebSocket(),2e3)):(d(),document.body.classList.add("logowanie-page"),be())}),window.addEventListener("popstate",()=>{me()}),he=new MutationObserver(()=>{m&&clearTimeout(m),m=setTimeout(()=>me(),500)}),he.observe(document.body,{childList:!0,subtree:!0}),fe()}function fe(){const n=GM_addValueChangeListener(e.SHOW_CALENDAR_WIDGET_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.showCalendarWidget=t,J())}),t=GM_addValueChangeListener(e.SHOW_COMMENTS_WIDGET_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.showCommentsWidget=t,J())}),o=GM_addValueChangeListener(e.SHOW_NOTES_WIDGET_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.showNotesWidget=t,J())}),r=GM_addValueChangeListener(e.SHOW_PLUS_WIDGET_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.showPlusWidget=t,J())}),a=GM_addValueChangeListener(e.COLOR_SCHEME_KEY,(e,n,t,o)=>{o&&t&&n!==t&&(console.log("Motyw zaktualizowany z innej karty:",t),U.applyTheme(t),m("Motyw zaktualizowany z innej karty","info"))}),i=GM_addValueChangeListener(e.MENTION_NOTIFY_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.mentionNotify=t)}),s=GM_addValueChangeListener(e.AUTO_CONNECT_CHAT_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(u.autoConnectChat=t,t&&!W.wsInitialized?W.initializeWebSocket():!t&&W.wsInitialized&&(W.intentionalClose=!0,W.cleanupWebSocket()))}),l=GM_addValueChangeListener(e.SHOW_AVATARS_KEY,(e,n,t,o)=>{o&&void 0!==t&&n!==t&&(console.log("Widoczność awatarów zaktualizowana z innej karty:",t),u.shouldShowAvatars=t,W.updateAvatarVisibility&&W.updateAvatarVisibility())}),d=GM_addValueChangeListener(e.SHOW_RECENT_COMMENTS_KEY,(e,n,t,o)=>{if(o&&void 0!==t&&n!==t){console.log("Widoczność komentarzy zaktualizowana z innej karty:",t),u.showRecentComments=t;const e=document.querySelector(".dashboard-container");e&&e.remove(),X=!1,Q()}}),c=GM_addValueChangeListener(e.FEED_SECTIONS_KEY,(e,n,t,o)=>{if(o&&t&&JSON.stringify(n)!==JSON.stringify(t)){console.log("Sekcje feedu zaktualizowane z innej karty:",t),u.feedSections=t;const e=document.querySelector(".dashboard-container");e&&e.remove(),X=!1,Q()}});W._settingsListeners=[a,l,d,c,s,i,n,t,o,r]}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",ve):ve(),window.addEventListener("beforeunload",()=>{he&&he.disconnect(),window._fellowAdBlockObserver&&window._fellowAdBlockObserver.disconnect(),W.cleanupAllIntervals(),W.webSocket&&W.webSocket.readyState===WebSocket.OPEN&&W.webSocket.close(),document.querySelectorAll('iframe[name*="pb_locator"], iframe[name*="tcfapi"]').forEach(e=>e.remove())})}();