Files
securebit-chat/dist/app.js
T
lockbitchat 4000bde857
CodeQL Analysis / Analyze CodeQL (push) Canceled after 0s
Deploy Application / deploy (push) Canceled after 0s
Mirror to Codeberg / mirror (push) Canceled after 0s
Mirror to PrivacyGuides / mirror (push) Canceled after 0s
v6.8.1: the downloads point at desktop 1.0.3
Desktop 1.0.3 fixes video on a call placed after a group call — the two shared
one peer connection, the second call opened a second video section, and the two
H264 profiles collided, so the call carried sound and no picture. It also ships
the STUN and TURN list this client uses, which is what lets a browser and a
desktop agree on a path instead of one of them offering no relay at all.

The version lives in two places on this side (the landing page and the download
grid), and the consistency test also reads the README badge, the changelog and
the cryptography document, so all of them move together.

Riding along: the group status dot now takes its colour from the theme in the
call and group views, which is what the desktop's copy of groupsStore.js was
compared against.

Claude-Session: https://claude.ai/code/session_019RCW2Fm7dkAaU2zeHDksei
2026-09-11 22:58:20 -04:00

51 lines
345 KiB
JavaScript

function La(t=globalThis.window){return t?.SECUREBIT_DEBUG===!0}function Ls({targetWindow:t=globalThis.window,webrtcManagerRef:e,onClearData:n,clearConsole:r=()=>{typeof console.clear=="function"&&console.clear()}}){return La(t)?(t.forceCleanup=()=>{n(),e.current&&e.current.disconnect()},t.clearLogs=r,t.webrtcManagerRef=e,()=>{delete t.forceCleanup,delete t.clearLogs,delete t.webrtcManagerRef}):()=>{}}var Ba="securebit-net";var Gr="ice-device-key",Wr="ice-settings";function Vr(){return typeof indexedDB<"u"&&typeof crypto<"u"&&!!crypto.subtle}function jr(){return new Promise((t,e)=>{let n;try{n=indexedDB.open(Ba,1)}catch(r){e(r);return}n.onupgradeneeded=()=>{let r=n.result;r.objectStoreNames.contains("kv")||r.createObjectStore("kv")},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function Hr(t,e){return new Promise((n,r)=>{let c=t.transaction("kv","readonly").objectStore("kv").get(e);c.onsuccess=()=>n(c.result),c.onerror=()=>r(c.error)})}function Bs(t,e,n){return new Promise((r,i)=>{let c=t.transaction("kv","readwrite");c.objectStore("kv").put(n,e),c.oncomplete=()=>r(),c.onerror=()=>i(c.error)})}function za(t,e){return new Promise((n,r)=>{let i=t.transaction("kv","readwrite");i.objectStore("kv").delete(e),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}async function Ua(t){let e=await Hr(t,Gr);if(e instanceof CryptoKey)return e;let n=await crypto.subtle.generateKey({name:"AES-GCM",length:256},!1,["encrypt","decrypt"]);return await Bs(t,Gr,n),n}async function zs(t){if(!Vr())throw new Error("Persistent storage is not available in this browser");let e=await jr(),n=await Ua(e),r=JSON.stringify({version:1,servers:Array.isArray(t?.servers)?t.servers:[],privacyMode:t?.privacyMode==="relay-only"?"relay-only":"standard"}),i=crypto.getRandomValues(new Uint8Array(12)),c=await crypto.subtle.encrypt({name:"AES-GCM",iv:i},n,new TextEncoder().encode(r));await Bs(e,Wr,{iv:Array.from(i),data:Array.from(new Uint8Array(c))})}async function Us(){if(!Vr())return null;try{let t=await jr(),e=await Hr(t,Wr);if(!e||!Array.isArray(e.iv)||!Array.isArray(e.data))return null;let n=await Hr(t,Gr);if(!(n instanceof CryptoKey))return null;let r=await crypto.subtle.decrypt({name:"AES-GCM",iv:new Uint8Array(e.iv)},n,new Uint8Array(e.data)),i=JSON.parse(new TextDecoder().decode(r));return{servers:Array.isArray(i.servers)?i.servers:[],privacyMode:i.privacyMode==="relay-only"?"relay-only":"standard"}}catch{return null}}async function $r(){if(Vr())try{let t=await jr();await za(t,Wr)}catch{}}var Mn=["en","de","fr","es","uk","ru","zh","ko","hi","ar","he","fa","ur"],ar={en:{htmlLang:"en",nativeName:"English",abbr:"EN",dir:"ltr",path:"/"},de:{htmlLang:"de",nativeName:"Deutsch",abbr:"DE",dir:"ltr",path:"/de/"},fr:{htmlLang:"fr",nativeName:"Fran\xE7ais",abbr:"FR",dir:"ltr",path:"/fr/"},es:{htmlLang:"es",nativeName:"Espa\xF1ol",abbr:"ES",dir:"ltr",path:"/es/"},uk:{htmlLang:"uk",nativeName:"\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",abbr:"UK",dir:"ltr",path:"/uk/"},ru:{htmlLang:"ru",nativeName:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",abbr:"RU",dir:"ltr",path:"/ru/"},zh:{htmlLang:"zh-Hans",nativeName:"\u7B80\u4F53\u4E2D\u6587",abbr:"ZH",dir:"ltr",path:"/zh/"},ko:{htmlLang:"ko",nativeName:"\uD55C\uAD6D\uC5B4",abbr:"KO",dir:"ltr",path:"/ko/"},hi:{htmlLang:"hi",nativeName:"\u0939\u093F\u0928\u094D\u0926\u0940",abbr:"HI",dir:"ltr",path:"/hi/"},ar:{htmlLang:"ar",nativeName:"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",abbr:"AR",dir:"rtl",path:"/ar/"},he:{htmlLang:"he",nativeName:"\u05E2\u05D1\u05E8\u05D9\u05EA",abbr:"HE",dir:"rtl",path:"/he/"},fa:{htmlLang:"fa",nativeName:"\u0641\u0627\u0631\u0633\u06CC",abbr:"FA",dir:"rtl",path:"/fa/"},ur:{htmlLang:"ur",nativeName:"\u0627\u0631\u062F\u0648",abbr:"UR",dir:"rtl",path:"/ur/"}},Gs={en:{"language.suggest.text":"This page is also available in English.","language.suggest.cta":"Read in English","language.suggest.dismiss":"Dismiss"},de:{"language.suggest.text":"Diese Seite gibt es auch auf Deutsch.","language.suggest.cta":"Auf Deutsch lesen","language.suggest.dismiss":"Schlie\xDFen"},fr:{"language.suggest.text":"Cette page est aussi disponible en fran\xE7ais.","language.suggest.cta":"Lire en fran\xE7ais","language.suggest.dismiss":"Fermer"},es:{"language.suggest.text":"Esta p\xE1gina tambi\xE9n est\xE1 disponible en espa\xF1ol.","language.suggest.cta":"Leer en espa\xF1ol","language.suggest.dismiss":"Cerrar"},uk:{"language.suggest.text":"\u0426\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0442\u0430\u043A\u043E\u0436 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u043E\u044E.","language.suggest.cta":"\u0427\u0438\u0442\u0430\u0442\u0438 \u0443\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u043E\u044E","language.suggest.dismiss":"\u0417\u0430\u043A\u0440\u0438\u0442\u0438"},ru:{"language.suggest.text":"\u042D\u0442\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0442\u0430\u043A\u0436\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u043E\u043C.","language.suggest.cta":"\u0427\u0438\u0442\u0430\u0442\u044C \u043F\u043E-\u0440\u0443\u0441\u0441\u043A\u0438","language.suggest.dismiss":"\u0417\u0430\u043A\u0440\u044B\u0442\u044C"},zh:{"language.suggest.text":"\u672C\u9875\u9762\u4E5F\u6709\u7B80\u4F53\u4E2D\u6587\u7248\u672C\u3002","language.suggest.cta":"\u9605\u8BFB\u7B80\u4F53\u4E2D\u6587","language.suggest.dismiss":"\u5173\u95ED"},ko:{"language.suggest.text":"\uC774 \uD398\uC774\uC9C0\uB294 \uD55C\uAD6D\uC5B4\uB85C\uB3C4 \uBCFC \uC218 \uC788\uC2B5\uB2C8\uB2E4.","language.suggest.cta":"\uD55C\uAD6D\uC5B4\uB85C \uBCF4\uAE30","language.suggest.dismiss":"\uB2EB\uAE30"},hi:{"language.suggest.text":"\u092F\u0939 \u092A\u0943\u0937\u094D\u0920 \u0939\u093F\u0928\u094D\u0926\u0940 \u092E\u0947\u0902 \u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0939\u0948\u0964","language.suggest.cta":"\u0939\u093F\u0928\u094D\u0926\u0940 \u092E\u0947\u0902 \u092A\u0922\u093C\u0947\u0902","language.suggest.dismiss":"\u092C\u0902\u0926 \u0915\u0930\u0947\u0902"},ar:{"language.suggest.text":"\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062D\u0629 \u0645\u062A\u0648\u0641\u0631\u0629 \u0623\u064A\u0636\u064B\u0627 \u0628\u0627\u0644\u0639\u0631\u0628\u064A\u0629.","language.suggest.cta":"\u0627\u0642\u0631\u0623 \u0628\u0627\u0644\u0639\u0631\u0628\u064A\u0629","language.suggest.dismiss":"\u0625\u063A\u0644\u0627\u0642"},he:{"language.suggest.text":"\u05D4\u05D3\u05E3 \u05D4\u05D6\u05D4 \u05D6\u05DE\u05D9\u05DF \u05D2\u05DD \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA.","language.suggest.cta":"\u05DC\u05E7\u05E8\u05D9\u05D0\u05D4 \u05D1\u05E2\u05D1\u05E8\u05D9\u05EA","language.suggest.dismiss":"\u05E1\u05D2\u05D9\u05E8\u05D4"},fa:{"language.suggest.text":"\u0627\u06CC\u0646 \u0635\u0641\u062D\u0647 \u0628\u0647 \u0641\u0627\u0631\u0633\u06CC \u0647\u0645 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0627\u0633\u062A.","language.suggest.cta":"\u062E\u0648\u0627\u0646\u062F\u0646 \u0628\u0647 \u0641\u0627\u0631\u0633\u06CC","language.suggest.dismiss":"\u0628\u0633\u062A\u0646"},ur:{"language.suggest.text":"\u06CC\u06C1 \u0635\u0641\u062D\u06C1 \u0627\u0631\u062F\u0648 \u0645\u06CC\u06BA \u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u06C1\u06D2\u06D4","language.suggest.cta":"\u0627\u0631\u062F\u0648 \u0645\u06CC\u06BA \u067E\u0691\u06BE\u06CC\u06BA","language.suggest.dismiss":"\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA"}};var Ga={"language.label":"Language","language.suggest.text":"This page is also available in English.","language.suggest.cta":"Read in English","language.suggest.dismiss":"Dismiss","theme.label":"Theme","theme.system":"System","theme.light":"Light","theme.dark":"Dark","community.title":"Join the future of privacy","community.description":"SecureBit grows thanks to its community. Your ideas and feedback shape the future of secure communication - built in the open, with complete ASN.1 validation end-to-end.","community.github":"GitHub Repository","community.feedback":"Feedback","unique.eyebrow":"What sets us apart","unique.heading":"Why SecureBit is unique","unique.s1.titleTop":"Layered","unique.s1.titleBottom":"encryption core","unique.s1.collapsed":"Encryption core","unique.s1.desc":"ECDH P-384 key exchange, AES-256-GCM payloads, ECDSA signatures and full ASN.1 validation - composed into one hardened pipeline.","unique.s1.tags":["ECDH P-384","AES-256-GCM","ECDSA","ASN.1"],"unique.s2.titleTop":"Pure P2P","unique.s2.titleBottom":"WebRTC","unique.s2.collapsed":"Pure P2P WebRTC","unique.s2.desc":"Messages travel directly between devices over WebRTC. No relay holds your data - the server only helps two peers find each other.","unique.s2.tags":["DTLS 1.3","No relay"],"unique.s3.titleTop":"Perfect","unique.s3.titleBottom":"forward secrecy","unique.s3.collapsed":"Forward secrecy","unique.s3.desc":"Session keys rotate continuously and are discarded after use, so a single compromised key can never unlock past conversations.","unique.s3.tags":["Ephemeral keys","Auto-rotate"],"unique.s4.titleTop":"Traffic","unique.s4.titleBottom":"obfuscation","unique.s4.collapsed":"Traffic obfuscation","unique.s4.desc":"Packet sizes and timing are padded and randomized, hiding metadata patterns from anyone watching the wire.","unique.s4.tags":["Packet padding","Timing jitter"],"unique.s5.titleTop":"Zero data","unique.s5.titleBottom":"collection","unique.s5.collapsed":"Zero data collection","unique.s5.desc":"No accounts, no logs, no message storage. There is nothing on a server to leak, subpoena, or sell.","unique.s5.tags":["No accounts","No logs"],"partners.eyebrow":"Partners & ecosystem","partners.heading":"Trusted by our partners","partners.aegis.desc":"Capital partner securing confidential financial communications across its portfolio.","partners.aegis.role":"Strategic backer","partners.furilabs.desc":"Privacy-first Linux phones that ship SecureBit as a default secure channel.","partners.furilabs.role":"Technology partner","partners.inviteTitle":"Become a partner","partners.inviteDesc":"Building privacy hardware or infrastructure? Let's integrate SecureBit.","partners.inviteCta":"Start a conversation","roadmap.eyebrow":"Development Roadmap","roadmap.heading":"The evolution of SecureBit","roadmap.subheading":"From the first prototype to a quantum-resistant, decentralized network - with complete ASN.1 validation at every layer.","roadmap.progress":"{shipped} of {total} milestones shipped","roadmap.upcoming":"{upcoming} on the way","roadmap.keyFeatures":"Key features","roadmap.status.released":"Released","roadmap.status.current":"Current","roadmap.status.dev":"In development","roadmap.status.planned":"Planned","roadmap.status.research":"Research","hero.headlineTop":"A direct line","hero.headlineBottom":"only you two can read.","hero.subheading":"Keys are generated on your device and exchanged peer-to-peer. No accounts, no servers storing your messages.","hero.diagramAlt":"A direct encrypted line to one peer, with two more peers joining the mesh","intro.createTitle":"Create a new channel","intro.createDesc":"Your device generates the keys and a one-time invitation. Nothing touches a server.","intro.createCta":"Generate keys & invitation","intro.joinTitle":"Join a channel","intro.scanTitle":"Scan QR with camera","intro.scanSubtitle":"Fastest - point at your peer's screen","intro.orPasteCode":"or paste code","intro.pastePlaceholder":"Paste invitation code here\u2026","intro.connect":"Connect","intro.connecting":"Processing\u2026","roadmap.r1.title":"Start of Development","roadmap.r1.sub":"Idea, prototype, and infrastructure setup","roadmap.r1.date":"Early 2025","roadmap.r1.features":["Concept and requirements formation","Stack selection: WebRTC, P2P, cryptography","First messaging prototypes","Repository creation and CI","Basic encryption architecture","UX/UI design"],"roadmap.r2.title":"Alpha Release","roadmap.r2.sub":"First public alpha: basic chat and key exchange","roadmap.r2.date":"Spring 2025","roadmap.r2.features":["Basic P2P messaging via WebRTC","Simple E2E encryption (demo scheme)","Stable signaling and reconnection","Minimal UX for testing","Feedback collection from early testers"],"roadmap.r3.title":"Security Hardened","roadmap.r3.sub":"Security strengthening and stable branch release","roadmap.r3.date":"Summer 2025","roadmap.r3.features":["ECDH/ECDSA implementation in production","Perfect Forward Secrecy and key rotation","Improved authentication checks","File encryption and large payload transfers","Audit of basic cryptoprocesses"],"roadmap.r4.title":"Scaling & Stability","roadmap.r4.sub":"Network scaling and stability improvements","roadmap.r4.date":"Fall 2025","roadmap.r4.features":["Optimization of P2P connections and NAT traversal","Reconnection mechanisms and message queues","Reduced battery consumption on mobile","Multi-device synchronization support","Monitoring and logging tools for developers"],"roadmap.r5.title":"Privacy-first Release","roadmap.r5.sub":"Focus on privacy: minimizing metadata","roadmap.r5.date":"Winter 2025","roadmap.r5.features":["Metadata protection and fingerprint reduction","Experiments with onion routing and DHT","Options for anonymous connections","Preparation for open code audit","Improved user verification processes"],"roadmap.r6.title":"Enhanced Security Edition","roadmap.r6.sub":"18-layer military-grade cryptography with complete ASN.1 validation","roadmap.r6.date":"Late 2025","roadmap.r6.features":["ECDH + DTLS + SAS triple-layer security","ECDH P-384 + AES-GCM 256-bit encryption","DTLS fingerprint verification","SAS (Short Authentication String) verification","Perfect Forward Secrecy with key rotation","Enhanced MITM attack prevention","Complete ASN.1 DER validation","OID and EC point verification","SPKI structure validation","P2P WebRTC architecture","Metadata protection","100% open source code"],"roadmap.r7.title":"Desktop Edition","roadmap.r7.sub":"Native desktop apps for Windows, macOS, and Linux","roadmap.r7.date":"Early 2026","roadmap.r7.features":["Windows desktop app (Tauri v2)","macOS desktop app (Tauri v2)","Linux AppImage support (Tauri v2)","Real-time notifications","Automatic reconnection","Cross-device synchronization","Improved UX/UI","Support for files up to 100MB"],"roadmap.r8.title":"Secure Voice & Calls","roadmap.r8.sub":"Encrypted voice messages, audio calls, and video calls","roadmap.r8.date":"Early 2026","roadmap.r8.features":["End-to-end encrypted voice messages","1:1 encrypted audio calls (WebRTC)","1:1 encrypted video calls (WebRTC)","Perfect Forward Secrecy for live media","SRTP/DTLS-protected media streams","In-call SAS verification","Call notifications and auto-reconnection","Low-latency P2P media"],"roadmap.r9.title":"Group Communications","roadmap.r9.sub":"Group chats with preserved privacy","roadmap.r9.date":"Now","roadmap.r9.features":["P2P group chats up to 8 participants","Mesh delivery with signed relay fallback","One group safety code, compared by everyone","Commit-then-reveal ceremony against code grinding","Per-group identity keys, ephemeral by design","Signed membership with epoch ordering","Signed messages, so a split transcript is provable","No server, no shared group key, no history"],"roadmap.r10.title":"Mobile Edition","roadmap.r10.sub":"Native mobile apps for iOS and Android","roadmap.r10.date":"Q2 2027","roadmap.r10.features":["iOS native app (Swift/SwiftUI)","Android native app (Kotlin/Jetpack Compose)","PWA support for mobile browsers","Real-time push notifications","Battery optimization","Mobile-optimized UX/UI","Offline message queuing","Biometric authentication"],"roadmap.r11.title":"Quantum-Resistant Edition","roadmap.r11.sub":"Protection against quantum computers","roadmap.r11.date":"Q4 2027","roadmap.r11.features":["Post-quantum cryptography CRYSTALS-Kyber","SPHINCS+ digital signatures","Hybrid scheme: classic + PQ","Quantum-safe key exchange","Updated hashing algorithms","Migration of existing sessions","Compatibility with v5.x","Quantum-resistant protocols"],"roadmap.r12.title":"Decentralized Network","roadmap.r12.sub":"Fully decentralized network","roadmap.r12.date":"2028","roadmap.r12.features":["Node mesh network","DHT for peer discovery","Built-in onion routing","Tokenomics and node incentives","Governance via DAO","Interoperability with other networks","Cross-platform compatibility","Self-healing network"],"roadmap.r13.title":"AI Privacy Assistant","roadmap.r13.sub":"AI for privacy and security","roadmap.r13.date":"2028+","roadmap.r13.features":["Local AI threat analysis","Automatic MITM detection","Adaptive cryptography","Personalized security recommendations","Zero-knowledge machine learning","Private AI assistant","Predictive security","Autonomous attack protection"],"handshake.step1":"Generating ECDH P-384 key pair","handshake.step2":"Deriving verification code","handshake.step3":"Pinning Perfect Forward Secrecy","handshake.securingTitle":"Securing your channel","handshake.answerTitle":"Building your answer","handshake.securingDesc":"Forging keys strong enough to resist tampering.","handshake.shareTitle":"Share your invitation","handshake.sendAnswerTitle":"Send back your answer","handshake.shareDesc":"Show the QR or send the code to your peer. It is one-time and expires shortly.","handshake.sendAnswerDesc":"Give this answer to the channel creator so they can finish the handshake.","handshake.establish":"Establish connection","handshake.thenReceive":"Then receive the answer your peer sends back","handshake.pasteAnswerPlaceholder":"Paste peer's answer code\u2026","handshake.answerSentNote":"Send this answer to the creator, then wait - the chat opens once they connect.","handshake.qrHint":"Keep this open until your peer captures the code.","handshake.qrHintFrames":"The handshake is split across {frames} frames - keep this open until your peer captures all of them.","verify.title":"Security verification","verify.desc":"Compare this safety code with your peer over a separate channel (voice / in person), then type it to unlock the chat.","verify.enterLabel":"Enter the verified code","verify.placeholder":"Type code here","verify.confirm":"Confirm code","verify.confirmed":"Confirmed","verify.mismatch":"Don't match","verify.yours":"Your confirmation","verify.peer":"Peer confirmation","verify.pending":"Pending","verify.waiting":"Waiting for code\u2026","verify.verified":"Channel verified","verify.bothConfirmed":"Both parties confirmed. Opening the secure chat\u2026","pwa.bannerTitle":"Install SecureBit.chat","pwa.bannerDesc":"Get the native app experience with enhanced security","pwa.install":"Install","pwa.dismiss":"Dismiss","pwa.close":"Close","pwa.iosTitle":"Install on iOS","pwa.iosStep1":"Tap the Share button","pwa.iosStep1Hint":"Usually at the bottom of Safari","pwa.iosStep2":'Find "Add to Home Screen"',"pwa.iosStep2Hint":"Scroll down in the share menu","pwa.iosStep3":'Tap "Add"',"pwa.iosStep3Hint":"Confirm to install SecureBit.chat","pwa.genericTitle":"Install SecureBit","pwa.genericDesc":"Your browser handles installs its own way. Pick the steps that match yours.","pwa.androidChromeHint":"Tap \u22EE in the top corner, then \u201CInstall app\u201D","pwa.androidOtherHint":"Tap the menu, then \u201CAdd to Home screen\u201D","pwa.gotIt":"Got it","pwa.installedTitle":"App Installed!","pwa.installedIos":"iOS App installed! Open from home screen.","pwa.installedGeneric":"SecureBit.chat is now on your device","pwa.anytimeTitle":"Install Anytime","pwa.anytimeDesc":"You can still install SecureBit.chat from your browser's menu for the best experience.","pwa.ok":"OK","step.open":"Step 1 \xB7 open a channel","step.exchange":"Step 2 \xB7 exchange","step.verification":"Step 3 \xB7 verification","action.create":"Create","action.join":"Join","action.back":"Back","action.copy":"Copy","action.copied":"Copied","action.scan":"Scan","action.downloadDesktop":"Download desktop app","action.advancedSettings":"Advanced settings","cred.offerTag":"offer \xB7 or copy text","cred.answerTag":"answer \xB7 or copy text","cred.reveal":"Click to reveal - keep this code private","qr.title":"Scan QR code","qr.subtitle":"Point your camera at their QR","qr.scanning":"Scanning\u2026","qr.hint":"Hold steady until all parts are captured. Camera access is local - nothing is uploaded.","mesh.you":"you","mesh.peer":"peer \xB7 session 1","mesh.joined2":"mara joined \xB7 +2","mesh.joined3":"tobi joined \xB7 +3","ice.title":"Network settings","ice.subtitle":"Configured locally - never shared with your peer","ice.intro":"SecureBit uses public STUN servers by default to negotiate the peer-to-peer link. Point it at your own STUN/TURN if you self-host.","ice.publicTitle":"Public servers (default)","ice.publicDesc":"Zero-config. Good for most users.","ice.customTitle":"My own STUN/TURN servers","ice.customDesc":"Up to {max} servers.","ice.turnNote":"A TURN relay sees both peers' IP and traffic timing - but never message contents, which stay end-to-end encrypted. Prefer ","ice.turnNoteTls":" (TLS).","ice.test":"Test servers","ice.testing":"Testing\u2026","ice.relayTitle":"Relay-only mode","ice.relayBadge":"MAX PRIVACY","ice.relayDesc":"Routes all traffic through TURN so your IP is never exposed to the peer. Requires a TURN server.","ice.relayWarning":"Relay-only is enabled but no TURN server is configured. The connection will not be able to start.","ice.persist":"Save on this device","ice.persistDesc":"Stored encrypted in this browser. Leave off to use only for this session.","ice.forget":"Forget saved","ice.cancel":"Cancel","ice.apply":"Apply","ice.errUnavailable":"WebRTC is not available in this browser","ice.errInvalid":"Invalid server configuration","update.title":"Update available","update.desc":"A newer version of SecureBit has been detected.","update.currentVersion":"Current version","update.newVersion":"New version","update.now":"Update now","update.later":"Later","update.unknown":"N/A","update.stepSaving":"Saving data...","update.stepSwCaches":"Clearing Service Worker caches...","update.stepSwUnregister":"Unregistering Service Workers...","update.stepBrowserCache":"Clearing browser cache...","update.stepVersion":"Updating version...","update.stepReload":"Reloading application...","update.error":"Update error. Please refresh the page manually (Ctrl+F5 or Cmd+Shift+R)","update.confirmSkip":"New version available. Update is recommended for security and stability. Continue without update?","offline.backOnline":"Back online","offline.mode":"Offline mode","offline.dismiss":"Dismiss","offline.lostTitle":"Connection lost","offline.lostDesc":"SecureBit is now in offline mode. Some features are limited, but your data stays safe.","offline.point1":"Your session and keys are preserved","offline.point2":"No data is stored on servers","offline.point3":"Messages & files sync when you reconnect","offline.continue":"Continue offline","offline.restoredTitle":"When you reconnect","offline.restoredDesc":"A dropped connection costs you nothing. SecureBit queues everything locally and resumes the encrypted session the instant you're back online.","offline.r1Title":"Your messages get delivered","offline.r1Desc":"Everything you wrote while offline is sent to your contact automatically.","offline.r2Title":"Files finish transferring","offline.r2Desc":"Uploads resume from where they stopped - no need to resend.","offline.r3Title":"Their messages & files arrive","offline.r3Desc":"Whatever your contact sent during the outage is delivered to you in order.","offline.r4Title":"Nothing is lost","offline.r4Desc":"After reconnect there's no gap - the conversation continues exactly where it paused.","offline.gotIt":"Got it","qr.showTitle":"Show QR code","qr.showSubtitle":"Full-screen \xB7 let your peer scan","qr.showSubtitleFrames":"Full-screen \xB7 let your peer scan all {frames} frames","notify.enabledBody":"Notifications enabled! You will receive alerts for new messages.","notify.workingBody":"Notifications are working! You will receive alerts for new messages.","pw.label":"Password input","pw.placeholder":"Enter password...","pw.decrypt":"Decrypt","pw.cancel":"Cancel","file.title":"File transfers","file.drop":"Drag & drop files here","file.dropHint":"Encrypted end-to-end before transfer \xB7 up to 100 MB","file.browse":"Browse device","file.incoming":"Incoming file request","file.accept":"Accept","file.reject":"Reject","file.download":"Download","file.notReady":"Connection not ready","file.tooLarge":"File too large","file.typeNotAllowed":"File type not allowed","file.maxConcurrent":"Maximum concurrent transfers","file.gone":"This file is no longer available for download.","call.incoming":"Incoming call","call.incomingVideo":"Incoming video call","call.encrypted":"Encrypted call","call.encryptedShort":"Encrypted","call.peer":"Secure peer","call.connecting":"Connecting\u2026","call.ringing":"Ringing\u2026","call.accept":"Accept","call.decline":"Decline","call.end":"End call","call.camera":"Camera","call.cameraOff":"Camera off","call.peerCameraOff":"Peer's camera is off","call.flipCamera":"Flip camera","call.addVideo":"Add video","call.video":"Video","call.muted":"Muted","call.expand":"Expand","call.minimize":"Minimize","call.quality":"Connection quality","call.qualityExcellent":"Excellent","call.videoPrefix":"Video \xB7 ","call.voicePrefix":"Voice \xB7 ","group.new":"New group","group.create":"Create group","group.join":"Join group","group.name":"Group name","group.nameTooLong":"The group name is too long.","group.capacity":"Up to {max} people, peer to peer. Everyone will compare one safety code before the group opens.","group.invite":"Invite","group.inviteMore":"Invite more members","group.invitePeople":"Invite {count} people","group.invitation":"Group invitation","group.addMembers":"Add members","group.roomFor":"Room for {remaining} more. Everyone will compare a new group code once they join.","group.membersCount":"{count} members","group.member":"Member","group.members":"Members","group.remove":"Remove {name}","group.message":"Message {name}","group.leave":"Leave","group.leaveThis":"Leave this group","group.cancel":"Cancel group","group.close":"Close","group.cancelBtn":"Cancel","group.decline":"Decline","group.working":"Working\u2026","group.sasTitle":"Group safety code","group.sasEveryone":"Everyone sees this code","group.sasCompare":"Compare the group code with every member to open this group.","group.sasReadAloud":"Read these digits aloud to ","group.sasWarning":"If even one member reads a different code, someone is sitting between you. Cancel the group - do not confirm.","group.confirmFirst":"Confirm the group code first","group.codeSuffix":" \xB7 code {code}","group.exchangingNonces":"Exchanging nonces\u2026","group.waitingCommit":"Waiting for every member to commit\u2026","group.waitingJoin":"Waiting for the other members to join\u2026","group.emptyChat":"Nothing here yet. Messages are signed by their sender and travel over each member's own encrypted link.","group.noVerified":"No verified chats yet. Open a 1:1 chat and compare its safety code first - a group is built out of connections you have already checked.","group.noMoreToAdd":"No other verified chats to add. Open a 1:1 chat and compare its safety code first.","group.directLink":"Direct peer-to-peer link","group.noDirectLink":"No direct link yet - messages are relayed by another member while one is being built","group.relayNote":"Some members have no direct link to you yet. Their messages travel through another member, who can see that you are talking but cannot read past the signature or change what you said. The group keeps trying to connect them directly.","group.relayOnlyOff":"Relay-only mode is off, so each member connects to you directly and learns your IP address - including members somebody else invited. Turn it on in network settings if that matters here.","group.memberOffline":"{name} is offline and will not receive messages. They are still a member - removing them re-keys the group.","group.joinNote":"Other members will learn your presence in this group. There is no message history to catch up on - a group starts empty.","group.inviteSentNote":"The group keeps working until they accept. There is no history for them to catch up on - they will only see what is sent from now on.","group.errNotCreated":"Group not created","group.errNobodyAccepted":"Nobody accepted the invitation in time.","group.errNothingSent":"Nothing was sent and nothing was verified. Close this and try again once everyone is connected.","group.errNotFormed":"This group could not be formed.","group.errFull":"This group is full.","group.errInviteFailed":"The invitation could not be sent - that chat is not connected.","group.errNoMemberList":"The group owner never sent the member list.","group.errUnsignedList":"The member list was not signed by the group owner. Do not retry - tell them.","group.errNotOwner":"Someone other than the group owner tried to change the members.","hdr.tagline":"End-to-end encrypted","hdr.netSettings":"Advanced network settings","hdr.netSettingsTitle":"Advanced network settings (STUN/TURN)","hdr.disconnect":"Disconnect","status.connected":"Connected","status.connecting":"Connecting...","status.notConnected":"Not connected","status.reconnecting":"Reconnecting...","status.retrying":"Retrying...","status.verifying":"Verifying...","status.peerDisconnected":"Peer disconnected","sec.replayProtection":"Replay Protection","sec.messageIntegrity":"Message Integrity (HMAC)","sec.forwardSecrecy":"Perfect Forward Secrecy","sec.metadataProtection":"Metadata Protection","sec.trafficObfuscation":"Traffic Obfuscation","sec.realTests":"Real Cryptographic Tests","sec.simulatedData":"Simulated Data","sec.testPassed":"Test passed","sec.testFailed":"Test failed or unavailable","sec.verificationDone":"Real cryptographic verification completed","sec.verificationInProgress":"Security verification in progress...","sec.verificationWait":`Security verification in progress...
Please wait for real-time cryptographic verification to complete.`,"sec.verificationUnavailable":"Security verification not available","chat.placeholder":"Type an encrypted message\u2026","chat.send":"Send message","chat.sendFiles":"Send files","chat.hideFiles":"Hide files","chat.recordVoice":"Record voice message","chat.sendVoice":"Send voice message","chat.discard":"Discard","chat.codeBlock":"Send as a code block (expands the input)","chat.codeHint":"Code snippet \xB7 formatting preserved \xB7 \u2318\u21B5 to send","chat.viewOnce":"View once","chat.viewOnceTitle":"View once - vanishes after the peer reads it","chat.viewOncePrefix":"View once \xB7 ","chat.viewOnceTap":"View once \xB7 tap to reveal","chat.viewedOnce":"Viewed once","chat.disappearing":"Disappearing message - deletes on both sides","chat.disappearAfter":"Disappear after","chat.visibleFor":"Visible for","chat.timerPrefix":"Timer \xB7 ","chat.expired":"This message has expired","chat.deleteForEveryone":"Delete for everyone","chat.sending":"Sending","chat.delivered":"Delivered","chat.notSent":"Not sent","chat.notSentReason":"Not sent - the secure channel is not ready. Reconnect to continue.","chat.encrypted":"Encrypted","chat.decrypted":"Decrypted","chat.encryptedOnDevice":"Encrypted on your device","chat.uploading":"Uploading","chat.downloading":"Downloading","chat.transferring":"Transferring\u2026","chat.copied":"Copied!","chat.collapse":"Collapse","chat.closeMenu":"Close menu","chat.newChat":"New chat","chat.newGroup":"New group","chat.createGroup":"Create a group","chat.groupChats":"Group chats","chat.secureChat":"Secure chat","chat.nameThis":"Name this chat","chat.rename":"Rename chat (local only)","chat.renameHint":"Double-click to rename","chat.localLabel":"Local label \xB7 stored only on this device","chat.setStatus":"Set your status","chat.yourStatusPrefix":"Your status - ","chat.meshHint":"Up to 8 peers \xB7 P2P mesh","chat.offline":"Offline","chat.noNetwork":"No network \xB7 reconnecting","chat.startVoiceCall":"Start encrypted voice call","chat.startVideoCall":"Start encrypted video call","chat.verifyForCalls":"Verify the session to enable calls","chat.e2eeNote":"Every message is end-to-end encrypted on your device before it leaves.","chat.peersOnly":"Sent end-to-end to connected peers only - never stored on a server.","flow.invitationCreated":"Secure invitation created","flow.invitationCreatedBang":"Secure invitation created and encrypted!","flow.responseCreated":"Secure response created","flow.responseCreatedBang":"Secure response created!","flow.sendInvitation":"Send the invitation code to your interlocutor via a secure channel (voice call, SMS, etc.).","flow.sendResponse":"Send the response code to the initiator via a secure channel or let them scan the QR code below.","flow.sendEncryptedCode":"Send the encrypted code","flow.sendTheResponse":"Send the response","flow.pasteOrWrite":"Paste or write code\u2026","flow.processingInvitation":"Processing the secure invitation...","flow.processingResponse":"Processing the secure response...","flow.finalizing":"Finalizing the secure connection...","flow.channelEstablished":"Secure channel established","flow.channelReady":"Secure channel is ready","flow.restoring":"Restoring connection\u2026","flow.invitationCaptured":"Invitation captured.","err.needInvitation":"You need to insert the invitation code from your interlocutor.","err.needResponse":"You need to insert the response code from your interlocutor.","err.responseFormat":"Invalid response format - please check the code","err.responseNoKey":"Invalid response code - missing or corrupted cryptographic key. Please check the code and try again.","err.responseNoSignKey":"Invalid response code - missing signature verification key. Please check the code and try again.","err.responseOutdated":"Response data is outdated - please use a fresh invitation","err.setupError":"Connection setup error","err.notReady":"Connection not ready","err.securityBreach":"Security breach detected - connection rejected","err.securityValidation":"Security validation failed - possible attack detected","err.retiredQr":"This QR code uses a retired format that could not transfer the invitation. Ask your peer to generate a new one, or use copy/paste.","err.compressedQrNote":"Compressed QR may omit SDP for brevity. Use copy/paste if connection fails.","err.inviteNotConnected":"The invitation could not be sent. That chat is not connected right now.","err.inviteNotConnectedRetry":"The invitation could not be sent. That chat is not connected right now - reopen it and try again.","err.nobodyAccepted":"Nobody accepted the invitation. The group is unchanged.","err.noAudio":"No audio captured - check microphone permission and try again.","err.voiceNeedsConnection":"Voice message needs an active secure connection. Reconnect and try again.","err.voiceRestoring":"Restoring the connection - try sending the voice message again in a moment.","err.fileTooLarge":"File too large","sas.safetyNumber":"Safety number","sas.incorrect":"Incorrect code. Check it with your peer and try again.","sas.noMatch":"The codes do not match","sas.makeSure":"Make sure the codes match exactly.","sas.tooManyAttempts":"Too many incorrect attempts. Session reset for safety.","sas.verificationFailed":"Verification failed","sas.verified":"Verified \xB7 Perfect Forward Secrecy","sas.runVerification":"Run security verification","sec.panelTitle":"Network & crypto details","sec.security":"Security","sec.transport":"Transport","sec.keyExchange":"Key exchange","sec.allEnabled":"All security features enabled by default","sec.realTimeNote":"Real-time verification using actual cryptographic functions - no mock data.","sec.simulatedWarning":"Warning: connection may not be fully established - values may be simulated.","dl.title":"Download SecureBit","dl.free":"Free \xB7 open source","dl.soon":"Mobile (iOS, Android) and browser extensions (Chrome, Firefox, Opera) are coming soon.","chatHdr.chat":"Chat","chatHdr.chats":"Chats","chatHdr.newChat":"+ New","chatHdr.secure":"Secure","chatHdr.p2pSub":"P2P \xB7 end-to-end encrypted","chatHdr.save":"Save","chatHdr.close":"Close","chatHdr.expand":"Expand","chatHdr.you":"You","chatHdr.qrCode":"QR code","chat.disconnected":"Disconnected","call.mute":"Mute","call.endShort":"End","group.add":"Add","group.send":"Send","sec.pfsShort":"Perfect Forward Secrecy","sec.cipher":"Cipher","chat.close":"Close","file.needConnection":"File transfer needs an open connection","presence.available":"Available","presence.away":"Away","presence.busy":"Busy","presence.offline":"Offline","presence.invisible":"Invisible","presence.availableDesc":"Online and reachable","presence.awayDesc":"Idle \xB7 stepped away","presence.busyDesc":"Do not disturb","presence.invisibleDesc":"Appear offline to peers","presence.online":"Online","conn.p2p":"P2P \xB7 connected","conn.verifying":"Verifying\u2026","conn.connecting":"Connecting\u2026","conn.reconnecting":"Reconnecting\u2026","conn.peerDisconnected":"Peer disconnected","conn.disconnected":"Disconnected","chat.defaultLabel":"Chat","groupPhase.forming":"Forming\u2026","groupPhase.commitments":"Exchanging commitments\u2026","groupPhase.revealing":"Revealing\u2026","groupPhase.compare":"Compare the group code","groupPhase.ready":"Group ready","groupPhase.failed":"Group failed","call.qualityGood":"Good","call.qualityFair":"Fair","call.qualityWeak":"Weak","msg.code":"Code","msg.timer":"Timer","msg.voice":"Voice","msg.play":"Play","msg.sent":"Sent","msg.read":"Read","report.title":"Real-time security verification","report.active":"Active","report.testsPassed":"Tests passed","report.verifiedAt":"Verified at","report.source":"Source","secTest.verifyECDHKeyExchange":"ECDH key exchange","secTest.verifyECDSASignatures":"ECDSA digital signatures","secTest.verifyEncryption":"AES-GCM encryption","secTest.verifyMessageIntegrity":"Message integrity","secTest.verifyPerfectForwardSecrecy":"Perfect forward secrecy","secTest.verifyPFS":"Perfect forward secrecy","secTest.verifyReplayProtection":"Replay protection","secTest.verifyDTLSFingerprint":"DTLS fingerprint","secTest.verifySASVerification":"SAS verification","secTest.verifyMetadataProtection":"Metadata protection","secTest.verifyTrafficObfuscation":"Traffic obfuscation","secTest.verifyPacketPadding":"Packet padding","secTest.verifyNestedEncryption":"Nested encryption","secTest.verifyNonExtractableKeys":"Non-extractable keys","secTest.verifyRateLimiting":"Rate limiting","secTest.verifyMutualAuth":"Mutual authentication","secTest.verifyAuthProof":"Authentication proof","secTest.verifyEnhancedValidation":"Enhanced validation","secTest.verifyAdvancedFeatures":"Advanced features","secTest.verifySignature":"Signature check","secDetail.Security system initializing...":"Security system initializing...","secDetail.Nested encryption active":"Nested encryption active","secDetail.Nested encryption failed":"Nested encryption failed","secDetail.Packet padding active":"Packet padding active","secDetail.Packet padding failed":"Packet padding failed","secDetail.Advanced features active":"Advanced features active","secDetail.Advanced features failed":"Advanced features failed","secDetail.No encryption key available":"No encryption key available","secDetail.AES-GCM encryption/decryption working correctly":"AES-GCM encryption/decryption working correctly","secDetail.No ECDH key pair available":"No ECDH key pair available","secDetail.Key derivation failed":"Key derivation failed","secDetail.No ECDSA key pair available":"No ECDSA key pair available","secDetail.ECDSA digital signatures working correctly":"ECDSA digital signatures working correctly","secDetail.MAC key not available or invalid":"MAC key not available or invalid","secDetail.Rate limiter did not block a message over the limit":"Rate limiter did not block a message over the limit","secDetail.Rate limiter is not available":"Rate limiter is not available","secDetail.Replay protection is working correctly":"Replay protection is working correctly","secDetail.Replay protection not enabled":"Replay protection not enabled","secDetail.SAS code not available":"SAS code not available","secDetail.SAS verification code is valid and available":"SAS verification code is valid and available","secDetail.Traffic obfuscation is working correctly":"Traffic obfuscation is working correctly","secDetail.Traffic obfuscation not enabled":"Traffic obfuscation not enabled","secDetail.No non-extractable ephemeral ECDH key pair for this session":"No non-extractable ephemeral ECDH key pair for this session","secDetail.Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation":"Session-level PFS only: keys are ephemeral per session, but the Double Ratchet is not active for this connection (peer on an older version), so a compromised session key exposes the whole conversation","msg.pause":"Pause","msg.failed":"Failed","groupErr.timeout":"A member stopped responding before the code was ready.","groupErr.keyMismatch":"A member's key did not match the identity claimed for it.","groupErr.revealMismatch":"A member's revealed value did not match what they committed to.","groupErr.commitChanged":"A member changed their commitment part-way through.","groupErr.missingKey":"A member was listed whose key never arrived.","groupErr.outsider":"A frame arrived from someone outside the group.","groupErr.limit":"A group is limited to eight members.","groupErr.tooLarge":"A message was too large to send to the group.","fileType.text":"Plain text","fileType.images":"Images","fileType.archives":"Archives","fileType.voice":"Voice messages","fileType.unsupported":"Unsupported","qrScan.title":"Scan QR Code","qrScan.auto":"Auto Mode","qrScan.reset":"Reset","qrScan.autoScroll":"Auto-scrolling enabled","qrScan.starting":"Starting camera...","qrScan.point":"Point camera at QR code","qrScan.tapFocus":"Tap screen to focus","qrScan.focusing":"Focusing...","iceErr.notArray":"Server list must be an array","iceErr.invalidJson":"Invalid JSON","iceErr.tooMany":"Too many servers (max {max})","iceErr.invalidEntry":"{label}: invalid entry","iceErr.urlCount":"{label}: between 1 and {max} URLs required","iceErr.turnCreds":"{label}: TURN servers usually require a username and credential","iceUrl.notString":"URL must be a string","iceUrl.empty":"URL is empty","iceUrl.tooLong":"URL is too long","iceUrl.badChars":"URL contains invalid characters","iceUrl.badScheme":"URL must start with stun:, stuns:, turn: or turns:","iceUrl.badQuery":"URL has an invalid query","iceUrl.noHost":"URL is missing a host","iceUrl.badHost":"URL has an invalid host or port","iceUrl.badTransport":"URL query must be transport=udp or transport=tcp","msg.off":"Off","file.consentUnavailable":"User consent unavailable","secLevel.MAXIMUM":"MAXIMUM","secLevel.INITIALIZING":"INITIALIZING","secLevel.ERROR":"ERROR","secLevel.UNKNOWN":"UNKNOWN","status.error":"Error","offline.disconnect":"Disconnect","offline.learnMore":"Learn more","pwa.installApp":"Install App","chat.onWeb":"You're on Web","groupCall.startVoice":"Start a group voice call","groupCall.startVideo":"Start a group video call","groupCall.join":"Join","groupCall.dismiss":"Not now","groupCall.leave":"Leave call","groupCall.you":"You","groupCall.connecting":"Connecting\u2026","groupCall.waitingLink":"Waiting for a direct link\u2026","groupCall.legFailed":"Could not connect","groupCall.startedVoice":"{name} started a voice call","groupCall.startedVideo":"{name} started a video call","groupCall.inCall":"{count} in the call","groupCall.err.permission_denied":"The call could not start - microphone and camera access is blocked. Allow it for this site, then try again.","groupCall.err.device_not_found":"The call could not start - no microphone was found on this device.","groupCall.err.device_busy":"The call could not start - your microphone is in use by another app. Close it and try again.","groupCall.err.media_failed":"The call could not start - the microphone could not be opened.","groupCall.err.call_in_progress":"A call is already running in this group. Join it instead of starting another.","groupCall.err.not_ready":"Confirm the group code before calling.","groupCall.speaking":"{name} is speaking","groupCall.pin":"Show {name} large","groupCall.unpin":"Back to everyone","groupCall.showEveryone":"Everyone","msg.after5s":"5s after reading","msg.after15s":"15s after reading","msg.after30s":"30s after reading","msg.after1m":"1m after reading","msg.sec30":"30 seconds","msg.min5":"5 minutes","msg.hour1":"1 hour","desktop.shareDesc":"Send the code to your peer. It is one-time and expires shortly.","desktop.invitationCreated":"Secure invitation created - send it to your peer.","desktop.joinDesc":"Paste your peer's invitation code to build your secure answer.","desktop.offerTag":"offer \xB7 copy text","desktop.answerTag":"answer \xB7 copy text","desktop.offerPlaceholder":"Invitation code will appear here\u2026","desktop.answerPlaceholder":"Response code will appear here\u2026","desktop.backToChats":"Back to chats","desktop.sendFeedback":"Send feedback","desktop.callsNeedVerified":"Calls require a verified secure channel.","desktop.noOpenChannel":"No open secure channel.","desktop.chatCarriesCall":"This chat is carrying a group call. Leave the group call before placing a 1:1 call.","desktop.err.permission_denied":"The call could not start - microphone and camera access is blocked. Allow it in system settings, then try again.","desktop.language":"Language","desktop.languageHint":"Applies at once. Messages already sent keep the words they were written in.","desktop.compareCode":"Compare the verification code with your peer and confirm if it matches.","desktop.verifyBeforeFiles":"Complete verification before sending files.","desktop.verifyBeforeSending":"Complete verification before sending messages.","desktop.disconnectedByBackend":"Connection securely disconnected.","desktop.restoreFailed":"Could not restore the connection. Closing this chat.","desktop.channelNotReady":"The data channel is not available yet. Wait for the connection to establish.","desktop.enterCode":"Enter the verification code to confirm.","desktop.noOffer":"No invitation found. Create one first.","desktop.notInitiator":"You did not create this connection, so there is no answer for you to apply.","desktop.decryptFailed":"A message could not be decrypted and was discarded.","desktop.badMessageFormat":"A malformed frame arrived and was discarded.","desktop.notSentNotReady":"Message not sent: the secure channel is not ready. Wait for verification to finish, or reconnect.","desktop.micDenied":"Microphone access was denied.","desktop.noChannelWait":"No open secure channel - wait for the connection to establish.","desktop.sasFailed":"Verification failed. A machine-in-the-middle may be present, so the connection was aborted.","desktop.sasOk":"Verification succeeded. This channel is authenticated end to end.","desktop.iceForgotten":"Saved servers forgotten. Using public ICE servers.","desktop.icePublic":"Using public ICE servers.","desktop.verificationInProgress":"Security verification is still running. Wait for it to finish.","desktop.fileGone":"This file is no longer available for download.","desktop.codeMismatch":"The verification codes do not match. Disconnecting for safety.","desktop.noLocalCode":"Verification failed: there is no locally derived code to compare against. Disconnecting for safety.","desktop.protocolViolation":"The peer claimed the code was confirmed before you confirmed it. Disconnecting for safety.","desktop.verificationRejected":"Verification rejected. The connection was aborted for safety.","secLevel.HIGH":"HIGH","secLevel.MEDIUM":"MEDIUM","secLevel.LOW":"LOW","desktop.rerun":"Re-run","desktop.ice.customDesc":"Up to {max} servers, one URL per line or JSON.","desktop.ice.persistDesc":"Stored locally on this device. Leave off to use only for this session.","desktop.group.leaveNote":"The other members are told you left. Nothing about this group is kept on this device afterwards - there is no server holding a copy to rejoin from, so you would need a fresh invitation.","desktop.sec.ecdsaOk":"Peer key package signature verified during the handshake (ECDSA P-384 / SHA-384)","desktop.sec.ecdsaNone":"No completed handshake","desktop.sec.ecdhOk":"Session keys derived from an ephemeral ECDH P-384 exchange via HKDF-SHA-256","desktop.sec.ecdhNone":"No session keys derived","desktop.sec.encryptionOk":"AES-GCM encryption and decryption verified inside the core","desktop.sec.encryptionNa":"The AES-GCM self-test could not be run","desktop.sec.integrityOk":"Message integrity verified (AES-GCM authentication)","desktop.sec.integrityNa":"The integrity self-test could not be run","desktop.sec.pfsOk":"Double Ratchet active - every message has a key of its own","desktop.sec.pfsNa":"Not measured","desktop.sec.replayOk":"Ratchet message keys are destroyed once used, so a captured frame cannot be replayed","desktop.sec.replayNa":"Not measured","desktop.sec.dtlsPinned":"Peer DTLS fingerprint pinned: {fp}","desktop.sec.dtlsNone":"No remote DTLS fingerprint available","desktop.sec.sasBoth":"Both peers confirmed the out-of-band safety code","desktop.sec.sasIncomplete":"The safety code has not been confirmed by both peers","desktop.sec.metadataOk":"A dedicated metadata key was derived (HKDF metadata-protection-v4)","desktop.sec.metadataNone":"No metadata key","desktop.sec.coverOn":"Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel","desktop.sec.coverOff":"The cover traffic generator is not running","desktop.sec.coverUnsupported":"Cover traffic needs a Double Ratchet session (the peer is on an older release)","desktop.tagline":"End-to-end freedom","desktop.callsNotHere":"Calls are not available in this build yet. Messages, files and group chats work as usual."},Ha=globalThis.__SECUREBIT_I18N__||(globalThis.__SECUREBIT_I18N__=Object.create(null));Ha.en=Ga;var Wa=globalThis.__SECUREBIT_I18N__||(globalThis.__SECUREBIT_I18N__=Object.create(null));function Hs(t){return Wa[t]||null}var Ws="securebit-locale";function qr(t="/"){let e=String(t).split("/")[1];return Mn.includes(e)&&e!=="en"?e:null}function Vs(t=[]){for(let e of t){let n=String(e).toLowerCase(),r=Mn.find(d=>d.toLowerCase()===n);if(r)return r;let i=n.split("-")[0],c=Mn.find(d=>d.toLowerCase().split("-")[0]===i);if(c)return c}return null}function Va({pathname:t="/",stored:e=null,languages:n=[]}={}){let r=qr(t);return r||(ja(t)?"en":e&&Mn.includes(e)?e:Vs(n)||"en")}function ja(t){return t==="/"||t==="/index.html"}function js(t,e="/"){let n=qr(e),i=(n?String(e).slice(n.length+1):String(e)).replace(/^\/+/,"");return t==="en"?`/${i}`:`/${t}/${i}`}function $s(t){try{localStorage.setItem(Ws,t)}catch{}}function Yr(){try{return localStorage.getItem(Ws)}catch{return null}}var or=null;function cr(){if(or)return or;let t=typeof window>"u"?null:window;return!t||!t.location?"en":(or=Va({pathname:t.location.pathname||"/",stored:Yr(),languages:t.navigator?.languages||[]}),or)}function $a(t=cr()){return ar[t]?.dir==="rtl"?"rtl":"ltr"}function qa(t=cr()){return $a(t)==="rtl"}function qs(t=cr()){return qa(t)?-1:1}var Ys="securebit-locale-suggest-dismissed";function Ks(){try{return localStorage.getItem(Ys)==="1"}catch{return!1}}function Kr(){try{localStorage.setItem(Ys,"1")}catch{}}function Qs({pathname:t="/",languages:e=[],stored:n=null}={}){let r=qr(t)||"en",i=Mn.includes(n)&&n||Vs(e);return i&&i!==r?i:null}function a(t,e,n=cr()){let r=Hs(n)?.[t]??Gs[n]?.[t]??Hs("en")?.[t]??t;return e?String(r).replace(/\{(\w+)\}/g,(i,c)=>Object.prototype.hasOwnProperty.call(e,c)?String(e[c]):i):r}var J=Object.freeze({CREATE_SESSION:"CREATE_SESSION",REMOVE_SESSION:"REMOVE_SESSION",SET_ACTIVE:"SET_ACTIVE",SET_STATUS:"SET_STATUS",SET_FINGERPRINT:"SET_FINGERPRINT",SET_VERIFICATION:"SET_VERIFICATION",SET_SAS:"SET_SAS",ADD_MESSAGE:"ADD_MESSAGE",SET_MESSAGES:"SET_MESSAGES",UPDATE_MESSAGE_STATUS:"UPDATE_MESSAGE_STATUS",PATCH_MESSAGE:"PATCH_MESSAGE",DELETE_MESSAGE:"DELETE_MESSAGE",EXPIRE_MESSAGE:"EXPIRE_MESSAGE",INCREMENT_UNREAD:"INCREMENT_UNREAD",CLEAR_UNREAD:"CLEAR_UNREAD",SET_PENDING_FILES:"SET_PENDING_FILES",PATCH_SETUP:"PATCH_SETUP",RENAME:"RENAME",SET_PEER_PRESENCE:"SET_PEER_PRESENCE"}),Qr={available:"var(--sb-green-solid)",away:"var(--sb-yellow-2-solid)",busy:"var(--sb-red-solid)",offline:"var(--sb-text-9)"},Xr={available:a("presence.available"),away:a("presence.away"),busy:a("presence.busy"),offline:a("presence.offline")},lr=[{key:"available",word:a("presence.available"),desc:a("presence.availableDesc"),dot:"var(--sb-green-solid)"},{key:"away",word:a("presence.away"),desc:a("presence.awayDesc"),dot:"var(--sb-yellow-2-solid)"},{key:"busy",word:a("presence.busy"),desc:a("presence.busyDesc"),dot:"var(--sb-red-solid)"},{key:"invisible",word:a("presence.invisible"),desc:a("presence.invisibleDesc"),dot:"var(--sb-text-9)"}];function Ya(t){let e=String(t||"").replace(/[^a-z0-9]/gi,"");return a("chat.defaultLabel")+" "+(e.slice(0,4)||"0000").toUpperCase()}function dr(t){let e=String(t||"").trim().split(/\s+/).filter(Boolean),n=e[0]?.[0]||"",r=e[1]?.[0]||e[0]?.[1]||"";return(n+r).toUpperCase()||"\xB7\xB7"}function Xs(t){switch(t){case"connected":case"verified":return a("conn.p2p");case"verifying":return a("conn.verifying");case"connecting":case"new":return a("conn.connecting");case"reconnecting":return a("conn.reconnecting");case"peer_disconnected":return a("conn.peerDisconnected");default:return a("conn.disconnected")}}function Ka(){return{offerData:"",answerData:"",offerInput:"",answerInput:"",showOfferStep:!1,showAnswerStep:!1,showVerification:!1,showQRCode:!1,qrCodeUrl:"",isGeneratingKeys:!1,qrFramesTotal:0,qrFrameIndex:0,qrManualMode:!1}}function Jr(t={}){let e=t.id||(typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():String(Date.now())+Math.random());return{id:e,peerLabel:t.peerLabel||Ya(e),labelIsCustom:!1,createdAt:t.createdAt||Date.now(),role:t.role||"offer",status:t.status||"new",keyFingerprint:"",verificationCode:"",sas:{localConfirmed:!1,remoteConfirmed:!1,bothConfirmed:!1,isVerified:!1},messages:[],unreadCount:0,pendingIncomingFiles:[],peerPresence:null,setup:Ka()}}function Js(){return{sessions:{},order:[],activeSessionId:null}}function Xe(t,e,n){let r=t.sessions[e];return r?{...t,sessions:{...t.sessions,[e]:{...r,...n}}}:t}function Zs(t,e){let n=J;switch(e.type){case n.CREATE_SESSION:{let r=e.entry||Jr(e);return t.sessions[r.id]?t:{sessions:{...t.sessions,[r.id]:r},order:[...t.order,r.id],activeSessionId:e.activate===!1?t.activeSessionId:r.id}}case n.REMOVE_SESSION:{let{id:r}=e;if(!t.sessions[r])return t;let i={...t.sessions};delete i[r];let c=t.order.filter(h=>h!==r),d=t.activeSessionId;if(d===r){let h=t.order.indexOf(r);d=c[Math.max(0,h-1)]||c[0]||null}return{sessions:i,order:c,activeSessionId:d}}case n.SET_ACTIVE:return!t.sessions[e.id]||t.activeSessionId===e.id?t:{...t,activeSessionId:e.id};case n.SET_STATUS:{let r=t.sessions[e.id];if(!r||r.status===e.status)return t;let c=!(e.status==="connected"||e.status==="verified"||e.status==="reconnecting")&&r.peerPresence!==null?{status:e.status,peerPresence:null}:{status:e.status};return Xe(t,e.id,c)}case n.SET_FINGERPRINT:return Xe(t,e.id,{keyFingerprint:e.fingerprint});case n.SET_VERIFICATION:return Xe(t,e.id,{verificationCode:e.code});case n.SET_SAS:{let r=t.sessions[e.id];return r?Xe(t,e.id,{sas:{...r.sas,...e.sas}}):t}case n.ADD_MESSAGE:{let r=t.sessions[e.id];return r?Xe(t,e.id,{messages:[...r.messages,e.message]}):t}case n.SET_MESSAGES:{let r=t.sessions[e.id];if(!r)return t;let i=typeof e.updater=="function"?e.updater(r.messages):e.messages;return Xe(t,e.id,{messages:Array.isArray(i)?i:[]})}case n.UPDATE_MESSAGE_STATUS:{let r=t.sessions[e.id];if(!r)return t;let i=!1,c=r.messages.map(d=>String(d.mid)===String(e.mid)&&d.status!==e.status?(i=!0,{...d,status:e.status}):d);return i?Xe(t,e.id,{messages:c}):t}case n.PATCH_MESSAGE:{let r=t.sessions[e.id];if(!r)return t;let i=e.messageId!=null?String(e.messageId):null,c=e.mid!=null?String(e.mid):null,d=e.fileId!=null?String(e.fileId):null,h=!1,y=r.messages.map(w=>{if(!(i!=null&&String(w.id)===i||c!=null&&String(w.mid)===c||d!=null&&w.fileId!=null&&String(w.fileId)===d))return w;h=!0;let p=typeof e.patch=="function"?e.patch(w):e.patch;return{...w,...p}});return h?Xe(t,e.id,{messages:y}):t}case n.DELETE_MESSAGE:{let r=t.sessions[e.id];if(!r)return t;let i=r.messages.filter(c=>String(c.mid)!==String(e.mid));return i.length===r.messages.length?t:Xe(t,e.id,{messages:i})}case n.EXPIRE_MESSAGE:{let r=t.sessions[e.id];if(!r)return t;let i=!1,c=r.messages.map(d=>String(d.id)===String(e.messageId)&&!d.expired?(i=!0,{...d,expired:!0,message:"",expiresAt:void 0}):d);return i?Xe(t,e.id,{messages:c}):t}case n.INCREMENT_UNREAD:{let r=t.sessions[e.id];return r?Xe(t,e.id,{unreadCount:r.unreadCount+1}):t}case n.CLEAR_UNREAD:{let r=t.sessions[e.id];return!r||r.unreadCount===0?t:Xe(t,e.id,{unreadCount:0})}case n.SET_PENDING_FILES:{let r=t.sessions[e.id];if(!r)return t;let i=typeof e.updater=="function"?e.updater(r.pendingIncomingFiles):e.files;return Xe(t,e.id,{pendingIncomingFiles:Array.isArray(i)?i:[]})}case n.PATCH_SETUP:{let r=t.sessions[e.id];return r?Xe(t,e.id,{setup:{...r.setup,...e.patch}}):t}case n.RENAME:{let r=t.sessions[e.id];if(!r)return t;let i=String(e.label||"").trim()||r.peerLabel;return Xe(t,e.id,{peerLabel:i,labelIsCustom:!0})}case n.SET_PEER_PRESENCE:{let r=t.sessions[e.id];return!r||r.peerPresence===e.presence?t:Xe(t,e.id,{peerPresence:e.presence})}default:return t}}function Qa(t,e){let n=[...t.messages].reverse().find(w=>!w.expired&&w.type!=="system"&&(typeof w.message=="string"&&w.message.trim()||w.voice)),r=t.status,i=r==="connected"||r==="verified",c=r==="connecting"||r==="verifying"||r==="new"||r==="reconnecting",d,h;c?(d="var(--sb-yellow-2-solid)",h=Xs(r)):i?(d=t.peerPresence?Qr[t.peerPresence]||"var(--sb-text-9)":"var(--sb-green-solid)",h=t.peerPresence?Xr[t.peerPresence]||a("presence.online"):a("conn.p2p")):(d="var(--sb-red-solid)",h=Xs(r));let y=n?n.voice?"\u{1F399} Voice message":n.message:h;return{id:t.id,name:t.peerLabel,mono:dr(t.peerLabel),dot:d,headerSub:h,status:t.status,peerPresence:t.peerPresence,preview:y,unread:t.unreadCount>0?t.unreadCount>99?"99+":String(t.unreadCount):null,verified:!!t.sas.isVerified,active:t.id===e,inactive:t.id!==e}}function ei(t){return t.order.map(e=>t.sessions[e]).filter(Boolean).map(e=>Qa(e,t.activeSessionId))}var N=Object.freeze({MAX_MEMBERS:8,MIN_MEMBERS:2,GROUP_ID_BYTES:16,NONCE_BYTES:32,COMMIT_BYTES:32,FINGERPRINT_BYTES:32,SAS_DIGITS:7,MAX_NAME_BYTES:128,MAX_EPOCH:4294967295,MAX_SPKI_BYTES:256,MIN_SPKI_BYTES:40,MAX_SIG_BYTES:160,MIN_SIG_BYTES:48,MAX_BODY_BYTES:1024,FRAME_BUDGET_CHARS:1800,MAX_DESCRIPTOR_CHARS:768,MESH_NONCE_BYTES:16,CALL_ID_BYTES:16}),Tt=Object.freeze({START:"start",JOIN:"join",LEAVE:"leave"}),fn=Object.freeze({OFFER:"moffer",ANSWER:"manswer"}),hn=Object.freeze({CREATE:"create",ADD:"add",REMOVE:"remove",RENAME:"rename"}),Gn=new TextEncoder,Zr=class extends Error{constructor(e,n="group_crypto"){super(e),this.name="GroupCryptoError",this.code=n}},se=(t,e)=>{throw new Zr(t,e)};function es(t){let e=t instanceof Uint8Array?t:new Uint8Array(t),n="";for(let r=0;r<e.length;r++)n+=e[r].toString(16).padStart(2,"0");return n}function $e(t){(typeof t!="string"||t.length%2!==0||!/^[0-9a-f]*$/i.test(t))&&se("not a hex string","bad_hex");let e=new Uint8Array(t.length/2);for(let n=0;n<e.length;n++)e[n]=parseInt(t.substr(n*2,2),16);return e}function Ve(t){let e=t instanceof Uint8Array?t:new Uint8Array(t),n="";for(let r=0;r<e.length;r++)n+=String.fromCharCode(e[r]);return btoa(n)}function Je(t,{max:e=N.MAX_SPKI_BYTES}={}){typeof t!="string"&&se("not a base64 string","bad_b64"),t.length>Math.ceil(e*4/3)+4&&se("base64 payload exceeds its limit","bad_b64");let n;try{n=atob(t)}catch{se("malformed base64","bad_b64")}let r=new Uint8Array(n.length);for(let i=0;i<n.length;i++)r[i]=n.charCodeAt(i);return r}function Hn(t){return crypto.getRandomValues(new Uint8Array(t))}function ti(){return es(Hn(N.GROUP_ID_BYTES))}function Jt(t,...e){let n=[Gn.encode(t+"\0")],r=n[0].length;for(let d of e){let h=d instanceof Uint8Array?d:typeof d=="string"?Gn.encode(d):se("unsupported payload component","bad_payload"),y=new Uint8Array(4);new DataView(y.buffer).setUint32(0,h.length),n.push(y,h),r+=4+h.length}let i=new Uint8Array(r),c=0;for(let d of n)i.set(d,c),c+=d.length;return i}function Nt(t){(!Number.isInteger(t)||t<0||t>N.MAX_EPOCH)&&se("value out of uint32 range","bad_u32");let e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t),e}function ni(t,e){if(!(t instanceof Uint8Array)||!(e instanceof Uint8Array)||t.length!==e.length)return!1;let n=0;for(let r=0;r<t.length;r++)n|=t[r]^e[r];return n===0}function Rt(t){return(typeof t!="string"||t.length!==N.GROUP_ID_BYTES*2||!/^[0-9a-f]+$/.test(t))&&se("malformed group id","bad_group_id"),t}function Ce(t){return(typeof t!="string"||t.length!==N.FINGERPRINT_BYTES*2||!/^[0-9a-f]+$/.test(t))&&se("malformed member fingerprint","bad_fingerprint"),t}function Ne(t){return(!Number.isInteger(t)||t<0||t>N.MAX_EPOCH)&&se("epoch out of range","bad_epoch"),t}function gn(t){let e=typeof t=="string"?t:"";return Gn.encode(e).length>N.MAX_NAME_BYTES&&se("group name too long","bad_name"),e}function mn(t){Array.isArray(t)||se("member list is not an array","bad_members"),t.length<N.MIN_MEMBERS&&se("a group needs at least two members","bad_members"),t.length>N.MAX_MEMBERS&&se(`a group is limited to ${N.MAX_MEMBERS} members`,"too_many_members");let e=new Set;for(let n of t)Ce(n),e.has(n)&&se("duplicate member fingerprint","duplicate_member"),e.add(n);return[...t].sort()}async function ri(t){let e=await t.generateKey({name:"ECDSA",namedCurve:"P-384"},!1,["sign","verify"]),n=new Uint8Array(await t.exportKey("spki",e.publicKey)),r=await si(t,n);return{keyPair:e,spki:n,fingerprint:r}}async function si(t,e){return(!(e instanceof Uint8Array)||e.length<N.MIN_SPKI_BYTES||e.length>N.MAX_SPKI_BYTES)&&se("SPKI length out of range","bad_spki"),es(new Uint8Array(await t.digest("SHA-256",e)))}async function Wn(t,e){let n=await si(t,e),r;try{r=await t.importKey("spki",e,{name:"ECDSA",namedCurve:"P-384"},!1,["verify"])}catch{se("member identity key is not a valid P-384 public key","bad_spki")}return{publicKey:r,fingerprint:n}}async function ii(t,{groupId:e,epoch:n,fingerprint:r,nonce:i}){Rt(e),Ne(n),Ce(r),(!(i instanceof Uint8Array)||i.length!==N.NONCE_BYTES)&&se("nonce must be 32 bytes","bad_nonce");let c=Jt("securebit/group/commit/v1",$e(e),Nt(n),$e(r),i);return new Uint8Array(await t.digest("SHA-256",c))}async function Xa(t,e,n){if(!(e instanceof Uint8Array)||e.length!==N.COMMIT_BYTES)return!1;let r;try{r=await ii(t,n)}catch{return!1}return ni(e,r)}async function ts(t,{groupId:e,epoch:n,contributions:r,digits:i=N.SAS_DIGITS}){Rt(e),Ne(n),Array.isArray(r)||se("contributions must be an array","bad_contributions"),(!Number.isInteger(i)||i<4||i>12)&&se("digit count out of range","bad_digits"),mn(r.map(k=>k&&k.fingerprint));let c=[...r].sort((k,p)=>k.fingerprint<p.fingerprint?-1:1),d=[];for(let k of c)(!(k.nonce instanceof Uint8Array)||k.nonce.length!==N.NONCE_BYTES)&&se("every member must contribute a 32-byte nonce","bad_nonce"),d.push($e(k.fingerprint),k.nonce);let h=Jt("securebit/group/sas/v1",$e(e),Nt(n),...d),y=new Uint8Array(await t.digest("SHA-256",Jt("securebit/group/sas-salt/v1",$e(e),Nt(n)))),w=null;try{w=await t.importKey("raw",h,"HKDF",!1,["deriveBits"]);let k=await t.deriveBits({name:"HKDF",hash:"SHA-256",salt:y,info:Gn.encode("securebit-group-sas-v1")},w,64),p=new DataView(k),v=p.getUint32(0)*2**20+(p.getUint32(4)>>>12);return String(v%10**i).padStart(i,"0")}finally{try{h.fill(0)}catch{}}}var pr=class{constructor({groupId:e,epoch:n,selfFingerprint:r,memberFingerprints:i}){this.groupId=Rt(e),this.epoch=Ne(n),this.selfFingerprint=Ce(r),this.members=mn(i),this.members.includes(this.selfFingerprint)||se("the local member is not in the member set","not_a_member"),this.nonce=Hn(N.NONCE_BYTES),this.commitments=new Map,this.nonces=new Map,this.revealed=!1,this.code=null}async ownCommitment(e){let n=await ii(e,{groupId:this.groupId,epoch:this.epoch,fingerprint:this.selfFingerprint,nonce:this.nonce});return this.commitments.set(this.selfFingerprint,n),n}acceptCommitment(e,n){Ce(e),this.members.includes(e)||se("commitment from a non-member","not_a_member"),(!(n instanceof Uint8Array)||n.length!==N.COMMIT_BYTES)&&se("malformed commitment","bad_commitment");let r=this.commitments.get(e);return r?(ni(r,n)||se("member changed their commitment","commitment_changed"),!1):(this.commitments.set(e,n),!0)}get commitmentsComplete(){return this.members.every(e=>this.commitments.has(e))}reveal(){return this.commitmentsComplete||se("cannot reveal before every member has committed","premature_reveal"),this.revealed=!0,this.nonces.set(this.selfFingerprint,this.nonce),this.nonce}async acceptReveal(e,n,r){Ce(n),this.members.includes(n)||se("reveal from a non-member","not_a_member");let i=this.commitments.get(n);return i||se("reveal arrived before the commitment","reveal_without_commitment"),await Xa(e,i,{groupId:this.groupId,epoch:this.epoch,fingerprint:n,nonce:r})||se("revealed nonce does not match the commitment","commitment_mismatch"),this.nonces.set(n,r),!0}get revealsComplete(){return this.members.every(e=>this.nonces.has(e))}async finish(e){return this.revealsComplete||se("not every member has revealed","incomplete_reveal"),this.code=await ts(e,{groupId:this.groupId,epoch:this.epoch,contributions:this.members.map(n=>({fingerprint:n,nonce:this.nonces.get(n)}))}),this.code}destroy(){try{this.nonce.fill(0)}catch{}for(let e of this.nonces.values())try{e.fill(0)}catch{}this.nonces.clear(),this.commitments.clear()}};function ai({groupId:t,epoch:e,op:n,memberFps:r,name:i=""}){Rt(t),Ne(e),Object.values(hn).includes(n)||se("unknown membership operation","bad_op");let c=mn(r);return Jt("securebit/group/member-op/v1",$e(t),Nt(e),n,gn(i),...c.map(d=>$e(d)))}async function oi(t,e,n){let r=await t.sign({name:"ECDSA",hash:"SHA-384"},e,ai(n));return new Uint8Array(r)}async function ci(t,e,n,r){if(!(r instanceof Uint8Array)||r.length<N.MIN_SIG_BYTES||r.length>N.MAX_SIG_BYTES)return!1;let i;try{i=ai(n)}catch{return!1}try{return await t.verify({name:"ECDSA",hash:"SHA-384"},e,r,i)}catch{return!1}}async function ns(t,e){let n=typeof e=="string"?Gn.encode(e):e;return n instanceof Uint8Array||se("message body must be a string or bytes","bad_body"),n.length>N.MAX_BODY_BYTES&&se("message body exceeds the group limit","body_too_large"),new Uint8Array(await t.digest("SHA-256",n))}function li({groupId:t,epoch:e,seq:n,senderFp:r,bodyHash:i}){return Rt(t),Ne(e),Ne(n),Ce(r),(!(i instanceof Uint8Array)||i.length!==32)&&se("body hash must be 32 bytes","bad_body_hash"),Jt("securebit/group/message/v1",$e(t),Nt(e),Nt(n),$e(r),i)}async function di(t,e,n){let r=await t.sign({name:"ECDSA",hash:"SHA-384"},e,li(n));return new Uint8Array(r)}async function pi(t,e,n,r){if(!(r instanceof Uint8Array)||r.length<N.MIN_SIG_BYTES||r.length>N.MAX_SIG_BYTES)return!1;let i;try{i=li(n)}catch{return!1}try{return await t.verify({name:"ECDSA",hash:"SHA-384"},e,r,i)}catch{return!1}}function ui({groupId:t,epoch:e,kind:n,fromFp:r,toFp:i,descriptor:c,nonce:d}){return Rt(t),Ne(e),n!==fn.OFFER&&n!==fn.ANSWER&&se("unknown mesh descriptor kind","bad_mesh_kind"),Ce(r),Ce(i),r===i&&se("a member cannot dial itself","bad_mesh_peer"),(typeof c!="string"||c.length===0||c.length>N.MAX_DESCRIPTOR_CHARS)&&se("mesh descriptor is missing or oversized","bad_descriptor"),(!(d instanceof Uint8Array)||d.length!==N.MESH_NONCE_BYTES)&&se("mesh nonce must be 16 bytes","bad_mesh_nonce"),Jt("securebit/group/mesh-descriptor/v1",$e(t),Nt(e),n,$e(r),$e(i),c,d)}async function rs(t,e,n){let r=await t.sign({name:"ECDSA",hash:"SHA-384"},e,ui(n));return new Uint8Array(r)}async function ss(t,e,n,r){if(!(r instanceof Uint8Array)||r.length<N.MIN_SIG_BYTES||r.length>N.MAX_SIG_BYTES)return!1;let i;try{i=ui(n)}catch{return!1}try{return await t.verify({name:"ECDSA",hash:"SHA-384"},e,r,i)}catch{return!1}}function fi({groupId:t,epoch:e,fp:n,linkFp:r}){return Rt(t),Ne(e),Ce(n),(typeof r!="string"||r.length===0||r.length>256)&&se("link fingerprint is missing or oversized","bad_link_fp"),Jt("securebit/group/link-probe/v1",$e(t),Nt(e),$e(n),r)}async function hi(t,e,n){let r=await t.sign({name:"ECDSA",hash:"SHA-384"},e,fi(n));return new Uint8Array(r)}async function gi(t,e,n,r){if(!(r instanceof Uint8Array)||r.length<N.MIN_SIG_BYTES||r.length>N.MAX_SIG_BYTES)return!1;let i;try{i=fi(n)}catch{return!1}try{return await t.verify({name:"ECDSA",hash:"SHA-384"},e,r,i)}catch{return!1}}function mi({groupId:t,epoch:e,callId:n,action:r,fp:i,seq:c,withVideo:d}){return Rt(t),Ne(e),is(n),Ne(c),Ce(i),r!==Tt.START&&r!==Tt.JOIN&&r!==Tt.LEAVE&&se("unknown call action","bad_call_action"),Jt("securebit/group/call/v1",$e(t),Nt(e),$e(n),r,$e(i),Nt(c),d===!0?"v":"a")}function is(t){return(typeof t!="string"||t.length!==N.CALL_ID_BYTES*2||!/^[0-9a-f]+$/.test(t))&&se("malformed call id","bad_call_id"),t}function yi(){return es(Hn(N.CALL_ID_BYTES))}async function bi(t,e,n){let r=await t.sign({name:"ECDSA",hash:"SHA-384"},e,mi(n));return new Uint8Array(r)}async function xi(t,e,n,r){if(!(r instanceof Uint8Array)||r.length<N.MIN_SIG_BYTES||r.length>N.MAX_SIG_BYTES)return!1;let i;try{i=mi(n)}catch{return!1}try{return await t.verify({name:"ECDSA",hash:"SHA-384"},e,r,i)}catch{return!1}}var fe=Object.freeze({CREATE_GROUP:"CREATE_GROUP",REMOVE_GROUP:"REMOVE_GROUP",SET_ACTIVE_GROUP:"SET_ACTIVE_GROUP",SET_PHASE:"SET_PHASE",SET_MEMBERS:"SET_MEMBERS",PATCH_MEMBER:"PATCH_MEMBER",SET_SAS:"SET_SAS",CONFIRM_SAS:"CONFIRM_SAS",ADD_MESSAGE:"ADD_MESSAGE",SET_MESSAGES:"SET_MESSAGES",UPDATE_MESSAGE_STATUS:"UPDATE_MESSAGE_STATUS",INCREMENT_UNREAD:"INCREMENT_UNREAD",CLEAR_UNREAD:"CLEAR_UNREAD",RENAME:"RENAME",SET_ERROR:"SET_ERROR"}),K=Object.freeze({FORMING:"forming",COMMITTING:"committing",REVEALING:"revealing",AWAITING_SAS:"awaiting_sas",READY:"ready",FAILED:"failed"}),oe=Object.freeze({SELF:"self",LINKED:"linked",PENDING:"pending",LOST:"lost"}),Ja={[K.FORMING]:a("groupPhase.forming"),[K.COMMITTING]:a("groupPhase.commitments"),[K.REVEALING]:a("groupPhase.revealing"),[K.AWAITING_SAS]:a("groupPhase.compare"),[K.READY]:a("groupPhase.ready"),[K.FAILED]:a("groupPhase.failed")};function as(t){let e=String(t||"").trim().split(/\s+/).filter(Boolean),n=e[0]?.[0]||"",r=e[1]?.[0]||e[0]?.[1]||"";return(n+r).toUpperCase()||"##"}function ur(t={}){return{id:t.id,name:t.name||"Group",createdAt:t.createdAt||Date.now(),adminFp:t.adminFp||"",selfFp:t.selfFp||"",isAdmin:!!t.isAdmin,epoch:Number.isInteger(t.epoch)?t.epoch:1,phase:t.phase||K.FORMING,members:Array.isArray(t.members)?[...t.members].sort(vi):[],sasCode:"",sasConfirmed:!1,messages:[],unreadCount:0,error:null}}var Za=new TextEncoder;function eo(t){let e=String(t);for(;Za.encode(e).length>N.MAX_NAME_BYTES;)e=e.slice(0,-1);return e}function vi(t,e){return t.fp<e.fp?-1:t.fp>e.fp?1:0}function wi(){return{groups:{},order:[],activeGroupId:null}}function bt(t,e,n){let r=t.groups[e];return r?{...t,groups:{...t.groups,[e]:{...r,...n}}}:t}function ki(t,e){let n=fe;switch(e.type){case n.CREATE_GROUP:{let r=e.entry||ur(e);return!r.id||t.groups[r.id]?t:{groups:{...t.groups,[r.id]:r},order:[...t.order,r.id],activeGroupId:e.activate===!1?t.activeGroupId:r.id}}case n.REMOVE_GROUP:{let{id:r}=e;if(!t.groups[r])return t;let i={...t.groups};delete i[r];let c=t.order.filter(h=>h!==r),d=t.activeGroupId;if(d===r){let h=t.order.indexOf(r);d=c[Math.max(0,h-1)]||c[0]||null}return{groups:i,order:c,activeGroupId:d}}case n.SET_ACTIVE_GROUP:return e.id===null?t.activeGroupId===null?t:{...t,activeGroupId:null}:!t.groups[e.id]||t.activeGroupId===e.id?t:{...t,activeGroupId:e.id};case n.SET_PHASE:{let r=t.groups[e.id];if(!r||r.phase===e.phase)return t;let i={phase:e.phase};return e.phase!==K.READY&&r.sasConfirmed&&(i.sasConfirmed=!1),e.phase!==K.READY&&e.phase!==K.AWAITING_SAS&&(i.sasCode=""),e.phase!==K.FAILED&&(i.error=null),bt(t,e.id,i)}case n.SET_MEMBERS:{let r=t.groups[e.id];if(!r)return t;let c={members:Array.isArray(e.members)?[...e.members].sort(vi):r.members};return Number.isInteger(e.epoch)&&(c.epoch=e.epoch),bt(t,e.id,c)}case n.PATCH_MEMBER:{let r=t.groups[e.id];if(!r)return t;let i=!1,c=r.members.map(d=>{if(d.fp!==e.fp)return d;let h={...d,...e.patch};return Object.keys(e.patch).every(y=>d[y]===h[y])?d:(i=!0,h)});return i?bt(t,e.id,{members:c}):t}case n.SET_SAS:{let r=t.groups[e.id];return!r||r.sasCode===e.code?t:bt(t,e.id,{sasCode:e.code||"",sasConfirmed:!1})}case n.CONFIRM_SAS:{let r=t.groups[e.id];return!r||!r.sasCode||r.phase!==K.AWAITING_SAS||r.sasConfirmed&&r.phase===K.READY?t:bt(t,e.id,{sasConfirmed:!0,phase:K.READY,error:null})}case n.ADD_MESSAGE:{let r=t.groups[e.id];return r?bt(t,e.id,{messages:[...r.messages,e.message]}):t}case n.SET_MESSAGES:{let r=t.groups[e.id];if(!r)return t;let i=typeof e.updater=="function"?e.updater(r.messages):e.messages;return bt(t,e.id,{messages:Array.isArray(i)?i:[]})}case n.UPDATE_MESSAGE_STATUS:{let r=t.groups[e.id];if(!r)return t;let i=!1,c=r.messages.map(d=>String(d.mid)===String(e.mid)&&d.status!==e.status?(i=!0,{...d,status:e.status}):d);return i?bt(t,e.id,{messages:c}):t}case n.INCREMENT_UNREAD:{let r=t.groups[e.id];return r?bt(t,e.id,{unreadCount:r.unreadCount+1}):t}case n.CLEAR_UNREAD:{let r=t.groups[e.id];return!r||r.unreadCount===0?t:bt(t,e.id,{unreadCount:0})}case n.RENAME:{let r=t.groups[e.id];if(!r)return t;let i=eo(String(e.name||"").trim())||r.name;return bt(t,e.id,{name:i})}case n.SET_ERROR:{if(!t.groups[e.id])return t;let i={error:e.error||null};return e.error&&(i.phase=K.FAILED),bt(t,e.id,i)}default:return t}}function os(t){return t.members.filter(e=>e.state===oe.SELF||e.state===oe.LINKED).length}function to(t){if(t.phase!==K.READY)return Ja[t.phase]||"Group";let e=t.members.length,n=os(t);return n<e?`${n} of ${e} connected`:`${e} members \xB7 P2P mesh`}function no(t){switch(t.phase){case K.READY:return os(t)<t.members.length?"var(--sb-yellow-2-solid)":"var(--sb-green-solid)";case K.FAILED:return"var(--sb-red-solid)";default:return"var(--sb-yellow-2-solid)"}}function ro(t,e){let n=[...t.messages].reverse().find(i=>!i.expired&&typeof i.message=="string"&&i.message.trim()),r=to(t);return{id:t.id,kind:"group",name:t.name,mono:as(t.name),dot:no(t),headerSub:r,phase:t.phase,memberCount:t.members.length,linkedCount:os(t),preview:n?n.message:r,unread:t.unreadCount>0?t.unreadCount>99?"99+":String(t.unreadCount):null,verified:t.phase===K.READY&&t.sasConfirmed,active:t.id===e,inactive:t.id!==e}}function Si(t){return t.order.map(e=>t.groups[e]).filter(Boolean).map(e=>ro(e,t.activeGroupId))}var ce=Object.freeze({INVITE:"g_invite",HELLO:"g_hello",MEMBER:"g_member",ROSTER:"g_roster",COMMIT:"g_commit",REVEAL:"g_reveal",MESSAGE:"g_msg",RELAY:"g_relay",LEAVE:"g_leave",MESH_OFFER:"g_moffer",MESH_ANSWER:"g_manswer",MESH_ABORT:"g_mabort",PROBE:"g_probe",CALL:"g_call"}),hr="g_env",gr=Object.freeze(new Set(Object.values(ce)));function Vn(t){return!t||typeof t!="object"?!1:t.type===hr||gr.has(t.type)}function Ei(t){return!t||typeof t!="object"?null:t.type===hr?typeof t.t=="string"?t.t:null:gr.has(t.type)?t.type:null}function so(t){let e=JSON.stringify(t),n=Ve(new TextEncoder().encode(e));if(n.length>N.FRAME_BUDGET_CHARS)throw new Q("group frame exceeds the transport budget","frame_too_large");return{type:hr,gid:t.gid,t:t.type,d:n}}function fr(t){if(!t||t.type!==hr)return t;let e=String(t.d||"");if(e.length>N.FRAME_BUDGET_CHARS)throw new Q("group frame exceeds the transport budget","frame_too_large");let n=Je(e,{max:N.FRAME_BUDGET_CHARS}),r=JSON.parse(new TextDecoder().decode(n));if(!r||typeof r!="object"||!gr.has(r.type))throw new Q("envelope carried no recognisable frame","bad_envelope");if(t.gid&&r.gid!==t.gid)throw new Q("envelope group id does not match its frame","bad_envelope");if(t.t&&r.type!==t.t)throw new Q("envelope type does not match its frame","bad_envelope");return r}var yn=Object.freeze({CEREMONY_MS:6e4,HELLO_MS:45e3,MESH_DIAL_MS:45e3,MESH_RETRY_MS:2e4}),io=2,ao=3,Q=class extends Error{constructor(e,n="group_session"){super(e),this.name="GroupSessionError",this.code=n}},Tn=class{constructor({groupId:e,name:n,isAdmin:r,subtle:i,send:c,emit:d,mesh:h=null,log:y=()=>{}}){this.groupId=Rt(e),this.name=gn(n),this.isAdmin=!!r,this.subtle=i,this._send=c,this._emit=d,this._log=y,this._mesh=h,this.identity=null,this.epoch=1,this.adminFp="",this.phase=K.FORMING,this.members=new Map,this.sessionToFp=new Map,this.ceremony=null,this.sasCode="",this.sasConfirmed=!1,this.seq=0,this.transcript=new Map,this._timers=new Set,this._destroyed=!1,this._awaitingHello=new Map,this._pendingCeremony=[],this._draining=!1,this._pendingKeys=new Map,this._pendingAdd=null,this._meshDials=new Map,this._meshFailures=new Map,this._meshSessions=new Set,this._probed=new Set,this._meshPass=null,this.call=null,this.callSeq=0,this._callSeen=new Map}static newId(){return ti()}async init(){return this.identity?this.identity:(this.identity=await ri(this.subtle),this.members.set(this.identity.fingerprint,{fp:this.identity.fingerprint,name:"You",spki:this.identity.spki,publicKey:null,sessionId:null,state:oe.SELF}),this.isAdmin&&(this.adminFp=this.identity.fingerprint),this.identity)}get selfFp(){return this.identity?.fingerprint||""}destroy(){this._destroyed=!0;for(let e of this._timers)clearTimeout(e);this._timers.clear();try{this.ceremony?.destroy()}catch{}this.ceremony=null;for(let e of this._meshSessions)try{this._mesh?.close(e)}catch{}this._meshSessions.clear(),this._meshDials.clear(),this._meshFailures.clear(),this._probed.clear(),this.call=null,this._callSeen.clear(),this.members.clear(),this.sessionToFp.clear(),this.transcript.clear(),this._pendingCeremony=[],this._pendingKeys.clear(),this._pendingAdd=null,this.identity=null}_timer(e,n){let r=setTimeout(()=>{this._timers.delete(r),this._destroyed||e()},n);return this._timers.add(r),r}_fail(e){if(!this._destroyed){this._log("warn","group ceremony failed",{code:e}),this.phase=K.FAILED;try{this.ceremony?.destroy()}catch{}this.ceremony=null,this._emit("error",{error:e})}}_setPhase(e){this.phase!==e&&(this.phase=e,e!==K.READY&&(this.sasConfirmed=!1),e!==K.READY&&e!==K.AWAITING_SAS&&(this.sasCode=""),this._emit("phase",{phase:e}))}_memberSnapshot(){return[...this.members.values()].map(e=>({fp:e.fp,name:e.name,sessionId:e.sessionId,state:e.state}))}_emitMembers(){this._pruneCall(),this._emit("members",{members:this._memberSnapshot(),epoch:this.epoch})}_pruneCall(){if(!this.call)return;let e=!1;for(let n of[...this.call.participants])this.members.has(n)||(this.call.participants.delete(n),e=!0);this.call.participants.size===0&&(this.call=null,e=!0),e&&this._emit("call",{call:this.getCallSnapshot()})}_directPeers(){return[...this.members.values()].filter(e=>e.state===oe.LINKED&&e.sessionId)}_relayFor(e){let n=this.members.get(this.adminFp);return n&&n.state===oe.LINKED&&n.sessionId&&n.fp!==e?n:this._directPeers().find(r=>r.fp!==e)||null}async _wire(e,n){return this._send(e,so(n))}async _sendTo(e,n){let r=this.members.get(e);if(!r||r.fp===this.selfFp)return!1;if(r.state===oe.LINKED&&r.sessionId)return await this._wire(r.sessionId,n),!0;let i=this._relayFor(e);return i?(await this._wire(i.sessionId,{type:ce.RELAY,gid:this.groupId,to:e,hopped:!1,inner:n}),r.state!==oe.LOST):!1}async _broadcast(e,{exclude:n=[]}={}){let r=[...this.members.keys()].filter(h=>h!==this.selfFp&&!n.includes(h)),i=await Promise.allSettled(r.map(h=>this._sendTo(h,e))),c=[],d=0;return i.forEach((h,y)=>{if(h.status==="fulfilled"&&h.value===!0){d+=1;return}let w=this.members.get(r[y]);c.push({fp:r[y],name:w?.name||"A member"})}),{delivered:d,unreachable:c}}bindSession(e,n,r=oe.LINKED){let i=this.members.get(e);return i?(i.sessionId&&i.sessionId!==n&&(this.sessionToFp.delete(i.sessionId),this._closeMeshSession(i.sessionId)),i.sessionId=n,i.state=r,n&&this.sessionToFp.set(n,e),this._emitMembers(),!0):!1}unbindSession(e){let n=this.members.get(e);if(!n||!n.sessionId)return!1;let r=n.sessionId;return this.sessionToFp.delete(r),n.sessionId=null,(n.state===oe.LINKED||n.state===oe.LOST)&&(n.state=oe.PENDING),this._closeMeshSession(r),this._emitMembers(),this._scheduleMeshMaintain(),!0}setSessionState(e,n){let r=this.sessionToFp.get(e);if(!r)return;let i=this.members.get(r);if(!i||i.state===oe.SELF)return;let c=n?oe.LINKED:oe.LOST;i.state!==c&&(i.state=c,this._emitMembers(),n&&this._settleDial(r),this._scheduleMeshMaintain())}_dialStillWanted(e,n){if(this._destroyed||this._meshDials.get(e)!==n||this.epoch!==n.epoch)return!1;let r=this.members.get(e);return!(!r||r.sessionId&&r.sessionId!==n.sessionId)}_abandonDial(e,n,r){this._meshDials.get(e)===n&&(n.timer&&(clearTimeout(n.timer),this._timers.delete(n.timer)),this._meshDials.delete(e)),this._meshSessions.delete(r);try{this._mesh?.close(r)}catch{}}_closeMeshSession(e){if(!(!e||!this._meshSessions.has(e))){this._meshSessions.delete(e);try{this._mesh?.close(e)}catch{}}}_settleDial(e){let n=this._meshDials.get(e);n&&(n.timer&&(clearTimeout(n.timer),this._timers.delete(n.timer)),this._meshDials.delete(e),this._meshFailures.delete(e))}_meshFail(e,n,{tellPeer:r=!0}={}){let i=this._meshDials.get(e);if(i){i.timer&&(clearTimeout(i.timer),this._timers.delete(i.timer)),this._meshDials.delete(e);let d=this.members.get(e);i.sessionId&&d&&d.sessionId===i.sessionId?this.unbindSession(e):this._closeMeshSession(i.sessionId)}let c=this._meshFailures.get(e)||{attempts:0,nextAt:0};c.attempts+=1,c.nextAt=Date.now()+yn.MESH_RETRY_MS*2**(c.attempts-1),this._meshFailures.set(e,c),this._log("warn","mesh dial failed",{code:n,attempts:c.attempts}),r&&this.members.has(e)&&this._sendTo(e,{type:ce.MESH_ABORT,gid:this.groupId,epoch:this.epoch,from:this.selfFp,to:e}).catch(()=>{}),this._scheduleMeshMaintain()}_meshReset(){for(let e of[...this._meshDials.keys()]){let n=this._meshDials.get(e);n?.timer&&(clearTimeout(n.timer),this._timers.delete(n.timer)),this._meshDials.delete(e);let r=this.members.get(e);n?.sessionId&&r&&r.sessionId===n.sessionId?this.unbindSession(e):this._closeMeshSession(n?.sessionId)}this._meshFailures.clear(),this._probed.clear()}_scheduleMeshMaintain(){this._destroyed||!this._mesh||this._meshPass||(this._meshPass=this._timer(()=>{this._meshPass=null,this._meshMaintain()},0))}_meshMaintain(){if(this._destroyed||!this._mesh||this.phase!==K.READY||!this.sasConfirmed)return;let e=Date.now(),n=this._meshDials.size,r=1/0;for(let i of mn([...this.members.keys()])){if(n>=io)break;let c=this.members.get(i);if(!c||c.state===oe.SELF||c.sessionId||this._meshDials.has(i)||!(this.selfFp<i))continue;let d=this._meshFailures.get(i);if(d){if(d.attempts>=ao)continue;if(e<d.nextAt){r=Math.min(r,d.nextAt);continue}}this._relayFor(i)&&(n+=1,this._meshDial(i).catch(()=>{}))}r!==1/0&&!this._meshPass&&(this._meshPass=this._timer(()=>{this._meshPass=null,this._meshMaintain()},Math.max(0,r-e)+50))}async _meshDial(e){let n=this.members.get(e);if(!n||n.sessionId||this._meshDials.has(e))return;let r=this.epoch,i=Hn(N.MESH_NONCE_BYTES),c={role:"offer",sessionId:null,nonce:i,epoch:r,timer:null};this._meshDials.set(e,c);try{let d=await this._mesh.createOffer(e),h=d&&d.sessionId,y=String(d&&d.descriptor||"");if(!h||!y)throw new Q("mesh transport produced no descriptor","no_descriptor");if(!this._dialStillWanted(e,c))return this._abandonDial(e,c,h);c.sessionId=h,this._meshSessions.add(h),this.bindSession(e,h,oe.PENDING);let w=await rs(this.subtle,this.identity.keyPair.privateKey,{groupId:this.groupId,epoch:r,kind:fn.OFFER,fromFp:this.selfFp,toFp:e,descriptor:y,nonce:i});if(!await this._sendTo(e,{type:ce.MESH_OFFER,gid:this.groupId,epoch:r,from:this.selfFp,to:e,d:y,n:Ve(i),sig:Ve(w)}))throw new Q("no route to carry the dial","unreachable");c.timer=this._timer(()=>this._meshFail(e,"dial_timeout"),yn.MESH_DIAL_MS)}catch(d){this._meshFail(e,d?.code||"dial_failed")}}async _onMeshOffer(e){if(!this._mesh||this._destroyed)return;let n=Ce(String(e.from||""));if(Ce(String(e.to||""))!==this.selfFp||Ne(e.epoch)!==this.epoch||this.phase!==K.READY||!this.sasConfirmed)return;let r=this.members.get(n);if(!r||!r.publicKey)throw new Q("mesh dial from a non-member","not_a_member");if(r.sessionId||this._meshDials.has(n)||this.selfFp<n)return;let i=String(e.d||"");if(!i||i.length>N.MAX_DESCRIPTOR_CHARS)throw new Q("mesh descriptor is missing or oversized","bad_descriptor");let c=Je(String(e.n||""),{max:N.MESH_NONCE_BYTES});if(!await ss(this.subtle,r.publicKey,{groupId:this.groupId,epoch:this.epoch,kind:fn.OFFER,fromFp:n,toFp:this.selfFp,descriptor:i,nonce:c},Je(String(e.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("mesh dial signature did not verify","bad_signature");if(this._destroyed||r.sessionId||this._meshDials.has(n)||Ne(e.epoch)!==this.epoch)return;let h=this.epoch,y={role:"answer",sessionId:null,nonce:c,epoch:h,timer:null};this._meshDials.set(n,y);try{let w=await this._mesh.createAnswer(n,i),k=w&&w.sessionId,p=String(w&&w.descriptor||"");if(!k||!p)throw new Q("mesh transport produced no answer","no_descriptor");if(!this._dialStillWanted(n,y))return this._abandonDial(n,y,k);y.sessionId=k,this._meshSessions.add(k),this.bindSession(n,k,oe.PENDING);let v=await rs(this.subtle,this.identity.keyPair.privateKey,{groupId:this.groupId,epoch:h,kind:fn.ANSWER,fromFp:this.selfFp,toFp:n,descriptor:p,nonce:c});if(!await this._sendTo(n,{type:ce.MESH_ANSWER,gid:this.groupId,epoch:h,from:this.selfFp,to:n,d:p,n:Ve(c),sig:Ve(v)}))throw new Q("no route to carry the answer","unreachable");y.timer=this._timer(()=>this._meshFail(n,"answer_timeout"),yn.MESH_DIAL_MS)}catch(w){this._meshFail(n,w?.code||"answer_failed")}}async _onMeshAnswer(e){if(!this._mesh||this._destroyed)return;let n=Ce(String(e.from||""));if(Ce(String(e.to||""))!==this.selfFp||Ne(e.epoch)!==this.epoch)return;let r=this._meshDials.get(n);if(!r||r.role!=="offer"||!r.sessionId||r.epoch!==this.epoch)return;let i=this.members.get(n);if(!i||!i.publicKey)throw new Q("mesh answer from a non-member","not_a_member");let c=String(e.d||"");if(!c||c.length>N.MAX_DESCRIPTOR_CHARS)throw new Q("mesh descriptor is missing or oversized","bad_descriptor");let d=Je(String(e.n||""),{max:N.MESH_NONCE_BYTES});if(d.length!==r.nonce.length||!d.every((y,w)=>y===r.nonce[w]))throw new Q("mesh answer does not match the dial it claims","bad_mesh_nonce");if(!await ss(this.subtle,i.publicKey,{groupId:this.groupId,epoch:this.epoch,kind:fn.ANSWER,fromFp:n,toFp:this.selfFp,descriptor:c,nonce:d},Je(String(e.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("mesh answer signature did not verify","bad_signature");try{await this._mesh.acceptAnswer(r.sessionId,c)}catch(y){this._meshFail(n,y?.code||"answer_rejected")}}_onMeshAbort(e){let n=Ce(String(e.from||""));Ce(String(e.to||""))===this.selfFp&&this._meshDials.has(n)&&this._meshFail(n,"peer_aborted",{tellPeer:!1})}async probeSession(e){return this._destroyed||!this._mesh||!e||this.phase!==K.READY||!this.sasConfirmed||this.sessionToFp.has(e)?!1:this._sendProbe(e)}async _sendProbe(e){if(this._destroyed||this._probed.has(e))return!1;let n=this._linkFingerprint(e);if(!n)return!1;this._probed.add(e);let r=await hi(this.subtle,this.identity.keyPair.privateKey,{groupId:this.groupId,epoch:this.epoch,fp:this.selfFp,linkFp:n});return await this._wire(e,{type:ce.PROBE,gid:this.groupId,epoch:this.epoch,fp:this.selfFp,sig:Ve(r)}),!0}_linkFingerprint(e){try{let n=this._mesh?.linkFingerprint?.(e);return typeof n=="string"&&n.length>0?n:""}catch{return""}}async _onProbe(e,n){if(this._destroyed||this.phase!==K.READY||!this.sasConfirmed||Ne(n.epoch)!==this.epoch)return;let r=Ce(String(n.fp||""));if(r===this.selfFp)return;let i=this.members.get(r);if(!i||!i.publicKey||this.sessionToFp.has(e)||i.sessionId&&(i.state===oe.LINKED||!this._meshDials.has(r)))return;let c=this._linkFingerprint(e);if(!c)return;if(!await gi(this.subtle,i.publicKey,{groupId:this.groupId,epoch:this.epoch,fp:r,linkFp:c},Je(String(n.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("link probe signature did not verify","bad_signature");this._settleDial(r),this.bindSession(r,e,oe.LINKED),this._sendProbe(e).catch(()=>{}),this._scheduleMeshMaintain()}async invite(e){if(!this.isAdmin)throw new Q("only the admin invites","not_admin");if(await this.init(),e.length+1>N.MAX_MEMBERS)throw new Q(`a group is limited to ${N.MAX_MEMBERS} members`,"too_many_members");this._setPhase(K.FORMING);for(let c of e)this._awaitingHello.set(c.sessionId,c.name||"Member");let n={type:ce.INVITE,gid:this.groupId,epoch:this.epoch,name:this.name,adminSpki:Ve(this.identity.spki)},r=await Promise.allSettled(e.map(c=>this._wire(c.sessionId,n))),i=r.filter(c=>c.status==="rejected");if(i.length===e.length)throw this._fail("invitations_could_not_be_sent"),new Q("the invitation could not be sent \u2014 the chat with that peer is not connected","invitations_could_not_be_sent");if(i.length>0){let c=e.filter((d,h)=>r[h].status==="fulfilled");for(let d of e)c.includes(d)||this._awaitingHello.delete(d.sessionId);this._emit("partial_invite",{sent:c.length,total:e.length})}this._timer(()=>{this.phase===K.FORMING&&this._fail("invitees_did_not_respond")},yn.HELLO_MS)}async acceptInvite(e,n){let r=fr(n);await this.init();let i=Je(String(r.adminSpki||"")),{publicKey:c,fingerprint:d}=await Wn(this.subtle,i);this.adminFp=d,this.epoch=Ne(r.epoch),this.name=gn(r.name),this.members.set(d,{fp:d,name:"Admin",spki:i,publicKey:c,sessionId:e,state:oe.LINKED}),this.sessionToFp.set(e,d),this._setPhase(K.FORMING),this._emitMembers(),await this._wire(e,{type:ce.HELLO,gid:this.groupId,epoch:this.epoch,spki:Ve(this.identity.spki)}),this._timer(()=>{this.phase===K.FORMING&&this._fail("roster_never_arrived")},yn.HELLO_MS)}async _onHello(e,n){if(!this.isAdmin)return;if(!this._awaitingHello.has(e)){this._log("warn","dropped an unsolicited group hello",{groupId:this.groupId});return}let r=Je(String(n.spki||"")),{publicKey:i,fingerprint:c}=await Wn(this.subtle,r);if(!(this.members.has(c)&&c!==this.selfFp)){if(this.members.size>=N.MAX_MEMBERS)throw new Q("group is full","too_many_members");if(this.members.set(c,{fp:c,name:this._awaitingHello.get(e)||"Member",spki:r,publicKey:i,sessionId:e,state:oe.LINKED}),this.sessionToFp.set(e,c),this._awaitingHello.delete(e),this._emitMembers(),this._awaitingHello.size===0){if(this._pendingAdd)return this._finishAdd();await this.publishRoster(hn.CREATE)}}}async publishRoster(e=hn.ADD){if(!this.isAdmin)throw new Q("only the admin publishes the roster","not_admin");let n=mn([...this.members.keys()]),r={groupId:this.groupId,epoch:this.epoch,op:e,memberFps:n,name:this.name},i=await oi(this.subtle,this.identity.keyPair.privateKey,r);for(let c of n){let d=this.members.get(c);await this._broadcast({type:ce.MEMBER,gid:this.groupId,epoch:this.epoch,fp:c,name:d.name==="You"?"Admin":d.name,spki:Ve(d.spki)})}await this._broadcast({type:ce.ROSTER,gid:this.groupId,epoch:this.epoch,op:e,name:this.name,adminSpki:Ve(this.identity.spki),members:n,sig:Ve(i)}),await this._startCeremony()}async _onMemberKey(e){if(Ne(e.epoch)<this.epoch||this._pendingKeys.size>N.MAX_MEMBERS*2)return;let r=Je(String(e.spki||"")),{publicKey:i,fingerprint:c}=await Wn(this.subtle,r);if(Ce(String(e.fp||""))!==c)throw new Q("member key does not match its fingerprint","fingerprint_mismatch");this._pendingKeys.set(c,{spki:r,publicKey:i,name:gn(e.name)})}async _onRoster(e,n){let r=Ne(n.epoch);if(this.isAdmin)return;if(r<this.epoch)throw new Q("roster epoch went backwards","stale_epoch");let i=Je(String(n.adminSpki||"")),{publicKey:c,fingerprint:d}=await Wn(this.subtle,i);if(this.adminFp&&d!==this.adminFp)throw new Q("roster was signed by someone other than the admin","wrong_admin");if(!Array.isArray(n.members))throw new Q("roster carries no member list","bad_roster");if(n.members.length>N.MAX_MEMBERS)throw new Q("roster exceeds the member limit","too_many_members");let h=mn(n.members.map(p=>String(p||"")));if(!h.includes(this.selfFp))throw new Q("roster does not include us","not_a_member");if(!h.includes(d))throw new Q("roster does not include its author","bad_roster");let y=[];for(let p of h){if(p===this.selfFp){y.push({fp:p,name:"You",spki:this.identity.spki,publicKey:null});continue}let v=this._pendingKeys.get(p)||(p===d?{spki:i,publicKey:c,name:"Admin"}:null);if(!v)throw new Q("roster names a member whose key never arrived","missing_member_key");y.push({fp:p,name:v.name,spki:v.spki,publicKey:v.publicKey})}if(!await ci(this.subtle,c,{groupId:this.groupId,epoch:r,op:String(n.op||""),memberFps:h,name:gn(n.name)},Je(String(n.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("roster signature did not verify","bad_signature");this.epoch=r,this.name=gn(n.name),this.adminFp=d;let k=this.members;this.members=new Map;for(let p of y){let v=k.get(p.fp);this.members.set(p.fp,{fp:p.fp,name:p.fp===this.selfFp?"You":p.name,spki:p.spki,publicKey:p.fp===this.selfFp?null:p.publicKey,sessionId:v?.sessionId||null,state:p.fp===this.selfFp?oe.SELF:v?.state===oe.LINKED?oe.LINKED:oe.PENDING})}for(let[p,v]of[...this.sessionToFp])this.members.has(v)||this.sessionToFp.delete(p);this._emit("roster",{name:this.name,epoch:this.epoch,adminFp:d}),this._emitMembers(),await this._startCeremony()}async _startCeremony(){try{this.ceremony?.destroy()}catch{}this._meshReset(),this.ceremony=new pr({groupId:this.groupId,epoch:this.epoch,selfFingerprint:this.selfFp,memberFingerprints:[...this.members.keys()]}),this._setPhase(K.COMMITTING);let e=await this.ceremony.ownCommitment(this.subtle);await this._broadcast({type:ce.COMMIT,gid:this.groupId,epoch:this.epoch,fp:this.selfFp,commit:Ve(e)});let n=this.epoch;this._timer(()=>{this.epoch===n&&(this.phase===K.COMMITTING||this.phase===K.REVEALING)&&this._fail("ceremony_timed_out")},yn.CEREMONY_MS),await this._drainPendingCeremony(),await this._maybeReveal()}_holdCeremonyFrame(e){this._pendingCeremony.length>=N.MAX_MEMBERS*2||this._pendingCeremony.push(e)}async _drainPendingCeremony(){if(!this._draining){this._draining=!0;try{let e=this._pendingCeremony;this._pendingCeremony=[];for(let n of e)try{n.type===ce.COMMIT?await this._onCommit(n):n.type===ce.REVEAL&&await this._onReveal(n)}catch(r){this._log("warn","held ceremony frame discarded",{code:r?.code})}}finally{this._draining=!1}}}async _onCommit(e){if(!this.ceremony)return this._holdCeremonyFrame(e);Ne(e.epoch)===this.epoch&&(this.ceremony.acceptCommitment(Ce(String(e.fp||"")),Je(String(e.commit||""),{max:N.COMMIT_BYTES})),await this._drainPendingCeremony(),await this._maybeReveal())}async _maybeReveal(){if(!this.ceremony||this.ceremony.revealed||!this.ceremony.commitmentsComplete)return;this._setPhase(K.REVEALING);let e=this.ceremony.reveal();await this._broadcast({type:ce.REVEAL,gid:this.groupId,epoch:this.epoch,fp:this.selfFp,nonce:Ve(e)}),await this._maybeFinish()}async _onReveal(e){if(!this.ceremony)return this._holdCeremonyFrame(e);if(Ne(e.epoch)===this.epoch){if(!this.ceremony.commitments.has(Ce(String(e.fp||""))))return this._holdCeremonyFrame(e);await this.ceremony.acceptReveal(this.subtle,Ce(String(e.fp||"")),Je(String(e.nonce||""),{max:N.NONCE_BYTES})),await this._maybeFinish()}}async _maybeFinish(){if(!this.ceremony||!this.ceremony.revealsComplete||this.sasCode)return;let e=await this.ceremony.finish(this.subtle);this._setPhase(K.AWAITING_SAS),this.sasCode=e,this._emit("sas",{code:e})}confirmSas(){if(this.phase!==K.AWAITING_SAS||!this.sasCode)throw new Q("there is no group code to confirm","no_code");this.sasConfirmed=!0,this.phase=K.READY;try{this.ceremony?.destroy()}catch{}this.ceremony=null,this._emit("confirmed",{members:this._memberSnapshot()}),this._scheduleMeshMaintain()}async _recomputeSas(e){return ts(this.subtle,{groupId:this.groupId,epoch:this.epoch,contributions:e})}async sendText(e){if(this.phase!==K.READY||!this.sasConfirmed)throw new Q("the group code has not been confirmed","not_ready");let n=String(e??"");if(!n.trim())throw new Q("empty message","empty");let r=++this.seq,i=await ns(this.subtle,n),c=await di(this.subtle,this.identity.keyPair.privateKey,{groupId:this.groupId,epoch:this.epoch,seq:r,senderFp:this.selfFp,bodyHash:i}),d={type:ce.MESSAGE,gid:this.groupId,epoch:this.epoch,seq:r,fp:this.selfFp,ts:Date.now(),body:n,sig:Ve(c)},{delivered:h,unreachable:y}=await this._broadcast(d);return{seq:r,delivered:h,total:this.members.size-1,unreachable:y}}async _onMessage(e,{relayed:n=!1}={}){let r=Ne(e.epoch),i=Ne(e.seq),c=Ce(String(e.fp||""));if(c===this.selfFp)return;let d=this.members.get(c);if(!d||!d.publicKey)throw new Q("message from a non-member","not_a_member");if(r!==this.epoch)throw new Q("message from another epoch","stale_epoch");let h=String(e.body??""),y=await ns(this.subtle,h);if(!await pi(this.subtle,d.publicKey,{groupId:this.groupId,epoch:r,seq:i,senderFp:c,bodyHash:y},Je(String(e.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("message signature did not verify","bad_signature");let k=this.transcript.get(c)||new Map,p=Ve(y),v=k.get(i);if(v!==void 0){if(v===p)return;throw this._emit("inconsistency",{fp:c,seq:i,name:d.name}),new Q("member sent conflicting messages under one sequence number","transcript_split")}k.set(i,p),k.size>512&&k.delete(k.keys().next().value),this.transcript.set(c,k),this._emit("message",{fp:c,name:d.name,body:h,seq:i,ts:Number.isFinite(e.ts)?e.ts:Date.now(),relayed:n})}getCallSnapshot(){if(!this.call)return null;let e=this.members.get(this.call.startedBy);return{callId:this.call.callId,startedBy:this.call.startedBy,startedByName:this.call.startedBy===this.selfFp?"You":e?.name||"A member",withVideo:this.call.withVideo,startedAt:this.call.startedAt,joined:this.call.joined,participants:[...this.call.participants].map(n=>{let r=this.members.get(n);return{fp:n,name:n===this.selfFp?"You":r?.name||"A member",self:n===this.selfFp,sessionId:r?.sessionId||null,state:r?.state||oe.LOST}}).sort((n,r)=>n.fp<r.fp?-1:n.fp>r.fp?1:0)}}_emitCall(){this._emit("call",{call:this.getCallSnapshot()})}_requireReady(){if(this.phase!==K.READY||!this.sasConfirmed)throw new Q("the group code has not been confirmed","not_ready")}async _sendCallFrame(e,n,r){let i=++this.callSeq,c=await bi(this.subtle,this.identity.keyPair.privateKey,{groupId:this.groupId,epoch:this.epoch,callId:n,action:e,fp:this.selfFp,seq:i,withVideo:r});return this._broadcast({type:ce.CALL,gid:this.groupId,epoch:this.epoch,callId:n,action:e,fp:this.selfFp,seq:i,v:r===!0,ts:Date.now(),sig:Ve(c)})}async startCall({withVideo:e=!1,prepare:n=null}={}){if(this._requireReady(),this.call)throw new Q("a call is already running in this group","call_in_progress");let r=yi();this.call={callId:r,startedBy:this.selfFp,withVideo:e===!0,startedAt:Date.now(),participants:new Set([this.selfFp]),joined:!0},this._emitCall(),this._scheduleMeshMaintain();try{typeof n=="function"&&await n(this.getCallSnapshot());let{unreachable:i}=await this._sendCallFrame(Tt.START,r,this.call.withVideo);return{callId:r,unreachable:i}}catch(i){throw this.call=null,this._emitCall(),i}}async joinCall(){if(this._requireReady(),!this.call)throw new Q("there is no call to join","no_call");if(this.call.joined)return{callId:this.call.callId,unreachable:[]};this.call.joined=!0,this.call.participants.add(this.selfFp),this._emitCall(),this._scheduleMeshMaintain();let{unreachable:e}=await this._sendCallFrame(Tt.JOIN,this.call.callId,this.call.withVideo);return{callId:this.call.callId,unreachable:e}}async leaveCall(){if(!this.call)return;let e=this.call.callId,n=this.call.withVideo;this.call.joined=!1,this.call.participants.delete(this.selfFp),this.call.participants.size===0&&(this.call=null),this._emitCall();try{await this._sendCallFrame(Tt.LEAVE,e,n)}catch{}}_dropFromCall(e){!this.call||!this.call.participants.has(e)||(this.call.participants.delete(e),this.call.participants.size===0&&(this.call=null),this._emitCall())}async _onCall(e){let n=Ne(e.epoch),r=Ne(e.seq),i=Ce(String(e.fp||"")),c=is(String(e.callId||"")),d=String(e.action||""),h=e.v===!0;if(i===this.selfFp)return;let y=this.members.get(i);if(!y||!y.publicKey)throw new Q("call frame from a non-member","not_a_member");if(n!==this.epoch)throw new Q("call frame from another epoch","stale_epoch");let w=this._callSeen.get(i);if(w!==void 0&&r<=w)return;if(!await xi(this.subtle,y.publicKey,{groupId:this.groupId,epoch:n,callId:c,action:d,fp:i,seq:r,withVideo:h},Je(String(e.sig||""),{max:N.MAX_SIG_BYTES})))throw new Q("call frame signature did not verify","bad_signature");if(this._callSeen.set(i,r),!(this.phase!==K.READY||!this.sasConfirmed))switch(d){case Tt.START:{if(this.call&&this.call.callId!==c){if(c>=this.call.callId)return;this.call=null}this.call?this.call.participants.add(i):this.call={callId:c,startedBy:i,withVideo:h,startedAt:Date.now(),participants:new Set([i]),joined:!1},this._emitCall(),this._scheduleMeshMaintain();return}case Tt.JOIN:{if(!this.call||this.call.callId!==c||this.call.participants.has(i))return;this.call.participants.add(i),h&&(this.call.withVideo=!0),this._emitCall(),this._scheduleMeshMaintain();return}case Tt.LEAVE:{if(!this.call||this.call.callId!==c)return;this._dropFromCall(i);return}default:return}}async handleFrame(e,n,{relayed:r=!1}={}){if(this._destroyed||!Vn(n))return;let i=fr(n);if(!(!i||!gr.has(i.type))&&Rt(String(i.gid||""))===this.groupId)switch(i.type){case ce.RELAY:return this._onRelay(e,i);case ce.HELLO:return this._onHello(e,i);case ce.MEMBER:return this._onMemberKey(i);case ce.ROSTER:return this._onRoster(e,i);case ce.COMMIT:return this._onCommit(i);case ce.REVEAL:return this._onReveal(i);case ce.MESSAGE:return this._onMessage(i,{relayed:r});case ce.LEAVE:return this._onLeave(i);case ce.MESH_OFFER:return this._onMeshOffer(i);case ce.MESH_ANSWER:return this._onMeshAnswer(i);case ce.MESH_ABORT:return this._onMeshAbort(i);case ce.CALL:return this._onCall(i);case ce.PROBE:return r?void 0:this._onProbe(e,i);case ce.INVITE:return;default:return}}async _onRelay(e,n){let r=Ce(String(n.to||"")),i=n.inner;if(!Vn(i)||i.type===ce.RELAY)return;if(r===this.selfFp)return this.handleFrame(e,i,{relayed:!0});if(n.hopped===!0)return;let c=this.members.get(r);!c||c.state!==oe.LINKED||!c.sessionId||await this._wire(c.sessionId,{...n,hopped:!0})}async _onLeave(e){let n=Ce(String(e.fp||"")),r=this.members.get(n);if(!(!r||n===this.selfFp)){if(this._emit("left",{fp:n,name:r.name}),this._dropFromCall(n),!this.isAdmin&&n===this.adminFp){this.members.delete(n);for(let[i,c]of[...this.sessionToFp])c===n&&this.sessionToFp.delete(i);this._emit("ended",{reason:"admin_left"});return}if(this.isAdmin){this.members.delete(n);for(let[i,c]of[...this.sessionToFp])c===n&&this.sessionToFp.delete(i);if(this._emitMembers(),this.members.size<N.MIN_MEMBERS){this._emit("ended",{reason:"last_member_left"});return}this.epoch+=1,await this.publishRoster(hn.REMOVE)}}}async leave(){try{await this._broadcast({type:ce.LEAVE,gid:this.groupId,fp:this.selfFp})}catch{}}async addMembers(e){if(!this.isAdmin)throw new Q("only the admin invites","not_admin");if(!Array.isArray(e)||e.length===0)return 0;if(this._pendingAdd)throw new Q("an invitation round is already running","add_in_flight");if(this.members.size+e.length>N.MAX_MEMBERS)throw new Q(`a group is limited to ${N.MAX_MEMBERS} members`,"too_many_members");for(let d of e)if(this.sessionToFp.has(d.sessionId))throw new Q("that chat is already a member of this group","already_a_member");this._pendingAdd={op:hn.ADD,epoch:this.epoch+1,before:new Set(this.members.keys())};for(let d of e)this._awaitingHello.set(d.sessionId,d.name||"Member");let n={type:ce.INVITE,gid:this.groupId,epoch:this._pendingAdd.epoch,name:this.name,adminSpki:Ve(this.identity.spki)},r=this._pendingAdd,i=await Promise.allSettled(e.map(d=>this._wire(d.sessionId,n))),c=i.filter(d=>d.status==="fulfilled").length;if(c===0){for(let d of e)this._awaitingHello.delete(d.sessionId);throw this._pendingAdd===r&&(this._pendingAdd=null),new Q("the invitation could not be sent \u2014 that chat is not connected","invitations_could_not_be_sent")}return e.forEach((d,h)=>{i[h].status==="rejected"&&this._awaitingHello.delete(d.sessionId)}),this._pendingAdd===r&&this._timer(()=>{this._pendingAdd===r&&this._finishAdd()},yn.HELLO_MS),c}async _finishAdd(){let e=this._pendingAdd;return e?(this._pendingAdd=null,this._awaitingHello.clear(),[...this.members.keys()].filter(r=>!e.before.has(r)).length===0?(this._emit("add_failed",{reason:"nobody_joined"}),!1):(this.epoch=e.epoch,this._emitMembers(),await this.publishRoster(e.op),!0)):!1}async removeMember(e){if(!this.isAdmin)throw new Q("only the admin removes members","not_admin");if(e===this.selfFp)throw new Q("the admin cannot remove themselves","bad_target");if(!this.members.has(e))return!1;if(this.members.size-1<N.MIN_MEMBERS)throw new Q("a group cannot drop below two members \u2014 leave it instead","would_empty_group");this.members.delete(e);for(let[n,r]of[...this.sessionToFp])r===e&&this.sessionToFp.delete(n);return this.epoch+=1,this._emitMembers(),await this.publishRoster(hn.REMOVE),!0}};var oo=t=>/rate limit/i.test(t?.message||"");function Ri({getManager:t,gapMs:e=260,attempts:n=4,now:r=()=>Date.now(),sleep:i=c=>new Promise(d=>setTimeout(d,c))}={}){let c=new Map;return async function(h,y){let w=t(h);if(!w||typeof w.sendMessage!="function")throw new Error("no such link");if(typeof w.isConnected=="function"&&!w.isConnected())throw new Error("link is down");let k=c.get(h)||{chain:Promise.resolve(),lastAt:0},p=JSON.stringify(y),v=k.chain.then(async()=>{let m=e-(r()-k.lastAt);m>0&&await i(m);let I=null;for(let B=0;B<n;B++)try{return await w.sendMessage(p),k.lastAt=r(),!0}catch(D){if(I=D,!oo(D))throw D;await i(e*(B+1))}throw I});return k.chain=v.catch(()=>{}),c.set(h,k),v}}var Nn={move:{damping:1,response:.4},drawer:{damping:.8,response:.3},rotate:{damping:.8,response:.4}},co=1/480,lo=.064;function jn(){try{return typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function po(t,e=.998){return t/1e3*e/(1-e)}function _i(t,e,n,r={}){let{flick:i=220,decelerationRate:c=.998}=r;if(!n||!n.length)return t;let d=t+po(e,c),h=n;if(Math.abs(e)>i){let y=n.filter(w=>e>0?w>=t:w<=t);y.length&&(h=y)}return h.reduce((y,w)=>Math.abs(w-d)<Math.abs(y-d)?w:y,h[0])}function cs(t,e,n=.55){return e?t*e*n/(e+n*Math.abs(t)):0}function Ci(t=100){let e=[];return{add(n,r=performance.now()){for(e.push({value:n,time:r});e.length>2&&r-e[0].time>t;)e.shift()},get(n=performance.now()){if(e.length<2)return 0;let r=e[e.length-1];if(n-r.time>t)return 0;let i=e[0],c=(r.time-i.time)/1e3;return c<=0?0:(r.value-i.value)/c},reset(){e.length=0}}}function Ii(t){let{from:e,to:n,velocity:r=0,damping:i=Nn.move.damping,response:c=Nn.move.response,restDelta:d=.1,restSpeed:h=.5,respectReducedMotion:y=!0,onUpdate:w,onComplete:k}=t,p=e,v=r,m=n,I=0,B=0,D=!1,ae=2*Math.PI/c,te=i,le=()=>{D=!0,I=0,p=m,v=0,w&&w(p),k&&k()};if(y&&jn())return le(),{get value(){return p},get velocity(){return 0},get done(){return!0},retarget(C){m=C,le()},stop(){}};let be=C=>{I=0;let F=Math.min((C-B)/1e3,lo);B=C;let V=F;for(;V>0;){let O=Math.min(co,V),P=-ae*ae*(p-m)-2*te*ae*v;v+=P*O,p+=v*O,V-=O}if(Math.abs(p-m)<d&&Math.abs(v)<h){le();return}w&&w(p),I=requestAnimationFrame(be)};return B=performance.now(),I=requestAnimationFrame(be),{get value(){return p},get velocity(){return v},get done(){return D},retarget(C){m=C},stop(){I&&cancelAnimationFrame(I),I=0,D=!0}}}var ls=()=>{let[t]=React.useState(()=>typeof window>"u"||!window.location||Ks()?null:Qs({pathname:window.location.pathname||"/",languages:window.navigator?.languages||[],stored:Yr()})),[e,n]=React.useState(!1),[r,i]=React.useState(!1);if(React.useEffect(()=>{if(!t)return;let I=setTimeout(()=>i(!0),600);return()=>clearTimeout(I)},[t]),!t||e)return null;let c=ar[t]||{},d=c.dir==="rtl"?"rtl":"ltr",h=typeof window<"u"?window.location.pathname:"/",y=js(t,h),w=jn(),k=()=>{Kr(),n(!0)},p=React.createElement("div",{key:"line",lang:c.htmlLang||t,dir:d,style:{fontSize:"13px",lineHeight:1.45,color:"var(--sb-text-4)",textAlign:"start"}},a("language.suggest.text",null,t)),v=React.createElement("a",{key:"cta",href:y,hrefLang:c.htmlLang||t,lang:c.htmlLang||t,dir:d,onClick:()=>{$s(t),Kr()},style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"7px 12px",borderRadius:"9px",border:"1px solid rgba(var(--sb-orange-rgb), 0.30)",background:"rgba(var(--sb-orange-rgb), 0.12)",color:"var(--sb-orange)",fontSize:"12.5px",fontWeight:600,textDecoration:"none",whiteSpace:"nowrap"}},a("language.suggest.cta",null,t)),m=React.createElement("button",{key:"dismiss",type:"button",onClick:k,"aria-label":a("language.suggest.dismiss",null,t),style:{padding:"7px 10px",borderRadius:"9px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"rgba(var(--sb-ink), 0.02)",color:"var(--sb-text-7)",font:"inherit",fontSize:"12.5px",fontWeight:500,cursor:"pointer",whiteSpace:"nowrap"}},a("language.suggest.dismiss",null,t));return React.createElement("div",{role:"region","aria-label":a("language.label"),style:{position:"fixed",bottom:"24px",insetInlineStart:"24px",zIndex:50,maxWidth:"min(340px, calc(100vw - 48px))",display:"flex",flexDirection:"column",gap:"11px",padding:"14px 16px",borderRadius:"14px",border:"1px solid rgba(var(--sb-ink), 0.08)",background:"var(--sb-surface)",boxShadow:"0 16px 40px rgba(var(--sb-shadow-rgb), calc(0.5 * var(--sb-shadow-k)))",opacity:r?1:0,transform:r||w?"none":"translateY(10px)",transition:w?"opacity .2s linear":"opacity .3s ease, transform .3s cubic-bezier(.2,.7,.3,1)",pointerEvents:r?"auto":"none"}},[p,React.createElement("div",{key:"actions",style:{display:"flex",alignItems:"center",gap:"8px"}},[v,m])])};window.LanguageSuggestion=ls;var E=(...t)=>React.createElement(...t),_={bg:"var(--sb-bg-deep)",panel:"var(--sb-surface)",panel2:"var(--sb-surface-2)",line:"rgba(var(--sb-ink), 0.07)",line2:"rgba(var(--sb-ink), 0.13)",ink:"var(--sb-text-1)",ink2:"var(--sb-text-5b)",ink3:"var(--sb-text-9)",accent:"var(--sb-orange)",good:"var(--sb-green)",warn:"var(--sb-yellow-2)",bad:"var(--sb-red)",accentSolid:"var(--sb-orange-solid)",goodSolid:"var(--sb-green-solid)",warnSolid:"var(--sb-yellow-2-solid)",badSolid:"var(--sb-red-solid)",mono:"'JetBrains Mono', ui-monospace, monospace"},Zt={users:'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/></svg>',send:'<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 2 11 13"/><path d="m22 2-7 20-4-9-9-4 20-7z"/></svg>',shield:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><path d="m9 12 2 2 4-4"/></svg>',x:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>',plus:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg>',relay:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12h4l3-7 4 14 3-7h2"/></svg>',phone:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/></svg>',exit:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 20H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h4"/><path d="m15 16 4-4-4-4"/><path d="M19 12H10"/></svg>',video:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/></svg>'},en=(t,e={})=>E("span",{style:{display:"grid",placeItems:"center",...e},dangerouslySetInnerHTML:{__html:t}}),pt=(t=!1)=>({display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"11px 18px",borderRadius:"10px",cursor:"pointer",fontFamily:"inherit",fontSize:"14px",fontWeight:700,border:t?"none":`1px solid ${_.line2}`,background:t?_.accentSolid:"transparent",color:t?"var(--sb-on-accent)":_.ink2}),$n={position:"fixed",inset:0,zIndex:90,display:"grid",placeItems:"center",background:"rgba(var(--sb-scrim-rgb), 0.72)",backdropFilter:"blur(6px)",padding:"20px"},qn={width:"100%",maxWidth:"440px",background:_.panel,border:`1px solid ${_.line}`,borderRadius:"16px",padding:"24px",display:"flex",flexDirection:"column",gap:"18px",boxShadow:"0 24px 60px rgba(var(--sb-shadow-rgb), calc(0.5 * var(--sb-shadow-k)))"};function uo(t,e){let n=new TextEncoder,r=String(t);for(;n.encode(r).length>e;)r=r.slice(0,-1);return r}var bn={fontFamily:_.mono,fontSize:"10px",fontWeight:700,letterSpacing:"1.3px",textTransform:"uppercase",color:_.ink3};function fo(t){switch(t.phase){case K.FORMING:return a("group.waitingJoin");case K.COMMITTING:return a("group.waitingCommit");case K.REVEALING:return a("group.exchangingNonces");case K.FAILED:return ho[t.error]||a("group.errNotFormed");default:return a("group.working")}}var ho={invitations_could_not_be_sent:a("group.errInviteFailed"),invitees_did_not_respond:a("group.errNobodyAccepted"),roster_never_arrived:a("group.errNoMemberList"),ceremony_timed_out:a("groupErr.timeout"),bad_signature:a("group.errUnsignedList"),wrong_admin:a("group.errNotOwner"),fingerprint_mismatch:a("groupErr.keyMismatch"),commitment_mismatch:a("groupErr.revealMismatch"),commitment_changed:a("groupErr.commitChanged"),missing_member_key:a("groupErr.missingKey"),not_a_member:a("groupErr.outsider"),bad_name:a("group.nameTooLong"),too_many_members:a("groupErr.limit"),frame_too_large:a("groupErr.tooLarge")};function Ai({group:t,onConfirm:e,onCancel:n}){if(!t)return null;let r=t.phase===K.FAILED,i=t.phase!==K.AWAITING_SAS||!t.sasCode;return E("div",{style:$n,role:"dialog","aria-modal":"true"},E("div",{style:qn},[E("div",{key:"h",style:{display:"flex",flexDirection:"column",gap:"6px"}},[E("span",{key:"l",style:bn},a("group.sasTitle")),E("h3",{key:"t",style:{margin:0,fontSize:"19px",fontWeight:700,color:_.ink}},t.name)]),i?E("div",{key:"wait",style:{padding:"28px 16px",textAlign:"center",borderRadius:"12px",background:_.panel2,border:`1px solid ${_.line}`,color:_.ink2,fontSize:"14px"}},[E("div",{key:"d",style:{fontFamily:_.mono,fontSize:"26px",letterSpacing:"6px",color:r?_.bad:_.ink3}},"\xB7\xB7\xB7\xB7\xB7\xB7\xB7"),E("div",{key:"s",style:{marginTop:"10px",color:r?_.bad:_.ink2}},fo(t)),r&&E("div",{key:"why",style:{marginTop:"6px",fontFamily:_.mono,fontSize:"11px",color:_.ink3}},t.error||"unknown")]):E("div",{key:"code",style:{padding:"22px 16px",textAlign:"center",borderRadius:"12px",background:"rgba(var(--sb-orange-rgb), 0.09)",border:"1px solid rgba(var(--sb-orange-rgb), 0.3)"}},E("span",{dir:"ltr",style:{fontFamily:_.mono,fontSize:"clamp(30px, 9vw, 42px)",fontWeight:700,letterSpacing:"9px",color:_.accentSolid,unicodeBidi:"isolate"}},t.sasCode)),E("p",{key:"why",style:{margin:0,fontSize:"13.5px",lineHeight:1.62,color:_.ink2}},[a("group.sasReadAloud"),E("b",{key:"b",style:{color:_.ink}},`all ${t.members.length-1} other members`)," \u2014 in person, or on a call where you recognise every voice. Everyone must see the same code."]),E("p",{key:"warn",style:{margin:0,padding:"11px 13px",borderRadius:"9px",fontSize:"12.5px",lineHeight:1.55,background:"rgba(var(--sb-red-rgb), 0.09)",border:"1px solid rgba(var(--sb-red-rgb), 0.26)",color:"var(--sb-red-soft)"}},r?a("group.errNothingSent"):a("group.sasWarning")),E("div",{key:"actions",style:{display:"flex",gap:"10px"}},[E("button",{key:"c",onClick:n,style:{...pt(r),flex:r?2:1}},r?a("group.close"):a("group.cancel")),!r&&E("button",{key:"ok",onClick:e,disabled:i,style:{...pt(!0),flex:2,opacity:i?.4:1,cursor:i?"not-allowed":"pointer"}},[en(Zt.shield,{key:"i"}),a("group.sasEveryone")])])]))}function Mi({candidates:t,relayOnly:e,onCreate:n,onCancel:r}){let[i,c]=React.useState(""),[d,h]=React.useState([]),y=N.MAX_MEMBERS-1,w=p=>h(v=>v.includes(p)?v.filter(m=>m!==p):v.length>=y?v:[...v,p]),k=i.trim().length>0&&d.length>=1;return E("div",{style:$n,role:"dialog","aria-modal":"true"},E("div",{style:{...qn,maxWidth:"470px"}},[E("div",{key:"h",style:{display:"flex",flexDirection:"column",gap:"6px"}},[E("span",{key:"l",style:bn},a("group.new")),E("p",{key:"p",style:{margin:0,fontSize:"13.5px",lineHeight:1.6,color:_.ink2}},a("group.capacity",{max:N.MAX_MEMBERS}))]),E("input",{key:"name",value:i,onChange:p=>c(uo(p.target.value,N.MAX_NAME_BYTES)),placeholder:a("group.name"),style:{width:"100%",padding:"12px 14px",borderRadius:"10px",outline:"none",background:_.panel2,border:`1px solid ${_.line2}`,color:_.ink,fontFamily:"inherit",fontSize:"14.5px"}}),E("div",{key:"pick",style:{display:"flex",flexDirection:"column",gap:"9px"}},[E("div",{key:"l",style:{display:"flex",justifyContent:"space-between",alignItems:"baseline"}},[E("span",{key:"a",style:bn},a("group.members")),E("span",{key:"b",style:{...bn,color:d.length>=y?_.warn:_.ink3}},`${d.length} / ${y}`)]),t.length===0?E("div",{key:"empty",style:{padding:"18px 14px",borderRadius:"10px",textAlign:"center",background:_.panel2,border:`1px dashed ${_.line2}`,color:_.ink3,fontSize:"13px",lineHeight:1.55}},a("group.noVerified")):E("div",{key:"list",className:"msc-scroll",style:{display:"flex",flexDirection:"column",gap:"6px",maxHeight:"240px",overflowY:"auto"}},t.map(p=>{let v=d.includes(p.id),m=!v&&d.length>=y;return E("button",{key:p.id,onClick:()=>w(p.id),disabled:m,style:{display:"flex",alignItems:"center",gap:"11px",padding:"10px 12px",borderRadius:"10px",cursor:m?"not-allowed":"pointer",textAlign:"start",background:v?"rgba(var(--sb-orange-rgb), 0.1)":"transparent",border:`1px solid ${v?"rgba(var(--sb-orange-rgb), 0.32)":_.line}`,opacity:m?.4:1,fontFamily:"inherit"}},[E("span",{key:"av",style:{flex:"none",width:"32px",height:"32px",borderRadius:"9px",display:"grid",placeItems:"center",background:_.panel2,border:`1px solid ${_.line}`,fontFamily:_.mono,fontSize:"11px",fontWeight:700,color:_.ink2}},p.mono),E("span",{key:"n",style:{flex:1,minWidth:0,fontSize:"14px",color:_.ink,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},p.name),E("span",{key:"tick",style:{flex:"none",width:"18px",height:"18px",borderRadius:"5px",background:v?_.accentSolid:"transparent",border:`1px solid ${v?_.accentSolid:_.line2}`}})])}))]),!e&&E("p",{key:"ip",style:{margin:0,padding:"11px 13px",borderRadius:"9px",fontSize:"12.5px",lineHeight:1.55,background:"rgba(var(--sb-yellow-2-rgb), 0.08)",border:"1px solid rgba(var(--sb-yellow-2-rgb), 0.26)",color:"var(--sb-yellow-2)"}},a("group.relayOnlyOff")),E("div",{key:"actions",style:{display:"flex",gap:"10px"}},[E("button",{key:"c",onClick:r,style:{...pt(!1),flex:1}},a("group.cancelBtn")),E("button",{key:"ok",onClick:()=>k&&n({name:i.trim(),sessionIds:d}),disabled:!k,style:{...pt(!0),flex:2,opacity:k?1:.4,cursor:k?"pointer":"not-allowed"}},a("group.create"))])]))}function Ti({message:t,onDismiss:e}){return t?E("div",{style:$n,role:"alertdialog","aria-modal":"true"},E("div",{style:{...qn,maxWidth:"400px"}},[E("span",{key:"l",style:bn},a("group.errNotCreated")),E("p",{key:"m",style:{margin:0,fontSize:"14px",lineHeight:1.6,color:_.ink2}},t),E("button",{key:"ok",onClick:e,style:pt(!0)},a("group.close"))])):null}function Ni({candidates:t,remaining:e,onAdd:n,onCancel:r}){let[i,c]=React.useState([]),d=h=>c(y=>y.includes(h)?y.filter(w=>w!==h):y.length>=e?y:[...y,h]);return E("div",{style:$n,role:"dialog","aria-modal":"true"},E("div",{style:{...qn,maxWidth:"440px"}},[E("div",{key:"h",style:{display:"flex",flexDirection:"column",gap:"6px"}},[E("span",{key:"l",style:bn},a("group.addMembers")),E("p",{key:"p",style:{margin:0,fontSize:"13.5px",lineHeight:1.6,color:_.ink2}},e>0?a("group.roomFor",{remaining:e}):a("group.errFull"))]),t.length===0?E("div",{key:"empty",style:{padding:"18px 14px",borderRadius:"10px",textAlign:"center",background:_.panel2,border:`1px dashed ${_.line2}`,color:_.ink3,fontSize:"13px",lineHeight:1.55}},a("group.noMoreToAdd")):E("div",{key:"list",className:"msc-scroll",style:{display:"flex",flexDirection:"column",gap:"6px",maxHeight:"260px",overflowY:"auto"}},t.map(h=>{let y=i.includes(h.id),w=!y&&i.length>=e;return E("button",{key:h.id,onClick:()=>d(h.id),disabled:w,style:{display:"flex",alignItems:"center",gap:"11px",padding:"10px 12px",borderRadius:"10px",cursor:w?"not-allowed":"pointer",textAlign:"start",background:y?"rgba(var(--sb-orange-rgb), 0.1)":"transparent",border:`1px solid ${y?"rgba(var(--sb-orange-rgb), 0.32)":_.line}`,opacity:w?.4:1,fontFamily:"inherit"}},[E("span",{key:"av",style:{flex:"none",width:"32px",height:"32px",borderRadius:"9px",display:"grid",placeItems:"center",background:_.panel2,border:`1px solid ${_.line}`,fontFamily:_.mono,fontSize:"11px",fontWeight:700,color:_.ink2}},h.mono),E("span",{key:"n",style:{flex:1,minWidth:0,fontSize:"14px",color:_.ink,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},h.name),E("span",{key:"tick",style:{flex:"none",width:"18px",height:"18px",borderRadius:"5px",background:y?_.accentSolid:"transparent",border:`1px solid ${y?_.accentSolid:_.line2}`}})])})),E("p",{key:"note",style:{margin:0,padding:"11px 13px",borderRadius:"9px",fontSize:"12.5px",lineHeight:1.55,background:_.panel2,border:`1px solid ${_.line}`,color:_.ink3}},a("group.inviteSentNote")),E("div",{key:"actions",style:{display:"flex",gap:"10px"}},[E("button",{key:"c",onClick:r,style:{...pt(!1),flex:1}},a("group.cancelBtn")),E("button",{key:"ok",onClick:()=>i.length&&n(i),disabled:i.length===0,style:{...pt(!0),flex:2,opacity:i.length?1:.4,cursor:i.length?"pointer":"not-allowed"}},i.length>1?a("group.invitePeople",{count:i.length}):a("group.invite"))])]))}function Di({invite:t,onAccept:e,onDecline:n}){return t?E("div",{style:$n,role:"dialog","aria-modal":"true"},E("div",{style:qn},[E("div",{key:"h",style:{display:"flex",flexDirection:"column",gap:"6px"}},[E("span",{key:"l",style:bn},a("group.invitation")),E("h3",{key:"t",style:{margin:0,fontSize:"19px",fontWeight:700,color:_.ink}},t.name)]),E("p",{key:"p",style:{margin:0,fontSize:"13.5px",lineHeight:1.62,color:_.ink2}},[E("b",{key:"b",style:{color:_.ink}},t.fromLabel)," invited you to a peer-to-peer group. You will compare one safety code with every member before anything is sent."]),E("p",{key:"note",style:{margin:0,padding:"11px 13px",borderRadius:"9px",fontSize:"12.5px",lineHeight:1.55,background:_.panel2,border:`1px solid ${_.line}`,color:_.ink3}},a("group.joinNote")),E("div",{key:"actions",style:{display:"flex",gap:"10px"}},[E("button",{key:"d",onClick:n,style:{...pt(!1),flex:1}},a("group.decline")),E("button",{key:"a",onClick:e,style:{...pt(!0),flex:2}},a("group.join"))])])):null}function go({group:t,onRemove:e,isAdmin:n}){return E("div",{className:"msc-scroll",style:{display:"flex",gap:"7px",padding:"9px 16px",overflowX:"auto",borderBottom:`1px solid ${_.line}`,flex:"none"}},t.members.map(r=>{let i=r.state===oe.SELF,c=r.state===oe.LOST,d=i||r.state===oe.LINKED?_.goodSolid:r.state===oe.PENDING?_.warnSolid:_.badSolid,h=r.state===oe.PENDING;return E("span",{key:r.fp,title:i?"You":r.state===oe.LINKED?a("group.directLink"):r.state===oe.PENDING?a("group.noDirectLink"):a("group.memberOffline",{name:r.name}),style:{flex:"none",display:"inline-flex",alignItems:"center",gap:"6px",padding:"5px 10px",borderRadius:"20px",background:c?"transparent":_.panel2,border:`1px solid ${c?"rgba(var(--sb-red-rgb), 0.3)":_.line}`,fontSize:"12.5px",color:i?_.ink:c?_.ink3:_.ink2,opacity:c?.75:1}},[E("span",{key:"d",style:{width:"7px",height:"7px",borderRadius:"50%",background:d}}),E("span",{key:"n",style:c?{textDecoration:"line-through"}:void 0},i?"You":r.name),c&&E("span",{key:"off",style:{fontFamily:_.mono,fontSize:"10px",color:_.bad,letterSpacing:"0.04em"}},"offline"),h&&en(Zt.relay,{key:"r",color:_.warn}),n&&!i&&e&&E("button",{key:"x",onClick:()=>e(r.fp),title:a("group.remove",{name:r.name}),style:{border:"none",background:"transparent",color:_.ink3,cursor:"pointer",display:"grid",padding:0},dangerouslySetInnerHTML:{__html:'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>'}})])}))}function mo({msg:t}){let e=t.type==="sent";return t.type==="system"?E("div",{style:{alignSelf:"center",maxWidth:"80%",textAlign:"center",padding:"6px 12px",borderRadius:"9px",background:_.panel2,border:`1px solid ${_.line}`,fontSize:"12px",color:_.ink3,lineHeight:1.5}},t.message):E("div",{style:{alignSelf:e?"flex-end":"flex-start",maxWidth:"min(74%, 560px)",display:"flex",flexDirection:"column",gap:"3px"}},[!e&&E("span",{key:"who",style:{fontSize:"11.5px",fontWeight:600,color:_.accent,paddingInlineStart:"3px"}},t.senderName||a("group.member")),E("div",{key:"b",style:{padding:"9px 13px",borderRadius:e?"13px 13px 4px 13px":"13px 13px 13px 4px",background:e?"rgba(var(--sb-orange-rgb), 0.14)":_.panel2,border:`1px solid ${e?"rgba(var(--sb-orange-rgb), 0.26)":_.line}`,color:_.ink,fontSize:"14.5px",lineHeight:1.5,wordBreak:"break-word",whiteSpace:"pre-wrap"}},t.message),E("span",{key:"t",style:{fontFamily:_.mono,fontSize:"10px",color:_.ink3,alignSelf:e?"flex-end":"flex-start",padding:"0 3px"}},[new Date(t.timestamp||Date.now()).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}),t.relayed?" \xB7 relayed":""].join(""))])}function Fi({group:t,input:e,setInput:n,onSend:r,onLeave:i,onRemoveMember:c,onAddMembers:d,isAdmin:h,scrollRef:y,onStartCall:w,callActive:k,callOverlay:p}){let v=t.phase===K.READY&&t.sasConfirmed,m=t.members.some(B=>B.state===oe.PENDING),I=B=>{B.preventDefault(),!(!v||!e.trim())&&r(e)};return E("div",{style:{position:"relative",display:"flex",flexDirection:"column",height:"100%",minHeight:0,background:_.bg}},[E("style",{key:"head-css",dangerouslySetInnerHTML:{__html:"@media (max-width:1023px){.sb-group-header{padding-inline-start:58px !important;gap:9px !important;}}@media (max-width:600px){.sb-group-header .sb-gh-label{display:none !important;}.sb-group-header .sb-gh-btn{padding:8px 10px !important;}}"}}),E("div",{key:"head",className:"sb-group-header",style:{flex:"none",display:"flex",alignItems:"center",gap:"12px",padding:"var(--sb-safe-top, 0px) 16px 0",minHeight:"calc(64px + var(--sb-safe-top, 0px))",borderBottom:`1px solid ${_.line}`}},[E("span",{key:"av",style:{flex:"none",width:"38px",height:"38px",borderRadius:"11px",display:"grid",placeItems:"center",background:"rgba(var(--sb-orange-rgb), 0.12)",border:"1px solid rgba(var(--sb-orange-rgb), 0.24)",color:_.accent,fontFamily:_.mono,fontSize:"12px",fontWeight:700}},as(t.name)),E("div",{key:"meta",style:{flex:1,minWidth:0}},[E("div",{key:"n",style:{fontSize:"15px",fontWeight:700,color:_.ink,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},t.name),E("div",{key:"s",style:{fontSize:"11.5px",color:m?_.warn:_.ink3,display:"flex",alignItems:"center",gap:"5px"}},[en(Zt.users,{key:"i",width:"13px",height:"13px"}),a("group.membersCount",{count:t.members.length}),v&&t.sasCode?E("span",{key:"code",dir:"ltr",style:{unicodeBidi:"isolate"}},a("group.codeSuffix",{code:t.sasCode})):""])]),v&&w&&E("button",{key:"callvoice",className:"sb-gh-btn",onClick:()=>w(!1),disabled:k,title:a("groupCall.startVoice"),"aria-label":a("groupCall.startVoice"),style:{...pt(!1),flex:"none",padding:"8px 10px",opacity:k?.4:1,cursor:k?"default":"pointer"}},en(Zt.phone,{key:"i"})),v&&w&&E("button",{key:"callvideo",className:"sb-gh-btn",onClick:()=>w(!0),disabled:k,title:a("groupCall.startVideo"),"aria-label":a("groupCall.startVideo"),style:{...pt(!1),flex:"none",padding:"8px 10px",opacity:k?.4:1,cursor:k?"default":"pointer"}},en(Zt.video,{key:"i"})),h&&d&&t.members.length<N.MAX_MEMBERS&&E("button",{key:"add",className:"sb-gh-btn",onClick:d,title:a("group.inviteMore"),style:{...pt(!1),flex:"none",padding:"8px 12px",fontSize:"12.5px"}},[en(Zt.plus,{key:"i"}),E("span",{key:"l",className:"sb-gh-label"},a("group.add"))]),E("button",{key:"leave",className:"sb-gh-btn",onClick:i,title:a("group.leaveThis"),"aria-label":a("group.leaveThis"),style:{...pt(!1),flex:"none",padding:"8px 12px",fontSize:"12.5px",color:_.bad,borderColor:"rgba(var(--sb-red-rgb), 0.3)"}},[en(Zt.exit,{key:"i"}),E("span",{key:"l",className:"sb-gh-label"},a("group.leave"))])]),E(go,{key:"strip",group:t,onRemove:c,isAdmin:h}),m&&v&&E("div",{key:"relay-note",style:{flex:"none",padding:"8px 16px",fontSize:"12px",lineHeight:1.5,color:_.warn,background:"rgba(var(--sb-yellow-2-rgb), 0.08)",borderBottom:`1px solid ${_.line}`}},a("group.relayNote")),E("div",{key:"msgs",ref:y,className:"msc-scroll",style:{flex:1,minHeight:0,overflowY:"auto",padding:"18px 16px",display:"flex",flexDirection:"column",gap:"11px"}},t.messages.length===0?[E("div",{key:"empty",style:{margin:"auto",textAlign:"center",color:_.ink3,fontSize:"13.5px",lineHeight:1.6,maxWidth:"320px"}},v?a("group.emptyChat"):a("group.sasCompare"))]:t.messages.map(B=>E(mo,{key:B.id,msg:B}))),E("form",{key:"composer",onSubmit:I,style:{flex:"none",display:"flex",gap:"9px",padding:"12px 16px",borderTop:`1px solid ${_.line}`,alignItems:"flex-end"}},[E("input",{key:"in",value:e,onChange:B=>n(B.target.value),placeholder:v?a("group.message",{name:t.name}):a("group.confirmFirst"),disabled:!v,maxLength:N.MAX_BODY_BYTES,style:{flex:1,minWidth:0,padding:"12px 14px",borderRadius:"11px",outline:"none",background:_.panel2,border:`1px solid ${_.line2}`,color:_.ink,fontFamily:"inherit",fontSize:"14.5px",opacity:v?1:.5}}),E("button",{key:"send",type:"submit",disabled:!v||!e.trim(),title:a("group.send"),style:{...pt(!0),flex:"none",width:"44px",height:"44px",padding:0,borderRadius:"11px",opacity:!v||!e.trim()?.4:1}},en(Zt.send))]),p])}var Ue=Object.freeze({UNREACHABLE:"unreachable",CONNECTING:"connecting",ACTIVE:"active",FAILED:"failed"}),yo={idle:Ue.CONNECTING,outgoing:Ue.CONNECTING,incoming:Ue.CONNECTING,connecting:Ue.CONNECTING,active:Ue.ACTIVE,ended:Ue.FAILED},mr=Object.freeze({ON:.05,OFF:.025,HOLD_MS:600,SAMPLE_MS:120}),bo=8e3;function xo(t,e){if(!t||!e)return null;let n;try{n=t.createMediaStreamSource(e)}catch{return null}let r=t.createAnalyser();r.fftSize=512,r.smoothingTimeConstant=.2,n.connect(r);let i=new Uint8Array(r.fftSize);return{read(){r.getByteTimeDomainData(i);let c=0;for(let d=0;d<i.length;d++){let h=(i[d]-128)/128;c+=h*h}return Math.sqrt(c/i.length)},close(){try{n.disconnect()}catch{}try{r.disconnect()}catch{}}}}var yr=class{constructor({getManager:e,getUserMedia:n=null,createAudioSink:r=null,createLevelMeter:i=null,onChange:c=()=>{},log:d=()=>{}}){this._getManager=e,this._getUserMedia=n||(h=>navigator.mediaDevices.getUserMedia(h)),this._createAudioSink=r||(()=>typeof Audio=="function"?new Audio:null),this._createLevelMeter=i||(h=>xo(this._audioContext(),h)),this._onChange=c,this._log=d,this.callId=null,this.selfFp="",this.withVideo=!1,this.micEnabled=!0,this.cameraEnabled=!1,this.facingMode="user",this.error=null,this.localStream=null,this._legs=new Map,this._peers=[],this._busy=!1,this._ctx=null,this._selfMeter=null,this.selfSpeaking=!1,this._selfQuietSince=0,this._levelTimer=null}_audioContext(){if(this._ctx)return this._ctx;let e=typeof AudioContext<"u"?AudioContext:typeof webkitAudioContext<"u"?webkitAudioContext:null;if(!e)return null;try{this._ctx=new e,this._ctx.state==="suspended"&&this._ctx.resume().catch(()=>{})}catch{this._ctx=null}return this._ctx}get active(){return this.callId!==null}async join({callId:e,selfFp:n,withVideo:r=!1,peers:i=[]}){if(this.callId===e){this.setPeers(i);return}this.callId&&await this.leave(),this.callId=e,this.selfFp=n,this.withVideo=r===!0,this.micEnabled=!0,this.cameraEnabled=this.withVideo,this.error=null,this._changed();try{this.localStream=await this._getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},video:this.withVideo?{facingMode:this.facingMode,width:{ideal:1280},height:{ideal:720}}:!1})}catch(c){throw this.callId=null,this.error=Yn(c),this._changed(),c}this._selfMeter=this._createLevelMeter(this.localStream),this._startLevelPolling(),this.setPeers(i)}setPeers(e){if(this._peers=Array.isArray(e)?e:[],!this.active)return;let n=new Map;for(let r of this._peers)!r||!r.fp||r.fp===this.selfFp||n.set(r.fp,r);for(let[r,i]of[...this._legs]){let c=n.get(r);(!c||c.sessionId!==i.sessionId)&&this._detach(r)}for(let[r,i]of n){let c=this._legs.get(r);if(c){c.state===Ue.FAILED&&this._weDial(r)&&this._dial(c);continue}i.sessionId&&this._attach(r,i)}this._changed()}async leave(){if(this._stopLevelPolling(),this._selfMeter){try{this._selfMeter.close?.()}catch{}this._selfMeter=null}this.selfSpeaking=!1;for(let e of[...this._legs.keys()])this._detach(e);if(this._ctx){try{this._ctx.close?.()}catch{}this._ctx=null}if(this.localStream)for(let e of this.localStream.getTracks())try{e.stop()}catch{}this.localStream=null,this.callId=null,this.selfFp="",this.withVideo=!1,this.cameraEnabled=!1,this.micEnabled=!0,this._peers=[],this._changed()}_weDial(e){return this.selfFp<e}_attach(e,n){let r=this._getManager(n.sessionId);if(!r)return;let i={fp:e,name:n.name||"Member",sessionId:n.sessionId,manager:r,unsubscribe:null,sink:this._createAudioSink(),meter:null,fallback:null,speaking:!1,quietSince:0,state:Ue.CONNECTING,quality:null,hasVideo:!1};i.sink&&(i.sink.autoplay=!0,i.sink.muted=!1),this._legs.set(e,i);try{r.setCallGroupContext(this.callId)}catch{}try{r.setExternalMediaStream(this.localStream)}catch{}if(typeof r.addCallStateListener=="function"&&(i.unsubscribe=r.addCallStateListener(c=>this._onLegState(e,c))),this._onLegState(e,r.getCallState?.()||{}),this._weDial(e)){this._dial(i);return}i.fallback=setTimeout(()=>this._dialFallback(e),bo)}_dialFallback(e){let n=this._legs.get(e);!n||!this.active||(n.fallback=null,(n.manager.getCallState?.().phase||"idle")!=="idle")||(this._log("info","group call leg was never dialled by the peer; dialling it",{}),Promise.resolve().then(()=>n.manager.startCall(this.withVideo)).catch(()=>{let i=this._legs.get(e);i===n&&(i.state=Ue.FAILED,this._changed())}))}_dial(e){(e.manager.getCallState?.().phase||"idle")==="idle"&&(e.state=Ue.CONNECTING,Promise.resolve().then(()=>e.manager.startCall(this.withVideo)).catch(r=>{this._log("warn","group call leg could not be placed",{errorType:r?.constructor?.name});let i=this._legs.get(e.fp);i===e&&(i.state=Ue.FAILED,this._changed())}))}_detach(e){let n=this._legs.get(e);if(n){this._legs.delete(e),n.fallback&&(clearTimeout(n.fallback),n.fallback=null);try{n.unsubscribe?.()}catch{}if(n.sink){try{n.sink.pause?.()}catch{}try{n.sink.srcObject=null}catch{}}if(n.meter){try{n.meter.close?.()}catch{}n.meter=null}try{n.manager.endCall?.()}catch{}try{n.manager.setExternalMediaStream?.(null)}catch{}try{n.manager.setCallGroupContext?.(null)}catch{}}}_onLegState(e,n){let r=this._legs.get(e);if(!r)return;let i=n?.phase||"idle";r.fallback&&i!=="idle"&&(clearTimeout(r.fallback),r.fallback=null),r.state=yo[i]||Ue.CONNECTING,r.quality=n?.quality||null,r.hasVideo=n?.remoteHasVideo===!0,this._pumpAudio(r),this._changed()}_pumpAudio(e){if(!e.sink)return;let n=null;try{n=e.manager.getRemoteMediaStream?.()||null}catch{return}if(!(!n||e.sink.srcObject===n)){try{e.sink.srcObject=n;let r=e.sink.play?.();r&&r.catch&&r.catch(()=>{})}catch{}if(e.meter)try{e.meter.close?.()}catch{}e.meter=this._createLevelMeter(n),e.speaking=!1}}_startLevelPolling(){this._levelTimer||typeof setInterval!="function"||(this._levelTimer=setInterval(()=>this._sampleLevels(),mr.SAMPLE_MS))}_stopLevelPolling(){this._levelTimer&&(clearInterval(this._levelTimer),this._levelTimer=null)}_applyLevel(e,n,r,i,c){let d=e[n]===!0;return i>=mr.ON?(e[r]=0,d?!1:(e[n]=!0,!0)):d?i>mr.OFF?(e[r]=0,!1):e[r]?c-e[r]>=mr.HOLD_MS?(e[n]=!1,!0):!1:(e[r]=c,!1):!1}_sampleLevels(){if(!this.active)return;let e=Date.now(),n=!1,r=this.micEnabled&&this._selfMeter?Oi(this._selfMeter):0;this._applyLevel(this,"selfSpeaking","_selfQuietSince",r,e)&&(n=!0);for(let i of this._legs.values()){let c=i.meter?Oi(i.meter):0;this._applyLevel(i,"speaking","quietSince",c,e)&&(n=!0)}n&&this._changed()}setMic(e){if(this.micEnabled=e!==!1,this.localStream)for(let n of this.localStream.getAudioTracks())n.enabled=this.micEnabled;this.micEnabled||(this.selfSpeaking=!1,this._selfQuietSince=0);for(let n of this._legs.values())try{n.manager.setMicEnabled?.(this.micEnabled)}catch{}this._changed()}toggleMic(){this.setMic(!this.micEnabled)}async setCamera(e){if(!this.active||this._busy)return;if(e===!1){if(this.cameraEnabled=!1,this.localStream)for(let r of this.localStream.getVideoTracks())r.enabled=!1;for(let r of this._legs.values())try{r.manager.setCameraEnabled?.(!1)}catch{}this._changed();return}let n=this.localStream?.getVideoTracks?.()||[];if(n.length){for(let r of n)r.enabled=!0;this.cameraEnabled=!0,this.withVideo=!0,this._changed();return}this._busy=!0;try{let i=(await this._getUserMedia({video:{facingMode:this.facingMode,width:{ideal:1280},height:{ideal:720}}})).getVideoTracks()[0];if(!i)return;this.localStream.addTrack(i),this.cameraEnabled=!0,this.withVideo=!0,await Promise.allSettled([...this._legs.values()].map(c=>Promise.resolve().then(()=>c.manager.addVideoTrack?.(i))))}catch(r){this.error=Yn(r),this.cameraEnabled=!1}finally{this._busy=!1,this._changed()}}async toggleCamera(){await this.setCamera(!this.cameraEnabled)}async flipCamera(){if(!this.active||this._busy||!this.localStream)return;let e=this.localStream.getVideoTracks()[0];if(!e)return;this._busy=!0;let n=this.facingMode;this.facingMode=this.facingMode==="user"?"environment":"user";try{let i=(await this._getUserMedia({video:{facingMode:this.facingMode}})).getVideoTracks()[0];if(!i){this.facingMode=n;return}i.enabled=this.cameraEnabled,this.localStream.removeTrack(e);try{e.stop()}catch{}this.localStream.addTrack(i),await Promise.allSettled([...this._legs.values()].map(c=>Promise.resolve().then(()=>c.manager.replaceVideoTrack?.(i))))}catch(r){this.facingMode=n,this._log("warn","group call camera flip failed",{errorType:r?.constructor?.name})}finally{this._busy=!1,this._changed()}}getLocalStream(){return this.localStream}getRemoteStream(e){let n=this._legs.get(e);if(!n)return null;try{return n.manager.getRemoteMediaStream?.()||null}catch{return null}}snapshot(){let e=this._peers.filter(n=>n&&n.fp!==this.selfFp).map(n=>{let r=this._legs.get(n.fp);return{fp:n.fp,name:n.name||"Member",state:r?r.state:Ue.UNREACHABLE,quality:r?r.quality:null,hasVideo:r?r.hasVideo:!1,speaking:r?r.speaking===!0:!1}}).sort((n,r)=>n.fp<r.fp?-1:n.fp>r.fp?1:0);return{active:this.active,callId:this.callId,withVideo:this.withVideo,micEnabled:this.micEnabled,cameraEnabled:this.cameraEnabled,facingMode:this.facingMode,error:this.error,selfSpeaking:this.selfSpeaking,peers:e,connected:e.filter(n=>n.state===Ue.ACTIVE).length}}_changed(){try{this._onChange(this.snapshot())}catch{}}};function Oi(t){try{return t.read()}catch{return 0}}function Yn(t){let e=t?.name||"";return e==="NotAllowedError"||e==="SecurityError"?"permission_denied":e==="NotFoundError"||e==="OverconstrainedError"?"device_not_found":e==="NotReadableError"||e==="AbortError"?"device_busy":"media_failed"}var Pi=1.7777777777777777,vo=150;function Li(t,e,n,{gap:r=10,aspect:i=Pi,minWidth:c=vo}={}){if(t<=0)return{cols:0,rows:0,tileW:0,tileH:0};if(!(e>0)||!(n>0)){let h=Math.min(t,t<=2?t:Math.ceil(Math.sqrt(t)));return{cols:h,rows:Math.ceil(t/h),tileW:0,tileH:0}}let d={cols:1,rows:t,tileW:0,tileH:0};for(let h=1;h<=t;h++){let y=Math.ceil(t/h),w=(e-r*(h-1))/h,k=(n-r*(y-1))/y;if(w<=0||k<=0)continue;let p=Math.min(w,k*i);p>d.tileW&&(d={cols:h,rows:y,tileW:p,tileH:p/i})}return d.tileW<c&&(d.tileW=c,d.tileH=c/i),d}function Bi(t,e,n,{gap:r=10,aspect:i=Pi,minThumb:c=92,maxThumb:d=168}={}){if(!(e>0)||!(n>0))return{main:{w:0,h:0},stripH:0,thumbW:0};if(t<=0){let p=Math.min(e,n*i);return{main:{w:p,h:p/i},stripH:0,thumbW:0}}let h=Math.max(c,Math.min(d,Math.round(n*.2*i))),y=h/i,w=n-y-r,k=Math.min(e,w*i);return w<=0||k<h*2?{main:{w:0,h:0},stripH:0,thumbW:0}:{main:{w:k,h:k/i},stripH:y,thumbW:h}}var W=(...t)=>React.createElement(...t),xn="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",qe={lock:'<path d="M7 11V7a5 5 0 0 1 10 0v4"/><rect x="4.5" y="11" width="15" height="9" rx="2.2"/>',minimize:'<path d="M9 4v4a1 1 0 0 1-1 1H4M15 4v4a1 1 0 0 0 1 1h4M9 20v-4a1 1 0 0 0-1-1H4M15 20v-4a1 1 0 0 1 1-1h4"/>',expand:'<path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/>',users:'<path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/>',micOn:'<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v3"/>',micOff:'<path d="M9 9v-1a3 3 0 0 1 5.1-2.1M15 11v3a3 3 0 0 1-4.6 2.5"/><path d="M5 11a7 7 0 0 0 10.3 6.2M19 11a7 7 0 0 1-.4 2.3"/><path d="M12 18v3"/><path d="M3 3l18 18"/>',camOn:'<path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/>',camOff:'<path d="M16 16H3a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h2l2-2M11 6h2l7-3v14M2 2l20 20"/>',grid:'<rect x="3" y="3" width="7.5" height="7.5" rx="1.6"/><rect x="13.5" y="3" width="7.5" height="7.5" rx="1.6"/><rect x="3" y="13.5" width="7.5" height="7.5" rx="1.6"/><rect x="13.5" y="13.5" width="7.5" height="7.5" rx="1.6"/>',flip:'<path d="M3 7h3l2-2h8l2 2h3v12H3z"/><path d="M9.5 13a2.5 2.5 0 0 1 5 0M14.5 13l-1.3-1.3M14.5 13l1.3-1.3"/>',phone:'<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/>',phoneHangup:'<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z" transform="rotate(135 12 12)"/>'},ct=(t,e,n)=>W("span",{style:{display:"grid",placeItems:"center",width:e+"px",height:e+"px"},dangerouslySetInnerHTML:{__html:`<svg width="${e}" height="${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="${n}" stroke-linecap="round" stroke-linejoin="round">${t}</svg>`}}),xr={width:"56px",height:"56px",borderRadius:"50%",display:"grid",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-4)",cursor:"pointer",transition:"all .15s"},zi={...xr,background:"var(--sb-red-strong-solid)",color:"#fff",border:"1px solid transparent"},Ui={width:"56px",height:"56px",borderRadius:"50%",display:"grid",placeItems:"center",border:"none",background:"var(--sb-red-strong-solid)",color:"#fff",cursor:"pointer",boxShadow:"0 8px 24px rgba(var(--sb-red-strong-rgb), 0.35)",transition:"transform .15s"},wo={width:"36px",height:"36px",borderRadius:"9px",display:"grid",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.15)",background:"rgba(0,0,0,0.35)",color:"#fff",cursor:"pointer",transition:"all .15s"},ko={excellent:{bars:4,color:"var(--sb-green)",solid:"var(--sb-green-solid)"},good:{bars:3,color:"var(--sb-green)",solid:"var(--sb-green-solid)"},fair:{bars:2,color:"var(--sb-yellow)",solid:"var(--sb-yellow-solid)"},poor:{bars:1,color:"var(--sb-red)",solid:"var(--sb-red-solid)"}};function So(t){let e=ko[t];return e?W("span",{key:"q",style:{display:"inline-flex",alignItems:"flex-end",gap:"2px",height:"12px"}},[0,1,2,3].map(n=>W("span",{key:n,style:{width:"2.5px",height:4+n*2.6+"px",borderRadius:"1px",background:n<e.bars?e.solid:"rgba(var(--sb-ink), 0.18)"}}))):null}function Eo(t){let e=String(t||"").trim().split(/\s+/).filter(Boolean);return((e[0]?.[0]||"")+(e[1]?.[0]||e[0]?.[1]||"")).toUpperCase()||"#"}var Gi=t=>`${String(Math.floor(t/60)).padStart(2,"0")}:${String(t%60).padStart(2,"0")}`;function Ro(){let[t,e]=React.useState({w:0,h:0}),[n,r]=React.useState(null);return React.useLayoutEffect(()=>{if(!n)return;let i=()=>e(d=>d.w===n.clientWidth&&d.h===n.clientHeight?d:{w:n.clientWidth,h:n.clientHeight});if(i(),typeof ResizeObserver>"u")return window.addEventListener("resize",i),()=>window.removeEventListener("resize",i);let c=new ResizeObserver(i);return c.observe(n),()=>c.disconnect()},[n]),[r,t]}function _o({peer:t,stream:e,self:n,localStream:r,cameraEnabled:i,speaking:c,tileW:d,tileH:h,onSelect:y,pinned:w,compact:k}){let p=React.useRef(null),v=n?r:e,m=n?i:t.hasVideo;React.useEffect(()=>{let D=p.current;if(!D||!v)return;D.srcObject!==v&&(D.muted=!0,D.srcObject=v);let ae=D.play&&D.play();ae&&ae.catch&&ae.catch(()=>{})});let I=n||t.state===Ue.ACTIVE?null:t.state===Ue.UNREACHABLE?a("groupCall.waitingLink"):t.state===Ue.FAILED?a("groupCall.legFailed"):a("groupCall.connecting"),B=Math.max(44,Math.min(148,Math.round((h||180)*.42)));return W("div",{role:y?"button":void 0,tabIndex:y?0:void 0,onClick:y,onKeyDown:y?D=>{(D.key==="Enter"||D.key===" ")&&(D.preventDefault(),y())}:void 0,title:w?a("groupCall.unpin",{name:t.name}):y?a("groupCall.pin",{name:t.name}):c?a("groupCall.speaking",{name:t.name}):t.name,style:{cursor:y?"pointer":"default",position:"relative",borderRadius:"14px",overflow:"hidden",background:"var(--sb-surface)",border:c?"2px solid var(--sb-green-solid)":"2px solid rgba(var(--sb-ink), 0.08)",boxShadow:c?"0 0 0 3px rgba(var(--sb-green-rgb), 0.16)":"none",transition:"border-color .12s ease, box-shadow .12s ease",flex:d?"0 0 auto":"1 1 260px",minWidth:d?void 0:"200px",width:d?d+"px":"auto",height:h?h+"px":"auto",aspectRatio:h?void 0:"16 / 9",display:"grid",placeItems:"center"}},[m?W("video",{key:"v",ref:p,autoPlay:!0,muted:!0,playsInline:!0,style:{position:"absolute",inset:0,width:"100%",height:"100%",objectFit:"cover",transform:n?"scaleX(-1)":"none",background:"var(--sb-bg)"}}):W("div",{key:"av",style:{width:B+"px",height:B+"px",borderRadius:"50%",display:"grid",placeItems:"center",background:"radial-gradient(circle at 35% 30%, var(--sb-surface-4), var(--sb-surface))",border:c?"1.5px solid rgba(var(--sb-green-rgb), 0.65)":"1px solid rgba(var(--sb-ink), 0.1)",color:c?"var(--sb-green)":"var(--sb-text-4)",fontFamily:xn,fontSize:Math.round(B*.3)+"px",fontWeight:700,transition:"color .12s ease, border-color .12s ease"}},Eo(t.name)),W("div",{key:"label",style:{position:"absolute",insetInline:0,bottom:0,display:"flex",alignItems:"center",gap:k?"4px":"7px",padding:k?"4px 6px":"8px 10px",background:"linear-gradient(0deg, rgba(0,0,0,0.7), transparent)"}},[W("span",{key:"n",style:{flex:1,minWidth:0,fontSize:k?"10.5px":"12.5px",fontWeight:700,color:"var(--sb-text-1)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},t.name),c&&W("span",{key:"sp",style:{flex:"none",color:"var(--sb-green)",display:"grid",placeItems:"center"}},ct(qe.micOn,k?11:13,2)),I&&!k&&W("span",{key:"s",style:{flex:"none",fontFamily:xn,fontSize:"10.5px",color:t.state===Ue.FAILED?"var(--sb-red)":"var(--sb-text-6)"}},I),!n&&!k&&So(t.quality)])])}function ds({call:t,media:e,groupName:n,localStream:r,getRemoteStream:i,onJoin:c,onDismiss:d,onLeave:h,onToggleMic:y,onToggleCamera:w,onFlipCamera:k}){let[p,v]=React.useState(!1),[m,I]=React.useState(0),[B,D]=React.useState(null),[ae,te]=Ro(),le=!!t?.joined;React.useEffect(()=>{if(!le){I(0);return}let L=Date.now(),j=setInterval(()=>I(Math.floor((Date.now()-L)/1e3)),1e3);return()=>clearInterval(j)},[le,t?.callId]),React.useEffect(()=>{t||v(!1)},[!t]);let be=React.useMemo(()=>new Set(["self",...(e?.peers||[]).map(L=>L.fp)]),[e]);if(React.useEffect(()=>{B&&!be.has(B)&&D(null)},[B,be]),!t)return null;let C=W("span",{key:"enc",style:{display:"inline-flex",alignItems:"center",gap:"5px",fontSize:"11.5px",fontWeight:600,color:"var(--sb-green)"}},[ct(qe.lock,12,2),a("call.encryptedShort")]);if(!le)return W("div",{style:{position:"absolute",inset:0,zIndex:40,display:"flex",flexDirection:"column",background:"radial-gradient(680px 460px at 50% 36%, rgba(var(--sb-orange-rgb), 0.08), transparent 70%), var(--sb-bg-deep)",animation:"sbExpand .2s ease"}},[W("div",{key:"top",style:{flex:"none",padding:"16px 18px"}},W("span",{style:{display:"inline-flex",alignItems:"center",gap:"7px",fontSize:"12px",fontWeight:600,color:"var(--sb-green)"}},[ct(qe.lock,13,2),a("call.encrypted")])),W("div",{key:"mid",style:{flex:1,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",padding:"0 24px",textAlign:"center"}},[W("div",{key:"av",style:{position:"relative",width:"112px",height:"112px",marginBottom:"26px",display:"grid",placeItems:"center"}},[W("span",{key:"p1",style:{position:"absolute",inset:0,borderRadius:"50%",border:"1.5px solid rgba(var(--sb-orange-rgb), 0.5)",animation:"sbCallPulse 2s ease-out infinite"}}),W("span",{key:"p2",style:{position:"absolute",inset:0,borderRadius:"50%",border:"1.5px solid rgba(var(--sb-orange-rgb), 0.4)",animation:"sbCallPulse 2s ease-out infinite",animationDelay:"1s"}}),W("div",{key:"c",style:{width:"96px",height:"96px",borderRadius:"50%",display:"grid",placeItems:"center",background:"radial-gradient(circle at 35% 30%, var(--sb-surface-4), var(--sb-surface))",border:"1px solid rgba(var(--sb-ink), 0.1)",color:"var(--sb-text-7)"}},ct(qe.users,42,1.6))]),W("div",{key:"n",style:{fontSize:"22px",fontWeight:800,letterSpacing:"-0.4px",color:"var(--sb-text-1)"}},n),W("div",{key:"s",style:{fontFamily:xn,fontSize:"13.5px",color:"var(--sb-text-6)",marginTop:"8px"}},t.withVideo?a("groupCall.startedVideo",{name:t.startedByName}):a("groupCall.startedVoice",{name:t.startedByName})),W("div",{key:"p",style:{fontSize:"12.5px",color:"var(--sb-text-9)",marginTop:"6px"}},a("groupCall.inCall",{count:t.participants.length}))]),W("div",{key:"ctrls",style:{flex:"none",display:"flex",justifyContent:"center",gap:"48px",padding:"24px 24px 40px"}},[W("div",{key:"dec",style:{display:"flex",flexDirection:"column",alignItems:"center",gap:"8px"}},[W("button",{key:"b",onClick:d,title:a("groupCall.dismiss"),style:{...Ui,width:"62px",height:"62px"}},ct(qe.phoneHangup,24,1.9)),W("span",{key:"l",style:{fontFamily:xn,fontSize:"10.5px",color:"var(--sb-text-7)"}},a("groupCall.dismiss"))]),W("div",{key:"acc",style:{display:"flex",flexDirection:"column",alignItems:"center",gap:"8px"}},[W("button",{key:"b",onClick:c,title:a("groupCall.join"),style:{width:"62px",height:"62px",borderRadius:"50%",display:"grid",placeItems:"center",border:"none",background:"var(--sb-green-solid)",color:"var(--sb-on-green)",cursor:"pointer",boxShadow:"0 8px 24px rgba(var(--sb-green-rgb), 0.35)"}},ct(qe.phone,24,1.9)),W("span",{key:"l",style:{fontFamily:xn,fontSize:"10.5px",color:"var(--sb-text-7)"}},a("groupCall.join"))])])]);let F=e?.peers||[],V={fp:"self",name:a("groupCall.you"),state:Ue.ACTIVE,hasVideo:e?.cameraEnabled,quality:null,speaking:e?.selfSpeaking===!0};if(p){let L=F.filter(ne=>ne.speaking).map(ne=>ne.name),j=L.length===1?L[0]:L.length>1?L.slice(0,2).join(", "):e?.selfSpeaking?a("groupCall.you"):null;return W("div",{style:{position:"absolute",bottom:"18px",insetInlineEnd:"18px",zIndex:40,width:"244px",borderRadius:"14px",overflow:"hidden",background:"var(--sb-surface)",border:"1px solid rgba(var(--sb-ink), 0.1)",boxShadow:"0 18px 44px rgba(var(--sb-shadow-rgb), calc(0.55 * var(--sb-shadow-k)))",animation:"sbExpand .18s ease"}},[W("div",{key:"bar",style:{display:"flex",alignItems:"center",gap:"11px",padding:"11px 12px"}},[W("span",{key:"ic",style:{flex:"none",width:"34px",height:"34px",borderRadius:"9px",display:"grid",placeItems:"center",background:"rgba(var(--sb-green-rgb), 0.1)",border:"1px solid rgba(var(--sb-green-rgb), 0.25)",color:"var(--sb-green)"}},ct(qe.users,16,1.9)),W("div",{key:"tx",style:{flex:1,minWidth:0}},[W("div",{key:"n",style:{fontSize:"13px",fontWeight:700,color:"var(--sb-text-1)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},n),W("div",{key:"s",style:{fontFamily:xn,fontSize:"11px",color:j?"var(--sb-green)":"var(--sb-text-6)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},j?a("groupCall.speaking",{name:j}):`${a("groupCall.inCall",{count:t.participants.length})} \xB7 ${Gi(m)}`)]),W("button",{key:"exp",onClick:()=>v(!1),title:a("call.expand"),style:{flex:"none",width:"32px",height:"32px",borderRadius:"8px",display:"grid",placeItems:"center",border:"none",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-4)",cursor:"pointer"}},ct(qe.expand,15,2)),W("button",{key:"end",onClick:h,title:a("groupCall.leave"),style:{flex:"none",width:"32px",height:"32px",borderRadius:"8px",display:"grid",placeItems:"center",border:"none",background:"var(--sb-red-strong-solid)",color:"#fff",cursor:"pointer"}},ct(qe.phoneHangup,15,2))])])}let O=[V,...F],q=B?(L=>O.find(j=>j.fp===L)||null)(B):null,X=q?O.filter(L=>L.fp!==q.fp):[],H=q?Bi(X.length,te.w,te.h):null,re=q&&H&&H.main.w>0,ie=Li(O.length,te.w,te.h),de=(L,j={})=>W(_o,{key:L.fp,peer:L,self:L.fp==="self",speaking:L.speaking===!0,localStream:r,cameraEnabled:e?.cameraEnabled,stream:L.fp==="self"?null:i(L.fp),...j});return W("div",{style:{position:"absolute",inset:0,zIndex:40,display:"flex",flexDirection:"column",background:"var(--sb-bg-deepest)",animation:"sbExpand .2s ease"}},[W("div",{key:"top",style:{flex:"none",display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"14px",padding:"16px 18px 10px"}},[W("div",{key:"l",style:{minWidth:0}},[W("div",{key:"n",style:{fontSize:"17px",fontWeight:800,letterSpacing:"-0.3px",color:"#fff",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},n),W("div",{key:"s",style:{display:"inline-flex",alignItems:"center",gap:"9px",marginTop:"4px"}},[W("span",{key:"d",style:{fontFamily:xn,fontSize:"12.5px",color:"var(--sb-text-2)"}},Gi(m)),C,W("span",{key:"c",style:{fontSize:"11.5px",color:"var(--sb-text-7)"}},a("groupCall.inCall",{count:t.participants.length}))])]),W("div",{key:"r",style:{flex:"none",display:"flex",alignItems:"center",gap:"8px"}},[re&&W("button",{key:"grid",onClick:()=>D(null),title:a("groupCall.showEveryone"),style:{height:"36px",padding:"0 12px",borderRadius:"9px",display:"inline-flex",alignItems:"center",gap:"7px",border:"1px solid rgba(var(--sb-ink), 0.15)",background:"rgba(0,0,0,0.35)",color:"#fff",cursor:"pointer",fontFamily:"inherit",fontSize:"12.5px",fontWeight:600}},[ct(qe.grid,14,2),a("groupCall.showEveryone")]),W("button",{key:"min",onClick:()=>v(!0),title:a("call.minimize"),style:wo},ct(qe.minimize,16,2))])]),e?.error&&W("div",{key:"err",style:{flex:"none",margin:"0 18px 10px",padding:"9px 12px",borderRadius:"10px",background:"rgba(var(--sb-red-rgb), 0.1)",border:"1px solid rgba(var(--sb-red-rgb), 0.28)",color:"var(--sb-red)",fontSize:"12.5px",lineHeight:1.5}},a(`groupCall.err.${e.error}`)),W("div",{key:"stage",ref:ae,className:"msc-scroll",style:{flex:1,minHeight:0,minWidth:0,overflow:"auto",margin:"0 14px 6px",display:"flex",alignItems:"safe center",justifyContent:"safe center"}},re?W("div",{style:{display:"flex",flexDirection:"column",gap:10+"px",width:"100%",height:te.h+"px",minHeight:0}},[W("div",{key:"main",style:{flex:"none",display:"flex",justifyContent:"center",minHeight:0}},de(q,{tileW:H.main.w,tileH:H.main.h,pinned:!0,onSelect:()=>D(null)})),X.length>0&&W("div",{key:"strip",className:"msc-scroll",style:{flex:"none",height:H.stripH+"px",display:"flex",gap:10+"px",justifyContent:X.length>4?"flex-start":"center",overflowX:"auto",overflowY:"hidden"}},X.map(L=>de(L,{tileW:H.thumbW,tileH:H.stripH,compact:!0,onSelect:()=>D(L.fp)})))]):W("div",{style:{display:"flex",flexWrap:"wrap",gap:10+"px",justifyContent:"center",alignContent:"center",width:ie.tileW?ie.cols*ie.tileW+(ie.cols-1)*10+"px":"100%"}},O.map(L=>de(L,{tileW:ie.tileW,tileH:ie.tileH,onSelect:()=>D(L.fp)})))),W("div",{key:"ctrls",style:{flex:"none",display:"flex",alignItems:"center",justifyContent:"center",gap:"16px",padding:"16px 20px calc(22px + var(--sb-safe-bottom, env(safe-area-inset-bottom, 0px)))",background:"linear-gradient(0deg, rgba(0,0,0,0.6), transparent)"}},[W("button",{key:"mic",onClick:y,title:a("call.mute"),style:e?.micEnabled?xr:zi},ct(e?.micEnabled?qe.micOn:qe.micOff,21,1.9)),W("button",{key:"cam",onClick:w,title:a("call.camera"),style:e?.cameraEnabled?xr:zi},ct(e?.cameraEnabled?qe.camOn:qe.camOff,21,1.8)),e?.cameraEnabled&&W("button",{key:"flip",onClick:k,title:a("call.flipCamera"),style:xr},ct(qe.flip,21,1.8)),W("button",{key:"end",onClick:h,title:a("groupCall.leave"),style:Ui},ct(qe.phoneHangup,22,1.9))])])}typeof window<"u"&&(window.GroupCallUI=ds);var Kn=qs(),vr=()=>jn()?"auto":"smooth",us=async(t,e=0)=>{let n=!1;try{await navigator.clipboard.writeText(t),n=!0}catch{try{let i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),n=document.execCommand("copy"),document.body.removeChild(i)}catch{n=!1}}return n&&e>0&&navigator.clipboard&&navigator.clipboard.writeText&&setTimeout(async()=>{let r=null,i=!0;try{r=await navigator.clipboard.readText()}catch{i=!1}if(!i||r===t)try{await navigator.clipboard.writeText("")}catch{}},e),n},Co=t=>{if(typeof t!="string"||t.indexOf("```")===-1)return null;let e=[],n=/```([a-zA-Z0-9_+#.-]*)\n?([\s\S]*?)```/g,r=0,i;for(;(i=n.exec(t))!==null;)i.index>r&&e.push({kind:"text",content:t.slice(r,i.index)}),e.push({kind:"code",lang:(i[1]||"").toLowerCase(),content:i[2].replace(/\n$/,"")}),r=n.lastIndex;return r<t.length&&e.push({kind:"text",content:t.slice(r)}),e.some(c=>c.kind==="code")?e:null},Io=new Set(["const","let","var","function","return","if","else","for","while","do","switch","case","break","continue","class","extends","new","this","super","import","export","from","as","default","async","await","try","catch","finally","throw","typeof","instanceof","delete","yield","in","of","def","elif","lambda","pass","with","global","public","private","protected","static","final","void","int","long","float","double","char","bool","boolean","string","struct","enum","interface","package","func","fn","type","where","select","update","insert","delete","where","and","or","not","end","then","fi","done","echo","use","mut","impl","trait","match","module","require"]),Ao=new Set(["true","false","null","undefined","None","True","False","nil","NaN","Infinity"]),Mo=t=>{let e=/(\/\/[^\n]*|#[^\n]*|\/\*[\s\S]*?\*\/|--[^\n]*)|(`(?:\\.|[^`\\])*`|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')|(\b\d[\d_.]*(?:[eE][+-]?\d+)?\b|\b0[xX][0-9a-fA-F]+\b)|([A-Za-z_$][A-Za-z0-9_$]*)/g,n=[],r="",i=0,c=0,d=()=>{r&&(n.push(r),r="")},h;for(;(h=e.exec(t))!==null;){h.index>i&&(r+=t.slice(i,h.index)),i=e.lastIndex;let y=null;h[1]?y="text-gray-500 italic":h[2]?y="text-amber-300":h[3]?y="text-sky-300":h[4]&&(Io.has(h[4])?y="text-purple-300":Ao.has(h[4])&&(y="text-sky-300")),y?(d(),n.push(React.createElement("span",{key:`h${c++}`,className:y},h[0]))):r+=h[0]}return i<t.length&&(r+=t.slice(i)),d(),n},To={js:"javascript",mjs:"javascript",javascript:"javascript",node:"javascript",ts:"typescript",typescript:"typescript",jsx:"jsx",tsx:"tsx",py:"python",python:"python",sh:"bash",shell:"bash",zsh:"bash",bash:"bash","c++":"cpp",cpp:"cpp",cc:"cpp",cxx:"cpp",c:"c",h:"c",cs:"csharp",csharp:"csharp",java:"java",go:"go",golang:"go",rs:"rust",rust:"rust",json:"json",yml:"yaml",yaml:"yaml",sql:"sql",md:"markdown",markdown:"markdown",html:"markup",xml:"markup",svg:"markup",css:"css"},No=({code:t,lang:e})=>{let[n,r]=React.useState(!1),i=async()=>{await us(t,3e4)&&(r(!0),setTimeout(()=>r(!1),2e3))},c=To[(e||"").toLowerCase()]||(e||"").toLowerCase(),d=typeof window<"u"?window.Prism:null,h=d&&d.languages?d.languages[c]:null,y=!!(d&&h&&typeof d.highlight=="function"),w=null;if(y)try{w=d.highlight(t,h,c)}catch{w=null}let k=y?c:e||"code",p=y&&w!=null?React.createElement("code",{className:"language-"+c,dangerouslySetInnerHTML:{__html:w}}):React.createElement("code",null,Mo(t));return React.createElement("div",{className:"my-1 rounded-lg overflow-hidden",style:{backgroundColor:"var(--sb-legacy-1)",border:"0 solid var(--sb-text-3)"}},[React.createElement("div",{key:"hdr",className:"flex items-center justify-between px-3 py-1.5",style:{backgroundColor:"var(--sb-legacy-2)",border:"0 solid var(--sb-text-3)"}},[React.createElement("span",{key:"lang",className:"text-[11px] uppercase tracking-wide text-gray-500 font-mono"},k),React.createElement("button",{key:"copy",onClick:i,title:"Copy \u2014 clipboard auto-clears in 30s",className:"flex items-center text-[11px] text-gray-400 hover:text-green-400 transition-colors"},[React.createElement("i",{key:"ic",className:`${n?"fas fa-check text-green-400":"far fa-copy"} me-1`}),n?a("action.copied"):a("action.copy")])]),React.createElement("pre",{key:"pre",className:"px-3 py-2 overflow-x-auto text-xs leading-relaxed text-gray-200 custom-scrollbar",style:{whiteSpace:"pre",fontFamily:"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",margin:0}},p)])},Do=({text:t})=>{let e=Co(t);return e?React.createElement("div",{className:"text-sm"},e.map((n,r)=>n.kind==="code"?React.createElement(No,{key:r,code:n.content,lang:n.lang}):n.content.trim()?React.createElement("div",{key:r,className:"break-words",style:{whiteSpace:"pre-wrap",wordBreak:"break-word"}},n.content):null)):React.createElement("div",{className:"text-sm break-words",style:{whiteSpace:"pre-wrap",wordBreak:"break-word"}},t)};var Hi=7;var Fo=`url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='100'%20height='100'%3E%3Cfilter%20id='n'%3E%3CfeTurbulence%20type='fractalNoise'%20baseFrequency='0.9'%20numOctaves='2'%20stitchTiles='stitch'/%3E%3C/filter%3E%3Crect%20width='100%25'%20height='100%25'%20filter='url(%23n)'/%3E%3C/svg%3E")`,Dn="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",Oo=(t,e)=>{let n=[],r=t||1;for(let i=0;i<e;i++){r=(r*9301+49297)%233280;let c=r/233280,d=.45+.55*Math.sin(i/e*Math.PI);n.push(Math.max(.16,Math.min(1,(.3+c*.7)*d)))}return n},ji=t=>{t=Math.max(0,Math.round(t));let e=Math.floor(t/60),n=t%60;return e+":"+String(n).padStart(2,"0")},Po=({voice:t,isMe:e})=>{let n=React.createElement,[r,i]=React.useState(!1),[c,d]=React.useState(0),[h,y]=React.useState(!1),w=React.useRef(null),k=React.useRef(null),p=t||{},v=Number.isFinite(p.dur)&&p.dur>0?p.dur:8,m=Array.isArray(p.bars)&&p.bars.length?p.bars:Oo(v*37+11,34),I=p.url||null,B=p.transfer||null,D=!!B&&!I,ae=!!p.error||h,te=B?B.dir:null,le=B?Math.max(0,Math.min(100,B.pct||0)):100;React.useEffect(()=>()=>{if(k.current&&cancelAnimationFrame(k.current),w.current){try{w.current.pause()}catch{}w.current=null}},[]),React.useEffect(()=>{if(!I&&w.current){try{w.current.pause()}catch{}w.current=null,i(!1),d(0)}},[I]);let be=()=>{if(w.current)try{w.current.pause()}catch{}k.current&&cancelAnimationFrame(k.current),i(!1)},C=()=>{if(!I)return;if(y(!1),!w.current){let ne=new Audio;ne.preload="auto",ne.addEventListener("timeupdate",()=>{let Ie=ne.duration&&isFinite(ne.duration)?ne.duration:v;Ie&&d(Math.min(1,ne.currentTime/Ie))}),ne.addEventListener("ended",()=>{i(!1),d(0)}),ne.addEventListener("error",()=>{i(!1),y(!0)}),ne.src=I,w.current=ne}let j=w.current.play();j&&typeof j.then=="function"?j.then(()=>i(!0)).catch(ne=>{console.warn("Voice playback failed:",ne&&ne.name,ne&&ne.message),y(!0),i(!1)}):i(!0)},F=()=>{D||ae||!I||(r?be():C())},V=j=>{if(D||ae||!I)return;let ne=j.currentTarget.getBoundingClientRect(),Ie=Math.max(0,Math.min(1,(j.clientX-ne.left)/ne.width));w.current&&w.current.duration&&(w.current.currentTime=Ie*w.current.duration),d(Ie)},O=c*v,P=2*Math.PI*23,q=e?"var(--sb-orange-solid)":"rgba(var(--sb-orange-rgb), 0.14)",X=e?"var(--sb-on-accent)":"var(--sb-orange)",H=m.map((j,ne)=>{let Ie=(ne+.5)/m.length<=c,Y;return D?Y=e?"rgba(var(--sb-ink), 0.13)":"rgba(var(--sb-ink), 0.1)":Y=Ie?"var(--sb-orange-solid)":e?"rgba(var(--sb-ink), 0.22)":"rgba(var(--sb-ink), 0.16)",n("span",{key:ne,style:{flex:"1 1 0",minWidth:0,width:"3px",height:Math.round(6+j*22)+"px",borderRadius:"2px",background:Y,transition:"background .12s"}})}),re=D&&n("svg",{key:"ring",width:50,height:50,viewBox:"0 0 50 50",style:{position:"absolute",inset:0,transform:"rotate(-90deg)"}},[n("circle",{key:"bg",cx:25,cy:25,r:23,fill:"none",stroke:"rgba(var(--sb-orange-rgb), 0.2)",strokeWidth:2.5}),n("circle",{key:"fg",cx:25,cy:25,r:23,fill:"none",stroke:"var(--sb-orange-solid)",strokeWidth:2.5,strokeLinecap:"round",strokeDasharray:P.toFixed(1),strokeDashoffset:(P*(1-le/100)).toFixed(1),style:{transition:"stroke-dashoffset .12s linear"}})]),ie=ae?n("i",{className:"fas fa-triangle-exclamation",style:{fontSize:"14px"}}):D?n("svg",{width:15,height:15,viewBox:"0 0 24 24",fill:"currentColor",style:{opacity:.5}},n("path",{d:"M8 5.2v13.6l11-6.8z"})):r?n("svg",{width:16,height:16,viewBox:"0 0 24 24",fill:"currentColor"},[n("rect",{key:"a",x:6,y:5,width:4,height:14,rx:1.2}),n("rect",{key:"b",x:14,y:5,width:4,height:14,rx:1.2})]):n("svg",{width:16,height:16,viewBox:"0 0 24 24",fill:"currentColor"},n("path",{d:"M8 5.2v13.6l11-6.8z"})),de=ae?a("msg.failed"):D?te==="up"?a("chat.uploading"):a("chat.downloading"):a("msg.voice"),L=D?le+"%":ji(r||c>0?O:v);return n("div",{style:{display:"flex",alignItems:"center",gap:"13px",padding:"13px 15px 12px"}},[n("div",{key:"pw",style:{position:"relative",flex:"none",width:"50px",height:"50px",display:"grid",placeItems:"center"}},[re,n("button",{key:"pb",onClick:F,title:D?a("chat.transferring"):r?a("msg.pause"):a("msg.play"),style:{width:"42px",height:"42px",borderRadius:"50%",display:"grid",placeItems:"center",border:"none",background:ae?"rgba(var(--sb-red-rgb), 0.15)":q,color:ae?"var(--sb-red)":X,cursor:D||ae||!I?"default":"pointer",transition:"transform .15s cubic-bezier(.2,.7,.3,1)"}},ie)]),n("div",{key:"body",style:{flex:1,minWidth:0}},[n("div",{key:"wave",onClick:V,style:{display:"flex",alignItems:"center",gap:"2px",height:"30px",cursor:D||ae||!I?"default":"pointer"}},H),n("div",{key:"meta",style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:"6px"}},[n("span",{key:"t",style:{fontFamily:Dn,fontSize:"10.5px",fontWeight:500,color:D?"var(--sb-orange-3)":"var(--sb-text-6)"}},L),n("span",{key:"l",style:{fontFamily:Dn,fontSize:"9.5px",fontWeight:600,color:ae?"var(--sb-red)":D?"var(--sb-orange)":"var(--sb-text-faint)",textTransform:"uppercase",letterSpacing:"0.8px"}},de)])])])},Lo=({onSend:t,onCancel:e})=>{let n=React.createElement,r=300,i=40,[c,d]=React.useState(0),[h,y]=React.useState(()=>new Array(i).fill(.06)),[w,k]=React.useState(!1),p=React.useRef({}).current,v=()=>{try{p.node&&(p.node.disconnect(),p.node.port&&(p.node.port.onmessage=null),p.node.onaudioprocess=null)}catch{}try{p.srcNode&&p.srcNode.disconnect()}catch{}try{p.sink&&p.sink.disconnect()}catch{}p.node=p.srcNode=p.sink=null},m=()=>{p.timer&&clearInterval(p.timer),p.timer=null,v();try{p.stream&&p.stream.getTracks().forEach(C=>C.stop())}catch{}try{p.ac&&p.ac.close()}catch{}if(p.wurl){try{URL.revokeObjectURL(p.wurl)}catch{}p.wurl=null}p.stream=p.ac=null},I=C=>{p.peaks=p.peaks||[],p.peaks.push(C);let F=performance.now();(!p.lastDraw||F-p.lastDraw>55)&&(p.lastDraw=F,y(V=>{let O=V.slice(1);return O.push(Math.max(.08,C)),O}))},B=(C,F)=>{if(!C||!C.length)return new Array(F).fill(.3);let V=[],O=C.length/F;for(let P=0;P<F;P++){let q=Math.floor(P*O),X=Math.max(q+1,Math.floor((P+1)*O)),H=0;for(let re=q;re<X&&re<C.length;re++)H=Math.max(H,C[re]);V.push(Math.max(.16,Math.min(1,H)))}return V},D=(C,F,V)=>{if(!C||!C.length||V>=F)return C||new Float32Array(0);let O=F/V,P=Math.floor(C.length/O),q=new Float32Array(P);for(let X=0;X<P;X++){let H=Math.floor(X*O),re=Math.min(C.length,Math.floor((X+1)*O)),ie=0,de=0;for(let L=H;L<re;L++)ie+=C[L],de++;q[X]=de?ie/de:0}return q},ae=(C,F)=>{let V=new ArrayBuffer(44+C.length*2),O=new DataView(V),P=(X,H)=>{for(let re=0;re<H.length;re++)O.setUint8(X+re,H.charCodeAt(re))};P(0,"RIFF"),O.setUint32(4,36+C.length*2,!0),P(8,"WAVE"),P(12,"fmt "),O.setUint32(16,16,!0),O.setUint16(20,1,!0),O.setUint16(22,1,!0),O.setUint32(24,F,!0),O.setUint32(28,F*2,!0),O.setUint16(32,2,!0),O.setUint16(34,16,!0),P(36,"data"),O.setUint32(40,C.length*2,!0);let q=44;for(let X=0;X<C.length;X++){let H=Math.max(-1,Math.min(1,C[X]));O.setInt16(q,H<0?H*32768:H*32767,!0),q+=2}return new Blob([V],{type:"audio/wav"})},te=C=>{if(!C||!C.length)return;p.pcm.push(C),p.sampleCount=(p.sampleCount||0)+C.length;let F=0;for(let V=0;V<C.length;V++)F+=C[V]*C[V];I(Math.min(1,Math.sqrt(F/C.length)*3.2))},le=C=>{if(p.finished)return;p.finished=!0,p.timer&&clearInterval(p.timer),p.timer=null;let F=(p.peaks||[]).slice(),V=p.ac&&p.ac.sampleRate||48e3;v();let O=null,P=1,q=p.sampleCount||0;if(C&&p.pcm&&p.pcm.length&&q>V*.2){let X=new Float32Array(q),H=0;for(let de of p.pcm)X.set(de,H),H+=de.length;let re=24e3,ie=D(X,V,re);P=Math.max(1,Math.round(ie.length/re)),O=ae(ie,re)}try{p.stream&&p.stream.getTracks().forEach(X=>X.stop())}catch{}try{p.ac&&p.ac.close()}catch{}if(p.wurl){try{URL.revokeObjectURL(p.wurl)}catch{}p.wurl=null}p.stream=p.ac=null,p.pcm=[],C&&O&&O.size>44?t(O,P,B(F,34)):C?(k(!0),p.finished=!1):e()};if(React.useEffect(()=>{let C=!1;return p.finished=!1,p.peaks=[],p.pcm=[],p.sampleCount=0,p.t0=performance.now(),p.timer=setInterval(()=>{let F=(performance.now()-p.t0)/1e3;d(F),F>=r&&le(!0)},200),(async()=>{let F=null;try{navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&(F=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0}}))}catch{F=null}if(C){F&&F.getTracks().forEach(V=>V.stop());return}if(!F){k(!0),p.timer&&clearInterval(p.timer);return}p.stream=F;try{let V=window.AudioContext||window.webkitAudioContext;if(p.ac=new V,p.ac.state==="suspended")try{await p.ac.resume()}catch{}p.srcNode=p.ac.createMediaStreamSource(F),p.sink=p.ac.createGain(),p.sink.gain.value=0;let O=!1;if(p.ac.audioWorklet&&typeof p.ac.audioWorklet.addModule=="function"&&window.AudioWorkletNode)try{let P='class P extends AudioWorkletProcessor{process(i){const c=i[0]&&i[0][0];if(c){this.port.postMessage(c.slice(0));}return true;}}registerProcessor("sb-pcm",P);';if(p.wurl=URL.createObjectURL(new Blob([P],{type:"application/javascript"})),await p.ac.audioWorklet.addModule(p.wurl),C)return;p.node=new AudioWorkletNode(p.ac,"sb-pcm"),p.node.port.onmessage=q=>te(q.data),p.srcNode.connect(p.node),p.node.connect(p.sink),p.sink.connect(p.ac.destination),O=!0}catch{O=!1}O||(p.node=p.ac.createScriptProcessor(4096,1,1),p.node.onaudioprocess=q=>{let X=q.inputBuffer.getChannelData(0);te(new Float32Array(X))},p.srcNode.connect(p.node),p.node.connect(p.sink),p.sink.connect(p.ac.destination))}catch{k(!0),p.timer&&clearInterval(p.timer)}})(),()=>{C=!0,m()}},[]),w)return n("div",{style:{display:"flex",alignItems:"center",gap:"12px"}},[n("div",{key:"msg",style:{flex:1,minWidth:0,display:"flex",alignItems:"center",gap:"9px",height:"46px",padding:"0 16px",borderRadius:"13px",background:"rgba(var(--sb-red-strong-rgb), 0.06)",border:"1px solid rgba(var(--sb-red-strong-rgb), 0.22)",color:"var(--sb-red)",fontSize:"13.5px"}},[n("i",{key:"i",className:"fas fa-microphone-slash",style:{fontSize:"14px"}}),a("err.noAudio")]),n("button",{key:"x",onClick:e,title:a("chatHdr.close"),style:{flex:"none",width:"46px",height:"46px",borderRadius:"50%",display:"grid",placeItems:"center",border:"none",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-6)",cursor:"pointer"}},n("i",{className:"fas fa-xmark",style:{fontSize:"16px"}}))]);let be=h.map((C,F)=>n("span",{key:F,style:{flex:"none",width:"3px",height:Math.round(4+C*24)+"px",borderRadius:"2px",background:"var(--sb-red-solid)",opacity:.45+C*.55}}));return n("div",{style:{display:"flex",alignItems:"center",gap:"12px"}},[n("button",{key:"cancel",onClick:()=>le(!1),title:a("chat.discard"),style:{flex:"none",width:"42px",height:"42px",borderRadius:"12px",display:"grid",placeItems:"center",border:"none",background:"rgba(var(--sb-ink), 0.04)",color:"var(--sb-text-6)",cursor:"pointer"}},n("i",{className:"fas fa-trash-can",style:{fontSize:"15px"}})),n("div",{key:"bar",style:{flex:1,minWidth:0,display:"flex",alignItems:"center",gap:"11px",height:"46px",padding:"0 16px",borderRadius:"13px",background:"rgba(var(--sb-red-strong-rgb), 0.06)",border:"1px solid rgba(var(--sb-red-strong-rgb), 0.22)"}},[n("span",{key:"dot",style:{position:"relative",flex:"none",width:"9px",height:"9px"}},n("span",{style:{position:"absolute",inset:0,borderRadius:"50%",background:"var(--sb-red-solid)",animation:"vmRec 1.3s ease-in-out infinite"}})),n("span",{key:"time",style:{flex:"none",fontFamily:Dn,fontSize:"13px",fontWeight:600,color:"var(--sb-text-1)",minWidth:"42px"}},ji(c)),n("div",{key:"wave",style:{flex:1,minWidth:0,display:"flex",alignItems:"center",justifyContent:"flex-end",gap:"2px",height:"30px",overflow:"hidden"}},be)]),n("button",{key:"send",onClick:()=>le(!0),title:a("chat.sendVoice"),style:{flex:"none",width:"46px",height:"46px",borderRadius:"50%",display:"grid",placeItems:"center",border:"none",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",cursor:"pointer",boxShadow:"0 8px 22px rgba(var(--sb-orange-rgb), 0.3)",transition:"transform .15s cubic-bezier(.2,.7,.3,1)"}},n("svg",{width:20,height:20,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"},[n("path",{key:"a",d:"M22 2L11 13"}),n("path",{key:"b",d:"M22 2l-7 20-4-9-9-4 20-7z"})]))])},Bo=({message:t,type:e,timestamp:n,mid:r,status:i,viewOnce:c,viewOnceTtl:d,expiresAt:h,expired:y,nowTick:w,canUnsend:k,onUnsend:p,onExpire:v,voice:m})=>{let[I,B]=React.useState(!1),D=React.useRef(null),ae=L=>new Date(L).toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit"});if(React.useEffect(()=>()=>{D.current&&clearTimeout(D.current)},[]),e==="system"||e==="notice"){let L=e==="notice";return React.createElement("div",{className:"message-slide",style:{display:"flex",justifyContent:"center",margin:"4px 0"}},React.createElement("div",{style:{maxWidth:"80%",padding:"8px 14px",borderRadius:"10px",border:"1px solid "+(L?"rgba(var(--sb-green-rgb), 0.25)":"rgba(var(--sb-orange-rgb), 0.22)"),background:L?"rgba(var(--sb-green-rgb), 0.08)":"rgba(var(--sb-orange-rgb), 0.08)",color:L?"var(--sb-green-soft)":"var(--sb-orange-4)",fontSize:"12.5px",textAlign:"center",lineHeight:1.5}},t))}let te=e==="sent",le=te,be=e==="received"&&c===!0,C=typeof h=="number"?Math.max(0,Math.ceil((h-(w||Date.now()))/1e3)):null,F=L=>{if(L==null)return"";let j=Math.floor(L/3600),ne=Math.floor(L%3600/60),Ie=L%60,Y=me=>String(me).padStart(2,"0");return j>0?j+":"+Y(ne)+":"+Y(Ie):ne+":"+Y(Ie)},V=()=>{if(I)return;B(!0);let L=Math.max(1,typeof d=="number"?d:15)*1e3;D.current=setTimeout(()=>{v&&v()},L)},O=te?"14px 14px 4px 14px":"14px 14px 14px 4px",P=te?"1px solid rgba(var(--sb-ink), 0.10)":"1px solid rgba(var(--sb-ink), 0.06)",q=te?"var(--sb-surface-3)":"var(--sb-surface)";if(y===!0||typeof h=="number"&&(w||Date.now())>=h)return React.createElement("div",{className:"message-slide",style:{display:"flex",width:"100%",justifyContent:te?"flex-end":"flex-start"}},React.createElement("div",{style:{maxWidth:"74%",minWidth:"170px"}},React.createElement("div",{style:{display:"flex",alignItems:"center",gap:"9px",padding:"12px 15px",borderRadius:O,border:"1px dashed rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.018)"}},[React.createElement("i",{key:"i",className:"fas fa-clock",style:{color:"var(--sb-text-9)",fontSize:"13px"}}),React.createElement("span",{key:"t",style:{fontSize:"13px",color:"var(--sb-text-9)",fontStyle:"italic"}},a("chat.expired"))])));let H;m?H=React.createElement(Po,{key:"voice",voice:m,isMe:te}):be&&!I?H=React.createElement("div",{key:"cover",onClick:V,style:{position:"relative",cursor:"pointer",padding:"12px 15px 10px",overflow:"hidden"}},[React.createElement("div",{key:"blur",style:{fontSize:"14.5px",lineHeight:1.55,color:"var(--sb-text-5)",filter:"blur(7px)",userSelect:"none",pointerEvents:"none",wordBreak:"break-word",minHeight:"22px"}},t),React.createElement("div",{key:"grain",style:{position:"absolute",inset:0,backgroundImage:Fo,backgroundSize:"90px",opacity:.18,mixBlendMode:"screen",pointerEvents:"none"}}),React.createElement("div",{key:"lbl",style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",gap:"7px",pointerEvents:"none"}},[React.createElement("i",{key:"i",className:"fas fa-eye-slash",style:{color:"var(--sb-text-2)",fontSize:"13px"}}),React.createElement("span",{key:"t",style:{fontSize:"12px",fontWeight:600,color:"var(--sb-text-2)",textShadow:"0 1px 5px rgba(0,0,0,0.75)"}},a("chat.viewOnceTap"))])]):H=React.createElement("div",{key:"body",style:{padding:"12px 15px 10px",color:"var(--sb-text-2)"}},React.createElement(Do,{text:t}));let re=[React.createElement("span",{key:"time",style:{fontFamily:Dn,fontSize:"10.5px",color:"var(--sb-text-9)"}},ae(n))];if(te){let L={sending:{icon:"fa-clock",color:"var(--sb-text-9)",label:a("chat.sending")},sent:{icon:"fa-check",color:"var(--sb-text-7)",label:a("msg.sent")},delivered:{icon:"fa-check-double",color:"var(--sb-text-7)",label:a("chat.delivered")},read:{icon:"fa-check-double",color:"var(--sb-green)",label:a("msg.read")},failed:{icon:"fa-triangle-exclamation",color:"var(--sb-red)",label:a("chat.notSent")}}[i||"sent"]||{icon:"fa-check",color:"var(--sb-text-7)",label:a("msg.sent")};re.push(React.createElement("span",{key:"dlv",title:L.label,style:{display:"inline-flex",alignItems:"center",color:L.color}},React.createElement("i",{className:"fas "+L.icon,style:{fontSize:"10.5px"}})))}be&&I?re.push(React.createElement("span",{key:"vo",style:{display:"inline-flex",alignItems:"center",gap:"4px",fontSize:"10px",fontWeight:600,color:"var(--sb-text-7)"}},[React.createElement("span",{key:"d",style:{width:"4px",height:"4px",borderRadius:"50%",background:"var(--sb-text-7)"}}),a("chat.viewedOnce")])):C!==null&&re.push(React.createElement("span",{key:"ttl",style:{display:"inline-flex",alignItems:"center",gap:"4px",fontFamily:Dn,fontSize:"10.5px",fontWeight:500,color:"var(--sb-orange)"}},[React.createElement("i",{key:"i",className:"fas fa-clock",style:{fontSize:"10px"}}),F(C)]));let ie=[];ie.push(React.createElement("span",{key:"status",style:{display:"inline-flex",alignItems:"center",gap:"5px",fontSize:"10.5px",fontWeight:600,color:"var(--sb-green)",flex:"none"}},[React.createElement("i",{key:"i",className:le?"fas fa-lock":"fas fa-lock-open",style:{fontSize:"10px"}}),le?a("chat.encrypted"):a("chat.decrypted")])),k&&te&&r&&ie.push(React.createElement("button",{key:"unsend",onClick:()=>p&&p(r),title:a("chat.deleteForEveryone"),className:"sb-unsend",style:{background:"none",border:"none",cursor:"pointer",color:"var(--sb-text-faint)",fontSize:"11px",padding:0,lineHeight:1}},React.createElement("i",{className:"fas fa-trash-can"})));let de=React.createElement("div",{key:"meta",style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"14px",padding:"0 15px 10px"}},[React.createElement("div",{key:"l",style:{display:"flex",alignItems:"center",gap:"9px",minWidth:0}},re),React.createElement("div",{key:"r",style:{display:"flex",alignItems:"center",gap:"9px",flex:"none"}},ie)]);return React.createElement("div",{className:"message-slide",style:{display:"flex",width:"100%",justifyContent:te?"flex-end":"flex-start"}},[React.createElement("div",{key:"wrap",style:{maxWidth:"74%",minWidth:"170px"}},React.createElement("div",{style:{borderRadius:O,border:P,background:q,overflow:"hidden"}},[H,de]))])},zo=({messages:t,onCreateOffer:e,onCreateAnswer:n,onConnect:r,onClearData:i,onVerifyConnection:c,connectionStatus:d,offerData:h,answerData:y,offerInput:w,setOfferInput:k,answerInput:p,setAnswerInput:v,showOfferStep:m,showAnswerStep:I,verificationCode:B,showVerification:D,showQRCode:ae,qrCodeUrl:te,showQRScanner:le,setShowQRCode:be,setShowQRScanner:C,setShowQRScannerModal:F,offerPassword:V,answerPassword:O,localVerificationConfirmed:P,remoteVerificationConfirmed:q,bothVerificationsConfirmed:X,qrFramesTotal:H,qrFrameIndex:re,qrManualMode:ie,toggleQrManualMode:de,nextQrFrame:L,prevQrFrame:j,markAnswerCreated:ne,notificationIntegrationRef:Ie,isGeneratingKeys:Y,setIsGeneratingKeys:me,handleCreateOffer:Oe,relayOnlyMode:Ze,setRelayOnlyMode:Se,webrtcManagerRef:Ye,showIceSettings:et,setShowIceSettings:ht,iceServersText:Bt,iceSettingsPersisted:gt,customIceServers:Me,handleApplyIceSettings:ut,handleForgetIceSettings:ee,compact:Te=!1})=>{let[tt,_t]=React.useState("create"),[xt,Ct]=React.useState(!1),[zt,ft]=React.useState(!1),[vt,Ut]=React.useState(!1),[b,$]=React.useState(""),[Pe,je]=React.useState(""),[Re,nt]=React.useState(!1),[Dt,rt]=React.useState(!1),[st,nn]=React.useState(0);React.useEffect(()=>{$(""),je("")},[B]),React.useEffect(()=>{!m&&!I&&ft(!1),rt(!1)},[m,I]),React.useEffect(()=>{if(!(Y&&!m&&!I&&!D)){nn(0);return}nn(0);let Z=0,Ee=setInterval(()=>{Z+=1,nn(Z),Z>=3&&clearInterval(Ee)},520);return()=>clearInterval(Ee)},[Y,m,I,D]),React.useEffect(()=>{if(!Re)return;let z=()=>nt(!1),Z=setTimeout(()=>document.addEventListener("click",z),0);return()=>{clearTimeout(Z),document.removeEventListener("click",z)}},[Re]);let Gt=()=>{me(!1),ft(!1),i()},Fn=z=>c(z),rn=()=>{c(null,!1)},wt=async()=>{if(!xt)try{if(!("Notification"in window)||!window.isSecureContext&&window.location.protocol!=="https:"&&window.location.hostname!=="localhost")return;let z=typeof Notification<"u"&&Notification?Notification.permission:"denied";if(z==="default"&&typeof Notification<"u"&&Notification){if(await Notification.requestPermission()==="granted"){try{if(window.NotificationIntegration&&Ye.current){let Ee=new window.NotificationIntegration(Ye.current);await Ee.init(),Ie.current=Ee}}catch{}setTimeout(()=>{try{let Ee=new Notification("SecureBit Chat",{body:a("notify.enabledBody"),icon:"/logo/icon-192x192.png",tag:"welcome-notification"});Ee.onclick=()=>{Ee.close()},setTimeout(()=>{Ee.close()},5e3)}catch{}},1e3)}}else if(z==="granted"){try{if(window.NotificationIntegration&&Ye.current&&!Ie.current){let Z=new window.NotificationIntegration(Ye.current);await Z.init(),Ie.current=Z}}catch{}setTimeout(()=>{try{let Z=new Notification("SecureBit Chat",{body:a("notify.workingBody"),icon:"/logo/icon-192x192.png",tag:"test-notification"});Z.onclick=()=>{Z.close()},setTimeout(()=>{Z.close()},5e3)}catch{}},1e3)}Ct(!0)}catch{}},f=React.createElement,it="var(--sb-orange)",Fe="var(--sb-green)",we="var(--sb-orange-solid)",Ge="var(--sb-green-solid)",He=Dn,Ht=z=>{try{let Z=typeof z=="object"?JSON.stringify(z):z||"";return Z?typeof window.encodeBinaryToPrefixed=="function"?window.encodeBinaryToPrefixed(Z):typeof window.compressToPrefixedGzip=="function"?window.compressToPrefixedGzip(Z):Z:""}catch{return typeof z=="object"?JSON.stringify(z):z||""}},De=tt==="create",sn=Y&&!m&&!I&&!D,R=De&&m&&!D,xe=!De&&I&&!D,Le=!D&&!sn&&!R&&!xe,Ke=De?it:Fe,an=De?we:Ge,vn=D?a("step.verification"):R||xe?a("step.exchange"):a("step.open"),ye=Ht(De?h:y),kt=(w||"").trim().length>0,St=(p||"").trim().length>0,wr=async()=>{try{typeof us=="function"?await us(ye):await navigator.clipboard.writeText(ye)}catch{}Ut(!0),setTimeout(()=>Ut(!1),1600)},wn=(B||"").replace(/[-\s]/g,"").length,kr=b.replace(/[-\s]/g,"").length,Ft=!P&&wn>0&&kr===wn,Qn=async()=>{try{je(""),await c(b)}catch(z){$(""),je(z?.message==="SAS_MAX_ATTEMPTS"?a("sas.tooManyAttempts"):a("sas.incorrect"))}},Wt={"fa-user":{sw:1.9,e:[["circle",{cx:12,cy:8,r:3.6}],["path",{d:"M5 20c0-3.5 3-5.5 7-5.5s7 2 7 5.5"}]]},"fa-lock":{sw:2,e:[["path",{d:"M7 11V7a5 5 0 0 1 10 0v4"}],["rect",{x:4.5,y:11,width:15,height:9,rx:2.2}]]},"fa-plus":{sw:2.1,e:[["path",{d:"M12 5v14M5 12h14"}]]},"fa-link":{sw:2,e:[["path",{d:"M9.5 14.5l5-5M8 11l-2.2 2.2a3.5 3.5 0 0 0 4.95 4.95L13 16M16 13l2.2-2.2a3.5 3.5 0 0 0-4.95-4.95L11 8"}]]},"fa-bolt":{sw:2.1,e:[["path",{d:"M13 2L4.5 13H11l-1 9 8.5-11H12l1-9z"}]]},"fa-camera":{sw:1.8,e:[["path",{d:"M2 8.5V6.5A2.5 2.5 0 0 1 4.5 4h2M17.5 4h2A2.5 2.5 0 0 1 22 6.5v2M22 15.5v2a2.5 2.5 0 0 1-2.5 2.5h-2M6.5 20h-2A2.5 2.5 0 0 1 2 17.5v-2"}],["circle",{cx:12,cy:12,r:3.2}]]},"fa-qrcode":{sw:1.9,e:[["rect",{x:3,y:3,width:7,height:7,rx:1.3}],["rect",{x:14,y:3,width:7,height:7,rx:1.3}],["rect",{x:3,y:14,width:7,height:7,rx:1.3}],["path",{d:"M14 14h3v3M21 14v.01M14 21h.01M21 21v-4M17.5 21H21"}]]},"fa-chevron-right":{sw:2,e:[["path",{d:"M9 6l6 6-6 6"}]]},"fa-chevron-left":{sw:2,e:[["path",{d:"M15 6l-6 6 6 6"}]]},"fa-chevron-down":{sw:2,e:[["path",{d:"M6 9l6 6 6-6"}]]},"fa-circle-notch":{sw:2,e:[["path",{d:"M21 12a9 9 0 1 1-6.2-8.6"}]]},"fa-check":{sw:2.4,e:[["path",{d:"M20 6L9 17l-5-5"}]]},"fa-check-circle":{sw:2,e:[["circle",{cx:12,cy:12,r:9}],["path",{d:"M8.5 12.4l2.4 2.4 4.6-5"}]]},"fa-shield-alt":{sw:1.9,e:[["path",{d:"M12 2.6l7 3v5.1c0 4.5-3 8.3-7 10.2-4-1.9-7-5.7-7-10.2V5.6l7-3z"}],["path",{d:"M9 12l2 2 4-4.1"}]]},"fa-download":{sw:2,e:[["path",{d:"M12 3v12M12 15l-4.5-4.5M12 15l4.5-4.5"}],["path",{d:"M4 20h16"}]]},"fa-clock":{sw:1.8,e:[["circle",{cx:12,cy:13,r:8}],["path",{d:"M12 9v4l2.5 2M9 2h6"}]]},"fa-times":{sw:2.2,e:[["path",{d:"M18 6L6 18M6 6l12 12"}]]},"fa-eye":{sw:1.9,e:[["path",{d:"M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z"}],["circle",{cx:12,cy:12,r:3}]]}},pe=(z,Z)=>{Z=Z||{};let Ee=Wt[z];if(!Ee){let yt={};return Z.color&&(yt.color=Z.color),Z.fontSize&&(yt.fontSize=Z.fontSize),Z.animation&&(yt.animation=Z.animation),Z.style&&Object.assign(yt,Z.style),f("i",{key:Z.key,className:`fas ${z}`,style:yt})}let lt=Z.fontSize?parseFloat(Z.fontSize):16,ke={};return Z.animation&&(ke.animation=Z.animation,ke.transformOrigin="center",ke.transformBox="fill-box"),Z.style&&Object.assign(ke,Z.style),f("svg",{key:Z.key,className:z,width:lt,height:lt,viewBox:"0 0 24 24",fill:"none",stroke:Z.color||"currentColor",strokeWidth:Ee.sw||2,strokeLinecap:"round",strokeLinejoin:"round",style:ke},Ee.e.map((yt,Zn)=>f(yt[0],Object.assign({key:Zn},yt[1]))))},Vt=f("div",{key:"left",className:"sb-start-left",style:{flex:"1.05 1 380px",position:"relative",overflow:"hidden",minHeight:"100vh",boxSizing:"border-box",padding:"46px",display:"flex",flexDirection:"column",justifyContent:"space-between",gap:"36px",borderInlineEnd:"1px solid rgba(var(--sb-ink), 0.06)",background:"radial-gradient(900px 600px at 25% 18%, rgba(var(--sb-orange-rgb), 0.07), transparent 62%), radial-gradient(800px 700px at 80% 92%, rgba(var(--sb-green-rgb), 0.06), transparent 60%), var(--sb-bg-deep)"}},[f("div",{key:"herowrap",style:{flex:1,display:"flex",flexDirection:"column",justifyContent:"center",position:"relative",zIndex:2}},f("div",{key:"hero",style:{maxWidth:"560px"}},[f("h1",{key:"h1",style:{margin:"0 0 14px",fontSize:"34px",fontWeight:800,letterSpacing:"-1.1px",lineHeight:1.1,color:"var(--sb-text-1)"}},[a("hero.headlineTop"),f("br",{key:"br"}),a("hero.headlineBottom")]),f("p",{key:"p",style:{margin:"0 0 38px",fontSize:"14.5px",lineHeight:1.6,color:"var(--sb-text-7)",maxWidth:"390px"}},a("hero.subheading")),f("div",{key:"channel",style:{display:"flex",alignItems:"center",gap:"32px",flexWrap:"wrap"}},[f("svg",{key:"svg",viewBox:"0 0 380 200",role:"img","aria-label":a("hero.diagramAlt"),style:{display:"block",width:"100%",maxWidth:"380px",height:"auto",overflow:"visible"}},[f("line",{key:"l0",x1:30,y1:100,x2:330,y2:100,stroke:we,strokeWidth:1.5,strokeOpacity:.75}),f("circle",{key:"p0",r:3.6,fill:"var(--sb-orange-2)",style:{offsetPath:"path('M30,100 L330,100')",animation:"sbTrav 2.8s linear infinite"}}),f("g",{key:"g1",style:{animation:"sbIn1 14s linear infinite"}},[f("line",{key:"a",x1:30,y1:100,x2:250,y2:26,stroke:we,strokeWidth:1.4,strokeOpacity:.7}),f("line",{key:"b",x1:250,y1:26,x2:330,y2:100,stroke:Ge,strokeWidth:1.2,strokeOpacity:.3}),f("circle",{key:"p",r:3.2,fill:"var(--sb-orange-2)",style:{offsetPath:"path('M30,100 L250,26')",animation:"sbTrav 3s linear .6s infinite"}}),f("circle",{key:"n",cx:250,cy:26,r:5,fill:"var(--sb-bg-deep)",stroke:"var(--sb-diag-stroke)",strokeWidth:1.2}),f("text",{key:"t",x:250,y:8,textAnchor:"middle",fontFamily:He,fontSize:12,fill:"var(--sb-diag-label)"},"mara")]),f("circle",{key:"r1",cx:250,cy:26,r:5,fill:"none",stroke:we,strokeOpacity:.6,style:{animation:"sbRing1 14s linear infinite"}}),f("g",{key:"g2",style:{animation:"sbIn2 14s linear infinite"}},[f("line",{key:"a",x1:30,y1:100,x2:250,y2:174,stroke:we,strokeWidth:1.4,strokeOpacity:.7}),f("line",{key:"b",x1:250,y1:174,x2:330,y2:100,stroke:Ge,strokeWidth:1.2,strokeOpacity:.3}),f("line",{key:"c",x1:250,y1:26,x2:250,y2:174,stroke:Ge,strokeWidth:1.2,strokeOpacity:.3}),f("circle",{key:"p",r:3.2,fill:"var(--sb-orange-2)",style:{offsetPath:"path('M30,100 L250,174')",animation:"sbTrav 3s linear .3s infinite"}}),f("circle",{key:"q",r:2.8,fill:Ge,style:{offsetPath:"path('M250,26 L250,174')",animation:"sbTrav 3.4s linear 1.2s infinite"}}),f("circle",{key:"n",cx:250,cy:174,r:5,fill:"var(--sb-bg-deep)",stroke:"var(--sb-diag-stroke)",strokeWidth:1.2}),f("text",{key:"t",x:250,y:194,textAnchor:"middle",fontFamily:He,fontSize:12,fill:"var(--sb-diag-label)"},"tobi")]),f("circle",{key:"r2",cx:250,cy:174,r:5,fill:"none",stroke:we,strokeOpacity:.6,style:{animation:"sbRing2 14s linear infinite"}}),f("circle",{key:"pe",cx:330,cy:100,r:5,fill:"var(--sb-bg-deep)",stroke:"var(--sb-diag-stroke)",strokeWidth:1.2}),f("text",{key:"pt",x:346,y:104,fontFamily:He,fontSize:12,fill:"var(--sb-diag-label)"},"peer"),f("circle",{key:"yh",cx:30,cy:100,r:15,fill:we,fillOpacity:.09}),f("circle",{key:"yc",cx:30,cy:100,r:6,fill:we}),f("text",{key:"yt",x:30,y:126,textAnchor:"middle",fontFamily:He,fontSize:12,fill:"var(--sb-diag-text)"},a("mesh.you"))]),f("div",{key:"log",style:{display:"flex",flexDirection:"column",gap:"12px",fontFamily:He,fontSize:"12px",color:"var(--sb-diag-dim)"}},[f("div",{key:"r0",style:{animation:"sbRow0 14s linear infinite"}},a("mesh.peer")),f("div",{key:"r1",style:{animation:"sbRow1 14s linear infinite"}},a("mesh.joined2")),f("div",{key:"r2",style:{animation:"sbRow2 14s linear infinite"}},a("mesh.joined3"))])])])),f("div",{key:"badges",style:{position:"relative",zIndex:2,display:"flex",flexWrap:"wrap",gap:"8px"}},["ECDH P-384","AES-256-GCM",a("sec.pfsShort")].map(z=>f("span",{key:z,style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"6px 11px",borderRadius:"8px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"rgba(var(--sb-ink), 0.025)",fontFamily:He,fontSize:"11px",fontWeight:500,color:"var(--sb-text-6)"}},[f("span",{key:"dot",style:{width:"5px",height:"5px",borderRadius:"50%",background:Ge}}),z])))]),kn=Le&&f("div",{key:"seg",style:{position:"relative",display:"flex",padding:"4px",borderRadius:"12px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"var(--sb-surface)",marginBottom:"26px"}},[f("div",{key:"ind",style:{position:"absolute",top:"4px",bottom:"4px",insetInlineStart:"4px",width:"calc(50% - 4px)",borderRadius:"9px",background:"rgba(var(--sb-ink), 0.07)",border:"1px solid rgba(var(--sb-ink), 0.08)",transform:De?"translateX(0%)":`translateX(${100*Kn}%)`,transition:"transform .26s cubic-bezier(.3,.8,.3,1)"}}),f("button",{key:"c",className:"sb-seg-btn",onClick:()=>_t("create"),style:{position:"relative",zIndex:1,flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"11px",border:"none",background:"transparent",color:De?"var(--sb-text-1)":"var(--sb-text-8)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,cursor:"pointer"}},[pe("fa-plus",{key:"i"}),a("action.create")]),f("button",{key:"j",className:"sb-seg-btn",onClick:()=>_t("join"),style:{position:"relative",zIndex:1,flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"11px",border:"none",background:"transparent",color:De?"var(--sb-text-8)":"var(--sb-text-1)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,cursor:"pointer"}},[pe("fa-link",{key:"i"}),a("action.join")])]),on=z=>f("button",{key:z||"back",className:"sb-soft-btn",onClick:Gt,style:{display:"inline-flex",alignItems:"center",gap:"6px",marginBottom:"14px",paddingBlock:"6px",paddingInlineStart:"8px",paddingInlineEnd:"11px",borderRadius:"8px",border:"1px solid rgba(var(--sb-ink), 0.08)",background:"transparent",color:"var(--sb-text-6)",fontFamily:"inherit",fontSize:"12.5px",fontWeight:600,cursor:"pointer"}},[pe("fa-chevron-left",{key:"i"}),a("action.back")]),Xn=f("div",{key:"codeblock",style:{borderRadius:"13px",border:"1px solid rgba(var(--sb-ink), 0.08)",background:"var(--sb-surface)",overflow:"hidden",marginBottom:"16px"}},[f("div",{key:"bar",style:{display:"flex",alignItems:"center",gap:"8px",padding:"9px 12px",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)",background:"rgba(0,0,0,0.2)"}},[f("span",{key:"dot",style:{width:"7px",height:"7px",borderRadius:"50%",background:Ke}}),f("span",{key:"tag",style:{fontFamily:He,fontSize:"10.5px",fontWeight:600,color:"var(--sb-text-7)"}},De?a("cred.offerTag"):a("cred.answerTag")),f("button",{key:"copy",onClick:wr,style:{marginInlineStart:"auto",padding:"4px 9px",borderRadius:"6px",border:`1px solid ${vt?"rgba(var(--sb-green-rgb), 0.4)":"rgba(var(--sb-ink), 0.1)"}`,background:vt?"rgba(var(--sb-green-rgb), 0.1)":"rgba(var(--sb-ink), 0.04)",color:vt?Fe:"var(--sb-text-5)",fontFamily:"inherit",fontSize:"11px",fontWeight:600,cursor:"pointer",transition:"all .14s"}},vt?a("action.copied"):a("action.copy"))]),f("div",{key:"codewrap",style:{position:"relative"}},[f("div",{key:"code",className:"sb-sc",style:{fontFamily:He,fontSize:"11px",lineHeight:1.55,color:"var(--sb-text-code)",wordBreak:"break-all",padding:"11px 12px",maxHeight:"72px",overflowY:"auto",filter:Dt?"none":"blur(6px)",userSelect:Dt?"text":"none",transition:"filter .2s"}},ye),!Dt&&f("button",{key:"reveal",onClick:()=>rt(!0),style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",border:"none",background:"rgba(var(--sb-surface-rgb), 0.25)",color:"var(--sb-text-4)",fontFamily:"inherit",fontSize:"12px",fontWeight:600,cursor:"pointer"}},[pe("fa-eye",{key:"i",fontSize:"15px"}),a("cred.reveal")])])]),mt=te&&f("button",{key:"showqr",onClick:()=>ft(!0),style:{width:"100%",display:"flex",alignItems:"center",gap:"13px",padding:"15px 16px",borderRadius:"14px",border:`1px solid ${De?"rgba(var(--sb-orange-rgb), 0.3)":"rgba(var(--sb-green-rgb), 0.3)"}`,background:De?"rgba(var(--sb-orange-rgb), 0.06)":"rgba(var(--sb-green-rgb), 0.06)",color:"inherit",fontFamily:"inherit",cursor:"pointer",textAlign:"start",marginBottom:"14px"}},[f("span",{key:"ic",style:{flex:"none",width:"42px",height:"42px",borderRadius:"12px",display:"grid",placeItems:"center",background:De?"rgba(var(--sb-orange-rgb), 0.12)":"rgba(var(--sb-green-rgb), 0.12)",border:`1px solid ${De?"rgba(var(--sb-orange-rgb), 0.28)":"rgba(var(--sb-green-rgb), 0.28)"}`}},pe("fa-qrcode",{color:an,fontSize:"18px"})),f("span",{key:"tx",style:{flex:1}},[f("span",{key:"t",style:{display:"block",fontSize:"14.5px",fontWeight:700,color:"var(--sb-text-1)"}},a("qr.showTitle")),f("span",{key:"s",style:{display:"block",fontSize:"12.5px",color:"var(--sb-text-7)",marginTop:"1px"}},(H||0)>1?a("qr.showSubtitleFrames",{frames:H}):a("qr.showSubtitle"))]),pe("fa-chevron-right",{color:"var(--sb-text-9)"})]),Ot;if(D){let z=X,Z=(B||"").split("").map((Ee,lt)=>f("div",{key:lt,style:{flex:1,maxWidth:"46px",aspectRatio:"0.82",display:"grid",placeItems:"center",borderRadius:"10px",border:"1px solid rgba(var(--sb-green-rgb), 0.25)",background:"rgba(var(--sb-green-rgb), 0.05)",fontFamily:He,fontSize:"22px",fontWeight:700,color:Fe}},Ee));Ot=f("div",{key:"verify",style:{animation:"sbUp .3s ease"}},[!z&&on("vback"),f("div",{key:"head",style:{display:"flex",alignItems:"center",gap:"11px",marginBottom:"8px"}},[f("div",{key:"i",style:{width:"34px",height:"34px",flex:"none",borderRadius:"10px",display:"grid",placeItems:"center",background:"rgba(var(--sb-green-rgb), 0.1)",border:"1px solid rgba(var(--sb-green-rgb), 0.25)"}},pe("fa-shield-alt",{color:Ge})),f("h2",{key:"t",style:{margin:0,fontSize:"21px",fontWeight:800,letterSpacing:"-0.4px",color:"var(--sb-text-1)"}},a("verify.title"))]),f("p",{key:"sub",style:{margin:"0 0 18px",fontSize:"13.5px",lineHeight:1.55,color:"var(--sb-text-7)"}},a("verify.desc")),f("div",{key:"cells",dir:"ltr",style:{display:"flex",gap:"6px",justifyContent:"center",marginBottom:"20px",flexWrap:"wrap"}},Z),z?f("div",{key:"ok",style:{display:"flex",flexDirection:"column",alignItems:"center",textAlign:"center",padding:"24px 16px",borderRadius:"16px",border:"1px solid rgba(var(--sb-green-rgb), 0.25)",background:"rgba(var(--sb-green-rgb), 0.06)",animation:"sbUp .3s ease"}},[f("div",{key:"i",style:{width:"54px",height:"54px",borderRadius:"16px",display:"grid",placeItems:"center",background:"rgba(var(--sb-green-rgb), 0.14)",border:"1px solid rgba(var(--sb-green-rgb), 0.35)",marginBottom:"14px"}},pe("fa-check",{color:Ge,fontSize:"24px"})),f("div",{key:"t",style:{fontSize:"18px",fontWeight:800,color:"var(--sb-text-1)"}},a("verify.verified")),f("div",{key:"s",style:{fontSize:"13.5px",color:"var(--sb-text-7)",marginTop:"5px"}},a("verify.bothConfirmed"))]):f("div",{key:"form"},[f("div",{key:"lbl",style:{fontSize:"12.5px",fontWeight:600,color:"var(--sb-text-6)",marginBottom:"8px"}},a("verify.enterLabel")),f("input",{key:"in",dir:"ltr",value:b,onChange:Ee=>{$(Ee.target.value.replace(/\D/g,"").slice(0,Hi)),Pe&&je("")},disabled:P,autoFocus:!0,autoComplete:"one-time-code",spellCheck:!1,type:"text",inputMode:"numeric",pattern:"[0-9]*",maxLength:Hi,placeholder:B?a("verify.placeholder"):a("verify.waiting"),style:{width:"100%",textAlign:"center",letterSpacing:"6px",borderRadius:"12px",border:`1px solid ${b.length?Ft||P?"rgba(var(--sb-green-rgb), 0.5)":"rgba(var(--sb-ink), 0.14)":"rgba(var(--sb-ink), 0.08)"}`,background:"var(--sb-surface)",color:"var(--sb-text-1)",fontFamily:He,fontSize:"20px",fontWeight:700,padding:"14px",outline:"none",marginBottom:Pe?"8px":"16px"}}),Pe&&f("p",{key:"err",style:{color:"var(--sb-red)",fontSize:"12.5px",margin:"0 0 16px"}},Pe),f("div",{key:"status",style:{display:"flex",flexDirection:"column",gap:"8px",marginBottom:"16px"}},[f("div",{key:"you",style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"11px 14px",borderRadius:"11px",border:"1px solid rgba(var(--sb-ink), 0.06)",background:"var(--sb-surface)"}},[f("span",{key:"l",style:{fontSize:"13px",color:"var(--sb-text-4)",fontWeight:600}},a("verify.yours")),f("span",{key:"v",style:{display:"inline-flex",alignItems:"center",gap:"6px",fontSize:"12.5px",fontWeight:600,color:P?Fe:"var(--sb-text-8)"}},[pe(P?"fa-check-circle":"fa-clock",{key:"i"}),P?a("verify.confirmed"):a("verify.pending")])]),f("div",{key:"peer",style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"11px 14px",borderRadius:"11px",border:"1px solid rgba(var(--sb-ink), 0.06)",background:"var(--sb-surface)"}},[f("span",{key:"l",style:{fontSize:"13px",color:"var(--sb-text-4)",fontWeight:600}},a("verify.peer")),f("span",{key:"v",style:{display:"inline-flex",alignItems:"center",gap:"6px",fontSize:"12.5px",fontWeight:600,color:q?Fe:"var(--sb-text-8)"}},[pe(q?"fa-check-circle":"fa-clock",{key:"i"}),q?a("verify.confirmed"):a("verify.pending")])])]),f("div",{key:"btns",style:{display:"flex",gap:"10px"}},[f("button",{key:"ok",onClick:Qn,disabled:!Ft,style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"14px",borderRadius:"13px",border:"none",background:Ft?Ge:"rgba(var(--sb-ink), 0.05)",color:Ft?"var(--sb-on-green-2)":"var(--sb-text-faint)",fontFamily:"inherit",fontSize:"14.5px",fontWeight:700,cursor:Ft?"pointer":"not-allowed",boxShadow:Ft?"0 8px 24px rgba(var(--sb-green-rgb), 0.25)":"none"}},[pe(P?"fa-check-circle":"fa-check",{key:"i"}),P?a("verify.confirmed"):a("verify.confirm")]),f("button",{key:"no",onClick:rn,style:{flex:"none",display:"flex",alignItems:"center",justifyContent:"center",gap:"7px",padding:"14px 16px",borderRadius:"13px",border:"1px solid rgba(var(--sb-red-rgb), 0.3)",background:"transparent",color:"var(--sb-red)",fontFamily:"inherit",fontSize:"13.5px",fontWeight:600,cursor:"pointer"}},[pe("fa-times",{key:"i"}),a("verify.mismatch")])])])])}else if(sn){let z=[a("handshake.step1"),a("handshake.step2"),a("handshake.step3")];Ot=f("div",{key:"gen",style:{animation:"sbUp .28s ease"}},[f("div",{key:"head",style:{display:"flex",alignItems:"center",gap:"13px",marginBottom:"22px"}},[f("div",{key:"sp",style:{width:"44px",height:"44px",flex:"none",display:"grid",placeItems:"center"}},pe("fa-circle-notch",{color:we,fontSize:"32px",animation:"sbSpin 1s linear infinite"})),f("div",{key:"tx"},[f("h2",{key:"t",style:{margin:0,fontSize:"20px",fontWeight:800,letterSpacing:"-0.4px",color:"var(--sb-text-1)"}},De?a("handshake.securingTitle"):a("handshake.answerTitle")),f("p",{key:"s",style:{margin:"3px 0 0",fontSize:"13px",color:"var(--sb-text-7)"}},a("handshake.securingDesc"))])]),f("div",{key:"steps",style:{display:"flex",flexDirection:"column",borderRadius:"13px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"var(--sb-surface)",overflow:"hidden"}},z.map((Z,Ee)=>{let lt=st>Ee,ke=st===Ee;return f("div",{key:Ee,style:{display:"flex",alignItems:"center",gap:"12px",padding:"13px 15px",borderTop:Ee?"1px solid rgba(var(--sb-ink), 0.05)":"none",transition:"background .3s",background:lt?"rgba(var(--sb-green-rgb), 0.04)":"transparent"}},[f("div",{key:"d",style:{flex:"none",width:"20px",height:"20px",borderRadius:"50%",display:"grid",placeItems:"center",background:lt?"rgba(var(--sb-green-rgb), 0.12)":ke?"rgba(var(--sb-orange-rgb), 0.12)":"rgba(var(--sb-ink), 0.04)",border:`1px solid ${lt?"rgba(var(--sb-green-rgb), 0.3)":ke?"rgba(var(--sb-orange-rgb), 0.3)":"rgba(var(--sb-ink), 0.1)"}`,transition:"all .3s"}},lt?pe("fa-check",{color:Ge,fontSize:"11px"}):f("span",{style:{width:"6px",height:"6px",borderRadius:"50%",background:ke?we:"var(--sb-text-faint)",animation:ke?"sbBlink 1s ease-in-out infinite":"none"}})),f("span",{key:"l",style:{fontSize:"13.5px",color:lt?"var(--sb-text-4)":ke?"var(--sb-text-2)":"var(--sb-text-9)",transition:"color .3s"}},Z)])}))])}else R||xe?Ot=f("div",{key:"cred",style:{animation:"sbUp .3s ease"}},[on("cback"),f("h2",{key:"h",style:{margin:"0 0 6px",fontSize:"23px",fontWeight:800,letterSpacing:"-0.5px",color:"var(--sb-text-1)"}},De?a("handshake.shareTitle"):a("handshake.sendAnswerTitle")),f("p",{key:"p",style:{margin:"0 0 18px",fontSize:"14px",lineHeight:1.55,color:"var(--sb-text-7)"}},De?a("handshake.shareDesc"):a("handshake.sendAnswerDesc")),mt,Xn,R&&f("div",{key:"offerextra",style:{marginTop:"4px"}},[f("div",{key:"lbl",style:{fontSize:"12.5px",fontWeight:600,color:"var(--sb-text-6)",marginBottom:"8px"}},a("handshake.thenReceive")),f("div",{key:"ta",style:{borderRadius:"12px",border:`1px solid ${St?"rgba(var(--sb-ink), 0.18)":"rgba(var(--sb-ink), 0.07)"}`,background:"var(--sb-surface)",padding:"11px 14px",marginBottom:"10px"}},f("textarea",{dir:"ltr",value:p,onChange:z=>{v(z.target.value),z.target.value.trim().length>0&&typeof ne=="function"&&ne()},rows:2,placeholder:a("handshake.pasteAnswerPlaceholder"),style:{width:"100%",resize:"none",border:"none",outline:"none",background:"transparent",color:"var(--sb-text-3)",fontFamily:He,fontSize:"12px",lineHeight:1.55,minHeight:"44px"}})),f("div",{key:"btns",style:{display:"flex",gap:"10px"}},[f("button",{key:"scan",className:"sb-scan-btn",onClick:()=>F(!0),style:{flex:"none",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"14px 16px",borderRadius:"13px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.04)",color:"var(--sb-text-4)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,cursor:"pointer"}},[pe("fa-camera",{key:"i"}),a("action.scan")]),f("button",{key:"est",onClick:r,disabled:!St,style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",gap:"9px",padding:"14px",borderRadius:"13px",border:"none",background:St?we:"rgba(var(--sb-ink), 0.05)",color:St?"var(--sb-on-accent)":"var(--sb-text-faint)",fontFamily:"inherit",fontSize:"14.5px",fontWeight:700,cursor:St?"pointer":"not-allowed",boxShadow:St?"0 8px 24px rgba(var(--sb-orange-rgb), 0.28)":"none"}},a("handshake.establish"))])]),xe&&f("div",{key:"answerextra",style:{marginTop:"4px",display:"flex",alignItems:"center",gap:"10px",padding:"12px 14px",borderRadius:"12px",border:"1px solid rgba(var(--sb-green-rgb), 0.18)",background:"rgba(var(--sb-green-rgb), 0.05)"}},[pe("fa-circle-notch",{key:"i",color:Ge,animation:"sbSpin 1.4s linear infinite"}),f("span",{key:"t",style:{fontSize:"13px",color:"var(--sb-text-4)",fontWeight:500}},a("handshake.answerSentNote"))])]):De?Ot=f("div",{key:"introC",style:{animation:"sbUp .28s ease"}},[f("h2",{key:"h",style:{margin:"0 0 6px",fontSize:"23px",fontWeight:800,letterSpacing:"-0.5px",color:"var(--sb-text-1)"}},a("intro.createTitle")),f("p",{key:"p",style:{margin:"0 0 22px",fontSize:"14px",lineHeight:1.55,color:"var(--sb-text-7)"}},a("intro.createDesc")),f("button",{key:"gen",className:"sb-gen-btn",onClick:()=>{wt(),Ye.current&&Oe()},style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"center",gap:"9px",padding:"15px",borderRadius:"13px",border:"none",background:we,color:"var(--sb-on-accent)",fontFamily:"inherit",fontSize:"15px",fontWeight:700,cursor:"pointer",boxShadow:"0 8px 24px rgba(var(--sb-orange-rgb), 0.28)"}},[pe("fa-bolt",{key:"i"}),a("intro.createCta")])]):Ot=f("div",{key:"introJ",style:{animation:"sbUp .28s ease"}},[f("h2",{key:"h",style:{margin:"0 0 6px",fontSize:"23px",fontWeight:800,letterSpacing:"-0.5px",color:"var(--sb-text-1)"}},a("intro.joinTitle")),f("p",{key:"p",style:{margin:"0 0 16px",fontSize:"14px",lineHeight:1.55,color:"var(--sb-text-7)"}},"Scan your peer's QR with your camera, or paste their invitation code."),f("button",{key:"scan",className:"sb-scan-btn",onClick:()=>{wt(),F(!0)},style:{width:"100%",display:"flex",alignItems:"center",gap:"13px",padding:"15px 16px",borderRadius:"14px",border:"1px solid rgba(var(--sb-green-rgb), 0.3)",background:"rgba(var(--sb-green-rgb), 0.06)",color:"inherit",fontFamily:"inherit",cursor:"pointer",textAlign:"start",marginBottom:"14px"}},[f("span",{key:"ic",style:{flex:"none",width:"42px",height:"42px",borderRadius:"12px",display:"grid",placeItems:"center",background:"rgba(var(--sb-green-rgb), 0.12)",border:"1px solid rgba(var(--sb-green-rgb), 0.28)"}},pe("fa-camera",{color:Ge,fontSize:"18px"})),f("span",{key:"tx",style:{flex:1}},[f("span",{key:"t",style:{display:"block",fontSize:"14.5px",fontWeight:700,color:"var(--sb-text-1)"}},a("intro.scanTitle")),f("span",{key:"s",style:{display:"block",fontSize:"12.5px",color:"var(--sb-text-7)",marginTop:"1px"}},a("intro.scanSubtitle"))]),pe("fa-chevron-right",{color:"var(--sb-text-9)"})]),f("div",{key:"or",style:{display:"flex",alignItems:"center",gap:"12px",marginBottom:"14px"}},[f("span",{key:"a",style:{flex:1,height:"1px",background:"rgba(var(--sb-ink), 0.07)"}}),f("span",{key:"m",style:{fontSize:"11px",fontWeight:600,color:"var(--sb-text-faint)",textTransform:"uppercase",letterSpacing:"0.7px"}},a("intro.orPasteCode")),f("span",{key:"b",style:{flex:1,height:"1px",background:"rgba(var(--sb-ink), 0.07)"}})]),f("div",{key:"ta",style:{borderRadius:"13px",border:`1px solid ${kt?"rgba(var(--sb-ink), 0.18)":"rgba(var(--sb-ink), 0.07)"}`,background:"var(--sb-surface)",padding:"13px 15px",marginBottom:"12px"}},f("textarea",{dir:"ltr",value:w,onChange:z=>{k(z.target.value),z.target.value.trim().length>0&&typeof ne=="function"&&ne()},rows:3,placeholder:a("intro.pastePlaceholder"),style:{width:"100%",resize:"none",border:"none",outline:"none",background:"transparent",color:"var(--sb-text-3)",fontFamily:He,fontSize:"12.5px",lineHeight:1.6,minHeight:"66px"}})),f("button",{key:"connect",onClick:()=>{wt(),n()},disabled:!kt||d==="connecting",style:{width:"100%",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"9px",padding:"14px",borderRadius:"13px",border:"none",background:kt&&d!=="connecting"?we:"rgba(var(--sb-ink), 0.05)",color:kt&&d!=="connecting"?"var(--sb-on-accent)":"var(--sb-text-faint)",fontFamily:"inherit",fontSize:"15px",fontWeight:700,cursor:kt&&d!=="connecting"?"pointer":"not-allowed",boxShadow:kt&&d!=="connecting"?"0 8px 24px rgba(var(--sb-orange-rgb), 0.28)":"none"}},d==="connecting"?a("intro.connecting"):a("intro.connect"))]);let cn="1.0.3",On=`https://github.com/SecureBitChat/securebit-desktop/releases/download/v${cn}`,at={mac:{name:"macOS",format:".dmg \xB7 Apple Silicon & Intel",icon:"fab fa-apple",url:`${On}/SecureBit.Chat_${cn}_x64.dmg`},win:{name:"Windows",format:".exe \xB7 64-bit installer",icon:"fab fa-windows",url:`${On}/SecureBit.Chat_${cn}_x64-setup.exe`},linux:{name:"Linux",format:".AppImage",icon:"fab fa-linux",url:`${On}/SecureBit.Chat_${cn}_amd64.AppImage`}},jt=(()=>{let z=(navigator.userAgent||"")+" "+(navigator.platform||"");return/Mac|iPhone|iPad|iPod/i.test(z)&&!/Android/i.test(z)?"mac":/Win/i.test(z)?"win":/Linux/i.test(z)&&!/Android/i.test(z)?"linux":"win"})(),It=["mac","win","linux"].filter(z=>z!==jt),Sn=z=>{try{window.open(z,"_blank","noopener")}catch{}},At=Re&&f("div",{key:"platmenu",className:"sb-platforms-menu",style:{position:"absolute",insetInlineStart:0,bottom:"calc(100% + 10px)",width:"344px",maxWidth:"100%",borderRadius:"16px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"var(--sb-surface)",boxShadow:"0 24px 60px rgba(var(--sb-shadow-rgb), calc(0.55 * var(--sb-shadow-k)))",overflow:"hidden",zIndex:25,animation:"sbUp .2s ease"}},[f("div",{key:"mh",style:{display:"flex",alignItems:"center",gap:"10px",padding:"14px 16px",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)"}},[f("div",{key:"t",style:{flex:1,lineHeight:1.2}},[f("div",{key:"a",style:{fontSize:"14px",fontWeight:800,color:"var(--sb-text-1)"}},a("dl.title")),f("div",{key:"b",style:{fontSize:"11.5px",color:"var(--sb-text-8)"}},a("dl.free"))]),f("span",{key:"pill",style:{fontFamily:He,fontSize:"10px",fontWeight:600,color:Fe,padding:"3px 8px",borderRadius:"6px",background:"rgba(var(--sb-green-rgb), 0.1)",border:"1px solid rgba(var(--sb-green-rgb), 0.22)"}},a("chat.onWeb"))]),f("div",{key:"rec",style:{padding:"12px 12px 6px"}},f("button",{key:"b",onClick:()=>Sn(at[jt].url),style:{width:"100%",display:"flex",alignItems:"center",gap:"12px",padding:"13px 14px",borderRadius:"12px",border:"1px solid rgba(var(--sb-orange-rgb), 0.4)",background:"rgba(var(--sb-orange-rgb), 0.08)",color:"inherit",fontFamily:"inherit",cursor:"pointer",textAlign:"start"}},[f("span",{key:"ic",style:{flex:"none",display:"grid",placeItems:"center",width:"38px",height:"38px",borderRadius:"11px",background:"rgba(var(--sb-orange-rgb), 0.14)",border:"1px solid rgba(var(--sb-orange-rgb), 0.3)",color:it}},f("i",{className:at[jt].icon,style:{fontSize:"17px"}})),f("span",{key:"tx",style:{flex:1,minWidth:0}},[f("span",{key:"n",style:{display:"block",fontSize:"13.5px",fontWeight:700,color:"var(--sb-text-1)"}},at[jt].name),f("span",{key:"f",style:{display:"block",fontSize:"11px",color:"var(--sb-orange-3)",marginTop:"1px"}},`Recommended for this device \xB7 ${at[jt].format}`)]),pe("fa-download",{color:we})])),f("div",{key:"others",style:{padding:"0 12px 8px",display:"flex",flexDirection:"column",gap:"2px"}},It.map(z=>f("button",{key:z,onClick:()=>Sn(at[z].url),style:{width:"100%",display:"flex",alignItems:"center",gap:"12px",padding:"11px 14px",borderRadius:"11px",border:"none",background:"transparent",color:"inherit",fontFamily:"inherit",cursor:"pointer",textAlign:"start"}},[f("span",{key:"ic",style:{flex:"none",display:"grid",placeItems:"center",width:"34px",height:"34px",borderRadius:"10px",background:"rgba(var(--sb-ink), 0.04)",border:"1px solid rgba(var(--sb-ink), 0.08)",color:"var(--sb-text-4)"}},f("i",{className:at[z].icon,style:{fontSize:"15px"}})),f("span",{key:"tx",style:{flex:1,minWidth:0}},[f("span",{key:"n",style:{display:"block",fontSize:"13px",fontWeight:600,color:"var(--sb-text-2)"}},at[z].name),f("span",{key:"f",style:{display:"block",fontSize:"11px",color:"var(--sb-text-8)",marginTop:"1px"}},at[z].format)]),pe("fa-download",{color:"var(--sb-text-7)"})]))),f("div",{key:"soon",style:{display:"flex",alignItems:"center",gap:"9px",padding:"12px 16px",borderTop:"1px solid rgba(var(--sb-ink), 0.06)",background:"rgba(var(--sb-ink), 0.015)"}},[pe("fa-clock",{key:"i",color:"var(--sb-text-9)"}),f("span",{key:"t",style:{fontSize:"11.5px",lineHeight:1.45,color:"var(--sb-text-8)"}},a("dl.soon"))])]),Pn=f("div",{key:"footer",className:"sb-conn-footer",style:{position:"relative",marginTop:"30px",paddingTop:"18px",borderTop:"1px solid rgba(var(--sb-ink), 0.06)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"12px",flexWrap:"wrap"}},[f("button",{key:"dl",onClick:()=>nt(z=>!z),style:{display:"inline-flex",alignItems:"center",gap:"9px",paddingBlock:"8px",paddingInlineStart:"9px",paddingInlineEnd:"13px",borderRadius:"10px",border:`1px solid ${Re?"rgba(var(--sb-orange-rgb), 0.4)":"rgba(var(--sb-ink), 0.08)"}`,background:Re?"rgba(var(--sb-orange-rgb), 0.06)":"rgba(var(--sb-ink), 0.02)",color:"inherit",fontFamily:"inherit",cursor:"pointer",transition:"all .15s"}},[pe("fa-download",{key:"i",color:we}),f("span",{key:"t",style:{fontSize:"12.5px",fontWeight:700,color:"var(--sb-text-2)"}},a("action.downloadDesktop")),pe("fa-chevron-down",{key:"c",color:"var(--sb-text-9)",style:{fontSize:"11px",transform:Re?"rotate(180deg)":"rotate(0deg)",transition:"transform .2s"}})]),f("button",{key:"settings",className:"sb-link",onClick:()=>ht&&ht(!0),style:{display:"inline-flex",alignItems:"center",gap:"7px",background:"none",border:"none",color:"var(--sb-text-7)",fontFamily:"inherit",fontSize:"12.5px",fontWeight:600,cursor:"pointer"}},[pe("fa-sliders-h",{key:"i"}),a("action.advancedSettings")]),At]),Sr=et&&typeof window<"u"&&window.IceServerSettings?f(window.IceServerSettings,{key:"ice-settings",isOpen:!0,embedded:!0,onClose:()=>ht(!1),initial:{useCustom:Array.isArray(Me)&&Me.length>0,serversText:Bt,privacyMode:Ze?"relay-only":"standard",persisted:gt},hasSaved:gt,onApply:ut,onForget:ee}):null,En=f("div",{key:"right",style:Te?{flex:1,minWidth:0,width:"100%",position:"relative",overflow:"hidden",display:"flex",flexDirection:"column",height:"100%"}:{flex:"0.95 1 460px",minWidth:"min(100%, 320px)",position:"relative",overflow:"hidden",display:"flex",flexDirection:"column",height:"100vh"}},[f("div",{key:"scroll",className:"custom-scrollbar",style:{flex:1,overflowY:"auto",display:"flex",flexDirection:"column",padding:"42px 44px"}},f("div",{style:{maxWidth:"430px",width:"100%",margin:"auto"}},[f("div",{key:"kicker",style:{fontFamily:He,fontSize:"11px",fontWeight:600,color:"var(--sb-text-9)",textTransform:"uppercase",letterSpacing:"1px",marginBottom:"10px"}},vn),kn,Ot,Pn])),Sr]),Rn=zt&&te&&f("div",{key:"qrmodal",onClick:()=>ft(!1),style:{position:"fixed",inset:0,zIndex:50,display:"flex",alignItems:"center",justifyContent:"center",padding:"32px",background:"rgba(var(--sb-scrim-rgb), 0.82)",backdropFilter:"blur(10px)",animation:"sbUp .2s ease"}},f("div",{onClick:z=>z.stopPropagation(),style:{width:"100%",maxWidth:"460px",borderRadius:"22px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"var(--sb-bg)",boxShadow:"0 30px 90px rgba(var(--sb-shadow-rgb), calc(0.6 * var(--sb-shadow-k)))",overflow:"hidden"}},[f("div",{key:"head",style:{display:"flex",alignItems:"center",gap:"11px",padding:"18px 20px",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)"}},[f("span",{key:"d",style:{width:"9px",height:"9px",borderRadius:"50%",background:Ke}}),f("div",{key:"tx",style:{flex:1,lineHeight:1.2}},[f("div",{key:"t",style:{fontSize:"15.5px",fontWeight:800,color:"var(--sb-text-1)"}},De?a("handshake.shareTitle"):a("handshake.sendAnswerTitle")),f("div",{key:"s",style:{fontSize:"12px",color:"var(--sb-text-8)"}},`${De?"offer":"answer"} \xB7 one-time`)]),f("button",{key:"x",onClick:()=>ft(!1),style:{width:"32px",height:"32px",display:"grid",placeItems:"center",borderRadius:"9px",border:"none",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-6)",cursor:"pointer"}},pe("fa-times"))]),f("div",{key:"body",style:{padding:"22px 24px 24px"}},[f("div",{key:"qr",style:{position:"relative",width:"100%",aspectRatio:"1",borderRadius:"18px",overflow:"hidden",background:"#fff",padding:"18px",display:"grid",placeItems:"center"}},f("img",{src:te,alt:a("chatHdr.qrCode"),style:{width:"100%",height:"100%",objectFit:"contain",display:"block"}})),f("div",{key:"ctrls",style:{display:"flex",flexDirection:"column",alignItems:"center",gap:"12px",marginTop:"18px"}},[(H||0)>=1&&f("div",{key:"frame",style:{display:"flex",alignItems:"center",gap:"9px"}},[f("span",{key:"l",style:{fontFamily:He,fontSize:"12px",fontWeight:600,color:"var(--sb-text-6)"}},`Frame ${Math.max(1,re||1)} / ${H||1}`),f("div",{key:"dots",style:{display:"flex",gap:"5px"}},Array.from({length:H||1},(z,Z)=>f("span",{key:Z,style:{width:"7px",height:"7px",borderRadius:"50%",background:Z+1===(re||1)?Ke:"rgba(var(--sb-ink), 0.14)",transition:"background .25s"}})))]),(H||0)>1&&f("div",{key:"nav",style:{display:"flex",alignItems:"center",gap:"6px"}},[f("button",{key:"prev",onClick:j,style:{width:"40px",height:"36px",display:"grid",placeItems:"center",borderRadius:"10px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.04)",color:"var(--sb-text-4)",cursor:"pointer"}},pe("fa-chevron-left")),f("button",{key:"auto",onClick:de,style:{display:"inline-flex",alignItems:"center",gap:"7px",padding:"9px 18px",borderRadius:"10px",border:`1px solid ${ie?"rgba(var(--sb-ink), 0.1)":"rgba(var(--sb-orange-rgb), 0.45)"}`,background:ie?"rgba(var(--sb-ink), 0.04)":"rgba(var(--sb-orange-rgb), 0.08)",color:ie?"var(--sb-text-6)":it,fontFamily:"inherit",fontSize:"13px",fontWeight:600,cursor:"pointer"}},ie?"Manual":"Auto"),f("button",{key:"next",onClick:L,style:{width:"40px",height:"36px",display:"grid",placeItems:"center",borderRadius:"10px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.04)",color:"var(--sb-text-4)",cursor:"pointer"}},pe("fa-chevron-right"))]),f("p",{key:"hint",style:{margin:"2px 0 0",textAlign:"center",fontSize:"12px",lineHeight:1.5,color:"var(--sb-text-9)"}},(H||0)>1?a("handshake.qrHintFrames",{frames:H}):a("handshake.qrHint"))])])])),_n=f("div",{key:"hero",style:{display:"flex",flexWrap:"wrap",minHeight:"100vh",width:"100%",background:"var(--sb-bg)",color:"var(--sb-text-2)"}},[Vt,En]),Er=Le&&f(UniqueFeatureSlider,{key:"unique-features-slider"}),Ln=Le&&f(BecomePartner,{key:"become-partner"}),Rr=Le&&f(Roadmap,{key:"roadmap"}),_r=Le&&f(CommunityCTA,{key:"community-cta"}),ln=f("style",{key:"kf",dangerouslySetInnerHTML:{__html:'@keyframes sbFlowR{0%{left:4%;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:96%;opacity:0}}@keyframes sbFlowL{0%{left:96%;opacity:0}12%{opacity:1}88%{opacity:1}100%{left:4%;opacity:0}}@keyframes sbPulse{0%,100%{transform:translate(-50%,-50%) scale(1);opacity:.5}50%{transform:translate(-50%,-50%) scale(1.5);opacity:0}}@keyframes sbSpin{to{transform:rotate(360deg)}}@keyframes sbUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes sbNode{0%,100%{box-shadow:0 0 0 0 rgba(var(--sb-green-rgb), 0)}50%{box-shadow:0 0 0 6px rgba(var(--sb-green-rgb), .06)}}@keyframes sbScan{0%{top:8%}100%{top:88%}}@keyframes sbBlink{0%,100%{opacity:1}50%{opacity:.35}}@keyframes sbTrav{0%{offset-distance:0%;opacity:0}15%{opacity:1}80%{opacity:1}100%{offset-distance:100%;opacity:0}}@keyframes sbRing1{0%,24%{r:5;opacity:0}26%{opacity:.8}34%{r:22;opacity:0}100%{r:22;opacity:0}}@keyframes sbRing2{0%,54%{r:5;opacity:0}56%{opacity:.8}64%{r:22;opacity:0}100%{r:22;opacity:0}}@keyframes sbIn1{0%,24%{opacity:0}27%{opacity:1}100%{opacity:1}}@keyframes sbIn2{0%,54%{opacity:0}57%{opacity:1}100%{opacity:1}}@keyframes sbRow0{0%,4%{opacity:0;transform:translateY(4px)}8%{opacity:1;transform:none}100%{opacity:1;transform:none}}@keyframes sbRow1{0%,25%{opacity:0;transform:translateY(4px)}29%{opacity:1;transform:none}100%{opacity:1;transform:none}}@keyframes sbRow2{0%,55%{opacity:0;transform:translateY(4px)}59%{opacity:1;transform:none}100%{opacity:1;transform:none}}@media (prefers-reduced-motion: reduce){.sb-start [style*="sbTrav"],.sb-start [style*="sbRing"]{animation:none!important;opacity:0!important}.sb-start [style*="sbIn1"],.sb-start [style*="sbIn2"],.sb-start [style*="sbRow0"],.sb-start [style*="sbRow1"],.sb-start [style*="sbRow2"]{animation:none!important;opacity:1!important;transform:none!important}}'}});return Te?f("div",{className:"sb-start",style:{flex:1,minHeight:0,width:"100%",display:"flex",flexDirection:"column",background:"var(--sb-bg)",color:"var(--sb-text-2)"}},[ln,En,Rn]):f("div",{className:"sb-start",style:{width:"100%"}},[ln,_n,Er,Ln,Rr,_r,Rn])},Uo=t=>()=>{if(t&&t.current){let e=()=>{t.current&&t.current.scrollTo({top:t.current.scrollHeight,behavior:vr()})};e(),setTimeout(e,50),setTimeout(e,150),setTimeout(e,300),requestAnimationFrame(()=>{setTimeout(e,100)})}},$i=async t=>{let e=null;try{t&&window.EnhancedSecureCryptoUtils&&(e=await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(t))}catch{}if(!e){alert(`Security verification in progress\u2026
Please wait for real-time cryptographic verification to complete.`);return}let n="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",r=P=>String(P).replace(/[&<>"]/g,q=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[q]),i=e.color==="orange"?"var(--sb-orange-solid)":e.color==="yellow"?"var(--sb-yellow-solid)":e.color==="red"?"var(--sb-red-solid)":"var(--sb-green-solid)",c=e.color==="orange"?"var(--sb-orange)":e.color==="yellow"?"var(--sb-yellow)":e.color==="red"?"var(--sb-red)":"var(--sb-green)",d=e.color==="orange"?"var(--sb-orange-rgb)":e.color==="yellow"?"var(--sb-yellow-rgb)":e.color==="red"?"var(--sb-red-rgb)":"var(--sb-green-rgb)",h=Math.max(0,Math.min(100,Math.round(e.score||0))),y=2*Math.PI*56,w=`${(y*Math.min(1,h/100)).toFixed(1)} ${y.toFixed(1)}`,k=String(e.level||"SECURE").toUpperCase(),p=e.isRealData!==!1,v=e.verificationResults?Object.entries(e.verificationResults):[],m=Number.isFinite(e.passedChecks)?e.passedChecks:v.filter(([,P])=>P&&P.passed).length,I=Number.isFinite(e.totalChecks)?e.totalChecks:v.length,B=new Date(e.timestamp||Date.now()).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),D=P=>{let q=a(`secTest.${P}`);return q===`secTest.${P}`?ae(P):q},ae=P=>{let q=String(P).replace(/^verify/i,"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").trim();return q=q.replace(/\b(ecdh|ecdsa|aes|gcm|hmac|pfs|sas|mitm|asn|dtls|hkdf|spki|oid|p384)\b/gi,X=>X.toUpperCase()),q.charAt(0).toUpperCase()+q.slice(1)},te='<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="var(--sb-green-solid)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4 10-11"/></svg>',le='<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--sb-red-solid)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6L6 18M6 6l12 12"/></svg>',be=v.map(([P,q],X)=>{let H=!!(q&&q.passed),re=q&&q.details||(H?a("sec.testPassed"):a("sec.testFailed")),ie=a(`secDetail.${re}`),de=ie===`secDetail.${re}`?re:ie,L=H?"var(--sb-surface)":"var(--sb-bg)",j=H?"rgba(var(--sb-green-rgb), 0.16)":"rgba(var(--sb-red-rgb), 0.18)",ne=H?"rgba(var(--sb-green-rgb), 0.12)":"rgba(var(--sb-red-rgb), 0.1)",Ie=H?"rgba(var(--sb-green-rgb), 0.26)":"rgba(var(--sb-red-rgb), 0.24)",Y=H?"var(--sb-text-1)":"var(--sb-text-4)";return`<div style="display:flex; align-items:flex-start; gap:13px; padding:16px 18px; border-radius:14px; background:${L}; border:1px solid ${j}; animation:svIn .3s cubic-bezier(.2,.7,.3,1) both; animation-delay:${(X*.04).toFixed(2)}s;">
<span style="flex:none; width:34px; height:34px; border-radius:9px; display:grid; place-items:center; background:${ne}; border:1px solid ${Ie};">${H?te:le}</span>
<div style="flex:1; min-width:0;">
<div style="font-size:14.5px; font-weight:700; letter-spacing:-0.2px; color:${Y}; margin-bottom:3px;">${r(D(P))}</div>
<div style="font-family:${n}; font-size:11.5px; line-height:1.45; color:var(--sb-text-7);">${r(de)}</div>
</div>
</div>`}).join(""),C=document.createElement("div");C.id="sb-security-report",C.style.cssText="position:fixed; inset:0; z-index:10000; display:flex; align-items:center; justify-content:center; padding:24px; background:rgba(var(--sb-scrim-rgb), 0.62); backdrop-filter:blur(4px); -webkit-backdrop-filter:blur(4px); font-family:'Manrope',system-ui,-apple-system,sans-serif; overflow:auto;",C.innerHTML=`
<style>@keyframes svIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}@keyframes svPulse{0%,100%{opacity:1}50%{opacity:.4}}</style>
<div style="position:relative; max-width:960px; width:100%; border-radius:20px; background:radial-gradient(1100px 640px at 50% -6%, rgba(${d},0.05), transparent 62%), var(--sb-bg); border:1px solid rgba(var(--sb-ink), 0.08); color:var(--sb-text-2); padding:30px; box-shadow:0 30px 70px rgba(var(--sb-shadow-rgb), calc(0.55 * var(--sb-shadow-k))); animation:svIn .3s cubic-bezier(.2,.7,.3,1); max-height:calc(100vh - 48px); overflow:auto;">
<button class="sv-close" type="button" title="${a("chat.close")}" style="position:absolute; top:16px; inset-inline-end:16px; width:32px; height:32px; border-radius:9px; display:grid; place-items:center; border:1px solid rgba(var(--sb-ink), 0.08); background:rgba(var(--sb-ink), 0.02); color:var(--sb-text-7); cursor:pointer; z-index:2;">
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M6 6l12 12M18 6L6 18"/></svg>
</button>
<div style="position:relative; overflow:hidden; border-radius:18px; background:var(--sb-surface); border:1px solid rgba(var(--sb-ink), 0.07); padding:28px 30px; display:flex; align-items:center; gap:30px; flex-wrap:wrap; margin-bottom:20px;">
<div style="position:absolute; top:0; left:0; right:0; height:1px; background:linear-gradient(90deg, transparent, rgba(${d},0.6), transparent);"></div>
<div style="position:relative; flex:none; width:128px; height:128px;">
<svg width="128" height="128" viewBox="0 0 128 128" style="transform:rotate(-90deg);">
<circle cx="64" cy="64" r="56" fill="none" stroke="rgba(var(--sb-ink), 0.06)" stroke-width="9"/>
<circle cx="64" cy="64" r="56" fill="none" stroke="${i}" stroke-width="9" stroke-linecap="round" stroke-dasharray="${w}"/>
</svg>
<div style="position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center;">
<span style="font-size:30px; font-weight:800; letter-spacing:-1px; color:var(--sb-text-1); line-height:1;">${h}</span>
<span style="font-family:${n}; font-size:10px; font-weight:600; color:var(--sb-text-9); text-transform:uppercase; letter-spacing:1px; margin-top:4px;">/ 100 pts</span>
</div>
</div>
<div style="flex:1; min-width:240px;">
<div style="font-family:${n}; font-size:11px; font-weight:600; color:var(--sb-text-9); text-transform:uppercase; letter-spacing:1.6px; margin-bottom:10px;">${a("report.title")}</div>
<div style="display:flex; align-items:center; gap:12px; margin-bottom:14px; flex-wrap:wrap;">
<h2 style="margin:0; font-size:26px; font-weight:800; letter-spacing:-0.7px; color:var(--sb-text-1);">Security level: ${r(k)}</h2>
<span style="display:inline-flex; align-items:center; gap:8px; padding:6px 12px; border-radius:9px; background:rgba(${d},0.12); border:1px solid rgba(${d},0.3); font-family:${n}; font-size:11px; font-weight:700; color:${c}; text-transform:uppercase; letter-spacing:0.6px;"><span style="width:7px; height:7px; border-radius:50%; background:${i}; animation:svPulse 2s ease-in-out infinite;"></span>${a("report.active")}</span>
</div>
<div style="display:flex; gap:28px; flex-wrap:wrap;">
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:var(--sb-text-faint); text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.testsPassed")}</div><div style="font-size:15px; font-weight:700; color:var(--sb-text-2);"><span style="color:${c};">${m}</span> / ${I}</div></div>
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:var(--sb-text-faint); text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.verifiedAt")}</div><div style="font-family:${n}; font-size:15px; font-weight:600; color:var(--sb-text-2);">${r(B)}</div></div>
<div><div style="font-family:${n}; font-size:10px; font-weight:600; color:var(--sb-text-faint); text-transform:uppercase; letter-spacing:1px; margin-bottom:4px;">${a("report.source")}</div><div style="font-size:15px; font-weight:600; color:var(--sb-text-2);">${p?a("sec.realTests"):a("sec.simulatedData")}</div></div>
</div>
</div>
<button class="sv-rerun" type="button" style="flex:none; display:inline-flex; align-items:center; gap:9px; padding:12px 18px; border-radius:11px; border:1px solid rgba(var(--sb-ink), 0.1); background:rgba(var(--sb-ink), 0.025); color:var(--sb-text-4); font-family:'Manrope',sans-serif; font-size:14px; font-weight:700; cursor:pointer; transition:all .2s;">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="pointer-events:none;"><path d="M21 12a9 9 0 1 1-3-6.7L21 8"/><path d="M21 3v5h-5"/></svg>
Re-run
</button>
</div>
<div style="display:grid; grid-template-columns:repeat(auto-fit, minmax(248px, 1fr)); gap:12px;">${be}</div>
<div style="display:flex; align-items:center; gap:12px; margin-top:18px; padding:16px 20px; border-radius:14px; background:rgba(${d},0.06); border:1px solid rgba(${d},0.18);">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="${i}" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" style="flex:none;"><path d="M12 3l8 4v5c0 4.5-3.2 7.8-8 9-4.8-1.2-8-4.5-8-9V7l8-4z"/><path d="M9.2 12.2l2 2 3.6-3.8"/></svg>
<span style="font-size:14px; font-weight:600; color:var(--sb-text-2);">${p?a("sec.realTimeNote"):a("sec.simulatedWarning")}</span>
</div>
</div>`;let F=P=>{P.key==="Escape"&&V()},V=()=>{C.parentNode&&C.remove(),document.removeEventListener("keydown",F)};C.querySelector(".sv-close").addEventListener("click",V),C.addEventListener("click",P=>{P.target===C&&V()}),document.addEventListener("keydown",F);let O=C.querySelector(".sv-rerun");O.addEventListener("mouseenter",()=>{O.style.borderColor="rgba(var(--sb-orange-rgb), 0.45)",O.style.color="var(--sb-orange)"}),O.addEventListener("mouseleave",()=>{O.style.borderColor="rgba(var(--sb-ink), 0.1)",O.style.color="var(--sb-text-4)"}),O.addEventListener("click",()=>{V(),$i(t)}),document.body.appendChild(C)},Go=({status:t,onDisconnect:e,webrtcManager:n,title:r,isOffline:i,peerPresence:c,onRenameTitle:d})=>{let h="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",[y,w]=React.useState(!1),[k,p]=React.useState(null),[v,m]=React.useState(!1),[I,B]=React.useState("");React.useEffect(()=>{let Y=!0,me=async()=>{try{if(!n)return;let Se=null;typeof n.getRealSecurityLevel=="function"?Se=await n.getRealSecurityLevel():typeof n.calculateAndReportSecurityLevel=="function"?Se=await n.calculateAndReportSecurityLevel():window.EnhancedSecureCryptoUtils&&(Se=await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(n)),Y&&Se&&Se.isRealData!==!1&&p(Se)}catch{}};me();let Oe=Se=>{Y&&Se.detail&&Se.detail.securityData&&p(Se.detail.securityData)};document.addEventListener("real-security-calculated",Oe);let Ze=setInterval(me,15e3);return()=>{Y=!1,clearInterval(Ze),document.removeEventListener("real-security-calculated",Oe)}},[n]);let D=t==="connected"||t==="verified",ae=t==="disconnected"||t==="peer_disconnected",te=D&&!i,le=i||ae?"var(--sb-red-solid)":D?"var(--sb-green-solid)":"var(--sb-yellow-solid)",be=i?a("chat.offline"):D?a("status.connected"):t==="peer_disconnected"?a("status.peerDisconnected"):t==="disconnected"?a("chat.disconnected"):a("status.connecting"),C=i||ae?"0 0 0 3px rgba(var(--sb-red-rgb), 0.16)":D?"0 0 0 3px rgba(var(--sb-green-rgb), 0.16)":"0 0 0 3px rgba(var(--sb-yellow-rgb), 0.16)",F=D&&!i?Qr[c]||"var(--sb-green-solid)":le,V=D&&!i&&c&&Xr[c]||null,O=()=>{B(r||""),m(!0)},P=()=>{typeof d=="function"&&d(I),m(!1)},q=Y=>{Y.key==="Enter"?(Y.preventDefault(),P()):Y.key==="Escape"&&m(!1)},X=k&&Number.isFinite(k.passedChecks)?k.passedChecks:null,H=k&&Number.isFinite(k.totalChecks)?k.totalChecks:null,re=Y=>{if(!Y)return Y;let me=a(`secLevel.${Y}`);return me===`secLevel.${Y}`?Y:me},ie=X!=null&&H?X+"/"+H:k?k.score+"%":"\u2014",de=k?k.color==="green"?"var(--sb-green)":k.color==="orange"?"var(--sb-orange)":k.color==="yellow"?"var(--sb-yellow)":"var(--sb-red)":"var(--sb-green)",L=React.createElement("div",{key:"sec",title:a("sas.runVerification"),onClick:()=>$i(n),className:"sb-secpill",style:{display:"flex",alignItems:"center",gap:"9px",padding:"7px 13px",borderRadius:"9px",border:"1px solid "+(y?"rgba(var(--sb-ink), 0.16)":"rgba(var(--sb-ink), 0.07)"),background:y?"rgba(var(--sb-ink), 0.05)":"rgba(var(--sb-ink), 0.02)",cursor:"pointer",fontFamily:"inherit",transition:"all .15s"}},[React.createElement("i",{key:"i",className:"fas fa-shield-halved",style:{color:de,fontSize:"13px"}}),React.createElement("span",{key:"l",className:"sb-sec-label",style:{fontSize:"13px",fontWeight:600,color:"var(--sb-text-2)"}},k?re(k.level)||a("chatHdr.secure"):a("chatHdr.secure")),React.createElement("span",{key:"d",className:"sb-sec-div",style:{width:"1px",height:"13px",background:"rgba(var(--sb-ink), 0.12)"}}),React.createElement("span",{key:"s",className:"sb-sec-score",style:{fontFamily:h,fontSize:"11.5px",fontWeight:500,color:"var(--sb-text-7)"}},ie),React.createElement("button",{key:"c",type:"button",title:a("sec.panelTitle"),onClick:Y=>{Y.stopPropagation(),w(me=>!me)},style:{background:"none",border:"none",padding:0,margin:0,cursor:"pointer",display:"grid",placeItems:"center"}},React.createElement("i",{className:"fas fa-chevron-down",style:{color:"var(--sb-text-9)",fontSize:"11px",transform:y?"rotate(180deg)":"rotate(0deg)",transition:"transform .2s"}}))]),j=React.createElement("style",{key:"hdr-css",dangerouslySetInnerHTML:{__html:".sb-call-btn:not(.sb-call-off):hover{border-color:rgba(var(--sb-green-rgb), 0.45) !important;color:var(--sb-green) !important;background:rgba(var(--sb-green-rgb), 0.07) !important;}@media (max-width:768px){.sb-chat-header{padding-inline-start:58px !important;gap:8px !important;}.sb-chat-header .sb-secpill{display:none !important;}.sb-chat-header .sb-conn-text{display:none !important;}.sb-chat-header .sb-conn{padding:9px !important;}.sb-chat-header .sb-hdr-sub{display:none !important;}.sb-chat-header .sb-disconnect{width:40px !important;height:40px !important;padding:0 !important;gap:0 !important;justify-content:center !important;border-radius:9px !important;color:var(--sb-red) !important;border-color:rgba(var(--sb-red-rgb), 0.28) !important;}}@media (max-width:600px){.sb-chips{flex-wrap:nowrap !important;justify-content:flex-start !important;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;}.sb-chips::-webkit-scrollbar{display:none;}.sb-chips>*{flex:0 0 auto !important;}.sb-chips .sb-chips-right{flex-wrap:nowrap !important;}.sb-chips .sb-chip{white-space:nowrap;}}@media (max-width:480px){.sb-chat-header{padding-inline-end:12px !important;}}"}}),ne=React.createElement("header",{key:"hdr",className:"sb-chat-header",style:{flex:"none",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"24px",padding:"var(--sb-safe-top, 0px) 20px var(--sb-bar-extra, 0px)",minHeight:"calc(var(--sb-bar-h, 64px) + var(--sb-safe-top, 0px) + var(--sb-bar-extra, 0px))",boxSizing:"border-box",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)",background:"rgba(var(--sb-bg-rgb), 0.72)",backdropFilter:"blur(14px)",WebkitBackdropFilter:"blur(14px)"}},[j,React.createElement("div",{key:"left",style:{display:"flex",alignItems:"center",gap:"12px",minWidth:0}},[React.createElement("div",{key:"avatar",style:{position:"relative",flex:"none",width:"36px",height:"36px",borderRadius:"10px",display:"grid",placeItems:"center",background:"rgba(var(--sb-ink), 0.05)",border:"1px solid rgba(var(--sb-ink), 0.09)",fontSize:"13px",fontWeight:700,letterSpacing:"-0.3px",color:"var(--sb-text-2)"}},[dr(r||a("chatHdr.chat")),React.createElement("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"11px",height:"11px",borderRadius:"50%",background:F,border:"2px solid var(--sb-bg)"}})]),v?React.createElement("div",{key:"edit",style:{display:"flex",flexDirection:"column",gap:"4px",minWidth:0}},[React.createElement("div",{key:"row",style:{display:"flex",alignItems:"center",gap:"6px"}},[React.createElement("input",{key:"in",autoFocus:!0,value:I,maxLength:32,placeholder:a("chat.nameThis"),onChange:Y=>B(Y.target.value),onKeyDown:q,onBlur:P,style:{width:"210px",padding:"5px 10px",borderRadius:"8px",border:"1px solid rgba(var(--sb-orange-rgb), 0.55)",background:"var(--sb-bg)",color:"var(--sb-text-1)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,outline:"none"}}),React.createElement("button",{key:"ok",onMouseDown:Y=>Y.preventDefault(),onClick:P,title:a("chatHdr.save"),style:{flex:"none",width:"28px",height:"28px",borderRadius:"8px",display:"grid",placeItems:"center",border:"none",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",cursor:"pointer"}},React.createElement("i",{className:"fas fa-check",style:{fontSize:"12px"}}))]),React.createElement("div",{key:"hint",style:{fontSize:"11px",color:"var(--sb-text-faint)"}},a("chat.localLabel"))]):React.createElement("div",{key:"txt",style:{lineHeight:1.2,minWidth:0}},[React.createElement("div",{key:"r1",style:{display:"flex",alignItems:"center",gap:"7px"}},[React.createElement("span",{key:"n",style:{fontSize:"15px",fontWeight:800,letterSpacing:"-0.3px",color:"var(--sb-text-1)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},r||a("chat.secureChat")),React.createElement("button",{key:"edit",className:"sb-rename-btn",onClick:O,title:a("chat.rename"),style:{flex:"none",width:"24px",height:"24px",borderRadius:"7px",display:"grid",placeItems:"center",border:"none",background:"transparent",color:"var(--sb-text-faint)",cursor:"pointer"}},React.createElement("i",{className:"fas fa-pen",style:{fontSize:"11px"}}))]),React.createElement("div",{key:"r2",className:"sb-hdr-sub",style:{fontSize:"11px",color:"var(--sb-text-9)",fontWeight:500,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},i?a("chat.noNetwork"):t==="reconnecting"?a("flow.restoring"):V||(D?a("chatHdr.p2pSub"):t==="peer_disconnected"?a("status.peerDisconnected"):t==="disconnected"?a("chat.disconnected"):a("status.connecting")))])]),L,React.createElement("div",{key:"right",className:"sb-hdr-right",style:{display:"flex",alignItems:"center",gap:"9px"}},[...(()=>{let Y=te&&n&&n.isVerified===!0,me=Ye=>{if(!(!Y||!n))try{let et=n.startCall(Ye);et&&et.catch&&et.catch(()=>{})}catch{}},Oe={width:"40px",height:"40px",borderRadius:"9px",display:"grid",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.08)",background:"rgba(var(--sb-ink), 0.02)",color:Y?"var(--sb-text-6)":"var(--sb-surface-5)",cursor:Y?"pointer":"not-allowed",transition:"all .15s"};return[React.createElement("button",{key:"call-audio",className:Y?"sb-call-btn":"sb-call-btn sb-call-off",disabled:!Y,onClick:()=>me(!1),title:Y?a("chat.startVoiceCall"):a("chat.verifyForCalls"),style:Oe,dangerouslySetInnerHTML:{__html:'<svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.8 19.8 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.12 4.18 2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/></svg>'}}),React.createElement("button",{key:"call-video",className:Y?"sb-call-btn":"sb-call-btn sb-call-off",disabled:!Y,onClick:()=>me(!0),title:Y?a("chat.startVideoCall"):a("chat.verifyForCalls"),style:Oe,dangerouslySetInnerHTML:{__html:'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2.5"/></svg>'}})]})(),React.createElement("div",{key:"conn",className:"sb-conn",style:{display:"flex",alignItems:"center",gap:"8px",padding:"8px 13px",borderRadius:"9px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"rgba(var(--sb-ink), 0.02)"}},[React.createElement("span",{key:"dot",style:{flex:"none",width:"7px",height:"7px",borderRadius:"50%",background:le,boxShadow:C}}),React.createElement("span",{key:"t",className:"sb-conn-text",style:{fontSize:"13px",fontWeight:600,color:"var(--sb-text-4)"}},be)]),React.createElement("button",{key:"dc",onClick:e,className:"sb-disconnect",style:{display:"flex",alignItems:"center",gap:"7px",padding:"8px 14px",borderRadius:"9px",border:"1px solid rgba(var(--sb-ink), 0.08)",background:"transparent",color:"var(--sb-text-6)",fontFamily:"inherit",fontSize:"13px",fontWeight:600,cursor:"pointer",transition:"all .15s"}},[React.createElement("i",{key:"i",className:"fas fa-power-off",style:{fontSize:"12px"}}),React.createElement("span",{key:"t",className:"sb-hide-sm"},a("hdr.disconnect"))])])]),Ie=y&&React.createElement("div",{key:"net",style:{flex:"none",padding:"13px 20px",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)",background:"rgba(var(--sb-bg-rgb), 0.72)",backdropFilter:"blur(14px)",WebkitBackdropFilter:"blur(14px)"}},React.createElement("div",{style:{maxWidth:"1000px",margin:"0 auto",display:"grid",gridTemplateColumns:"repeat(auto-fit,minmax(140px,1fr))",gap:"14px",fontFamily:h}},[[a("sec.transport"),"WebRTC \xB7 DTLS"],[a("sec.cipher"),"AES-256-GCM"],[a("sec.keyExchange"),"ECDH P-384"],[a("sec.security"),ie+(k?" \xB7 "+k.score+"%":"")]].map(([Y,me],Oe)=>React.createElement("div",{key:"nf"+Oe},[React.createElement("div",{key:"k",style:{fontSize:"10px",color:"var(--sb-text-9)",textTransform:"uppercase",letterSpacing:"0.6px",marginBottom:"4px"}},Y),React.createElement("div",{key:"v",style:{fontSize:"12.5px",color:Oe===3?de:"var(--sb-text-4)",fontWeight:500}},me)]))));return React.createElement("div",{style:{flex:"none"}},[ne,Ie])},Wi=({title:t,isOffline:e,peerPresence:n,onRenameTitle:r,messages:i,messageInput:c,setMessageInput:d,onSendMessage:h,onSendVoice:y,onDisconnect:w,keyFingerprint:k,isVerified:p,chatMessagesRef:v,scrollToBottom:m,webrtcManager:I,status:B,pendingIncomingFiles:D=[],onIncomingDecision:ae,codeMode:te,setCodeMode:le,viewOnceMode:be,setViewOnceMode:C,viewOnceTtl:F,setViewOnceTtl:V,disappearTtl:O,setDisappearTtl:P,nowTick:q,onUnsendMessage:X,onMessageExpire:H})=>{let[re,ie]=React.useState(!1),[de,L]=React.useState(!1),[j,ne]=React.useState(!1),[Ie,Y]=React.useState(!1),[me,Oe]=React.useState(!1),[Ze,Se]=React.useState(!1),[Ye,et]=React.useState(!1),[ht,Bt]=React.useState(()=>typeof window<"u"&&!!window.matchMedia&&window.matchMedia("(min-width:1024px)").matches);React.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;let R=window.matchMedia("(min-width:1024px)"),xe=()=>Bt(R.matches);try{R.addEventListener("change",xe)}catch{R.addListener(xe)}return()=>{try{R.removeEventListener("change",xe)}catch{R.removeListener(xe)}}},[]);let gt=React.useRef(null);React.useEffect(()=>{let R=gt.current;!R||te||(R.style.height="auto",R.style.height=Math.min(R.scrollHeight,240)+"px")},[c,te]),React.useEffect(()=>{D.length>0&&L(!0)},[D.length]),React.useEffect(()=>{if(v.current&&i.length>0){let{scrollTop:R,scrollHeight:xe,clientHeight:Le}=v.current;if(xe-R-Le<100){let an=()=>{v.current&&v.current.scrollTo({top:v.current.scrollHeight,behavior:vr()})};an(),setTimeout(an,50),setTimeout(an,150)}}},[i,v]);let Me=()=>{if(v.current){let{scrollTop:R,scrollHeight:xe,clientHeight:Le}=v.current,Ke=xe-R-Le<100;ie(!Ke)}},ut=()=>{typeof m=="function"?(m(),ie(!1)):v.current&&(v.current.scrollTo({top:v.current.scrollHeight,behavior:vr()}),ie(!1))},ee=R=>{R.key==="Enter"&&(te?(R.metaKey||R.ctrlKey)&&(R.preventDefault(),h()):R.shiftKey||(R.preventDefault(),h()))},Te=()=>{if(!I)return!1;let R=I.isConnected?I.isConnected():!1,xe=I.isVerified||!1,Le=I.dataChannel&&I.dataChannel.readyState==="open";return R&&xe&&Le},tt="'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace",_t=R=>R?R>=86400&&R%86400===0?R/86400+"d":R>=3600&&R%3600===0?R/3600+"h":R>=60?Math.round(R/60)+"m":R+"s":"",xt=R=>({display:"flex",alignItems:"center",gap:"6px",padding:"7px 11px",borderRadius:"8px",border:"1px solid "+(R?"rgba(var(--sb-ink), 0.18)":"rgba(var(--sb-ink), 0.07)"),background:R?"rgba(var(--sb-ink), 0.06)":"transparent",color:R?"#fff":"var(--sb-text-6)",fontFamily:"inherit",fontSize:"12.5px",fontWeight:600,cursor:"pointer",transition:"all .15s"}),Ct=R=>({padding:"6px 12px",borderRadius:"8px",border:"1px solid "+(R?"rgba(var(--sb-ink), 0.22)":"rgba(var(--sb-ink), 0.07)"),background:R?"rgba(var(--sb-ink), 0.07)":"transparent",color:R?"#fff":"var(--sb-text-7)",fontFamily:tt,fontSize:"12px",fontWeight:500,cursor:"pointer",transition:"all .14s"}),zt=[{label:a("msg.off"),v:0},{label:"5s",v:5},{label:"30s",v:30},{label:"1m",v:60},{label:"1h",v:3600},{label:"24h",v:86400}],ft=[{label:a("msg.off"),v:0},{label:"5s",v:5},{label:"10s",v:10},{label:"30s",v:30},{label:"1m",v:60}],vt=be?F:0,Ut=R=>{P(R),Y(!1)},b=R=>{R===0?C(!1):(V(R),C(!0)),Oe(!1)},$=!!(c&&c.trim()),Pe=typeof y=="function"&&!e&&Te()&&typeof navigator<"u"&&navigator.mediaDevices&&typeof navigator.mediaDevices.getUserMedia=="function",je=R=>{try{return new Date(R).toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return""}},Re=i.filter(R=>R.type==="system"&&typeof R.message=="string"&&R.message.trim()),nt=i.filter(R=>R.type!=="system"),Dt=(p||Re.length>0)&&React.createElement("div",{key:"handshake",style:{border:"1px solid rgba(var(--sb-ink), 0.07)",borderRadius:"12px",background:"var(--sb-surface)",overflow:"hidden"}},[React.createElement("button",{key:"hs-btn",onClick:()=>Se(R=>!R),style:{width:"100%",display:"flex",alignItems:"center",gap:"13px",padding:"14px 16px",background:"transparent",border:"none",color:"inherit",cursor:"pointer",textAlign:"start",fontFamily:"inherit"}},[React.createElement("div",{key:"ic",style:{flex:"none",width:"30px",height:"30px",display:"grid",placeItems:"center"}},React.createElement("i",{className:"fas fa-check",style:{color:"var(--sb-green)",fontSize:"16px"}})),React.createElement("div",{key:"tx",style:{flex:1,minWidth:0}},[React.createElement("div",{key:"t1",style:{fontSize:"13.5px",fontWeight:600,color:"var(--sb-text-2)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},a("flow.channelEstablished")),React.createElement("div",{key:"t2",style:{fontSize:"12px",color:"var(--sb-text-8)",marginTop:"1px",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},a("sas.verified")+(Re.length?" \xB7 "+Re.length+(Re.length===1?" event":" events"):""))]),React.createElement("i",{key:"chev",className:"fas fa-chevron-down",style:{flex:"none",color:"var(--sb-text-9)",fontSize:"13px",transform:Ze?"rotate(180deg)":"rotate(0deg)",transition:"transform .2s"}})]),Ze&&React.createElement("div",{key:"hs-body",style:{paddingTop:"2px",paddingBottom:"14px",paddingInlineStart:"59px",paddingInlineEnd:"16px"}},[Re.length>0&&React.createElement("div",{key:"steps",className:"sb-scroll",style:{marginBottom:"12px",maxHeight:"220px",overflowY:"auto",paddingInlineEnd:"6px"}},Re.map((R,xe)=>React.createElement("div",{key:"s"+xe,style:{display:"flex",gap:"11px",padding:"6px 0",borderTop:xe===0?"none":"1px solid rgba(var(--sb-ink), 0.04)"}},[React.createElement("span",{key:"d",style:{flex:"none",width:"5px",height:"5px",borderRadius:"50%",background:"var(--sb-green-solid)",marginTop:"7px",opacity:.6}}),React.createElement("span",{key:"t",style:{flex:1,fontSize:"12.5px",color:"var(--sb-text-6)",lineHeight:1.5,wordBreak:"break-word"}},String(R.message||"").trim()),React.createElement("span",{key:"tm",style:{flex:"none",fontFamily:tt,fontSize:"10.5px",color:"var(--sb-text-faint)"}},je(R.timestamp))]))),k&&React.createElement("div",{key:"sn",style:{display:"flex",alignItems:"center",gap:"9px",padding:"10px 12px",borderRadius:"9px",background:"rgba(var(--sb-ink), 0.025)",border:"1px solid rgba(var(--sb-ink), 0.06)"}},[React.createElement("i",{key:"i",className:"fas fa-lock",style:{color:"var(--sb-text-7)",fontSize:"12px"}}),React.createElement("span",{key:"l",style:{fontSize:"11.5px",color:"var(--sb-text-7)"}},a("sas.safetyNumber")),React.createElement("span",{key:"v",style:{fontFamily:tt,fontSize:"12px",color:"var(--sb-text-4)",letterSpacing:"0.8px",fontWeight:500,wordBreak:"break-all"}},k)])])]),rt=React.createElement("div",{key:"empty",style:{display:"flex",alignItems:"center",justifyContent:"center",flex:1,minHeight:"40vh"}},React.createElement("div",{style:{textAlign:"center",maxWidth:"420px"}},[React.createElement("img",{key:"ic",src:"/logo/securebit-mark.svg",alt:"SecureBit",style:{width:"60px",height:"60px",objectFit:"contain",display:"block",margin:"0 auto 16px"}}),React.createElement("h3",{key:"t",style:{fontSize:"17px",fontWeight:700,color:"var(--sb-text-2)",margin:"0 0 6px"}},a("flow.channelReady")),React.createElement("p",{key:"p",style:{fontSize:"13px",color:"var(--sb-text-8)",margin:0}},a("chat.e2eeNote"))])),st=React.createElement("main",{key:"main",ref:v,onScroll:Me,className:"sb-scroll",style:{flex:1,overflowY:"auto",padding:"20px 20px 22px"}},React.createElement("div",{style:{width:"100%",maxWidth:"1000px",margin:"0 auto",display:"flex",flexDirection:"column",gap:"16px",minHeight:"100%"}},nt.length===0?[Dt,rt]:[Dt].concat(nt.map(R=>React.createElement(Bo,{key:R.id,message:R.message,type:R.type,timestamp:R.timestamp,mid:R.mid,status:R.status,viewOnce:R.viewOnce,viewOnceTtl:R.viewOnceTtl,expiresAt:R.expiresAt,expired:R.expired,nowTick:q,canUnsend:typeof X=="function",onUnsend:X,onExpire:()=>H&&H(R.id),voice:R.voice}))))),nn=Ie&&React.createElement("div",{key:"timer-row",style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"8px",padding:"10px 12px",marginBottom:"10px",borderRadius:"11px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"var(--sb-surface)"}},[React.createElement("span",{key:"lbl",style:{fontSize:"12px",color:"var(--sb-text-7)",fontWeight:600,marginInlineEnd:"4px"}},a("chat.disappearAfter"))].concat(zt.map(R=>React.createElement("button",{key:"td"+R.v,onClick:()=>Ut(R.v),style:Ct(O===R.v)},R.label)))),Gt=me&&React.createElement("div",{key:"once-row",style:{display:"flex",flexWrap:"wrap",alignItems:"center",gap:"8px",padding:"10px 12px",marginBottom:"10px",borderRadius:"11px",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"var(--sb-surface)"}},[React.createElement("span",{key:"lbl",style:{fontSize:"12px",color:"var(--sb-text-7)",fontWeight:600,marginInlineEnd:"4px"}},a("chat.visibleFor"))].concat(ft.map(R=>React.createElement("button",{key:"od"+R.v,onClick:()=>b(R.v),style:Ct(vt===R.v)},R.label)))),Fn=de&&React.createElement("div",{key:"file-panel",style:{marginBottom:"10px"}},React.createElement(window.FileTransferComponent||(()=>React.createElement("div",{style:{padding:"16px",textAlign:"center",color:"var(--sb-red)"}},"FileTransferComponent not loaded")),{webrtcManager:I,isConnected:Te(),pendingIncomingFiles:D,onIncomingDecision:ae,showDropzone:j})),rn=React.createElement("div",{key:"chips",className:"sb-chips",style:{display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",gap:"8px",marginBottom:"10px"}},[React.createElement("button",{key:"files",onClick:()=>{de&&j?(L(!1),ne(!1)):(L(!0),ne(!0))},className:"sb-chip",style:xt(de&&j)},[React.createElement("i",{key:"i",className:"fas fa-paperclip",style:{fontSize:"13px"}}),de&&j?a("chat.hideFiles"):a("chat.sendFiles")]),React.createElement("div",{key:"right",className:"sb-chips-right",style:{display:"flex",alignItems:"center",gap:"6px",flexWrap:"wrap"}},[React.createElement("button",{key:"code",onClick:()=>le(R=>!R),className:"sb-chip",style:xt(te)},[React.createElement("i",{key:"i",className:"fas fa-code",style:{fontSize:"13px"}}),a("msg.code")]),React.createElement("button",{key:"once",onClick:()=>{Oe(R=>!R),Y(!1)},className:"sb-chip",style:xt(me||be)},[React.createElement("i",{key:"i",className:"fas fa-eye-slash",style:{fontSize:"13px"}}),be?a("chat.viewOncePrefix")+_t(F):a("chat.viewOnce")]),React.createElement("button",{key:"timer",onClick:()=>{Y(R=>!R),Oe(!1)},className:"sb-chip",style:xt(Ie||O>0)},[React.createElement("i",{key:"i",className:"fas fa-stopwatch",style:{fontSize:"13px"}}),O>0?a("chat.timerPrefix")+_t(O):a("msg.timer")])])]),wt=te&&React.createElement("div",{key:"code-strip",style:{display:"flex",alignItems:"center",gap:"8px",padding:"8px 14px",border:"1px solid rgba(var(--sb-ink), 0.08)",borderBottom:"none",borderRadius:"14px 14px 0 0",background:"var(--sb-surface)"}},[React.createElement("i",{key:"i",className:"fas fa-code",style:{color:"var(--sb-text-7)",fontSize:"12px"}}),React.createElement("span",{key:"s",style:{fontSize:"11.5px",fontWeight:600,color:"var(--sb-text-7)"}},a("chat.codeHint")),React.createElement("button",{key:"c",onClick:()=>le(!1),className:"sb-link",style:{marginInlineStart:"auto",background:"none",border:"none",color:"var(--sb-text-9)",cursor:"pointer",fontSize:"11.5px",fontFamily:"inherit",fontWeight:600}},a("chat.close"))]),f=React.createElement("button",{key:"send",onClick:h,disabled:!$,title:a("chat.send"),className:"sb-send",style:{flex:"none",width:"44px",height:"44px",borderRadius:"11px",border:"none",display:"grid",placeItems:"center",cursor:$?"pointer":"default",background:$?"var(--sb-orange-solid)":"rgba(var(--sb-ink), 0.05)",color:$?"var(--sb-on-accent)":"var(--sb-text-faint)",transition:"all .15s"}},React.createElement("i",{className:"fas fa-paper-plane sb-mirror-rtl",style:{fontSize:"15px"}})),it=React.createElement("button",{key:"mic",onClick:()=>et(!0),title:a("chat.recordVoice"),className:"sb-send",style:{flex:"none",width:"44px",height:"44px",borderRadius:"50%",border:"none",display:"grid",placeItems:"center",cursor:"pointer",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",boxShadow:"0 8px 22px rgba(var(--sb-orange-rgb), 0.3)",transition:"transform .15s cubic-bezier(.2,.7,.3,1)"}},React.createElement("svg",{width:19,height:19,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.9,strokeLinecap:"round",strokeLinejoin:"round"},[React.createElement("rect",{key:"a",x:9,y:3,width:6,height:11,rx:3}),React.createElement("path",{key:"b",d:"M5 11a7 7 0 0 0 14 0"}),React.createElement("path",{key:"c",d:"M12 18v3"})])),Fe=Pe?ht?[it,f]:$?[f]:[it]:[f],we=React.createElement("div",{key:"input",style:{display:"flex",alignItems:"flex-end",gap:"11px",paddingBlock:"11px",paddingInlineStart:"16px",paddingInlineEnd:"11px",border:"1px solid "+($?"rgba(var(--sb-ink), 0.18)":"rgba(var(--sb-ink), 0.08)"),background:"var(--sb-surface)",borderRadius:te?"0 0 14px 14px":"14px",transition:"border .15s"}},[React.createElement("div",{key:"ta-wrap",style:{flex:1,minWidth:0}},[React.createElement("textarea",{key:"ta",value:c,ref:gt,onChange:R=>d(R.target.value),onKeyDown:ee,rows:1,maxLength:2e3,placeholder:te?a("flow.pasteOrWrite"):a("chat.placeholder"),className:"sb-textarea",style:{width:"100%",minHeight:te?"120px":"22px",maxHeight:"240px",resize:"none",border:"none",outline:"none",background:"transparent",color:"var(--sb-text-2)",fontFamily:te?tt:"inherit",fontSize:te?"13px":"14.5px",lineHeight:1.55,padding:"6px 0"}}),React.createElement("div",{key:"foot",style:{display:"flex",alignItems:"center",gap:"12px",marginTop:"3px"}},[React.createElement("span",{key:"enc",style:{display:"inline-flex",alignItems:"center",gap:"5px",fontSize:"11px",color:"var(--sb-text-faint)"}},[React.createElement("i",{key:"i",className:"fas fa-lock",style:{color:"var(--sb-green)",fontSize:"10px"}}),a("chat.encryptedOnDevice")]),React.createElement("span",{key:"cnt",style:{fontFamily:tt,fontSize:"10.5px",color:"var(--sb-text-faint)",marginInlineStart:"auto"}},(c?c.length:0)+"/2000")])])].concat(Fe)),Ge=React.createElement("div",{key:"recbar"},React.createElement(Lo,{onCancel:()=>et(!1),onSend:(R,xe,Le)=>{et(!1),typeof y=="function"&&y(R,xe,Le)}})),He=React.createElement("footer",{key:"composer",style:{flex:"none",padding:"12px 20px calc(18px + var(--sb-safe-bottom, env(safe-area-inset-bottom, 0px)))",background:"var(--sb-bg)",borderTop:"1px solid rgba(var(--sb-ink), 0.05)"}},React.createElement("div",{style:{maxWidth:"1000px",margin:"0 auto"}},Ye?[Ge]:[nn,Gt,Fn,rn,wt,we])),Ht=re&&React.createElement("button",{key:"scrollbtn",onClick:ut,style:{position:"fixed",insetInlineEnd:"24px",bottom:"150px",width:"44px",height:"44px",borderRadius:"50%",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"var(--sb-surface-3)",color:"var(--sb-text-4)",display:"grid",placeItems:"center",cursor:"pointer",zIndex:50,boxShadow:"0 6px 20px rgba(var(--sb-shadow-rgb), calc(0.4 * var(--sb-shadow-k)))"}},React.createElement("i",{className:"fas fa-arrow-down",style:{fontSize:"15px"}})),De=React.createElement(Go,{key:"chat-header",status:B,onDisconnect:w,webrtcManager:I,title:t,isOffline:e,peerPresence:n,onRenameTitle:r}),sn=window.CallUIComponent&&React.createElement(window.CallUIComponent,{key:"call-overlay",webrtcManager:I,peerTitle:t});return React.createElement("div",{className:"chat-container",style:{position:"relative",display:"flex",flexDirection:"column",height:"100vh",background:"var(--sb-bg)",color:"var(--sb-text-2)"}},[De,st,Ht,He,sn])},ps=(t,e,n={})=>({message:t,type:e,id:Date.now()+Math.random(),timestamp:typeof n.timestamp=="number"?n.timestamp:Date.now(),mid:n.mid,status:n.status,viewOnce:n.viewOnce===!0,viewOnceTtl:typeof n.viewOnceTtl=="number"?n.viewOnceTtl:15,expiresAt:typeof n.expiresAt=="number"?n.expiresAt:void 0,voice:n.voice||void 0,fileId:n.fileId||void 0}),tn={chevL:'<svg class="sb-mirror-rtl" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 6l-6 6 6 6"/></svg>',chevR:'<svg class="sb-mirror-rtl" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6l6 6-6 6"/></svg>',plus:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.1" stroke-linecap="round"><path d="M12 5v14M5 12h14"/></svg>',users:'<svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M16 19v-1.5a3.5 3.5 0 0 0-3.5-3.5h-5A3.5 3.5 0 0 0 4 17.5V19"/><circle cx="10" cy="8" r="3.2"/><path d="M20 19v-1.5a3.5 3.5 0 0 0-2.6-3.4"/><path d="M15.5 5.3a3.2 3.2 0 0 1 0 5.4"/></svg>',burger:'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16M4 12h16M4 17h16"/></svg>'},Vi=({chats:t,groups:e=[],collapsed:n,drawerOpen:r,onToggleCollapse:i,onSelect:c,onSelectGroup:d,onNewChat:h,onNewGroup:y,onRename:w,onCloseDrawer:k,myStatus:p,onSetStatus:v})=>{let m=React.createElement,[I,B]=React.useState(null),[D,ae]=React.useState(""),[te,le]=React.useState(!1),be=React.useRef(null),C=React.useRef(null),F=React.useRef(null),V=React.useRef(null),O=React.useRef(0),P=React.useRef(!1),q=React.useRef(!1),[X,H]=React.useState(!!r),re=10,ie=220,de=()=>C.current&&C.current.offsetWidth||292,L=b=>{O.current=b;let $=de(),Pe=Math.min(1,Math.max(0,1+b/$));if(C.current&&(C.current.style.transform="translate3d("+(b*Kn).toFixed(2)+"px,0,0)"),be.current){be.current.style.opacity=Pe.toFixed(3);let je="blur("+(5*Pe).toFixed(2)+"px)";be.current.style.backdropFilter=je,be.current.style.webkitBackdropFilter=je}},j=(b,$)=>{F.current&&F.current.stop(),F.current=Ii({from:O.current,to:b,velocity:$,damping:Math.abs($)>60?Nn.drawer.damping:Nn.move.damping,response:Nn.drawer.response,restDelta:.5,restSpeed:8,onUpdate:L,onComplete:()=>{L(b),F.current=null,b!==0&&H(!1)}})};React.useLayoutEffect(()=>{if(r&&!X){H(!0);return}if(!X||r===P.current)return;let b=de();r&&!F.current&&!V.current&&L(-b),P.current=r,j(r?0:-b,F.current?F.current.velocity:0)},[r,X]),React.useEffect(()=>()=>{F.current&&F.current.stop()},[]);let ne=b=>{b.pointerType==="mouse"&&b.button!==0||V.current||(q.current=!1,V.current={id:b.pointerId,x0:b.clientX,y0:b.clientY,base:O.current,axis:null,vel:Ci()},V.current.vel.add(b.clientX*Kn,b.timeStamp||performance.now()))},Ie=b=>{let $=V.current;if(!$||b.pointerId!==$.id)return;let Pe=b.clientX-$.x0,je=b.clientY-$.y0;if(!$.axis){if(Math.abs(Pe)<re&&Math.abs(je)<re)return;if(Math.abs(je)>=Math.abs(Pe)){V.current=null;return}$.axis="x",F.current&&($.base=O.current,$.x0=b.clientX,F.current.stop(),F.current=null);try{b.currentTarget.setPointerCapture($.id)}catch{}}$.vel.add(b.clientX*Kn,b.timeStamp||performance.now());let Re=de(),nt=$.base+(b.clientX-$.x0)*Kn;nt>0?nt=cs(nt,Re):nt<-Re&&(nt=-Re+cs(nt+Re,Re)),L(nt)},Y=b=>{let $=V.current;if(!$||b.pointerId!==void 0&&b.pointerId!==$.id||(V.current=null,$.axis!=="x"))return;q.current=!0;let Pe=de(),je=$.vel.get(b.timeStamp||performance.now()),Re=_i(O.current,je,[-Pe,0],{flick:ie})===0;P.current=Re,j(Re?0:-Pe,je),Re||k()},me=()=>{if(q.current){q.current=!1;return}k()},Oe=b=>$=>{$.stopPropagation(),B(b.id),ae(b.name)},Ze=()=>{I&&(w(I,D),B(null))},Se=b=>{b.key==="Enter"?(b.preventDefault(),Ze()):b.key==="Escape"&&B(null)},Ye=(b={})=>m("input",{autoFocus:!0,value:D,onChange:$=>ae($.target.value),onKeyDown:Se,onBlur:Ze,onClick:$=>$.stopPropagation(),style:Object.assign({width:"100%",background:"rgba(var(--sb-ink), 0.06)",border:"1px solid rgba(var(--sb-orange-rgb), 0.5)",borderRadius:"6px",color:"var(--sb-text-1)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,padding:"2px 6px",outline:"none"},b)}),et=(b,$)=>m("span",{style:Object.assign({display:"grid",placeItems:"center"},$||{}),dangerouslySetInnerHTML:{__html:b}}),ht=(b,$,Pe)=>m("div",{style:{position:"relative",flex:"none",width:$+"px",height:$+"px",borderRadius:($>=44?12:11)+"px",display:"grid",placeItems:"center",background:b.active?"rgba(var(--sb-ink), 0.06)":"rgba(var(--sb-ink), 0.035)",border:"1px solid rgba(var(--sb-ink), "+(b.active?"0.14":"0.07")+")",fontSize:"13px",fontWeight:700,letterSpacing:"-0.3px",color:b.active?"var(--sb-text-1)":"var(--sb-text-6)"}},[b.mono,m("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"11px",height:"11px",borderRadius:"50%",background:b.dot,border:"2px solid "+Pe}})]),Bt=b=>m("div",{key:b.id,onClick:()=>c(b.id),style:{position:"relative",display:"flex",alignItems:"center",gap:"12px",padding:"11px 12px",marginBottom:"4px",borderRadius:"11px",background:b.active?"var(--sb-surface)":"transparent",border:"1px solid "+(b.active?"rgba(var(--sb-ink), 0.08)":"transparent"),cursor:"pointer"}},[b.active&&m("span",{key:"bar",style:{position:"absolute",insetInlineStart:0,top:"12px",bottom:"12px",width:"3px",borderStartEndRadius:"3px",borderEndEndRadius:"3px",background:"var(--sb-orange-solid)"}}),ht(b,38,b.active?"var(--sb-surface)":"var(--sb-bg-deep)"),m("div",{key:"body",style:{flex:1,minWidth:0}},[m("div",{key:"top",style:{display:"flex",alignItems:"center",gap:"7px"}},[I===b.id?Ye():m("span",{key:"name",onDoubleClick:Oe(b),title:a("chat.renameHint"),style:{flex:1,minWidth:0,fontSize:"14px",fontWeight:b.active?700:600,letterSpacing:"-0.2px",color:b.active?"var(--sb-text-1)":"var(--sb-text-4)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},b.name),b.unread&&I!==b.id&&m("span",{key:"u",style:{flex:"none",minWidth:"18px",height:"18px",padding:"0 5px",borderRadius:"9px",display:"grid",placeItems:"center",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:700}},b.unread)]),m("div",{key:"prev",style:{fontSize:"12px",color:b.active?"var(--sb-text-7)":"var(--sb-text-9)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},b.preview)])]),gt=b=>m("div",{key:b.id,style:{position:"relative"}},[b.active&&m("span",{key:"bar",style:{position:"absolute",insetInlineStart:"-13px",top:"9px",bottom:"9px",width:"3px",borderStartEndRadius:"3px",borderEndEndRadius:"3px",background:"var(--sb-orange-solid)"}}),m("div",{key:"tile",onClick:()=>c(b.id),title:b.name,style:{position:"relative",width:"44px",height:"44px",borderRadius:"12px",display:"grid",placeItems:"center",cursor:"pointer",background:b.active?"rgba(var(--sb-ink), 0.06)":"rgba(var(--sb-ink), 0.03)",border:"1px solid rgba(var(--sb-ink), "+(b.active?"0.14":"0.07")+")",fontSize:"13px",fontWeight:700,letterSpacing:"-0.3px",color:b.active?"var(--sb-text-1)":"var(--sb-text-6)"}},[b.mono,m("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"11px",height:"11px",borderRadius:"50%",background:b.dot,border:"2.5px solid var(--sb-bg-deep)"}}),b.unread&&m("span",{key:"u",style:{position:"absolute",insetInlineStart:"-5px",top:"-5px",minWidth:"17px",height:"17px",padding:"0 4px",borderRadius:"9px",display:"grid",placeItems:"center",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",fontFamily:"'JetBrains Mono',monospace",fontSize:"9.5px",fontWeight:700,border:"2px solid var(--sb-bg-deep)"}},b.unread)])]),Me=b=>m("div",{style:{width:b+"px",height:b+"px",flex:"none",display:"grid",placeItems:"center"}},m("img",{src:"/logo/securebit-mark.svg",alt:"SecureBit",style:{width:"100%",height:"100%",objectFit:"contain",display:"block"}})),ut=(b,$)=>m("button",{className:"sb-collapse-btn",onClick:i,title:$,style:{width:"30px",height:"30px",borderRadius:"8px",display:"grid",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.07)",background:"transparent",color:"var(--sb-text-7)",cursor:"pointer"},dangerouslySetInnerHTML:{__html:b}}),ee=lr.find(b=>b.key===p)||lr[0],Te={user:'<svg width="19" height="19" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M18 20v-1.5a4 4 0 0 0-4-4h-4a4 4 0 0 0-4 4V20"/><circle cx="12" cy="8" r="3.6"/></svg>',check:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--sb-orange-solid)" stroke-width="2.3" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4 10-11"/></svg>',chevUp:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="var(--sb-text-9)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg>',lock:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="var(--sb-green-solid)" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M7 11V7a5 5 0 0 1 10 0v4"/><rect x="4.5" y="11" width="15" height="9" rx="2.2"/></svg>'},tt=b=>te?m("div",{key:"pmenu",style:Object.assign({position:"absolute",zIndex:30,borderRadius:"14px",background:"var(--sb-surface)",border:"1px solid rgba(var(--sb-ink), 0.1)",boxShadow:"0 16px 40px rgba(var(--sb-shadow-rgb), calc(0.55 * var(--sb-shadow-k)))",padding:"6px"},b)},[m("div",{key:"h",style:{padding:"9px 10px 7px",fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:600,color:"var(--sb-text-faint)",textTransform:"uppercase",letterSpacing:"1.2px"}},a("chat.setStatus")),...lr.map($=>m("button",{key:$.key,onClick:()=>{v($.key),le(!1)},style:{width:"100%",display:"flex",alignItems:"center",gap:"11px",padding:"9px 10px",borderRadius:"9px",border:"none",background:"transparent",cursor:"pointer",textAlign:"start"}},[m("span",{key:"d",style:{flex:"none",width:"10px",height:"10px",borderRadius:"50%",background:$.dot}}),m("span",{key:"t",style:{flex:1,minWidth:0}},[m("span",{key:"w",style:{display:"block",fontSize:"13.5px",fontWeight:600,color:"var(--sb-text-2)"}},$.word),m("span",{key:"de",style:{display:"block",fontSize:"11.5px",color:"var(--sb-text-9)"}},$.desc)]),$.key===p&&m("span",{key:"c",style:{flex:"none",display:"grid",placeItems:"center"},dangerouslySetInnerHTML:{__html:Te.check}})])),m("div",{key:"note",style:{display:"flex",alignItems:"flex-start",gap:"8px",margin:"6px 6px 4px",padding:"9px 10px",borderRadius:"9px",background:"rgba(var(--sb-green-rgb), 0.06)",border:"1px solid rgba(var(--sb-green-rgb), 0.16)"}},[m("span",{key:"i",style:{flex:"none",marginTop:"1px",display:"grid"},dangerouslySetInnerHTML:{__html:Te.lock}}),m("span",{key:"t",style:{fontSize:"11px",lineHeight:1.45,color:"var(--sb-text-7)"}},a("chat.peersOnly"))])]):null,_t=m("div",{key:"you",style:{flex:"none",position:"relative",marginTop:"10px",borderTop:"1px solid rgba(var(--sb-ink), 0.06)",padding:"10px 12px 12px"}},[tt({left:"12px",right:"12px",bottom:"64px"}),m("button",{key:"btn",onClick:()=>le(b=>!b),style:{width:"100%",display:"flex",alignItems:"center",gap:"11px",padding:"7px 8px",borderRadius:"11px",border:"1px solid rgba(var(--sb-ink), 0.06)",background:"rgba(var(--sb-ink), 0.02)",cursor:"pointer"}},[m("div",{key:"av",style:{position:"relative",flex:"none",width:"36px",height:"36px",borderRadius:"10px",display:"grid",placeItems:"center",background:"rgba(var(--sb-orange-rgb), 0.12)",border:"1px solid rgba(var(--sb-orange-rgb), 0.24)",color:"var(--sb-orange)"}},[m("span",{key:"i",style:{display:"grid"},dangerouslySetInnerHTML:{__html:Te.user}}),m("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"11px",height:"11px",borderRadius:"50%",background:ee.dot,border:"2px solid var(--sb-bg-deep)"}})]),m("div",{key:"tx",style:{flex:1,minWidth:0,textAlign:"start"}},[m("div",{key:"y",style:{fontSize:"13.5px",fontWeight:700,color:"var(--sb-text-1)"}},a("chatHdr.you")),m("div",{key:"w",style:{fontSize:"12px",color:"var(--sb-text-7)"}},ee.word)]),m("span",{key:"ch",style:{display:"grid",placeItems:"center"},dangerouslySetInnerHTML:{__html:Te.chevUp}})])]),xt=m("div",{key:"you",style:{flex:"none",position:"relative",display:"flex",flexDirection:"column",alignItems:"center",padding:"0 0 13px"}},[tt({insetInlineStart:"60px",bottom:"8px",width:"248px"}),m("button",{key:"btn",onClick:()=>le(b=>!b),title:a("chat.yourStatusPrefix")+ee.word,style:{position:"relative",width:"44px",height:"44px",borderRadius:"12px",display:"grid",placeItems:"center",cursor:"pointer",background:"rgba(var(--sb-orange-rgb), 0.12)",border:"1px solid rgba(var(--sb-orange-rgb), 0.24)",color:"var(--sb-orange)"}},[m("span",{key:"i",style:{display:"grid"},dangerouslySetInnerHTML:{__html:Te.user}}),m("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"12px",height:"12px",borderRadius:"50%",background:ee.dot,border:"2.5px solid var(--sb-bg-deep)"}})])]),Ct=[m("div",{key:"head",style:{flex:"none",display:"flex",alignItems:"center",justifyContent:"space-between",paddingBlock:0,paddingInlineStart:"16px",paddingInlineEnd:"12px",height:"var(--sb-bar-h, 64px)",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)"}},[m("div",{key:"brand",style:{display:"flex",alignItems:"center",gap:"10px"}},[Me(30),m("span",{key:"t",style:{fontSize:"15px",fontWeight:800,letterSpacing:"-0.3px",color:"var(--sb-text-1)"}},"SecureBit")]),ut(tn.chevL,a("chat.collapse"))]),m("div",{key:"label",style:{flex:"none",display:"flex",alignItems:"center",justifyContent:"space-between",padding:"16px 16px 9px"}},[m("span",{key:"l",style:{fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:600,color:"var(--sb-text-faint)",textTransform:"uppercase",letterSpacing:"1.3px"}},a("chatHdr.chats")),m("span",{key:"c",style:{fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:600,color:"var(--sb-text-9)"}},String(t.length))]),m("div",{key:"list",className:"msc-scroll",style:{flex:1,overflowY:"auto",padding:"0 10px"}},[...t.map(Bt),m("div",{key:"gh",style:{marginTop:"14px",padding:"0 2px 6px",display:"flex",alignItems:"baseline",justifyContent:"space-between"}},[m("span",{key:"l",style:{fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:600,color:"var(--sb-text-faint)",textTransform:"uppercase",letterSpacing:"1.3px"}},a("chat.groupChats")),m("button",{key:"add",onClick:y,title:a("chat.newGroup"),style:{border:"none",background:"transparent",color:"var(--sb-orange)",cursor:"pointer",fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:700,textTransform:"uppercase",letterSpacing:"0.9px",padding:0}},a("chatHdr.newChat"))]),...e.length===0?[m("div",{key:"gph",onClick:y,title:a("chat.createGroup"),style:{display:"flex",alignItems:"center",gap:"12px",padding:"11px 12px",borderRadius:"11px",background:"transparent",border:"1px dashed rgba(var(--sb-ink), 0.09)",cursor:"pointer"}},[m("div",{key:"i",style:{flex:"none",width:"38px",height:"38px",borderRadius:"11px",display:"grid",placeItems:"center",background:"rgba(var(--sb-ink), 0.025)",border:"1px solid rgba(var(--sb-ink), 0.06)",color:"var(--sb-text-faint)"},dangerouslySetInnerHTML:{__html:tn.users}}),m("div",{key:"b",style:{flex:1,minWidth:0}},[m("div",{key:"t",style:{fontSize:"14px",fontWeight:600,color:"var(--sb-text-7)"}},a("chat.newGroup")),m("div",{key:"s",style:{fontSize:"11.5px",color:"var(--sb-text-faint)"}},a("chat.meshHint"))])])]:e.map(b=>m("div",{key:b.id,onClick:()=>d(b.id),style:{position:"relative",display:"flex",alignItems:"center",gap:"12px",padding:"11px 12px",marginBottom:"4px",borderRadius:"11px",background:b.active?"var(--sb-surface)":"transparent",border:"1px solid "+(b.active?"rgba(var(--sb-ink), 0.08)":"transparent"),cursor:"pointer"}},[b.active&&m("span",{key:"bar",style:{position:"absolute",insetInlineStart:0,top:"12px",bottom:"12px",width:"3px",borderStartEndRadius:"3px",borderEndEndRadius:"3px",background:"var(--sb-orange-solid)"}}),ht(b,38,b.active?"var(--sb-surface)":"var(--sb-bg-deep)"),m("div",{key:"body",style:{flex:1,minWidth:0}},[m("div",{key:"top",style:{display:"flex",alignItems:"center",gap:"7px"}},[m("span",{key:"n",style:{flex:1,minWidth:0,fontSize:"14px",fontWeight:b.active?700:600,letterSpacing:"-0.2px",color:b.active?"var(--sb-text-1)":"var(--sb-text-4)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},b.name),b.unread&&m("span",{key:"u",style:{flex:"none",minWidth:"18px",height:"18px",padding:"0 5px",borderRadius:"9px",display:"grid",placeItems:"center",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",fontFamily:"'JetBrains Mono',monospace",fontSize:"10px",fontWeight:700}},b.unread)]),m("div",{key:"prev",style:{fontSize:"12px",color:b.active?"var(--sb-text-7)":"var(--sb-text-9)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"}},b.preview)])]))]),m("div",{key:"new",style:{flex:"none",padding:"12px"}},m("button",{onClick:h,style:{width:"100%",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"9px",padding:"12px",borderRadius:"11px",border:"none",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",fontFamily:"inherit",fontSize:"14px",fontWeight:700,cursor:"pointer",boxShadow:"0 8px 24px rgba(var(--sb-orange-rgb), 0.28)"}},[et(tn.plus,{key:"p"}),a("chat.newChat")])),_t],zt=[m("div",{key:"head",style:{flex:"none",display:"flex",flexDirection:"column",alignItems:"center",gap:"10px",padding:"13px 0",width:"100%",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)"}},[Me(32),ut(tn.chevR,a("chatHdr.expand"))]),m("div",{key:"list",className:"msc-scroll",style:{flex:1,overflowY:"auto",display:"flex",flexDirection:"column",alignItems:"center",gap:"10px",padding:"14px 0",width:"100%"}},[...t.map(gt),m("div",{key:"sep",style:{width:"30px",height:"1px",background:"rgba(var(--sb-ink), 0.07)",margin:"2px 0"}}),...e.map(b=>m("div",{key:b.id,style:{position:"relative"}},[b.active&&m("span",{key:"bar",style:{position:"absolute",insetInlineStart:"-13px",top:"9px",bottom:"9px",width:"3px",borderStartEndRadius:"3px",borderEndEndRadius:"3px",background:"var(--sb-orange-solid)"}}),m("div",{key:"tile",onClick:()=>d(b.id),title:b.name+" \u2014 "+b.headerSub,style:{position:"relative",width:"44px",height:"44px",borderRadius:"12px",display:"grid",placeItems:"center",cursor:"pointer",background:b.active?"rgba(var(--sb-ink), 0.06)":"rgba(var(--sb-ink), 0.03)",border:"1px solid rgba(var(--sb-ink), "+(b.active?"0.14":"0.07")+")",fontSize:"13px",fontWeight:700,letterSpacing:"-0.3px",color:b.active?"var(--sb-text-1)":"var(--sb-text-6)"}},[b.mono,m("span",{key:"dot",style:{position:"absolute",insetInlineEnd:"-2px",bottom:"-2px",width:"11px",height:"11px",borderRadius:"50%",background:b.dot,border:"2.5px solid var(--sb-bg-deep)"}}),b.unread&&m("span",{key:"u",style:{position:"absolute",insetInlineStart:"-5px",top:"-5px",minWidth:"17px",height:"17px",padding:"0 4px",borderRadius:"9px",display:"grid",placeItems:"center",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",fontFamily:"'JetBrains Mono',monospace",fontSize:"9.5px",fontWeight:700,border:"2px solid var(--sb-bg-deep)"}},b.unread)])])),m("div",{key:"gph",onClick:y,title:a("chat.newGroup"),style:{position:"relative",width:"44px",height:"44px",borderRadius:"12px",display:"grid",placeItems:"center",cursor:"pointer",background:"transparent",border:"1px dashed rgba(var(--sb-ink), 0.1)",color:"var(--sb-text-faint)"},dangerouslySetInnerHTML:{__html:tn.users}})]),m("div",{key:"new",style:{flex:"none",padding:"13px 0"}},m("button",{onClick:h,title:a("chat.newChat"),style:{width:"44px",height:"44px",borderRadius:"12px",display:"grid",placeItems:"center",border:"none",background:"var(--sb-orange-solid)",color:"var(--sb-on-accent)",cursor:"pointer",boxShadow:"0 8px 24px rgba(var(--sb-orange-rgb), 0.28)"},dangerouslySetInnerHTML:{__html:tn.plus}})),xt],vt={flex:"none",width:n?"72px":"292px",display:"flex",flexDirection:"column",alignItems:n?"center":"stretch",paddingTop:"var(--sb-safe-top, 0px)",background:"var(--sb-bg-deep)",borderInlineEnd:"1px solid rgba(var(--sb-ink), 0.06)"},Ut=n?zt:Ct;return m(React.Fragment,null,[m("style",{key:"css",dangerouslySetInnerHTML:{__html:"@media (max-width:1023px){.sb-rail{display:none !important;}.sb-burger{display:grid !important;}}@media (min-width:1024px){.sb-drawer-overlay{display:none !important;}}.sb-mobile-drawer .sb-collapse-btn{display:none !important;}html,body{background:var(--sb-bg) !important;overscroll-behavior:none;}.sb-app-shell{height:var(--sb-vh,100dvh) !important;min-height:0 !important;overflow:hidden;}.sb-chat-header{position:sticky;top:0;z-index:20;}.sb-app-col{height:100% !important;min-height:0 !important;}.chat-container{height:100% !important;min-height:0 !important;}.sb-scroll{min-height:0 !important;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;}@media (max-width:768px){textarea,input,select{font-size:16px !important;}}@media (max-width:768px){.sb-rename-btn{display:none !important;}}"}}),m("aside",{key:"rail",className:"sb-rail",style:vt},Ut),m("div",{key:"drawer",className:"sb-drawer-overlay",ref:be,onClick:me,onPointerDown:ne,onPointerMove:Ie,onPointerUp:Y,onPointerCancel:Y,style:{position:"fixed",inset:0,zIndex:60,background:"rgba(var(--sb-scrim-rgb), 0.6)",backdropFilter:"blur(0px)",WebkitBackdropFilter:"blur(0px)",opacity:0,display:X?"block":"none",touchAction:"pan-y",willChange:"opacity"}},m("aside",{className:"sb-mobile-drawer",ref:C,onClick:b=>b.stopPropagation(),style:{position:"absolute",insetInlineStart:0,top:0,bottom:0,width:"min(292px, 86vw)",display:"flex",flexDirection:"column",paddingTop:"var(--sb-safe-top, 0px)",background:"var(--sb-bg-deep)",borderInlineEnd:"1px solid rgba(var(--sb-ink), 0.06)",boxShadow:"0 0 60px rgba(var(--sb-shadow-rgb), calc(0.6 * var(--sb-shadow-k)))",touchAction:"pan-y",willChange:"transform"}},[m("button",{key:"x",onClick:k,title:a("chat.closeMenu"),"aria-label":a("chat.closeMenu"),style:{position:"absolute",top:"calc(15px + var(--sb-safe-top, 0px))",insetInlineEnd:"13px",zIndex:2,width:"34px",height:"34px",borderRadius:"9px",display:"grid",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-4)",cursor:"pointer"}},m("i",{className:"fas fa-xmark",style:{fontSize:"16px"}})),Ct]))])},fs=()=>{let[t,e]=React.useReducer(Zs,void 0,Js),n=t.activeSessionId,r=React.useRef(null);r.current=n;let i=n?t.sessions[n]:null,c=React.useRef([]).current,d=React.useRef(new Map),h=React.useRef(new Map),y=React.useRef(new Map),w=React.useRef(new Map),[k,p]=React.useReducer(ki,void 0,wi),v=React.useRef(new Map),m=k.activeGroupId,I=m?k.groups[m]:null,B=React.useRef(null);B.current=m;let[D,ae]=React.useState(""),[te,le]=React.useState(!1),[be,C]=React.useState(!1),[F,V]=React.useState(null),[O,P]=React.useState(null),[q,X]=React.useState(!1),H=React.useRef(null),[re,ie]=React.useState({}),[de,L]=React.useState({}),j=React.useRef(new Map),[ne,Ie]=React.useState({}),Y=React.useRef(new Set),me=React.useRef(new Map),Oe=React.useRef(new Map),Ze=React.useMemo(()=>Ri({getManager:s=>d.current.get(s)||me.current.get(s)?.manager||null}),[]),Se=(s,o,l={})=>({id:Date.now()+Math.random(),message:s,type:o,timestamp:Date.now(),...l}),Ye=React.useCallback(s=>(o,l={})=>{switch(o){case"phase":p({type:fe.SET_PHASE,id:s,phase:l.phase});break;case"members":p({type:fe.SET_MEMBERS,id:s,members:l.members,epoch:l.epoch}),Or.current(s,null);break;case"roster":p({type:fe.RENAME,id:s,name:l.name});break;case"sas":p({type:fe.SET_SAS,id:s,code:l.code}),p({type:fe.SET_ACTIVE_GROUP,id:s}),C(!0);break;case"confirmed":p({type:fe.CONFIRM_SAS,id:s});break;case"call":if(ie(u=>({...u,[s]:l.call})),Or.current(s,l.call),l.call&&!l.call.joined&&s!==B.current){let u=`${s}:${l.call.callId}`;Y.current.has(u)||(Y.current.add(u),p({type:fe.INCREMENT_UNREAD,id:s}))}break;case"message":p({type:fe.ADD_MESSAGE,id:s,message:Se(l.body,"received",{senderName:l.name,senderFp:l.fp,timestamp:l.ts,relayed:l.relayed===!0})}),s!==B.current&&p({type:fe.INCREMENT_UNREAD,id:s});break;case"ended":Cs.current(s,{announce:!1});break;case"add_failed":p({type:fe.ADD_MESSAGE,id:s,message:Se(a("err.nobodyAccepted"),"system")});break;case"left":p({type:fe.ADD_MESSAGE,id:s,message:Se(`${l.name} left the group.`,"system")});break;case"inconsistency":p({type:fe.ADD_MESSAGE,id:s,message:Se(`${l.name} sent conflicting messages to different members. That message was discarded.`,"system")});break;case"error":p({type:fe.SET_ERROR,id:s,error:l.error});break;default:break}},[]),et=React.useCallback((s,o)=>{let l=v.current.get(o.gid);if(!l){if(Ei(o)===ce.INVITE){let u=null;try{u=fr(o)}catch{return}V(g=>g||{gid:u.gid,name:String(u.name||"Group").slice(0,N.MAX_NAME_BYTES),frame:u,sessionId:s})}return}l.handleFrame(s,o).catch(u=>{let g=u?.code||(u?.message?`frame_rejected: ${String(u.message).slice(0,120)}`:"frame_rejected");p({type:fe.SET_ERROR,id:o.gid,error:g})})},[]),ht=React.useRef(et);ht.current=et;let Bt=React.useCallback((s,o)=>{for(let l of v.current.values())try{l.setSessionState(s,o)}catch{}},[]),gt=React.useRef(Bt);gt.current=Bt;let Me=React.useCallback(s=>{let o=r.current;o&&e(s(o))},[]),ut=i?i.messages:c,ee=React.useCallback(s=>{let o=r.current;o&&e(typeof s=="function"?{type:J.SET_MESSAGES,id:o,updater:s}:{type:J.SET_MESSAGES,id:o,messages:s})},[]),Te=i?i.status:"disconnected",tt=React.useCallback(s=>Me(o=>({type:J.SET_STATUS,id:o,status:s})),[Me]),_t=i?i.keyFingerprint:"",xt=React.useCallback(s=>Me(o=>({type:J.SET_FINGERPRINT,id:o,fingerprint:s})),[Me]),Ct=i?i.verificationCode:"",zt=React.useCallback(s=>Me(o=>({type:J.SET_VERIFICATION,id:o,code:s})),[Me]),ft=i?i.sas.isVerified:!1,vt=React.useCallback(s=>Me(o=>({type:J.SET_SAS,id:o,sas:{isVerified:!!s}})),[Me]),Ut=i?i.sas.localConfirmed:!1,b=React.useCallback(s=>Me(o=>({type:J.SET_SAS,id:o,sas:{localConfirmed:!!s}})),[Me]),$=i?i.sas.remoteConfirmed:!1,Pe=React.useCallback(s=>Me(o=>({type:J.SET_SAS,id:o,sas:{remoteConfirmed:!!s}})),[Me]),je=i?i.sas.bothConfirmed:!1,Re=React.useCallback(s=>Me(o=>({type:J.SET_SAS,id:o,sas:{bothConfirmed:!!s}})),[Me]),nt=i?i.pendingIncomingFiles:c,Dt=React.useCallback(s=>{let o=r.current;o&&e(typeof s=="function"?{type:J.SET_PENDING_FILES,id:o,updater:s}:{type:J.SET_PENDING_FILES,id:o,files:s})},[]),rt=(s,o)=>i?i.setup[s]:o,st=s=>React.useCallback(o=>Me(l=>({type:J.PATCH_SETUP,id:l,patch:{[s]:o}})),[Me]),nn=rt("offerData",""),Gt=st("offerData"),Fn=rt("answerData",""),rn=st("answerData"),wt=rt("offerInput",""),f=st("offerInput"),it=rt("answerInput",""),Fe=st("answerInput"),we=rt("showOfferStep",!1),Ge=st("showOfferStep"),He=rt("showAnswerStep",!1),Ht=st("showAnswerStep"),De=rt("showVerification",!1),sn=st("showVerification"),R=rt("showQRCode",!1),xe=st("showQRCode"),Le=rt("qrCodeUrl",""),Ke=st("qrCodeUrl"),an=rt("isGeneratingKeys",!1),vn=st("isGeneratingKeys"),ye=React.useMemo(()=>({get current(){return d.current.get(r.current)||null},set current(s){let o=r.current;o&&(s?d.current.set(o,s):d.current.delete(o))}}),[]),kt=React.useMemo(()=>({get current(){return h.current.get(r.current)||null},set current(s){let o=r.current;o&&(s?h.current.set(o,s):h.current.delete(o))}}),[]),[St,wr]=React.useState(()=>{try{return localStorage.getItem("securebit_my_status")||"available"}catch{return"available"}}),wn=React.useRef(St);wn.current=St;let kr=s=>s==="invisible"?"offline":s,Ft=React.useCallback((s,o)=>{if(!(!s||typeof s.sendMessage!="function"))try{if(s.isConnected&&s.isConnected()){let l=s.sendMessage(JSON.stringify({type:"presence",status:kr(o)}));l&&typeof l.catch=="function"&&l.catch(()=>{})}}catch{}},[]),Qn=React.useCallback(s=>{wr(s);try{localStorage.setItem("securebit_my_status",s)}catch{}for(let o of d.current.values())Ft(o,s)},[Ft]),[Wt,pe]=React.useState(!1),[Vt,kn]=React.useState(!1),[on,Xn]=React.useState(15),[mt,Ot]=React.useState(0),[cn,On]=React.useState(()=>Date.now()),[at,Jn]=React.useState(typeof navigator<"u"&&navigator.onLine===!1),jt=React.useRef(at);React.useEffect(()=>{jt.current=at},[at]),React.useEffect(()=>{let s=()=>Jn(!0),o=()=>Jn(!1),l=()=>{document.visibilityState==="visible"&&Jn(navigator.onLine===!1)};return window.addEventListener("offline",s),window.addEventListener("online",o),document.addEventListener("visibilitychange",l),()=>{window.removeEventListener("offline",s),window.removeEventListener("online",o),document.removeEventListener("visibilitychange",l)}},[]),React.useEffect(()=>{let s=typeof window<"u"?window.visualViewport:null,o=document.documentElement,l=-1,u="",g=()=>{let M=Math.round(s?s.height:window.innerHeight||0);M&&M!==l&&(l=M,o.style.setProperty("--sb-vh",M+"px"))},S=()=>{let U=!!s&&window.innerHeight-s.height>120?"0px":"env(safe-area-inset-bottom, 0px)";U!==u&&(u=U,o.style.setProperty("--sb-safe-bottom",U))},A=()=>{g(),S()};return A(),s&&s.addEventListener("resize",A),window.addEventListener("resize",A),window.addEventListener("orientationchange",A),()=>{s&&s.removeEventListener("resize",A),window.removeEventListener("resize",A),window.removeEventListener("orientationchange",A)}},[]);let[It,Sn]=React.useState(()=>{try{return localStorage.getItem("securebit_relay_only_mode")==="true"}catch{return!1}}),[At,Pn]=React.useState(null),[Sr,En]=React.useState(""),[Rn,_n]=React.useState(!1),[Er,Ln]=React.useState(!1);React.useEffect(()=>{let s=!1;return Us().then(o=>{s||!o||(Array.isArray(o.servers)&&o.servers.length>0&&(Pn(o.servers),En(JSON.stringify(o.servers,null,2))),o.privacyMode==="relay-only"&&Sn(!0),_n(!0))}).catch(()=>{}),()=>{s=!0}},[]),React.useEffect(()=>{let s=()=>Ln(!0);return window.addEventListener("securebit:open-network-settings",s),()=>window.removeEventListener("securebit:open-network-settings",s)},[]);let Rr=React.useCallback((s,o)=>{let l=s.useCustom&&Array.isArray(s.servers)?s.servers:null;Pn(l&&l.length?l:null),En(s.serversText||""),Sn(s.privacyMode==="relay-only"),Ln(!1),o?(_n(!0),zs({servers:l||[],privacyMode:s.privacyMode}).catch(()=>{})):Rn&&(_n(!1),$r().catch(()=>{}))},[Rn]),_r=React.useCallback(async()=>{await $r().catch(()=>{}),_n(!1),Pn(null),En("")},[]),[ln,z]=React.useState(""),[Z,Ee]=React.useState(!1),[lt,ke]=React.useState(!1),[yt,Zn]=React.useState(()=>typeof window<"u"&&!!window.Html5Qrcode);React.useEffect(()=>{if(yt)return;let s=()=>Zn(!0);return window.addEventListener("securebit:qr-ready",s),window.Html5Qrcode&&Zn(!0),()=>window.removeEventListener("securebit:qr-ready",s)},[yt]);let[qi,er]=React.useState(null),[Vo,Pt]=React.useState(0),[Cr,$t]=React.useState(null),[tr,Yi]=React.useState({status:"disconnected",hasActiveAnswer:!1,answerCreatedAt:null,isUserInitiatedDisconnect:!1}),Ki=(s,o={})=>{let{preserveAnswer:l=!1,isUserAction:u=!1}=o;Yi(g=>({...g,...s,isUserInitiatedDisconnect:u,hasActiveAnswer:l?g.hasActiveAnswer:!1,answerCreatedAt:l?g.answerCreatedAt:null}))},hs=()=>{let s=!!Fn||it&&typeof it=="string"&&it.trim().length>0,o=Le&&typeof Le=="string"&&Le.trim().length>0;return tr.hasActiveAnswer&&!tr.isUserInitiatedDisconnect||s&&!tr.isUserInitiatedDisconnect||o&&!tr.isUserInitiatedDisconnect},Ir=()=>{Ki({hasActiveAnswer:!0,answerCreatedAt:Date.now()})};React.useEffect(()=>Ls({targetWindow:window,webrtcManagerRef:ye,onClearData:Ns}),[]);let Mt=React.useCallback((s,o,l={})=>{let u=Date.now()+Math.random(),g={message:s,type:o,id:u,timestamp:typeof l.timestamp=="number"?l.timestamp:Date.now(),mid:l.mid,status:l.status,viewOnce:l.viewOnce===!0,viewOnceTtl:typeof l.viewOnceTtl=="number"?l.viewOnceTtl:15,expiresAt:typeof l.expiresAt=="number"?l.expiresAt:void 0,voice:l.voice||void 0,fileId:l.fileId||void 0};return ee(S=>{let A=[...S,g];return setTimeout(()=>{if(Cn?.current){let M=Cn.current;try{let{scrollTop:U,scrollHeight:Ae,clientHeight:Be}=M;(Ae-U-Be<100||S.length===0)&&requestAnimationFrame(()=>{M&&M.scrollTo&&M.scrollTo({top:M.scrollHeight,behavior:vr()})})}catch(U){console.warn("Scroll error:",U),M.scrollTop=M.scrollHeight}}},50),A}),u},[]),gs=React.useCallback((s,o)=>{s&&ee(l=>l.map(u=>String(u.mid)===String(s)&&u.type==="sent"?{...u,status:o}:u))},[]),ms=React.useCallback((s,o)=>{s!=null&&ee(l=>l.map(u=>String(u.id)===String(s)?{...u,...typeof o=="function"?o(u):o}:u))},[]),jo=React.useCallback((s,o)=>{s&&ee(l=>l.map(u=>u.fileId&&String(u.fileId)===String(s)?{...u,...typeof o=="function"?o(u):o}:u))},[]),Bn=React.useCallback(s=>{let o=y.current.get(s);if(!o)return;let l=d.current.get(s),u=o.outgoing;o.outgoing=[];let g=[];for(let M of u){if(!l||l.isConnected?.()!==!0){g.push(M);continue}try{let U=l.sendMessage?.(M.outText,M.meta);U&&typeof U.then=="function"&&U.then(()=>e({type:J.UPDATE_MESSAGE_STATUS,id:s,mid:M.mid,status:"delivered"})).catch(()=>e({type:J.UPDATE_MESSAGE_STATUS,id:s,mid:M.mid,status:"failed"}))}catch{g.push(M)}}g.length&&(o.outgoing=g.concat(o.outgoing));let S=o.incoming;o.incoming=[],S.length>0&&e({type:J.ADD_MESSAGE,id:s,message:ps(`Connection restored \u2014 ${S.length} message${S.length===1?"":"s"} received while you were offline.`,"notice")});let A=s===r.current&&(typeof document>"u"||document.visibilityState==="visible");for(let M of S)if(e({type:J.ADD_MESSAGE,id:s,message:ps(M.message,M.type,M.opts)}),M.opts&&M.opts.mid&&M.type==="received")if(A)try{l?.sendDeliveryReceipt?.(M.opts.mid)}catch{}else o.pendingReadAcks&&o.pendingReadAcks.push(M.opts.mid)},[]),ys=React.useCallback(()=>{for(let s of y.current.keys())Bn(s)},[Bn]);React.useEffect(()=>{at||ys()},[at,ys]),React.useEffect(()=>{let s=setInterval(()=>{for(let[o,l]of y.current.entries()){if(!l.outgoing.length&&!l.incoming.length)continue;let u=d.current.get(o);u?.isConnected?.()===!0&&u?.isReconnecting?.()!==!0&&Bn(o)}},2e3);return()=>clearInterval(s)},[Bn]);let dn=React.useCallback(async()=>{if(!window.isUpdatingSecurity){window.isUpdatingSecurity=!0;try{if(ye.current&&(er({level:"MAXIMUM",score:100,color:"green",details:a("sec.allEnabled"),passedChecks:10,totalChecks:10,isRealData:!0}),window.DEBUG_MODE)){let s=ye.current.ecdhKeyPair&&ye.current.ecdsaKeyPair?await ye.current.calculateSecurityLevel():{level:"MAXIMUM",score:100,sessionType:"premium",passedChecks:10,totalChecks:10}}}catch(s){console.error("Failed to update security level:",s),er({level:"ERROR",score:0,color:"red",details:a("sas.verificationFailed")})}finally{setTimeout(()=>{window.isUpdatingSecurity=!1},2e3)}}},[]),Cn=React.useRef(null),nr=Uo(Cn);React.useEffect(()=>{try{localStorage.setItem("securebit_relay_only_mode",String(It))}catch{}ye.current?._config?.webrtc&&ye.current._setRelayOnlyMode(It)},[It]),React.useEffect(()=>{ut.length>0&&Cn.current&&(nr(),setTimeout(nr,50),setTimeout(nr,150))},[ut]);let bs=t.order.some(s=>(t.sessions[s]?.messages||[]).some(o=>typeof o.expiresAt=="number")),xs=React.useRef(t);xs.current=t,React.useEffect(()=>{if(!bs)return;let s=l=>{let u=Date.now(),g=!1,S=l.map(A=>typeof A.expiresAt=="number"&&A.expiresAt<=u&&!A.expired?(g=!0,{...A,expired:!0,message:"",expiresAt:void 0}):A);return g?S:l},o=setInterval(()=>{let l=Date.now();On(l);let u=xs.current;for(let g of u.order)(u.sessions[g]?.messages||[]).some(A=>typeof A.expiresAt=="number"&&A.expiresAt<=l&&!A.expired)&&e({type:J.SET_MESSAGES,id:g,updater:s})},1e3);return()=>clearInterval(o)},[bs]);let vs=(s={})=>{let o=s.role||"offer",l=Jr({role:o}),u=l.id;e({type:J.CREATE_SESSION,entry:l,activate:s.activate!==!1}),y.current.set(u,{incoming:[],outgoing:[],pendingReadAcks:[]});let g=x=>{e(typeof x=="function"?{type:J.SET_MESSAGES,id:u,updater:x}:{type:J.SET_MESSAGES,id:u,messages:x})},S=(x,ue,ve={})=>{e({type:J.ADD_MESSAGE,id:u,message:ps(x,ue,ve)}),ue==="received"&&u!==r.current&&e({type:J.INCREMENT_UNREAD,id:u})},A=(x,ue)=>{x&&e({type:J.UPDATE_MESSAGE_STATUS,id:u,mid:x,status:ue})},M=(x,ue)=>{x!=null&&e({type:J.PATCH_MESSAGE,id:u,messageId:x,patch:ue})},U=(x,ue)=>{x&&e({type:J.PATCH_MESSAGE,id:u,fileId:x,patch:ue})},Ae=x=>e({type:J.SET_STATUS,id:u,status:x}),Be=x=>e({type:J.SET_FINGERPRINT,id:u,fingerprint:x}),he=x=>e({type:J.SET_VERIFICATION,id:u,code:x}),ge=x=>e({type:J.SET_SAS,id:u,sas:{isVerified:!!x}}),Et=x=>e({type:J.SET_SAS,id:u,sas:{localConfirmed:!!x}}),Qe=x=>e({type:J.SET_SAS,id:u,sas:{remoteConfirmed:!!x}}),Un=x=>e({type:J.SET_SAS,id:u,sas:{bothConfirmed:!!x}}),Qt=x=>e({type:J.PATCH_SETUP,id:u,patch:{showVerification:!!x}}),Xo=x=>e({type:J.PATCH_SETUP,id:u,patch:{showOfferStep:!!x}}),Jo=x=>e({type:J.PATCH_SETUP,id:u,patch:{showAnswerStep:!!x}}),Zo=x=>e({type:J.PATCH_SETUP,id:u,patch:{showQRCode:!!x}}),ec=x=>e({type:J.PATCH_SETUP,id:u,patch:{qrCodeUrl:x}}),tc=x=>e({type:J.PATCH_SETUP,id:u,patch:{offerData:x}}),nc=x=>e({type:J.PATCH_SETUP,id:u,patch:{answerData:x}}),rc=x=>e({type:J.PATCH_SETUP,id:u,patch:{offerInput:x}}),sc=x=>e({type:J.PATCH_SETUP,id:u,patch:{answerInput:x}}),Ta=x=>{e(typeof x=="function"?{type:J.SET_PENDING_FILES,id:u,updater:x}:{type:J.SET_PENDING_FILES,id:u,files:x})},Fs=()=>y.current.get(u)||{incoming:[],outgoing:[]},Os=(x,ue,ve)=>{if(typeof x=="string"&&x.trim().startsWith("{"))try{let _e=JSON.parse(x);if(_e.type==="presence"){let Ps=_e.data&&_e.data.status||_e.status;Ps&&e({type:J.SET_PEER_PRESENCE,id:u,presence:Ps});return}if(Vn(_e)){ht.current(u,_e);return}let ot=["file_transfer_start","file_transfer_response","file_chunk","chunk_confirmation","file_transfer_complete","file_transfer_error","heartbeat","verification","verification_response","verification_confirmed","verification_both_confirmed","peer_disconnect","key_rotation_signal","key_rotation_ready","security_upgrade","message_delete","message_receipt"];if(_e.type&&ot.includes(_e.type)){console.log(`Blocked system/file message from chat: ${_e.type}`);return}_e.type==="message"&&typeof _e.data=="string"&&(x=_e.data,_e.meta&&typeof _e.meta=="object"&&(ve=_e.meta))}catch{}let ze={};if(ve&&typeof ve=="object"&&(typeof ve.mid=="string"&&(ze.mid=ve.mid),ve.once===!0&&(ze.viewOnce=!0,ze.viewOnceTtl=Number.isFinite(ve.onceTtl)?ve.onceTtl:15),Number.isFinite(ve.ttl)&&ve.ttl>0&&(ze.expiresAt=Date.now()+ve.ttl*1e3),Number.isFinite(ve.ts)&&(ze.timestamp=ve.ts)),jt.current&&ue==="received"){Fs().incoming.push({message:x,type:ue,opts:ze});return}if(S(x,ue,ze),ze.mid&&ue==="received")if(u===r.current&&(typeof document>"u"||document.visibilityState==="visible"))try{Xt?.sendDeliveryReceipt?.(ze.mid)}catch{}else{let ot=Fs();ot.pendingReadAcks&&ot.pendingReadAcks.push(ze.mid)}},Na=x=>{let ue=w.current.get(u);if(w.current.set(u,x),Ae(x),gt.current(u,x==="connected"||x==="verified"),x!=="reconnecting"){if(x==="connected"&&ue==="reconnecting"&&Bn(u),x==="recovery_failed"){Ae("disconnected"),u===r.current&&(document.dispatchEvent(new CustomEvent("peer-disconnect")),document.dispatchEvent(new CustomEvent("disconnected"))),setTimeout(()=>{Tr.current(u)||Nr(u)},2500);return}if(x==="connected")document.dispatchEvent(new CustomEvent("new-connection")),window.isUpdatingSecurity||dn().catch(console.error);else if(x==="verifying")Qt(!0),window.isUpdatingSecurity||dn().catch(console.error);else if(x==="verified"){ge(!0),Qt(!1),Un(!0),Ae("connected"),setTimeout(()=>{ge(!0)},0);try{let ve=wn.current==="invisible"?"offline":wn.current;setTimeout(()=>{try{let ze=Xt.sendMessage?.(JSON.stringify({type:"presence",status:ve}));ze&&typeof ze.catch=="function"&&ze.catch(()=>{})}catch{}},400)}catch{}window.isUpdatingSecurity||dn().catch(console.error)}else x==="connecting"?window.isUpdatingSecurity||dn().catch(console.error):x==="disconnected"?(Ae("disconnected"),ge(!1),Qt(!1),Et(!1),Qe(!1),Un(!1),u===r.current&&document.dispatchEvent(new CustomEvent("disconnected"))):x==="peer_disconnected"&&(u===r.current&&(Pt(0),document.dispatchEvent(new CustomEvent("peer-disconnect"))),Ae("peer_disconnected"),ge(!1),Qt(!1),Et(!1),Qe(!1),Un(!1),setTimeout(()=>{Tr.current(u)||Nr(u)},2500))}},Da=x=>{Be(x===""?"":x)},Fa=x=>{x===""?(he(""),Qt(!1)):(he(x),Qt(!0))},Oa=x=>{Et(x.localConfirmed),Qe(x.remoteConfirmed),Un(x.bothConfirmed)},Pa=(x,ue)=>{x==="replay_attack"?(Pt(0),$t(null),S("\u{1F4A1} Data is outdated. Please create a new invitation or use a current response code.","system"),typeof console.clear=="function"&&console.clear()):x==="security_violation"&&(Pt(0),$t(null),S(` Security breach: ${ue}`,"system"),typeof console.clear=="function"&&console.clear())};typeof console.clear=="function"&&console.clear();let Xt=new EnhancedSecureWebRTCManager(Os,Na,Da,Fa,Pa,Oa,{webrtc:{relayOnly:It,iceServers:Array.isArray(At)&&At.length?At:Array.isArray(window.SECUREBIT_ICE_SERVERS)?window.SECUREBIT_ICE_SERVERS:void 0}});if(d.current.set(u,Xt),Xt.onMessageDelete=x=>{x&&g(ue=>ue.filter(ve=>String(ve.mid)!==String(x)))},Xt.onMessageDelivered=x=>{A(x,"read")},typeof Notification<"u"&&Notification&&Notification.permission==="granted"&&window.NotificationIntegration&&!h.current.get(u))try{let x=new window.NotificationIntegration(Xt);x.init().then(()=>{h.current.set(u,x)}).catch(ue=>{})}catch{}return Os(" SecureBit.chat Enhanced Security Edition v5.6.0 - ECDH + DTLS + SAS initialized. Ready to establish a secure connection with ECDH key exchange, DTLS fingerprint verification, and SAS authentication to prevent MITM attacks.","system"),Xt.setFileTransferCallbacks(x=>{if(x&&x.isVoice){let ue=Math.max(0,Math.min(100,x.progress||0)),ve=ze=>ze.voice?x.direction==="up"&&ue>=100?{voice:{...ze.voice,transfer:null}}:{voice:{...ze.voice,transfer:{dir:x.direction,pct:ue}}}:{};x.direction==="up"&&x.uiId!=null?M(x.uiId,ve):x.fileId&&U(x.fileId,ve);return}console.log("File progress:",x)},x=>{if(!!x.isVoice||typeof x.mimeType=="string"&&x.mimeType.startsWith("audio/")){x.getObjectURL().then(_e=>{U(x.fileId,ot=>({voice:{...ot.voice||{},url:_e,transfer:null}}))}).catch(_e=>{console.error("Voice decode failed:",_e),U(x.fileId,ot=>({voice:{...ot.voice||{},transfer:null,error:!0}}))});return}let ve=Math.max(1,Math.round((x.fileSize||0)/(1024*1024)));(async()=>{let _e=await x.getObjectURL(),ot=document.createElement("a");ot.href=_e,ot.download=x.fileName||"file",document.body.appendChild(ot),ot.click(),ot.remove(),setTimeout(()=>x.revokeObjectURL(_e),15e3)})().then(()=>{S(`File received & saved: ${x.fileName} (${ve} MB)`,"system")}).catch(_e=>{console.error("Auto-save failed:",_e),S(`File received: ${x.fileName} (${ve} MB). Open the file panel to download it.`,"system")})},x=>{console.error("File transfer error:",x),x.includes(a("err.notReady"))?S(" File transfer error: connection not ready. Try again later.","system"):x.includes(a("err.fileTooLarge"))?S(" File is too big. Maximum size: 100 MB","system"):S(` File transfer error: ${x}`,"system")},x=>{if(x&&x.isVoice){let ue=x.voice||{};S("","received",{voice:{dur:Number.isFinite(ue.dur)?ue.dur:0,bars:Array.isArray(ue.bars)?ue.bars:null,transfer:{dir:"down",pct:0},url:null},fileId:x.fileId});try{Xt.acceptIncomingFile(x.fileId)}catch{}return}Ta(ue=>ue.some(ve=>ve.fileId===x.fileId)?ue:[...ue,x])}),u},Ar=React.useRef(vs);Ar.current=vs;let Mr=React.useRef(new Set),ws=React.useCallback(s=>{for(let o of v.current.values())if(o.sessionToFp&&o.sessionToFp.has(s))return!0;return!1},[]),Tr=React.useRef(ws);Tr.current=ws;let Nr=React.useCallback(s=>{if(!(!s||Mr.current.has(s))){Mr.current.add(s);try{let o=d.current.get(s);if(o){try{o.disconnect()}catch{}d.current.delete(s)}let l=h.current.get(s);if(l){try{l.cleanup?.()}catch{}h.current.delete(s)}y.current.delete(s),w.current.delete(s),e({type:J.REMOVE_SESSION,id:s})}finally{Mr.current.delete(s)}}},[]);React.useEffect(()=>{t.order.length===0&&Ar.current({role:"offer"})},[t.order.length]);let[rr,ks]=React.useState(()=>{try{return localStorage.getItem("securebit_sidebar_collapsed")==="true"}catch{return!1}});React.useEffect(()=>{try{localStorage.setItem("securebit_sidebar_collapsed",String(rr))}catch{}},[rr]);let[Ss,qt]=React.useState(!1),Qi=React.useCallback(s=>{e({type:J.SET_ACTIVE,id:s}),e({type:J.CLEAR_UNREAD,id:s}),qt(!1)},[]),Xi=React.useCallback(()=>{p({type:fe.SET_ACTIVE_GROUP,id:null}),Ar.current({role:"offer"}),qt(!1)},[]),Ji=React.useCallback((s,o)=>{e({type:J.RENAME,id:s,label:o})},[]),Es=React.useCallback(s=>{let o=me.current.get(s);if(o){me.current.delete(s);try{o.manager.disconnect()}catch{}}},[]),pn=React.useRef(Es);pn.current=Es;let Rs=React.useCallback((s,o)=>{let l="mesh:"+Array.from(crypto.getRandomValues(new Uint8Array(8))).map(U=>U.toString(16).padStart(2,"0")).join(""),u={manager:null,gid:s,fp:o,sessionId:l},g=U=>{if(typeof U!="string"||!U.trim().startsWith("{"))return;let Ae;try{Ae=JSON.parse(U)}catch{return}Vn(Ae)&&ht.current(l,Ae)},S=U=>{let Ae=U==="disconnected"||U==="failed"||U==="peer_disconnected"||U==="recovery_failed";if(gt.current(l,!Ae&&u.manager?.isVerified===!0),U==="recovery_failed"||U==="failed"){let Be=v.current.get(s);try{Be?.unbindSession(o)}catch{}pn.current(l)}},A=U=>{if(!(!U||!u.manager))try{u.manager.markGroupLinkVerified(`group:${s}`)}catch{pn.current(l),gt.current(l,!1)}},M=new EnhancedSecureWebRTCManager(g,S,()=>{},A,()=>{},()=>{},{emitGlobalEvents:!1,webrtc:{relayOnly:It,iceServers:Array.isArray(At)&&At.length?At:Array.isArray(window.SECUREBIT_ICE_SERVERS)?window.SECUREBIT_ICE_SERVERS:void 0}});return u.manager=M,me.current.set(l,u),u},[It,At]),Dr=React.useRef(Rs);Dr.current=Rs;let _s=React.useCallback(s=>({createOffer:async o=>{let l=Dr.current(s,o);try{let u=await l.manager.createSecureOffer();if(!u||typeof u.sbq2!="string")throw new Error("mesh dial needs a compact descriptor");return{sessionId:l.sessionId,descriptor:u.sbq2}}catch(u){throw pn.current(l.sessionId),u}},createAnswer:async(o,l)=>{let u=Dr.current(s,o);try{let g=await u.manager.createSecureAnswer({t:"offer",sbq2:l});if(!g||typeof g.sbq2!="string")throw new Error("mesh answer needs a compact descriptor");return{sessionId:u.sessionId,descriptor:g.sbq2}}catch(g){throw pn.current(u.sessionId),g}},acceptAnswer:async(o,l)=>{let u=me.current.get(o);if(!u)throw new Error("that mesh dial is no longer open");await u.manager.handleSecureAnswer({t:"answer",sbq2:l})},close:o=>pn.current(o),linkFingerprint:o=>{let l=d.current.get(o)||me.current.get(o)?.manager||null;return!l||l.isVerified!==!0?"":typeof l.keyFingerprint=="string"?l.keyFingerprint:""}}),[]);React.useEffect(()=>{for(let[s,o]of v.current){let l=k.groups[s];if(!(!l||l.phase!==K.READY||!l.sasConfirmed))for(let u of t.order){let g=t.sessions[u];!g||!g.sas.isVerified||o.probeSession(u).catch(()=>{})}}},[k,t]);let Fr=React.useMemo(()=>t.order.map(s=>t.sessions[s]).filter(s=>s&&s.sas&&s.sas.isVerified).map(s=>({id:s.id,name:s.peerLabel,mono:dr(s.peerLabel)})),[t]),Zi=React.useCallback(s=>{p({type:fe.SET_ACTIVE_GROUP,id:s}),p({type:fe.CLEAR_UNREAD,id:s}),qt(!1)},[]),ea=React.useCallback(async({name:s,sessionIds:o})=>{le(!1);let l=Tn.newId(),u=new Tn({groupId:l,name:s,isAdmin:!0,subtle:crypto.subtle,send:Ze,emit:Ye(l),mesh:_s(l)});v.current.set(l,u);try{await u.init(),p({type:fe.CREATE_GROUP,entry:ur({id:l,name:s,selfFp:u.selfFp,adminFp:u.selfFp,isAdmin:!0,members:u._memberSnapshot()})}),await u.invite(o.map(g=>({sessionId:g,name:t.sessions[g]?.peerLabel||"Member"})))}catch(g){v.current.delete(l);try{u.destroy()}catch{}p({type:fe.REMOVE_GROUP,id:l}),P(g?.code==="invitations_could_not_be_sent"?a("err.inviteNotConnectedRetry"):`The group could not be created (${g?.code||"unknown error"}).`)}},[Ze,Ye,t]),ta=React.useCallback(async()=>{let s=F;if(!s)return;V(null);let o=new Tn({groupId:s.gid,name:s.name,isAdmin:!1,subtle:crypto.subtle,send:Ze,emit:Ye(s.gid),mesh:_s(s.gid)});v.current.set(s.gid,o);try{await o.init(),p({type:fe.CREATE_GROUP,entry:ur({id:s.gid,name:s.name,selfFp:o.selfFp})}),await o.acceptInvite(s.sessionId,s.frame)}catch(l){v.current.delete(s.gid);try{o.destroy()}catch{}p({type:fe.SET_ERROR,id:s.gid,error:l?.code||"join_failed"})}},[F,Ze,Ye]),na=React.useCallback(()=>{let s=B.current,o=s&&v.current.get(s);if(o)try{o.confirmSas(),C(!1)}catch(l){p({type:fe.SET_ERROR,id:s,error:l?.code||"confirm_failed"})}},[]),sr=React.useCallback((s,{announce:o=!0}={})=>{let l=v.current.get(s),u=j.current.get(s);u&&(j.current.delete(s),u.leave().catch(()=>{})),ie(g=>{let S={...g};return delete S[s],S}),L(g=>{let S={...g};return delete S[s],S}),v.current.delete(s),Oe.current.delete(s),p({type:fe.REMOVE_GROUP,id:s}),C(!1),l&&(o?Promise.resolve().then(()=>l.leave()).catch(()=>{}):Promise.resolve()).then(()=>{try{l.destroy()}catch{}})},[]),Cs=React.useRef(sr);Cs.current=sr;let ra=React.useCallback(async s=>{let o=B.current,l=o&&v.current.get(o);if(!l)return;let u=String(s||"").trim();if(u){ae("");try{let{unreachable:g}=await l.sendText(u);p({type:fe.ADD_MESSAGE,id:o,message:Se(u,"sent")});let S=g.map(A=>A.fp).sort().join(",");if(S!==(Oe.current.get(o)||"")&&(Oe.current.set(o,S),g.length>0)){let A=g.map(U=>U.name),M=A.length===1?`${A[0]} is`:`${A.slice(0,-1).join(", ")} and ${A[A.length-1]} are`;p({type:fe.ADD_MESSAGE,id:o,message:Se(`${M} offline and will not receive messages until they reconnect.`,"system")})}}catch(g){p({type:fe.ADD_MESSAGE,id:o,message:Se(`Could not send: ${g?.message||"unknown error"}`,"system")})}}},[]),sa=React.useMemo(()=>{if(!I)return[];let s=new Set(I.members.map(o=>o.sessionId).filter(Boolean));return Fr.filter(o=>!s.has(o.id))},[I,Fr]),ia=React.useCallback(async s=>{X(!1);let o=B.current,l=o&&v.current.get(o);if(l)try{await l.addMembers(s.map(u=>({sessionId:u,name:t.sessions[u]?.peerLabel||"Member"})))}catch(u){P(u?.code==="invitations_could_not_be_sent"?a("err.inviteNotConnected"):u?.code==="too_many_members"?`A group is limited to ${N.MAX_MEMBERS} members.`:`Could not invite (${u?.code||"unknown error"}).`)}},[t]),aa=React.useCallback(async s=>{let o=B.current,l=o&&v.current.get(o);if(l)try{await l.removeMember(s)}catch(u){p({type:fe.SET_ERROR,id:o,error:u?.code||"remove_failed"})}},[]),Is=React.useCallback((s,o)=>{let l=j.current.get(s);if(!l)return;let u=v.current.get(s),g=o!==null?o:u?.getCallSnapshot?.()||null;if(!g||!g.joined||g.callId!==l.callId){j.current.delete(s),l.leave().catch(()=>{}),L(S=>{let A={...S};return delete A[s],A});return}l.setPeers(g.participants)},[]),Or=React.useRef(Is);Or.current=Is;let ir=React.useCallback(async(s,o)=>{let l=j.current.get(s);if(l&&l.callId===o.callId)return l.setPeers(o.participants),l;l&&(j.current.delete(s),await l.leave().catch(()=>{}));let u=new yr({getManager:g=>d.current.get(g)||me.current.get(g)?.manager||null,onChange:g=>{L(S=>({...S,[s]:g}))}});return j.current.set(s,u),await u.join({callId:o.callId,selfFp:k.groups[s]?.selfFp||v.current.get(s)?.selfFp||"",withVideo:o.withVideo,peers:[]}),u},[k]),oa=React.useCallback(async s=>{let o=B.current,l=o&&v.current.get(o);if(l)try{await l.startCall({withVideo:s,prepare:u=>ir(o,u)})}catch(u){let g=j.current.get(o);g&&(j.current.delete(o),g.leave().catch(()=>{}));let S=u?.code||"media_failed";p({type:fe.ADD_MESSAGE,id:o,message:Se(S==="call_in_progress"?a("groupCall.err.call_in_progress"):S==="not_ready"?a("groupCall.err.not_ready"):a(`groupCall.err.${Yn(u)}`),"system")})}},[ir]),ca=React.useCallback(async()=>{let s=B.current,o=s&&v.current.get(s),l=o?.getCallSnapshot?.();if(!(!o||!l))try{let u=await ir(s,{...l,joined:!0});await o.joinCall(),u.setPeers(o.getCallSnapshot()?.participants||[])}catch(u){let g=j.current.get(s);g&&(j.current.delete(s),g.leave().catch(()=>{})),p({type:fe.ADD_MESSAGE,id:s,message:Se(a(`groupCall.err.${Yn(u)}`),"system")})}},[ir]),la=React.useCallback(()=>{let s=B.current,o=s&&v.current.get(s)?.getCallSnapshot?.();o&&Ie(l=>({...l,[s]:o.callId}))},[]),da=React.useCallback(async()=>{let s=B.current;if(!s)return;let o=j.current.get(s);o&&(j.current.delete(s),L(l=>{let u={...l};return delete u[s],u}),await o.leave().catch(()=>{}));try{await v.current.get(s)?.leaveCall()}catch{}},[]),In=React.useCallback(()=>B.current?j.current.get(B.current):null,[]),pa=React.useCallback(()=>{In()?.toggleMic()},[In]),ua=React.useCallback(()=>{In()?.toggleCamera()},[In]),fa=React.useCallback(()=>{In()?.flipCamera()},[In]);React.useEffect(()=>{m&&p({type:fe.CLEAR_UNREAD,id:m})},[m]),React.useEffect(()=>{let s=H.current;s&&(s.scrollTop=s.scrollHeight)},[I&&I.messages.length]),React.useEffect(()=>()=>{for(let s of j.current.values())s.leave().catch(()=>{});j.current.clear();for(let s of v.current.values())try{s.destroy()}catch{}v.current.clear();for(let s of[...me.current.keys()])pn.current(s)},[]);let Pr=React.useCallback(s=>{if(!s)return;let o=y.current.get(s),l=d.current.get(s);if(!o||!l||!o.pendingReadAcks||o.pendingReadAcks.length===0)return;let u=o.pendingReadAcks;o.pendingReadAcks=[];for(let g of u)try{l.sendDeliveryReceipt?.(g)}catch{}},[]);React.useEffect(()=>{n&&(e({type:J.CLEAR_UNREAD,id:n}),(typeof document>"u"||document.visibilityState==="visible")&&Pr(n))},[n,Pr]);let As=React.useRef(!1);React.useEffect(()=>{if(As.current)return;As.current=!0;let s=!1,o=null,l=g=>{if(g.type==="beforeunload"&&!s)for(let S of d.current.values())try{if(S.isConnected&&S.isConnected()){try{S.sendSystemMessage({type:"peer_disconnect",reason:"user_disconnect",timestamp:Date.now()})}catch{}setTimeout(()=>{try{S.disconnect()}catch{}},100)}else S.disconnect()}catch{}else s&&(g.preventDefault(),g.returnValue="")},u=()=>{document.visibilityState==="hidden"?(s=!0,o&&clearTimeout(o),o=setTimeout(()=>{s=!1},5e3)):document.visibilityState==="visible"&&(s=!1,o&&(clearTimeout(o),o=null),Pr(r.current))};return window.addEventListener("beforeunload",l),document.addEventListener("visibilitychange",u),()=>{window.removeEventListener("beforeunload",l),document.removeEventListener("visibilitychange",u),o&&(clearTimeout(o),o=null);for(let g of d.current.values())try{g.disconnect()}catch{}d.current.clear();for(let g of h.current.values())try{g.cleanup?.()}catch{}h.current.clear(),y.current.clear(),w.current.clear()}},[]);let $o=s=>{try{let o=typeof s=="string"?JSON.parse(s):s,l={type:o.type,version:o.version,timestamp:o.timestamp,sessionId:o.sessionId,connectionId:o.connectionId,verificationCode:o.verificationCode,salt:o.salt,keyFingerprints:o.keyFingerprints,fullDataAvailable:!0,compressionLevel:"minimal"};return JSON.stringify(l)}catch(o){return console.error("Error compressing offer data:",o),s}},qo=s=>({type:"enhanced_secure_offer_template",version:"4.0",sessionId:s.sessionId,connectionId:s.connectionId,verificationCode:s.verificationCode,timestamp:s.timestamp,keyFingerprints:s.keyFingerprints,authChallenge:s?.authChallenge?.challenge,capabilities:Array.isArray(s.capabilities)&&s.capabilities.length<=5?s.capabilities:void 0}),ha=800,Yo=400,[Lr,dt]=React.useState(0),[ga,We]=React.useState(0),[zn,Yt]=React.useState(!1),T=React.useRef({timer:null,chunks:[],idx:0,active:!1});React.useEffect(()=>()=>{try{T.current&&T.current.timer&&(clearInterval(T.current.timer),T.current.timer=null)}catch{}},[n]);let Ko=()=>{try{T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:[],idx:0,active:!1},We(0),dt(0),Yt(!1)},Br=async()=>{let{chunks:s,idx:o}=T.current||{};if(!s||!s.length)return;let l=s[o%s.length];try{let g=typeof window<"u"&&(window.innerWidth||0)>=1024?720:512,S=await(window.generateQRCode?window.generateQRCode(l,{errorCorrectionLevel:"M",margin:2,size:g}):Promise.resolve(""));S&&Ke(S)}catch(u){console.warn("Animated QR render error (current):",u)}We((T.current?.idx||0)%(T.current?.chunks?.length||1)+1)},An=async()=>{await Br();let s=T.current?.chunks?.length||0;if(s>0){let o=((T.current?.idx||0)+1)%s;T.current.idx=o,We(o+1)}},ma=()=>{let s=!zn;Yt(s),s?(T.current.timer&&(clearInterval(T.current.timer),T.current.timer=null),console.log("QR Manual mode enabled - auto-scroll stopped")):(T.current.chunks.length>1&&(T.current.active=!0,clearInterval(T.current.timer),T.current.timer=setInterval(An,3e3)),console.log("QR Manual mode disabled - auto-scroll resumed"))},ya=async()=>{if(console.log("\u{1F3AE} nextQrFrame called, qrFramesTotal:",Lr,"qrAnimationRef.current:",T.current),T.current.chunks.length>1){let s=(T.current.idx+1)%T.current.chunks.length;T.current.idx=s,We(s+1),console.log("\u{1F3AE} Next frame index:",s+1);try{clearInterval(T.current.timer)}catch{}T.current.timer=null,await Br(),!zn&&T.current.chunks.length>1?(T.current.active=!0,T.current.timer=setInterval(An,3e3)):T.current.active=!1}else console.log("\u{1F3AE} No multiple frames to navigate")},ba=async()=>{if(console.log("\u{1F3AE} prevQrFrame called, qrFramesTotal:",Lr,"qrAnimationRef.current:",T.current),T.current.chunks.length>1){let s=(T.current.idx-1+T.current.chunks.length)%T.current.chunks.length;T.current.idx=s,We(s+1),console.log("\u{1F3AE} Previous frame index:",s+1);try{clearInterval(T.current.timer)}catch{}T.current.timer=null,await Br(),!zn&&T.current.chunks.length>1?(T.current.active=!0,T.current.timer=setInterval(An,3e3)):T.current.active=!1}else console.log("\u{1F3AE} No multiple frames to navigate")},G=React.useRef({id:null,total:0,seen:new Set,items:[]}),Ms=async s=>{try{let o=typeof s=="string"?s.length:JSON.stringify(s).length,u=typeof window<"u"&&(window.innerWidth||0)>=1024?720:512;if(typeof window.generateBinaryQRCodeFromObject=="function")try{let he=typeof s=="string"?JSON.parse(s):s,ge=await window.generateBinaryQRCodeFromObject(he,{errorCorrectionLevel:"M",size:u,margin:2});if(ge){try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:[],idx:0,active:!1},We(0),dt(0),Yt(!1),Ke(ge),dt(1),We(1);return}}catch(he){console.warn("Binary QR generation failed, falling back to compressed:",he?.message||he)}if(typeof window.generateCompressedQRCode=="function")try{let he=typeof s=="string"?s:JSON.stringify(s),ge=await window.generateCompressedQRCode(he,{errorCorrectionLevel:"M",size:u,margin:2});if(ge){try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:[],idx:0,active:!1},We(0),dt(0),Yt(!1),Ke(ge),dt(1),We(1);return}}catch(he){console.warn("Compressed QR generation failed, falling back to plain:",he?.message||he)}let g=typeof s=="string"?s:JSON.stringify(s);if(g.length<=ha){if(!window.generateQRCode)throw new Error("QR code generator unavailable");try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:[],idx:0,active:!1},We(0),dt(0),Yt(!1);let he=await window.generateQRCode(g,{errorCorrectionLevel:"M",size:u,margin:2});Ke(he),dt(1),We(1);return}try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:[],idx:0,active:!1},We(0),dt(0),Yt(!1);let S=`raw_${Date.now()}_${Math.random().toString(36).slice(2)}`,M=Math.max(200,Math.floor(g.length/10)),U=Math.ceil(g.length/M),Ae=[];for(let he=0;he<U;he++){let ge=he+1,Et=g.slice(he*M,(he+1)*M);Ae.push(JSON.stringify({hdr:{v:1,id:S,seq:ge,total:U,rt:"raw"},body:Et}))}if(!window.generateQRCode)throw new Error("QR code generator unavailable");if(Ae.length===1){let he=await window.generateQRCode(Ae[0],{errorCorrectionLevel:"M",margin:2,size:u});Ke(he),dt(1),We(1);return}T.current.chunks=Ae,T.current.idx=0,T.current.active=!0,dt(Ae.length),We(1);let Be={errorCorrectionLevel:"M",margin:2,size:u};await renderNext(),zn||(T.current.active=!0,T.current.timer=setInterval(An,4e3));return}catch(o){console.error("QR code generation failed:",o),ee(l=>[...l,{message:` QR code generation failed: ${o.message}`,type:"error"}])}},xa=s=>({type:"enhanced_secure_offer",version:s.version,timestamp:s.timestamp,sessionId:s.sessionId,connectionId:s.connectionId,verificationCode:s.verificationCode,salt:s.salt,sdp:s.sdp,keyFingerprints:s.keyFingerprints,capabilities:s.capabilities,ecdhPublicKey:{keyType:"ECDH",keyData:s.ecdhKeyData,timestamp:s.timestamp-1e3,version:s.version,signature:s.ecdhSignature},ecdsaPublicKey:{keyType:"ECDSA",keyData:s.ecdsaKeyData,timestamp:s.timestamp-999,version:s.version,signature:s.ecdsaSignature},authChallenge:{challenge:s.authChallenge,timestamp:s.timestamp,nonce:s.authNonce,version:s.version},securityLevel:{level:"CRITICAL",score:20,color:"red",verificationResults:{encryption:{passed:!1,details:"Encryption not working",points:0},keyExchange:{passed:!0,details:"Simple key exchange verified",points:15},messageIntegrity:{passed:!1,details:"Message integrity failed",points:0},rateLimiting:{passed:!0,details:"Rate limiting active",points:5},ecdsa:{passed:!1,details:"Enhanced session required - feature not available",points:0},metadataProtection:{passed:!1,details:"Enhanced session required - feature not available",points:0},pfs:{passed:!1,details:"Enhanced session required - feature not available",points:0},nestedEncryption:{passed:!1,details:"Enhanced session required - feature not available",points:0},packetPadding:{passed:!1,details:"Enhanced session required - feature not available",points:0},advancedFeatures:{passed:!1,details:"Premium session required - feature not available",points:0}},timestamp:s.timestamp,details:"Real verification: 20/100 security checks passed (2/4 available)",isRealData:!0,passedChecks:2,totalChecks:4,sessionType:"demo",maxPossibleScore:50}}),va=async s=>{try{if(console.log("QR Code scanned:",s.substring(0,100)+"..."),console.log("Current buffer state:",G.current),s.startsWith("SB2:")||s.charCodeAt(0)===2)return G.current={id:null,total:0,seen:new Set,items:[]},we?Fe(s):f(s),ee(l=>[...l,{message:a("flow.invitationCaptured"),type:"success"}]),ke(!1),Promise.resolve(!0);if(s.startsWith("SB1:bin:")||G.current&&G.current.id){console.log("Binary chunk detected:",s.substring(0,50)+"..."),G.current.id||(console.log("Initializing buffer for binary chunks"),G.current={id:`bin_${Date.now()}`,total:4,seen:new Set,items:[],lastUpdateMs:Date.now()});let l=s.substring(0,50);if(G.current.seen.has(l))return console.log("Chunk already scanned, ignoring..."),Promise.resolve(!1);G.current.seen.add(l),G.current.items.push(s),G.current.lastUpdateMs=Date.now();try{let g=G.current.seen.size;document.dispatchEvent(new CustomEvent("qr-scan-progress",{detail:{id:G.current.id,seq:g,total:G.current.total}})),dt(G.current.total),We(g)}catch{}let u=G.current.seen.size>=G.current.total;if(console.log(`Chunks collected: ${G.current.seen.size}/${G.current.total}, complete: ${u}`),!u)return console.log(`Scanned chunk ${G.current.seen.size}/${G.current.total}, waiting for more...`),Promise.resolve(!1);try{let g=G.current.items.join("");return we?Fe(g):f(g),ee(S=>[...S,{message:"All binary chunks captured. Payload reconstructed.",type:"success"}]),G.current={id:null,total:0,seen:new Set,items:[]},ke(!1),Promise.resolve(!0)}catch(g){return console.warn("Binary chunks reconstruction failed:",g),Promise.resolve(!1)}}if(s.length>100&&!s.startsWith("{")&&!s.startsWith("[")){console.log("Detected potential binary chunk (long non-JSON string):",s.substring(0,50)+"..."),G.current.id||(console.log("Initializing buffer for potential binary chunks"),G.current={id:`bin_${Date.now()}`,total:4,seen:new Set,items:[],lastUpdateMs:Date.now()});let l=s.substring(0,50);if(G.current.seen.has(l))return console.log("Chunk already scanned, ignoring..."),Promise.resolve(!1);G.current.seen.add(l),G.current.items.push(s),G.current.lastUpdateMs=Date.now();try{let g=G.current.seen.size;document.dispatchEvent(new CustomEvent("qr-scan-progress",{detail:{id:G.current.id,seq:g,total:G.current.total}})),dt(G.current.total),We(g)}catch{}let u=G.current.seen.size>=G.current.total;if(console.log(`Chunks collected: ${G.current.seen.size}/${G.current.total}, complete: ${u}`),!u)return console.log(`Scanned chunk ${G.current.seen.size}/${G.current.total}, waiting for more...`),Promise.resolve(!1);try{let g=G.current.items.join("");return we?Fe(g):f(g),ee(S=>[...S,{message:"All binary chunks captured. Payload reconstructed.",type:"success"}]),G.current={id:null,total:0,seen:new Set,items:[]},ke(!1),Promise.resolve(!0)}catch(g){return console.warn("Binary chunks reconstruction failed:",g),Promise.resolve(!1)}}let o;if(typeof window.decodeAnyPayload=="function"){let l=window.decodeAnyPayload(s);typeof l=="string"?o=JSON.parse(l):o=l}else{let l=typeof window.decompressIfNeeded=="function"?window.decompressIfNeeded(s):s;o=JSON.parse(l)}if(console.log("Decoded data:",o),o.hdr&&o.body){let{hdr:l}=o;if(!G.current.id||G.current.id!==l.id){G.current={id:l.id,total:l.total||1,seen:new Set,items:[],lastUpdateMs:Date.now()};try{document.dispatchEvent(new CustomEvent("qr-scan-progress",{detail:{id:l.id,seq:0,total:l.total||1}}))}catch{}}G.current.seen.has(l.seq)||(G.current.seen.add(l.seq),G.current.items.push(s),G.current.lastUpdateMs=Date.now());try{let g=G.current.seen.size;document.dispatchEvent(new CustomEvent("qr-scan-progress",{detail:{id:l.id,seq:g,total:G.current.total||l.total||0}}))}catch{}if(!(G.current.seen.size>=(G.current.total||1)))return Promise.resolve(!1);if(l.rt==="raw")try{let S=G.current.items.map(M=>JSON.parse(M)).sort((M,U)=>(M.hdr.seq||0)-(U.hdr.seq||0)).map(M=>M.body||"").join(""),A=JSON.parse(S);we?Fe(JSON.stringify(A,null,2)):f(JSON.stringify(A,null,2)),ee(M=>[...M,{message:"All frames captured. RAW payload reconstructed.",type:"success"}]);try{document.dispatchEvent(new CustomEvent("qr-scan-complete",{detail:{id:l.id}}))}catch{}return G.current={id:null,total:0,seen:new Set,items:[]},ke(!1),Promise.resolve(!0)}catch(g){return console.warn("RAW multi-frame reconstruction failed:",g),Promise.resolve(!1)}else if(l.rt==="bin")try{let S=G.current.items.map(M=>JSON.parse(M)).sort((M,U)=>(M.hdr.seq||0)-(U.hdr.seq||0)).map(M=>M.body||"").join(""),A;if(typeof window.decodeAnyPayload=="function"){let M=window.decodeAnyPayload(S);A=typeof M=="string"?JSON.parse(M):M}else A=JSON.parse(S);we?Fe(JSON.stringify(A,null,2)):f(JSON.stringify(A,null,2)),ee(M=>[...M,{message:"All frames captured. BIN payload reconstructed.",type:"success"}]);try{document.dispatchEvent(new CustomEvent("qr-scan-complete",{detail:{id:l.id}}))}catch{}return G.current={id:null,total:0,seen:new Set,items:[]},ke(!1),Promise.resolve(!0)}catch(g){return console.warn("BIN multi-frame reconstruction failed:",g),Promise.resolve(!1)}else if(window.receiveAndProcess){try{let g=await window.receiveAndProcess(G.current.items);if(g.length>0){let{payloadObj:S}=g[0];we?Fe(JSON.stringify(S,null,2)):f(JSON.stringify(S,null,2)),ee(A=>[...A,{message:"All frames captured. COSE payload reconstructed.",type:"success"}]);try{document.dispatchEvent(new CustomEvent("qr-scan-complete",{detail:{id:l.id}}))}catch{}return G.current={id:null,total:0,seen:new Set,items:[]},ke(!1),Promise.resolve(!0)}}catch(g){console.warn("COSE multi-chunk processing failed:",g)}return Promise.resolve(!1)}else return Promise.resolve(!1)}if(o.type==="enhanced_secure_offer_template"){console.log("QR scan: Template-based offer detected, reconstructing...");let l=xa(o);return we?(Fe(JSON.stringify(l,null,2)),console.log("\u{1F4F1} Template data populated to answerInput (waiting for response mode)")):(f(JSON.stringify(l,null,2)),console.log("\u{1F4F1} Template data populated to offerInput (paste invitation mode)")),ee(u=>[...u,{message:"\u{1F4F1} QR code scanned successfully! Full offer reconstructed from template.",type:"success"}]),ke(!1),!0}else return o.type==="secure_offer_reference"?(ee(l=>[...l,{message:a("err.retiredQr"),type:"error"}]),!1):(!o.sdp&&o.type==="enhanced_secure_offer"&&ee(l=>[...l,{message:a("err.compressedQrNote"),type:"warning"}]),we?(console.log("QR scan: Populating answerInput with:",o),Fe(JSON.stringify(o,null,2))):(console.log("QR scan: Populating offerInput with:",o),f(JSON.stringify(o,null,2))),ee(l=>[...l,{message:"\u{1F4F1} QR code scanned successfully!",type:"success"}]),ke(!1),!0)}catch{return we?Fe(s):f(s),ee(l=>[...l,{message:"\u{1F4F1} QR code scanned successfully!",type:"success"}]),ke(!1),!0}},Ts=async()=>{try{vn(!0),Gt(""),Ge(!1),xe(!1),Ke("");let s=await ye.current.createSecureOffer();Gt(s),Ge(!0);let o=typeof s=="object"?JSON.stringify(s):s;try{if(typeof window.encodeBinaryToPrefixed=="function"){let u=window.encodeBinaryToPrefixed(o),g=4,S=g,A=Math.max(200,Math.ceil(u.length/g));A<=0&&(A=200),u.length<=A?(S=1,A=u.length):(A=Math.ceil(u.length/g),S=g);let M=`bin_${Date.now()}_${Math.random().toString(36).slice(2)}`,U=[];for(let ge=0;ge<S;ge++){let Et=ge+1,Qe=u.slice(ge*A,(ge+1)*A);U.push(Qe)}let Be=typeof window<"u"&&(window.innerWidth||0)>=1024?720:512;if(window.generateQRCode&&U.length>0){let ge=await window.generateQRCode(U[0],{errorCorrectionLevel:"M",size:Be,margin:2});ge&&Ke(ge)}try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:U,idx:0,active:!0},dt(U.length),We(1),Yt(!1);let he=3e3;T.current.timer=setInterval(An,he);try{xe(!0)}catch{}}else{await Ms(s);try{xe(!0)}catch{}}}catch(u){console.warn("Offer QR generation failed:",u)}ut.filter(u=>u.type==="system"&&(u.message.includes(a("flow.invitationCreated"))||u.message.includes(a("flow.sendEncryptedCode")))).length===0&&(ee(u=>[...u,{message:a("flow.invitationCreatedBang"),type:"system",id:Date.now(),timestamp:Date.now()}]),ee(u=>[...u,{message:a("flow.sendInvitation"),type:"system",id:Date.now(),timestamp:Date.now()}])),window.isUpdatingSecurity||dn().catch(console.error)}catch(s){ee(o=>[...o,{message:`Error creating invitation: ${s.message}`,type:"system",id:Date.now(),timestamp:Date.now()}])}finally{vn(!1)}},wa=async()=>{try{if(!wt.trim()){ee(s=>[...s,{message:a("err.needInvitation"),type:"system",id:Date.now(),timestamp:Date.now()}]);return}try{ee(S=>[...S,{message:a("flow.processingInvitation"),type:"system",id:Date.now(),timestamp:Date.now()}]);let s;try{if(typeof window.decodeAnyPayload=="function"){let S=window.decodeAnyPayload(wt.trim());s=typeof S=="string"?JSON.parse(S):S}else{let S=typeof window.decompressIfNeeded=="function"?window.decompressIfNeeded(wt.trim()):wt.trim();s=JSON.parse(S)}}catch(S){throw new Error(`Invalid invitation format: ${S.message}`)}if(!s||typeof s!="object")throw new Error("The invitation must be an object");if(!(s.t==="offer"||s.type==="enhanced_secure_offer"))throw new Error("Invalid invitation type. Expected offer or enhanced_secure_offer");let l=await ye.current.createSecureAnswer(s);rn(l),Ht(!0);let u=typeof l=="object"?JSON.stringify(l):l;try{if(typeof window.encodeBinaryToPrefixed=="function"){let S=window.encodeBinaryToPrefixed(u),A=4,M=A,U=Math.max(200,Math.ceil(S.length/A));U<=0&&(U=200),S.length<=U?(M=1,U=S.length):(U=Math.ceil(S.length/A),M=A);let Ae=`ans_${Date.now()}_${Math.random().toString(36).slice(2)}`,Be=[];for(let Qe=0;Qe<M;Qe++){let Un=Qe+1,Qt=S.slice(Qe*U,(Qe+1)*U);Be.push(Qt)}let ge=typeof window<"u"&&(window.innerWidth||0)>=1024?720:512;if(window.generateQRCode&&Be.length>0){let Qe=await window.generateQRCode(Be[0],{errorCorrectionLevel:"M",size:ge,margin:2});Qe&&Ke(Qe)}try{T.current&&T.current.timer&&clearInterval(T.current.timer)}catch{}T.current={timer:null,chunks:Be,idx:0,active:!0},dt(Be.length),We(1),Yt(!1);let Et=3e3;T.current.timer=setInterval(An,Et);try{xe(!0)}catch{}}else{await Ms(l);try{xe(!0)}catch{}}}catch(S){console.warn("Answer QR generation failed:",S)}typeof Ir=="function"&&Ir(),ut.filter(S=>S.type==="system"&&(S.message.includes(a("flow.responseCreated"))||S.message.includes(a("flow.sendTheResponse")))).length===0&&(ee(S=>[...S,{message:a("flow.responseCreatedBang"),type:"system",id:Date.now(),timestamp:Date.now()}]),ee(S=>[...S,{message:a("flow.sendResponse"),type:"system",id:Date.now(),timestamp:Date.now()}])),window.isUpdatingSecurity||dn().catch(console.error)}catch(s){console.error("Error in handleCreateAnswer:",s),ee(o=>[...o,{message:`Error processing the invitation: ${s.message}`,type:"system",id:Date.now(),timestamp:Date.now()}])}}catch(s){console.error("Error in handleCreateAnswer:",s),ee(o=>[...o,{message:`Invitation processing error: ${s.message}`,type:"system",id:Date.now(),timestamp:Date.now()}])}},ka=async()=>{try{if(!it.trim()){ee(s=>[...s,{message:a("err.needResponse"),type:"system",id:Date.now(),timestamp:Date.now()}]);return}try{ee(l=>[...l,{message:a("flow.processingResponse"),type:"system",id:Date.now(),timestamp:Date.now()}]);let s;try{if(typeof window.decodeAnyPayload=="function"){let l=window.decodeAnyPayload(it.trim());s=typeof l=="string"?JSON.parse(l):l}else{let l=typeof window.decompressIfNeeded=="function"?window.decompressIfNeeded(it.trim()):it.trim();s=JSON.parse(l)}}catch(l){throw new Error(`Invalid response format: ${l.message}`)}if(!s||typeof s!="object")throw new Error("The response must be an object");let o=s.t||s.type;if(!o||o!=="answer"&&o!=="enhanced_secure_answer")throw new Error("Invalid response type. Expected answer or enhanced_secure_answer");await ye.current.handleSecureAnswer(s),Cr&&($t(null),ee(l=>[...l,{message:"All security features enabled by default",type:"system",id:Date.now(),timestamp:Date.now()}])),ee(l=>[...l,{message:a("flow.finalizing"),type:"system",id:Date.now(),timestamp:Date.now()}]),window.isUpdatingSecurity||dn().catch(console.error)}catch(s){console.error("Error in handleConnect inner try:",s);let o=a("err.setupError");s.message.includes("CRITICAL SECURITY FAILURE")?s.message.includes("ECDH public key structure")?o=a("err.responseNoKey"):s.message.includes("ECDSA public key structure")?o=a("err.responseNoSignKey"):o=a("err.securityValidation"):s.message.includes("too old")||s.message.includes("replay")?o=a("err.responseOutdated"):s.message.includes("MITM")||s.message.includes("signature")?o=a("err.securityBreach"):s.message.includes("Invalid")||s.message.includes("format")?o=a("err.responseFormat"):o=` ${s.message}`,ee(l=>[...l,{message:o,type:"system",id:Date.now(),timestamp:Date.now(),showRetryButton:!0}]),!s.message.includes("too old")&&!s.message.includes("replay")&&($t(null),Pt(0)),tt("failed")}}catch(s){console.error("Error in handleConnect outer try:",s);let o=a("err.setupError");s.message.includes("CRITICAL SECURITY FAILURE")?s.message.includes("ECDH public key structure")?o=a("err.responseNoKey"):s.message.includes("ECDSA public key structure")?o=a("err.responseNoSignKey"):o=a("err.securityValidation"):s.message.includes("too old")||s.message.includes("replay")?o=a("err.responseOutdated"):s.message.includes("MITM")||s.message.includes("signature")?o=a("err.securityBreach"):s.message.includes("Invalid")||s.message.includes("format")?o=a("err.responseFormat"):o=`${s.message}`,ee(l=>[...l,{message:o,type:"system",id:Date.now(),timestamp:Date.now(),showRetryButton:!0}]),!s.message.includes("too old")&&!s.message.includes("replay")&&($t(null),Pt(0)),tt("failed")}},Sa=async(s,o=!0)=>{if(o){ye.current.confirmVerification(s),b(!0);try{if(window.NotificationIntegration&&ye.current&&!kt.current){let l=new window.NotificationIntegration(ye.current);await l.init(),kt.current=l,l.getStatus().permission==="granted"?ee(g=>[...g,{message:"\u2713 Notifications enabled - you will receive alerts when the tab is inactive",type:"system",id:Date.now(),timestamp:Date.now()}]):ee(g=>[...g,{message:"\u2139 Notifications disabled - you can enable them using the button on the main page",type:"system",id:Date.now(),timestamp:Date.now()}])}else kt.current}catch(l){console.warn("Failed to initialize notifications:",l)}}else ee(l=>[...l,{message:" Verification rejected. The connection is unsafe! Session reset..",type:"system",id:Date.now(),timestamp:Date.now()}]),b(!1),Pe(!1),Re(!1),sn(!1),zt(""),tt("disconnected"),Gt(""),rn(""),f(""),Fe(""),Ge(!1),Ht(!1),xt(""),er(null),vt(!1),ee([]),Pt(0),$t(null),document.dispatchEvent(new CustomEvent("disconnected")),zr()},Ea=async()=>{if(!ln.trim()||!ye.current)return;let s=ln.trim(),o=`m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`,l=ye.current,u=l?.isConnected?.()===!0&&l?.isReconnecting?.()!==!0;if(!u&&l?.isConnected){let g=Wt?"```\n"+s+"\n```":s,S=Date.now(),A={mid:o,ts:S};Vt&&(A.once=!0,A.onceTtl=on),mt>0&&(A.ttl=mt);let M={mid:o,status:"sent",timestamp:S};mt>0&&(M.expiresAt=S+mt*1e3),Mt(g,"sent",M);let U=y.current.get(r.current);U&&U.outgoing.push({outText:g,meta:A,mid:o}),z(""),Wt&&pe(!1),Vt&&kn(!1);return}if(!u){Mt(a("chat.notSentReason"),"system");return}try{let g=s,S=Wt?"```\n"+g+"\n```":g,A=o,M={mid:A,ts:Date.now()};Vt&&(M.once=!0,M.onceTtl=on),mt>0&&(M.ttl=mt);let U={mid:A,status:"sending"};mt>0&&(U.expiresAt=Date.now()+mt*1e3),Mt(S,"sent",U);try{await ye.current.sendMessage(S,M),gs(A,"delivered")}catch(Ae){throw gs(A,"failed"),Ae}z(""),Wt&&pe(!1),Vt&&kn(!1)}catch(g){let S=String(g?.message||g);/queued for sending|Data channel not ready/i.test(S)||Mt(`Sending error: ${S}`,"system")}},Ra=async(s,o,l)=>{if(!s||!ye.current)return;let u=String(s.type||"").toLowerCase(),g="audio/wav";u.startsWith("audio/webm")?g="audio/webm":u.startsWith("audio/mp4")||u.startsWith("audio/x-m4a")?g="audio/mp4":u.startsWith("audio/ogg")&&(g="audio/ogg");let S=g==="audio/mp4"?"m4a":g==="audio/ogg"?"ogg":g==="audio/webm"?"webm":"wav",A=new File([s],`voice-message.${S}`,{type:g}),M=null;try{M=URL.createObjectURL(s)}catch{}let U=ye.current?.isReconnecting?.()===!0;if(U||ye.current?.isConnected?.()!==!0){if(M)try{URL.revokeObjectURL(M)}catch{}Mt(U?a("err.voiceRestoring"):a("err.voiceNeedsConnection"),"system");return}let Be={dur:Math.max(1,Math.round(o||0)),bars:Array.isArray(l)?l.map(ge=>Math.round(ge*1e3)/1e3):[]},he=Mt("","sent",{voice:{dur:Be.dur,bars:Be.bars,url:M,transfer:{dir:"up",pct:0}}});try{await ye.current.sendFile(A,{voice:Be,uiId:he}),ms(he,ge=>({voice:{...ge.voice||{},transfer:null}}))}catch(ge){ms(he,Qe=>({voice:{...Qe.voice||{},transfer:null,error:!0}}));let Et=String(ge?.message||ge);/queued for sending|Data channel not ready/i.test(Et)||Mt(`Voice message failed: ${Et}`,"system")}},_a=React.useCallback(s=>{if(s){ee(o=>o.filter(l=>String(l.mid)!==String(s)));try{ye.current?.sendMessageDelete?.(String(s))}catch{}}},[]),Ca=React.useCallback(s=>{ee(o=>o.map(l=>l.id===s?{...l,expired:!0,message:"",expiresAt:void 0}:l))},[]),Ns=()=>{Gt(""),rn(""),f(""),Fe(""),Ge(!1),vn(!1),hs()||Ht(!1),sn(!1),xe(!1),Ee(!1),ke(!1),G.current={id:null,total:0,seen:new Set,items:[]},hs()||Ke(""),zt(""),vt(!1),xt(""),er(null),tt("disconnected"),ee([]),z(""),b(!1),Pe(!1),Re(!1),typeof console.clear=="function"&&console.clear(),Pt(0),$t(null),document.dispatchEvent(new CustomEvent("peer-disconnect"))},Ia=React.useCallback(async(s,o)=>{try{o?await ye.current?.acceptIncomingFile(s):await ye.current?.rejectIncomingFile(s)}finally{Dt(l=>l.filter(u=>u.fileId!==s))}},[]),zr=()=>{try{let s=r.current;Pt(0),document.dispatchEvent(new CustomEvent("peer-disconnect")),document.dispatchEvent(new CustomEvent("disconnected")),document.dispatchEvent(new CustomEvent("session-cleanup",{detail:{timestamp:Date.now(),reason:"manual_disconnect"}})),Nr(s),typeof console.clear=="function"&&console.clear()}catch(s){console.error("Error during disconnect:",s)}},Qo=s=>{let o;s.type==="demo"?o=" Demo session activated for 6 minutes. You can create invitations!":o=" All security features enabled by default. You can create invitations!",Mt(o,"system")},Ds=React.useRef(Te);React.useEffect(()=>{let s=Ds.current==="reconnecting";Ds.current=Te,Te==="connected"&&ft&&!s&&Mt(" Secure connection successfully established and verified! You can now communicate safely with full protection against MITM attacks and Perfect Forward Secrecy..","system")},[Te,ft]);let Ur=React.useMemo(()=>{try{return new URLSearchParams(window.location.search).get("preview")==="chat"}catch{return!1}},[]),Kt=(Te==="connected"||Te==="verified"||Te==="reconnecting")&&ft;React.useEffect(()=>(document.body.classList.toggle("sb-in-chat",Kt||Ur),()=>document.body.classList.remove("sb-in-chat")),[Kt,Ur]),React.useEffect(()=>{Kt&&Cr&&Te!=="failed"&&($t(null),Pt(0),Mt(" All security features enabled by default","system"))},[Kt,Cr,Te]),React.useEffect(()=>{if(lt&&window.Html5Qrcode){let s=new window.Html5Qrcode("qr-reader"),o={fps:10},l=!0;return s.start({facingMode:"environment"},o,(u,g)=>{if(!l){console.log("Scanner stopped, ignoring scan");return}console.log("QR Code scanned:",u),console.log("Current buffer state:",G.current),va(u).then(S=>{if(console.log("QR scan result:",S),S){console.log("Closing scanner and modal"),l=!1;try{console.log("Stopping scanner..."),s.stop().then(()=>{console.log("Scanner stopped, clearing..."),s.clear(),ke(!1)}).catch(A=>{console.log("Error stopping scanner:",A);try{s.clear()}catch(M){console.log("Error clearing scanner:",M)}ke(!1)})}catch(A){console.log("Error in scanner cleanup:",A),ke(!1)}}else console.log("Continuing to scan for more chunks...")}).catch(S=>{console.error("QR scan processing error:",S)})},u=>{l&&console.log("QR scan error (ignored):",u)}).catch(u=>{console.error("QR Scanner start error:",u),ke(!1)}),()=>{l=!1;try{s.stop().then(()=>{s.clear()}).catch(u=>{console.log("Scanner already stopped or error stopping:",u);try{s.clear()}catch(g){console.log("Error clearing scanner in cleanup:",g)}})}catch(u){console.log("Error in cleanup:",u);try{s.clear()}catch(g){console.log("Error clearing scanner in cleanup:",g)}}}}},[lt,yt]);let Aa=ei(t),Ma=Si(k),Lt=t.order.length>1||k.order.length>0||t.order.some(s=>{let o=t.sessions[s];return o&&o.sas&&o.sas.isVerified});if(Ur){let s=[{message:"Preview mode \u2014 no connection is open.",type:"system",id:1,timestamp:Date.now()-3e5},{message:"This renders the real chat components so the layout can be checked without a handshake.",type:"received",id:2,timestamp:Date.now()-24e4},{message:"Header pinned, list scrolls, composer sits above the keyboard.",type:"sent",id:3,timestamp:Date.now()-18e4},...Array.from({length:30},(l,u)=>({message:"Filler message "+(u+1)+" \u2014 enough content to make the list scroll.",type:u%2?"sent":"received",id:10+u,timestamp:Date.now()-(30-u)*5e3}))],o=()=>{};return React.createElement("div",{className:"minimal-bg sb-app-shell",style:{display:"flex",flexDirection:"row",height:"100vh",width:"100%",overflow:"hidden"}},[React.createElement(Vi,{key:"sidebar",chats:[{id:"preview",label:"Preview peer",unread:0,active:!0,verified:!0}],collapsed:rr,drawerOpen:Ss,onToggleCollapse:()=>ks(l=>!l),onSelect:o,onNewChat:o,onRename:o,onCloseDrawer:()=>qt(!1),myStatus:St,onSetStatus:Qn}),React.createElement("button",{key:"burger",className:"sb-burger",onClick:()=>qt(!0),style:{display:"none",position:"fixed",top:"calc(13px + var(--sb-safe-top, 0px))",insetInlineStart:"13px",zIndex:55,width:"38px",height:"38px",borderRadius:"10px",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-bg-rgb), 0.9)",color:"var(--sb-text-4)",cursor:"pointer"},dangerouslySetInnerHTML:{__html:tn.burger}}),React.createElement("div",{key:"col",className:"minimal-bg sb-app-col",style:{flex:1,minWidth:0,height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column"}},React.createElement("main",{key:"main"},React.createElement(Wi,{title:"Preview peer",isOffline:!1,peerPresence:"available",onRenameTitle:o,messages:s,messageInput:ln,setMessageInput:z,onSendMessage:o,onSendVoice:o,onDisconnect:o,keyFingerprint:"preview",isVerified:!0,chatMessagesRef:Cn,scrollToBottom:o,webrtcManager:null,status:"connected",pendingIncomingFiles:[],onIncomingDecision:o,codeMode:Wt,setCodeMode:pe,viewOnceMode:Vt,setViewOnceMode:kn,viewOnceTtl:on,setViewOnceTtl:Xn,disappearTtl:mt,setDisappearTtl:Ot,nowTick:cn,onUnsendMessage:o,onMessageExpire:o})))])}return React.createElement("div",{className:Lt?"minimal-bg sb-app-shell":"minimal-bg",style:Lt?{display:"flex",flexDirection:"row",height:"100vh",width:"100%",overflow:"hidden"}:{minHeight:"100vh"}},[Lt&&React.createElement(Vi,{key:"sessions-sidebar",chats:Aa,groups:Ma,collapsed:rr,drawerOpen:Ss,onToggleCollapse:()=>ks(s=>!s),onSelect:s=>{p({type:fe.SET_ACTIVE_GROUP,id:null}),Qi(s)},onSelectGroup:Zi,onNewChat:Xi,onNewGroup:()=>{le(!0),qt(!1)},onRename:Ji,onCloseDrawer:()=>qt(!1),myStatus:St,onSetStatus:Qn}),te&&React.createElement(Mi,{key:"create-group",candidates:Fr,relayOnly:It,onCreate:ea,onCancel:()=>le(!1)}),F&&React.createElement(Di,{key:"group-invite",invite:{name:F.name,fromLabel:t.sessions[F.sessionId]?.peerLabel||"A verified contact"},onAccept:ta,onDecline:()=>V(null)}),O&&React.createElement(Ti,{key:"group-error",message:O,onDismiss:()=>P(null)}),q&&I&&React.createElement(Ni,{key:"add-members",candidates:sa,remaining:Math.max(0,N.MAX_MEMBERS-I.members.length),onAdd:ia,onCancel:()=>X(!1)}),be&&I&&React.createElement(Ai,{key:"group-sas",group:I,onConfirm:na,onCancel:()=>{I.phase===K.READY?C(!1):sr(I.id)}}),Lt&&React.createElement("button",{key:"sb-burger",className:"sb-burger",onClick:()=>qt(!0),style:{display:"none",position:"fixed",top:"calc(13px + var(--sb-safe-top, 0px))",insetInlineStart:"13px",zIndex:55,width:"38px",height:"38px",borderRadius:"10px",placeItems:"center",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"rgba(var(--sb-bg-rgb), 0.9)",color:"var(--sb-text-4)",cursor:"pointer"},dangerouslySetInnerHTML:{__html:tn.burger}}),React.createElement("div",{key:"app-column",className:Lt?"minimal-bg sb-app-col":"minimal-bg min-h-screen",style:Lt?{flex:1,minWidth:0,height:"100vh",overflow:"hidden",display:"flex",flexDirection:"column"}:{}},[!Kt&&!Lt&&window.EnhancedMinimalHeader&&React.createElement(window.EnhancedMinimalHeader,{key:"header",status:Te,fingerprint:_t,verificationCode:Ct,onDisconnect:zr,isConnected:Kt,securityLevel:qi,webrtcManager:ye.current}),!Kt&&!Lt&&React.createElement(ls,{key:"lang-suggest"}),I&&React.createElement("main",{key:"group-main",style:{flex:1,minHeight:0,display:"flex",flexDirection:"column"}},React.createElement(Fi,{group:I,input:D,setInput:ae,onSend:ra,onLeave:()=>sr(I.id),onRemoveMember:aa,onAddMembers:()=>X(!0),isAdmin:I.isAdmin,scrollRef:H,onStartCall:oa,callActive:!!re[I.id],callOverlay:(()=>{let s=re[I.id]||null;if(!s||!s.joined&&ne[I.id]===s.callId)return null;let o=de[I.id]||null;return React.createElement(ds,{key:"group-call",call:s,media:o,groupName:I.name,localStream:j.current.get(I.id)?.getLocalStream()||null,getRemoteStream:l=>j.current.get(I.id)?.getRemoteStream(l)||null,onJoin:ca,onDismiss:la,onLeave:da,onToggleMic:pa,onToggleCamera:ua,onFlipCamera:fa})})()})),!I&&React.createElement("main",{key:"main"},Kt?React.createElement(Wi,{title:i?i.peerLabel:"",isOffline:at,peerPresence:i?i.peerPresence:null,onRenameTitle:s=>{n&&e({type:J.RENAME,id:n,label:s})},messages:ut,messageInput:ln,setMessageInput:z,onSendMessage:Ea,onSendVoice:Ra,onDisconnect:zr,keyFingerprint:_t,isVerified:ft,chatMessagesRef:Cn,scrollToBottom:nr,webrtcManager:ye.current,status:Te,pendingIncomingFiles:nt,onIncomingDecision:Ia,codeMode:Wt,setCodeMode:pe,viewOnceMode:Vt,setViewOnceMode:kn,viewOnceTtl:on,setViewOnceTtl:Xn,disappearTtl:mt,setDisappearTtl:Ot,nowTick:cn,onUnsendMessage:_a,onMessageExpire:Ca}):React.createElement(zo,{onCreateOffer:Ts,onCreateAnswer:wa,onConnect:ka,onClearData:Ns,onVerifyConnection:Sa,connectionStatus:Te,offerData:nn,answerData:Fn,offerInput:wt,setOfferInput:f,answerInput:it,setAnswerInput:Fe,showOfferStep:we,showAnswerStep:He,verificationCode:Ct,showVerification:De,showQRCode:R,qrCodeUrl:Le,showQRScanner:Z,setShowQRCode:xe,setShowQRScanner:Ee,setShowQRScannerModal:ke,messages:ut,localVerificationConfirmed:Ut,remoteVerificationConfirmed:$,bothVerificationsConfirmed:je,qrFramesTotal:Lr,qrFrameIndex:ga,qrManualMode:zn,toggleQrManualMode:ma,nextQrFrame:ya,prevQrFrame:ba,markAnswerCreated:Ir,notificationIntegrationRef:kt,isGeneratingKeys:an,setIsGeneratingKeys:vn,handleCreateOffer:Ts,relayOnlyMode:It,setRelayOnlyMode:Sn,webrtcManagerRef:ye,showIceSettings:Er,setShowIceSettings:Ln,iceServersText:Sr,iceSettingsPersisted:Rn,customIceServers:At,handleApplyIceSettings:Rr,handleForgetIceSettings:_r,compact:Lt})),lt&&(()=>{let s=()=>{ke(!1),G.current={id:null,total:0,seen:new Set,items:[]}},o=G.current,u=!!(o&&o.id&&o.total>1)?`Scanning frames\u2026 ${o.seen.size} / ${o.total}`:a("qr.scanning"),g=(S,A)=>React.createElement("span",{key:S,style:Object.assign({position:"absolute",width:"34px",height:"34px",zIndex:3},A)});return React.createElement("div",{key:"qr-scanner-modal",onClick:s,style:{position:"fixed",inset:0,zIndex:50,display:"flex",alignItems:"center",justifyContent:"center",padding:"32px",background:"rgba(var(--sb-scrim-rgb), 0.82)",backdropFilter:"blur(10px)",WebkitBackdropFilter:"blur(10px)",animation:"sbUp .2s ease"}},[React.createElement("div",{key:"scanner-container",onClick:S=>S.stopPropagation(),style:{width:"100%",maxWidth:"420px",borderRadius:"22px",border:"1px solid rgba(var(--sb-ink), 0.1)",background:"var(--sb-bg)",boxShadow:"0 30px 90px rgba(var(--sb-shadow-rgb), calc(0.6 * var(--sb-shadow-k)))",overflow:"hidden"}},[React.createElement("div",{key:"scanner-header",style:{display:"flex",alignItems:"center",gap:"11px",padding:"18px 20px",borderBottom:"1px solid rgba(var(--sb-ink), 0.06)"}},[React.createElement("span",{key:"scanner-icon",style:{display:"flex"},dangerouslySetInnerHTML:{__html:'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--sb-green-solid)" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M2 8.5V6.5A2.5 2.5 0 0 1 4.5 4h2M17.5 4h2A2.5 2.5 0 0 1 22 6.5v2M22 15.5v2a2.5 2.5 0 0 1-2.5 2.5h-2M6.5 20h-2A2.5 2.5 0 0 1 2 17.5v-2"/><circle cx="12" cy="12" r="3.2"/></svg>'}}),React.createElement("div",{key:"scanner-titles",style:{flex:1,lineHeight:1.2}},[React.createElement("div",{key:"scanner-title",style:{fontSize:"15.5px",fontWeight:800,color:"var(--sb-text-1)"}},a("qr.title")),React.createElement("div",{key:"scanner-hint",style:{fontSize:"12px",color:"var(--sb-text-8)"}},a("qr.subtitle"))]),React.createElement("button",{key:"close-btn",onClick:s,style:{width:"32px",height:"32px",display:"grid",placeItems:"center",borderRadius:"9px",border:"none",background:"rgba(var(--sb-ink), 0.05)",color:"var(--sb-text-6)",cursor:"pointer"}},React.createElement("i",{className:"fas fa-times"}))]),React.createElement("div",{key:"scanner-body",style:{padding:"22px 24px 24px"}},[React.createElement("div",{key:"viewfinder",style:{position:"relative",aspectRatio:"1",borderRadius:"18px",overflow:"hidden",background:"#000",border:"1px solid rgba(var(--sb-ink), 0.1)"}},[React.createElement("div",{key:"vf-bg",style:{position:"absolute",inset:0,background:"radial-gradient(circle at 50% 45%, var(--sb-surface-2), #000)"}}),React.createElement("div",{key:"qr-reader",id:"qr-reader",style:{position:"absolute",inset:0,zIndex:1}}),g("c-tl",{top:"18px",insetInlineStart:"18px",borderTop:"2.5px solid var(--sb-green-solid)",borderInlineStart:"2.5px solid var(--sb-green-solid)",borderRadius:"8px 0 0 0"}),g("c-tr",{top:"18px",insetInlineEnd:"18px",borderTop:"2.5px solid var(--sb-green-solid)",borderInlineEnd:"2.5px solid var(--sb-green-solid)",borderRadius:"0 8px 0 0"}),g("c-bl",{bottom:"18px",insetInlineStart:"18px",borderBottom:"2.5px solid var(--sb-green-solid)",borderInlineStart:"2.5px solid var(--sb-green-solid)",borderRadius:"0 0 0 8px"}),g("c-br",{bottom:"18px",insetInlineEnd:"18px",borderBottom:"2.5px solid var(--sb-green-solid)",borderInlineEnd:"2.5px solid var(--sb-green-solid)",borderRadius:"0 0 8px 0"}),React.createElement("span",{key:"scan-line",style:{position:"absolute",left:"18px",right:"18px",height:"2.5px",zIndex:2,background:"linear-gradient(90deg, transparent, var(--sb-green), transparent)",boxShadow:"0 0 16px var(--sb-green)",animation:"sbScan 1.5s ease-in-out infinite alternate"}}),React.createElement("div",{key:"scan-status",style:{position:"absolute",bottom:0,left:0,right:0,zIndex:3,display:"flex",alignItems:"center",justifyContent:"center",gap:"8px",padding:"14px",background:"linear-gradient(transparent, rgba(0,0,0,0.6))"}},[React.createElement("span",{key:"spinner",style:{display:"flex",animation:"sbSpin 1.4s linear infinite"},dangerouslySetInnerHTML:{__html:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--sb-green-solid)" stroke-width="2" stroke-linecap="round"><path d="M21 12a9 9 0 1 1-6.2-8.6"/></svg>'}}),React.createElement("span",{key:"scan-frames",style:{fontSize:"12.5px",fontWeight:600,color:"var(--sb-text-4)"}},u)])]),React.createElement("p",{key:"scanner-note",style:{margin:"16px 0 0",textAlign:"center",fontSize:"12px",lineHeight:1.5,color:"var(--sb-text-9)"}},a("qr.hint"))])])])})()])])},Ho=({children:t})=>typeof window<"u"&&window.UpdateChecker?React.createElement(window.UpdateChecker,{debug:!1},t):t;function Wo(){if(window.EnhancedSecureCryptoUtils&&window.EnhancedSecureWebRTCManager){let t=React.createElement(Ho,null,React.createElement(fs));ReactDOM.render(t,document.getElementById("root"))}else console.error("\u041C\u043E\u0434\u0443\u043B\u0438 \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u044B:",{hasCrypto:!!window.EnhancedSecureCryptoUtils,hasWebRTC:!!window.EnhancedSecureWebRTCManager})}typeof window<"u"&&(window.addEventListener("unhandledrejection",t=>{console.error("Unhandled promise rejection:",t.reason),t.preventDefault()}),window.addEventListener("error",t=>{console.error("Global error:",t.error),t.preventDefault()}),window.initializeApp||(window.initializeApp=Wo));if(window.EnhancedSecureCryptoUtils&&window.EnhancedSecureWebRTCManager){let t=({children:n})=>typeof window<"u"&&window.UpdateChecker?React.createElement(window.UpdateChecker,{debug:!1},n):n,e=React.createElement(t,null,React.createElement(fs));ReactDOM.render(e,document.getElementById("root"))}else ReactDOM.render(React.createElement(fs),document.getElementById("root"));
//# sourceMappingURL=app.js.map