From ff08ba6b2c25409ee9743cf8c50d94f4bd5086fe Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 27 Feb 2026 20:05:50 +0100 Subject: [PATCH] Follow-up --- dist/234.2c678b7ae28543b0d415.js | 2 + dist/234.2c678b7ae28543b0d415.js.map | 1 + dist/2394.0afa88a3e81dd3f7bc95.js | 2 + dist/2394.0afa88a3e81dd3f7bc95.js.map | 1 + dist/2400.7e51ea3c4784ada490f0.js | 2 + dist/2400.7e51ea3c4784ada490f0.js.map | 1 + dist/390.8f11aab3e0f9568b8c48.css | 30 +++ dist/390.8f11aab3e0f9568b8c48.css.map | 1 + dist/390.8f11aab3e0f9568b8c48.js | 2 + dist/390.8f11aab3e0f9568b8c48.js.map | 1 + dist/4765.6fac447187e43918fcc4.js | 2 + dist/4765.6fac447187e43918fcc4.js.map | 1 + dist/5378.5d3d04d312a94cdb681c.css | 178 +++++++++++++++ dist/5378.5d3d04d312a94cdb681c.css.map | 1 + dist/5378.5d3d04d312a94cdb681c.js | 2 + dist/5378.5d3d04d312a94cdb681c.js.map | 1 + dist/6930.3d59f289ec8d6dd8a179.js | 2 + dist/6930.3d59f289ec8d6dd8a179.js.map | 1 + dist/695.216e2125f9c5f7141f9e.js | 1 + dist/7405.5051cd5065a88d0fabf2.js | 2 + dist/7405.5051cd5065a88d0fabf2.js.map | 1 + dist/7768.971d2e4569c4472ff621.js | 2 + dist/7768.971d2e4569c4472ff621.js.map | 1 + dist/81.53a34063c67c6baa7c4d.js | 2 + dist/81.53a34063c67c6baa7c4d.js.map | 1 + dist/9451.e6319a0b74c344be9686.js | 2 + dist/9451.e6319a0b74c344be9686.js.map | 1 + dist/BrokenGift.2ab7b20bf2eba78ceab3.tgs | Bin 0 -> 6731 bytes dist/BundleAuth.5051cd5065a88d0fabf2.css | 3 + dist/BundleAuth.5051cd5065a88d0fabf2.css.map | 1 + dist/BundleCalls.0afa88a3e81dd3f7bc95.css | 17 ++ dist/BundleCalls.0afa88a3e81dd3f7bc95.css.map | 1 + dist/BundleExtra.e6319a0b74c344be9686.css | 166 ++++++++++++++ dist/BundleExtra.e6319a0b74c344be9686.css.map | 1 + dist/BundleMain.971d2e4569c4472ff621.css | 38 ++++ dist/BundleMain.971d2e4569c4472ff621.css.map | 1 + dist/BundleStars.3d59f289ec8d6dd8a179.css | 58 +++++ dist/BundleStars.3d59f289ec8d6dd8a179.css.map | 1 + dist/CraftProgress.1442d818f48573cc2a7b.tgs | Bin 0 -> 2739 bytes dist/attribute-mask.248bd6bbbc25763f39ee.svg | 1 + dist/broken-gift.451dc132a40c0c0ddcf0.svg | 1 + dist/craft.4fb361de4f306ef6b364.svg | 1 + dist/icons.b4be126c735bd5958a76.woff | Bin 0 -> 40136 bytes dist/icons.fec3f29b9b6c55e7f887.woff2 | Bin 0 -> 33456 bytes dist/main.0902f0cf255d884a7994.css | 202 ++++++++++++++++++ dist/main.0902f0cf255d884a7994.css.map | 1 + dist/main.39a8a2cda48f23d84fcf.js | 2 + dist/main.39a8a2cda48f23d84fcf.js.map | 1 + ...shared-components.6fac447187e43918fcc4.css | 26 +++ ...ed-components.6fac447187e43918fcc4.css.map | 1 + 50 files changed, 767 insertions(+) create mode 100644 dist/234.2c678b7ae28543b0d415.js create mode 100644 dist/234.2c678b7ae28543b0d415.js.map create mode 100644 dist/2394.0afa88a3e81dd3f7bc95.js create mode 100644 dist/2394.0afa88a3e81dd3f7bc95.js.map create mode 100644 dist/2400.7e51ea3c4784ada490f0.js create mode 100644 dist/2400.7e51ea3c4784ada490f0.js.map create mode 100644 dist/390.8f11aab3e0f9568b8c48.css create mode 100644 dist/390.8f11aab3e0f9568b8c48.css.map create mode 100644 dist/390.8f11aab3e0f9568b8c48.js create mode 100644 dist/390.8f11aab3e0f9568b8c48.js.map create mode 100644 dist/4765.6fac447187e43918fcc4.js create mode 100644 dist/4765.6fac447187e43918fcc4.js.map create mode 100644 dist/5378.5d3d04d312a94cdb681c.css create mode 100644 dist/5378.5d3d04d312a94cdb681c.css.map create mode 100644 dist/5378.5d3d04d312a94cdb681c.js create mode 100644 dist/5378.5d3d04d312a94cdb681c.js.map create mode 100644 dist/6930.3d59f289ec8d6dd8a179.js create mode 100644 dist/6930.3d59f289ec8d6dd8a179.js.map create mode 100644 dist/695.216e2125f9c5f7141f9e.js create mode 100644 dist/7405.5051cd5065a88d0fabf2.js create mode 100644 dist/7405.5051cd5065a88d0fabf2.js.map create mode 100644 dist/7768.971d2e4569c4472ff621.js create mode 100644 dist/7768.971d2e4569c4472ff621.js.map create mode 100644 dist/81.53a34063c67c6baa7c4d.js create mode 100644 dist/81.53a34063c67c6baa7c4d.js.map create mode 100644 dist/9451.e6319a0b74c344be9686.js create mode 100644 dist/9451.e6319a0b74c344be9686.js.map create mode 100644 dist/BrokenGift.2ab7b20bf2eba78ceab3.tgs create mode 100644 dist/BundleAuth.5051cd5065a88d0fabf2.css create mode 100644 dist/BundleAuth.5051cd5065a88d0fabf2.css.map create mode 100644 dist/BundleCalls.0afa88a3e81dd3f7bc95.css create mode 100644 dist/BundleCalls.0afa88a3e81dd3f7bc95.css.map create mode 100644 dist/BundleExtra.e6319a0b74c344be9686.css create mode 100644 dist/BundleExtra.e6319a0b74c344be9686.css.map create mode 100644 dist/BundleMain.971d2e4569c4472ff621.css create mode 100644 dist/BundleMain.971d2e4569c4472ff621.css.map create mode 100644 dist/BundleStars.3d59f289ec8d6dd8a179.css create mode 100644 dist/BundleStars.3d59f289ec8d6dd8a179.css.map create mode 100644 dist/CraftProgress.1442d818f48573cc2a7b.tgs create mode 100644 dist/attribute-mask.248bd6bbbc25763f39ee.svg create mode 100644 dist/broken-gift.451dc132a40c0c0ddcf0.svg create mode 100644 dist/craft.4fb361de4f306ef6b364.svg create mode 100644 dist/icons.b4be126c735bd5958a76.woff create mode 100644 dist/icons.fec3f29b9b6c55e7f887.woff2 create mode 100644 dist/main.0902f0cf255d884a7994.css create mode 100644 dist/main.0902f0cf255d884a7994.css.map create mode 100644 dist/main.39a8a2cda48f23d84fcf.js create mode 100644 dist/main.39a8a2cda48f23d84fcf.js.map create mode 100644 dist/shared-components.6fac447187e43918fcc4.css create mode 100644 dist/shared-components.6fac447187e43918fcc4.css.map diff --git a/dist/234.2c678b7ae28543b0d415.js b/dist/234.2c678b7ae28543b0d415.js new file mode 100644 index 000000000..082933b8f --- /dev/null +++ b/dist/234.2c678b7ae28543b0d415.js @@ -0,0 +1,2 @@ +(()=>{"use strict";const e="account",t="tt-media-progressive",n="tt-assets",s=("undefined"!=typeof window&&window.innerHeight,Math.round(450),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory","deleteParticipantHistory"]),new Set(["svg","svgz"]),new Set(["image/png","image/jpeg","image/gif"])),a=new Set(["video/mp4","video/quicktime"]);new Set(["audio/mp3","audio/ogg","audio/wav","audio/mpeg","audio/flac","audio/aac","audio/m4a","audio/mp4","audio/x-m4a"]),new Set([...s,...a]),new Set(["USERNAME_PURCHASE_AVAILABLE","USERNAME_INVALID"]),new Set(["t.me","web.t.me","a.t.me","k.t.me","z.t.me"]),new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),(-(10n**12n)-777n).toString(),new Set(["USER_CANCELED"]);const i=e=>new Promise(t=>{setTimeout(()=>t(),e)});async function o(e){const t=await r(async()=>{const t=await self.caches.open(n),s=await t.match(e.request);return{cache:t,cached:s}},3e3),{cache:s,cached:a}=t||{};if(s&&a){if(a.ok)return a;await s.delete(e.request)}const i=await fetch(e.request);return i.ok&&s&&s.put(e.request,i.clone()),i}async function r(e,t){let n=!1;try{return await Promise.race([i(t).then(()=>n?void 0:Promise.reject(new Error("TIMEOUT"))),e()])}catch(e){return void console.error(e)}finally{n=!0}}"function"==typeof SuppressedError&&SuppressedError;new WeakMap,new WeakMap,new WeakMap,new WeakMap,new WeakMap;const c="SharedWorker"in globalThis,l=(Intl,new URL("tg://host").host,(globalThis||window).isTauri,Boolean(globalThis.electron),"undefined"!=typeof WorkerGlobalScope&&globalThis.self instanceof WorkerGlobalScope?globalThis.self.name:void 0);function u(t){const n=new URL(t).searchParams.get(e),s=n?Number(n):1;if(s&&!Number.isNaN(s)&&1!==s)return s}if((l?Number(new URLSearchParams(l).get(e)):void 0)||c&&u(globalThis.location.href),"object"==typeof window){const e=new BroadcastChannel("tt-version");e.postMessage({version:"12.0.19"}),e.addEventListener("message",t=>{const{version:n}=t.data;n&&(-1===d("12.0.19",n)&&window.location.reload(),1===d("12.0.19",n)&&e.postMessage({version:"12.0.19"}))})}function d(e,t){return e.startsWith(`${t}-`)?-1:t.startsWith(`${e}-`)?1:e.localeCompare(t,void 0,{numeric:!0,sensitivity:"case",caseFirst:"upper"})}const f=524288,p=new Map;async function h(e,t){const n=t.url.includes("/download/"),s=await(n?async function(e){const t=u(e);return(await self.clients.matchAll()).find(e=>"window"===e.type&&"top-level"===e.frameType&&u(e.url)===t)}(t.url):self.clients.get(e.clientId));if(!s)return;const a=Date.now().toString(36)+Math.random().toString(36).slice(2),o={};let r=!1;const c=Promise.race([i(6e4).then(()=>r?void 0:Promise.reject(new Error("ERROR_PART_TIMEOUT"))),new Promise((e,t)=>{Object.assign(o,{resolve:e,reject:t})})]);return p.set(a,o),c.catch(()=>{}).finally(()=>{p.delete(a),r=!0}),s.postMessage({type:"requestPart",messageId:a,params:t}),c}self.addEventListener("message",e=>{const{type:t,messageId:n,result:s}=e.data;if("partResponse"===t){const e=p.get(n);e&&e.resolve(s)}});const w=1048576;class g{constructor(){this.queue=[]}push(e){this.queue.push(e)}async pop(){return await this.queue.shift()}get size(){return this.queue.length}}var m=function(e){return e.True="1",e.False="0",e}(m||{});let y=(new Date).valueOf();const v=new Set,S={};function R(e){return e.custom.from_id?e.custom.from_id:e.custom.chat_id||e.custom.channel_id?`-${e.custom.chat_id||e.custom.channel_id}`:void 0}function b(e){if(e.custom.msg_id)return parseInt(e.custom.msg_id,10)}async function I(){const e=new URL(self.registration.scope).origin;return(await self.clients.matchAll({type:"window"})).filter(t=>new URL(t.url).origin===e)}async function E(e){const t=(await I())[0];t&&t.postMessage({type:"playNotificationSound",payload:{id:e}})}function M({chatId:e,messageId:t,body:n,title:s,icon:a,reaction:i,isSilent:o,shouldReplaceHistory:r}){const c=(new Date).valueOf()-y<1e3,l={body:n,data:{chatId:e,messageId:t,reaction:i,count:1,shouldReplaceHistory:r},icon:a||"icon-192x192.png",badge:"icon-192x192.png",tag:String(c?0:e||0),vibrate:[200,100,200]};return Promise.all([i||o?void 0:E(String(t)||e||""),self.registration.showNotification(s,l)])}async function T(e,t){if(t.chatId&&(e.postMessage({type:"focusMessage",payload:t}),!e.focused))try{await e.focus()}catch(e){}}self.addEventListener("sync",()=>{y=Date.now()});class P{constructor(){this.promise=new Promise((e,t)=>{this.reject=t,this.resolve=e})}static resolved(e){const t=new P;return t.resolve(e),t}}const L=new Map;const U=/\.(wasm|html)$/,N=/[\da-f]{20}.*\.(js|css|woff2?|svg|png|jpg|jpeg|tgs|json|wasm)$/;self.addEventListener("install",e=>{e.waitUntil(self.skipWaiting())}),self.addEventListener("activate",e=>{e.waitUntil(Promise.race([i(3e3),Promise.all([self.caches.delete(n),self.clients.claim()])]))}),self.addEventListener("fetch",e=>{const{url:s}=e.request,{scope:a}=self.registration;if(!s.startsWith(a))return!1;const{pathname:i,protocol:c}=new URL(s),{pathname:l}=new URL(a);if(i.includes("/progressive/"))return e.respondWith(async function(e){const{url:n}=e.request,s=u(n),a=e.request.headers.get("range"),i=/^bytes=(\d+)-(\d+)?$/g.exec(a||""),o=Number(i[1]);let r=Number(i[2]);(!r||r-o+1>f)&&(r=o+f-1);const c=new URL(n);if(0===o&&1===r){const e=c.searchParams.get("fileSize"),t=e&&Number(e),n=c.searchParams.get("mimeType");if(t&&n)return new Response(new Uint8Array(2).buffer,{status:206,statusText:"Partial Content",headers:[["Content-Range",`bytes 0-1/${t}`],["Accept-Ranges","bytes"],["Content-Length","2"],["Content-Type",n]]})}c.searchParams.set("start",String(o)),c.searchParams.set("end",String(r));const l=c.href,[d,p]=await async function(e,n){const s=e?`${t}_${e}`:t,a=await self.caches.open(s);return Promise.all([a.match(`${n}&type=arrayBuffer`).then(e=>e?e.arrayBuffer():void 0),a.match(`${n}&type=headers`).then(e=>e?e.json():void 0)])}(s,l);if(d)return new Response(d,{status:206,statusText:"Partial Content",headers:p});let w;try{w=await h(e,{url:n,start:o,end:r})}catch(e){}if(!w)return new Response("",{status:500,statusText:"Failed to fetch progressive part"});const{arrayBuffer:g,fullSize:m,mimeType:y}=w,v=Math.min(r-o+1,g.byteLength);r=o+v-1;const S=g.slice(0,v),R=[["Content-Range",`bytes ${o}-${r}/${m}`],["Accept-Ranges","bytes"],["Content-Length",String(v)],["Content-Type",y]];return v<=524288&&r<2097151&&async function(e,n,s,a){const i=e?`${t}_${e}`:t,o=await self.caches.open(i);Promise.all([o.put(new Request(`${n}&type=arrayBuffer`),new Response(s)),o.put(new Request(`${n}&type=headers`),new Response(JSON.stringify(a)))])}(s,l,S,R),new Response(S,{status:206,statusText:"Partial Content",headers:R})}(e)),!0;if(i.includes("/download/"))return e.respondWith(async function(e){const{url:t}=e.request;let n;try{n=await h(e,{url:t,start:0,end:65536})}catch(e){}if(!n)return new Response("",{status:500,statusText:"Failed to fetch file to download"});const s=e.request.url.match(/filename=(.*)/),a=s?`filename="${decodeURIComponent(s[1])}"`:"",{fullSize:i,mimeType:o}=n,r=[["Content-Length",String(i)],["Content-Type",o],["Content-Disposition",`attachment; ${a}`]],c=new g,l=n=>(c.push(h(e,{url:t,start:n,end:n+w-1}).then(e=>e?.arrayBuffer)),n+w);let u=0;const d=new ReadableStream({start(){for(let e=0;e<8&&!(u>=i);e++)u=l(u)},async pull(e){const t=await c.pop();t?(e.enqueue(new Uint8Array(t)),t.byteLengthfetch(e.request),3e3);if(!t?.ok)return o(e);const s=t.clone();return self.caches.open(n).then(t=>t?.put(e.request,s)),t}(e)),!0;if(i.match(N))return e.respondWith(o(e)),!0}return!1}),self.addEventListener("push",function(e){const t=function(e){try{return e.data.json()}catch(e){return}}(e);if(!t||t.mute===m.True)return;const n=function(e){let t=e.title||"Telegram Web A";const n=e.custom?.silent===m.True;return n&&(t+=" 🔕"),{chatId:R(e),messageId:b(e),body:e.description,isSilent:n,title:t}}(t);v.has(n.messageId)?v.delete(n.messageId):e.waitUntil(M(n))}),self.addEventListener("notificationclick",function(e){const t=self.registration.scope;e.notification.close();const{data:n}=e.notification;e.waitUntil((async()=>{const e=await I();if(await Promise.all(e.map(e=>(S[e.id]=n,T(e,n)))),self.clients.openWindow&&!(e.length>0)){S[0]=n;try{const e=await self.clients.openWindow(t);e&&(S[e.id]=n)}catch(e){}}})())}),self.addEventListener("message",e=>{(function(e){if(!e.data)return;const t=e.source;if("clientReady"===e.data.type){const n=S[t.id]||S[0];n&&(delete S[t.id],delete S[0],e.waitUntil(T(t,n)))}if("showMessageNotification"===e.data.type){const t=e.data.payload;e.waitUntil((async()=>(t.chatId&&(await self.registration.getNotifications({tag:t.chatId})).forEach(e=>e.close()),v.add(t.messageId),M(t)))())}"closeMessageNotifications"===e.data.type&&e.waitUntil(async function({chatId:e,lastReadInboxMessageId:t}){const n=await self.registration.getNotifications(),s=t||Number.MAX_VALUE;n.forEach(t=>{("0"===t.tag||t.data.chatId===e&&t.data.messageId<=s)&&t.close()})}(e.data.payload))})(e),function(e){const{source:t,data:n}=e;if(t&&"clientReady"===n.type){const{id:e}=t,n=L.get(e);n?n.resolve():L.set(e,P.resolved())}}(e)})})(); +//# sourceMappingURL=234.2c678b7ae28543b0d415.js.map \ No newline at end of file diff --git a/dist/234.2c678b7ae28543b0d415.js.map b/dist/234.2c678b7ae28543b0d415.js.map new file mode 100644 index 000000000..b4c4da0c9 --- /dev/null +++ b/dist/234.2c678b7ae28543b0d415.js.map @@ -0,0 +1 @@ +{"version":3,"file":"234.2c678b7ae28543b0d415.js","mappings":"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","sources":["webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/serviceWorker/assetCache.ts","webpack://telegram-t/./node_modules/@tauri-apps/api/external/tslib/tslib.es6.js","webpack://telegram-t/./node_modules/@tauri-apps/api/core.js","webpack://telegram-t/./src/util/browser/globalEnvironment.ts","webpack://telegram-t/./src/util/multiaccount.ts","webpack://telegram-t/./src/serviceWorker/progressive.ts","webpack://telegram-t/./src/util/generateUniqueId.ts","webpack://telegram-t/./src/serviceWorker/download.ts","webpack://telegram-t/./src/serviceWorker/pushNotification.ts","webpack://telegram-t/./src/util/Deferred.ts","webpack://telegram-t/./src/serviceWorker/share.ts","webpack://telegram-t/./src/serviceWorker/index.ts"],"sourcesContent":["import type {\n ApiLimitTypeForPromo, ApiPremiumSection, ApiReactionEmoji,\n} from './api/types';\nimport type {\n GiftProfileFilterOptions,\n ResaleGiftsFilterOptions,\n} from './types';\n\nexport const APP_CODE_NAME = 'A';\nexport const APP_NAME = process.env.APP_NAME || `Telegram Web ${APP_CODE_NAME}`;\n\nexport const PRODUCTION_HOSTNAME = 'web.telegram.org';\nexport const PRODUCTION_URL = 'https://web.telegram.org/a';\nexport const WEB_VERSION_BASE = 'https://web.telegram.org/'; // Used to redirect to other versions\nexport const BASE_URL = process.env.BASE_URL;\nexport const ACCOUNT_QUERY = 'account';\n\nexport const IS_MOCKED_CLIENT = process.env.APP_MOCKED_CLIENT === '1';\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\nexport const IS_BETA = process.env.APP_ENV === 'staging';\n\nexport const PAID_MESSAGES_PURPOSE = 'paid_messages';\n\nexport const DEBUG = process.env.APP_ENV !== 'production';\nexport const DEBUG_MORE = false;\nexport const DEBUG_LOG_FILENAME = 'tt-log.json';\nexport const STRICTERDOM_ENABLED = DEBUG;\nexport const FORCE_FALLBACK_LANG = false;\n\nexport const BETA_CHANGELOG_URL = 'https://telegra.ph/WebA-Beta-03-20';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const PAGE_TITLE = process.env.APP_TITLE!;\nexport const PAGE_TITLE_TAURI = 'Telegram Air';\nexport const INACTIVE_MARKER = '[Inactive]';\n\nexport const DEBUG_PAYMENT_SMART_GLOCAL = false;\n\nexport const SESSION_LEGACY_USER_KEY = 'user_auth';\nexport const SESSION_ACCOUNT_PREFIX = 'account';\nexport const LEGACY_PASSCODE_CACHE_NAME = 'tt-passcode';\n\nexport const MULTIACCOUNT_MAX_SLOTS = 6;\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_PREFIX = 'tt-global-state';\nexport const SHARED_STATE_CACHE_KEY = 'tt-shared-state';\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;\nexport const GLOBAL_STATE_CACHE_ARCHIVED_CHAT_LIST_LIMIT = 10;\nexport const GLOBAL_STATE_CACHE_CUSTOM_EMOJI_LIMIT = 150;\n\nexport const IS_SCREEN_LOCKED_CACHE_KEY = 'tt-is-screen-locked';\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v51';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\nexport const DATA_BROADCAST_CHANNEL_PREFIX = 'tt-global';\nexport const ESTABLISH_BROADCAST_CHANNEL_PREFIX = 'tt-establish';\nexport const MULTITAB_LOCALSTORAGE_KEY_PREFIX = 'tt-multitab';\nexport const INTERCLIENT_BROADCAST_CHANNEL = 'tgweb';\nexport const DC_IDS = [1, 2, 3, 4, 5] as const;\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const ARCHIVE_MINIMIZED_HEIGHT = 36;\nexport const CHAT_HEIGHT_PX = 72;\nexport const TOPIC_HEIGHT_PX = 65;\nexport const PEER_PICKER_ITEM_HEIGHT_PX = 56;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const CHAT_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const GLOBAL_TOPIC_SEARCH_SLICE = 5;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const TOPIC_LIST_SENSITIVE_AREA = 600;\n\n// Public Posts Search defaults\nexport const PUBLIC_POSTS_SEARCH_DEFAULT_STARS_AMOUNT = 10;\nexport const PUBLIC_POSTS_SEARCH_DEFAULT_TOTAL_DAILY = 2;\n\n// Suggested Posts defaults\nexport const TON_CURRENCY_CODE = 'TON';\nexport const VERIFY_AGE_MIN_DEFAULT = 18;\n\nexport const STORY_VIEWS_MIN_SEARCH = 15;\nexport const STORY_MIN_REACTIONS_SORT = 10;\nexport const STORY_VIEWS_MIN_CONTACTS_FILTER = 20;\n\nexport const MEDIA_TIMESTAMP_SAVE_MINIMUM_DURATION = 30; // 30s\n\nexport const GLOBAL_SUGGESTED_CHANNELS_ID = 'global';\n\n// As in Telegram for Android\n// https://github.com/DrKLO/Telegram/blob/51e9947527/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java#L7781\nexport const REACTION_UNREAD_SLICE = 100;\nexport const MENTION_UNREAD_SLICE = 100;\nexport const TOPICS_SLICE = 20;\nexport const TOPICS_SLICE_SECOND_LOAD = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\n\nexport const DEFAULT_CHARGE_FOR_MESSAGES = 250;\nexport const MINIMUM_CHARGE_FOR_MESSAGES = 1;\nexport const DEFAULT_MAXIMUM_CHARGE_FOR_MESSAGES = 10000;\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\nexport const PLAYBACK_RATE_FOR_AUDIO_MIN_DURATION = 20 * 60; // 20 min\n\nexport const ANIMATION_LEVEL_CUSTOM = -1;\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MED;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const FOLDERS_POSITION_TOP = 'top';\nexport const FOLDERS_POSITION_LEFT = 'left';\nexport const FOLDERS_POSITION_DEFAULT = FOLDERS_POSITION_TOP;\n\nexport const PREVIEW_AVATAR_COUNT = 3;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\n// 10000s from https://corefork.telegram.org/api/url-authorization#automatic-authorization\nexport const APP_CONFIG_REFETCH_INTERVAL = 10000 * 1000;\nexport const GENERAL_REFETCH_INTERVAL = 60 * 60 * 1000; // 1h\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\nexport const EDITABLE_STORY_INPUT_ID = 'editable-story-input-text';\n// eslint-disable-next-line @stylistic/max-len\nexport const EDITABLE_INPUT_CSS_SELECTOR = `.messages-layout .Transition_slide-active #${EDITABLE_INPUT_ID}, .messages-layout .Transition > .Transition_slide-to #${EDITABLE_INPUT_ID}`;\nexport const EDITABLE_INPUT_MODAL_CSS_SELECTOR = `#${EDITABLE_INPUT_MODAL_ID}`;\nexport const EDITABLE_STORY_INPUT_CSS_SELECTOR = `#${EDITABLE_STORY_INPUT_ID}`;\n\nexport const CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\nexport const MESSAGE_CONTENT_CLASS_NAME = 'message-content';\nexport const MESSAGE_CONTENT_SELECTOR = '.message-content';\nexport const VT_CLASS_NAME = 'active-view-transition';\nexport const VT_TYPE_CLASS_PREFIX = 'active-vt-';\n\nexport const RESIZE_HANDLE_CLASS_NAME = 'resizeHandle';\nexport const RESIZE_HANDLE_SELECTOR = `.${RESIZE_HANDLE_CLASS_NAME}`;\n\nexport const SNAP_EFFECT_CONTAINER_ID = 'snap-effect-container';\nexport const SNAP_EFFECT_ID = 'snap-effect';\n\nexport const STARS_ICON_PLACEHOLDER = '⭐';\nexport const STARS_CURRENCY_CODE = 'XTR';\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const MAX_INT_32 = 2 ** 31 - 1;\nexport const TMP_CHAT_ID = '0';\n\nexport const MUTE_INDEFINITE_TIMESTAMP = MAX_INT_32;\nexport const UNMUTE_TIMESTAMP = 0;\n\nexport const ANIMATION_END_DELAY = 100;\nexport const ANIMATION_WAVE_MIN_INTERVAL = 200;\nexport const MESSAGE_APPEARANCE_DELAY = 10;\nexport const PAID_SEND_DELAY = 5000;\n\nexport const SCROLL_MIN_DURATION = 300;\nexport const SCROLL_MAX_DURATION = 600;\nexport const SCROLL_MAX_DISTANCE = 800;\nexport const SCROLL_SHORT_TRANSITION_MAX_DISTANCE = 300; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((SCROLL_MIN_DURATION + SCROLL_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage',\n 'newScheduledMessage',\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'deleteHistory',\n 'deleteParticipantHistory',\n]);\n\nexport const LOCK_SCREEN_ANIMATION_DURATION_MS = 200;\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 72;\nexport const EMOJI_SIZE_PICKER = 36;\nexport const COMPOSER_EMOJI_SIZE_PICKER = 32;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 40;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_PICKER_MAX_SHARED_COVERS = 20;\nexport const STICKER_SIZE_SEARCH = 72;\nexport const STICKER_SIZE_MODAL = 72;\nexport const EMOJI_SIZE_MODAL = 36;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_PASSCODE = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 100;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const STICKER_SIZE_JOIN_REQUESTS = 140;\nexport const STICKER_SIZE_INVITES = 140;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const RECENT_STATUS_LIMIT = 20;\nexport const EMOJI_STATUS_LOOP_LIMIT = 2;\nexport const EMOJI_SIZES = 7;\nexport const TOP_SYMBOL_SET_ID = 'top';\nexport const POPULAR_SYMBOL_SET_ID = 'popular';\nexport const RECENT_SYMBOL_SET_ID = 'recent';\nexport const COLLECTIBLE_STATUS_SET_ID = 'collectibleStatus';\nexport const FAVORITE_SYMBOL_SET_ID = 'favorite';\nexport const EFFECT_STICKERS_SET_ID = 'effectStickers';\nexport const EFFECT_EMOJIS_SET_ID = 'effectEmojis';\nexport const CHAT_STICKER_SET_ID = 'chatStickers';\nexport const DEFAULT_TOPIC_ICON_STICKER_ID = 'topic-default-icon';\nexport const DEFAULT_STATUS_ICON_ID = 'status-default-icon';\nexport const EMOJI_IMG_REGEX = /]+alt=\"([^\"]+)\"(?![^>]*data-document-id)[^>]*>/gm;\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const BIRTHDAY_NUMBERS_SET = 'FestiveFontEmoji';\nexport const RESTRICTED_EMOJI_SET = 'RestrictedEmoji';\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const SVG_EXTENSIONS = new Set(['svg', 'svgz']);\n\nexport const VIDEO_WEBM_TYPE = 'video/webm';\nexport const GIF_MIME_TYPE = 'image/gif';\n\nexport const LOTTIE_STICKER_MIME_TYPE = 'application/x-tgsticker';\nexport const VIDEO_STICKER_MIME_TYPE = VIDEO_WEBM_TYPE;\n\nexport const SUPPORTED_PHOTO_CONTENT_TYPES = new Set([\n 'image/png', 'image/jpeg', GIF_MIME_TYPE,\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', 'video/quicktime',\n]);\n\nexport const SUPPORTED_AUDIO_CONTENT_TYPES = new Set([\n 'audio/mp3',\n 'audio/ogg',\n 'audio/wav',\n 'audio/mpeg',\n 'audio/flac',\n 'audio/aac',\n 'audio/m4a',\n 'audio/mp4',\n 'audio/x-m4a',\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_PHOTO_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\n\nexport const STORYBOARD_MIME = 'application/x-tgstoryboard';\nexport const STORYBOARD_MAP_MIME = 'application/x-tgstoryboardmap';\n\n// Taken from https://github.com/telegramdesktop/tdesktop/blob/41d9a9fcbd0c809c60ddbd9350791b1436aff7d9/Telegram/SourceFiles/ui/boxes/choose_language_box.cpp#L28\nexport const SUPPORTED_TRANSLATION_LANGUAGES = [\n // Official\n 'en', 'ar', 'be', 'ca', 'zh', 'nl', 'fr', 'de', 'id',\n 'it', 'ja', 'ko', 'pl', 'pt', 'ru', 'es', 'uk',\n // Unofficial\n 'af', 'sq', 'am', 'hy', 'az', 'eu', 'bn', 'bs', 'bg',\n 'ceb', 'zh-CN', 'zh-TW', 'co', 'hr', 'cs', 'da', 'eo',\n 'et', 'fi', 'fy', 'gl', 'ka', 'el', 'gu', 'ht', 'ha',\n 'haw', 'he', 'iw', 'hi', 'hmn', 'hu', 'is', 'ig', 'ga',\n 'jv', 'kn', 'kk', 'km', 'rw', 'ku', 'ky', 'lo', 'la',\n 'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi',\n 'mr', 'mn', 'my', 'ne', 'no', 'ny', 'or', 'ps', 'fa',\n 'pa', 'ro', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si',\n 'sk', 'sl', 'so', 'su', 'sw', 'sv', 'tl', 'tg', 'ta',\n 'tt', 'te', 'th', 'tr', 'tk', 'ur', 'ug', 'uz', 'vi',\n 'cy', 'xh', 'yi', 'yo', 'zu',\n];\n\n// eslint-disable-next-line @stylistic/max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z][-a-zA-Z0-9]{1,62})\\\\b([-a-zA-Z0-9()@:%_+.,~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?/i;\nexport const RE_TME_LINK = /^(https?:\\/\\/)?([-a-zA-Z0-9@:%_+~#=]{1,32}\\.)?t\\.me/i;\nexport const RE_TELEGRAM_LINK = /^(https?:\\/\\/)?telegram\\.org\\//i;\nexport const TME_LINK_PREFIX = 'https://t.me/';\nexport const BOT_FATHER_USERNAME = 'botfather';\nexport const USERNAME_PURCHASE_ERROR = 'USERNAME_PURCHASE_AVAILABLE';\nexport const MESSAGE_ID_REQUIRED_ERROR = 'MESSAGE_ID_REQUIRED';\nexport const PURCHASE_USERNAME = 'auction';\nexport const ACCEPTABLE_USERNAME_ERRORS = new Set([USERNAME_PURCHASE_ERROR, 'USERNAME_INVALID']);\nexport const TME_WEB_DOMAINS = new Set(['t.me', 'web.t.me', 'a.t.me', 'k.t.me', 'z.t.me']);\nexport const WEB_APP_PLATFORM = 'weba';\nexport const LANG_PACK = 'weba';\n\nexport const NSFW_RESTRICTION_REASON = 'sensitive';\n\n// eslint-disable-next-line @stylistic/max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\nexport const API_CHAT_TYPES = ['bots', 'channels', 'chats', 'users', 'groups'] as const;\n\nexport const HEART_REACTION: ApiReactionEmoji = {\n type: 'emoji',\n emoticon: '❤',\n};\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\nexport const VERIFICATION_CODES_USER_ID = '489000';\nexport const ANONYMOUS_USER_ID = '2666000';\nexport const RESTRICTED_EMOJI_SET_ID = '7173162320003080';\nexport const COCOON_EMOJI_ID = '5197252827247841976';\nexport const LOCAL_MESSAGES_LIMIT = 1e6; // 1M\nexport const CHANNEL_ID_BASE = 10n ** 12n;\nexport const DEFAULT_GIF_SEARCH_BOT_USERNAME = 'gif';\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const SAVED_FOLDER_ID = -1;\nexport const FOLDER_TITLE_MAX_LENGTH = 12;\nexport const DELETED_COMMENTS_CHANNEL_ID = (-CHANNEL_ID_BASE - 777n).toString();\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const FAQ_URL = 'https://telegram.org/faq';\nexport const PRIVACY_URL = 'https://telegram.org/privacy';\nexport const MINI_APP_TOS_URL = 'https://telegram.org/tos/mini-apps';\nexport const FRAGMENT_ADS_URL = 'https://fragment.com/ads';\nexport const GENERAL_TOPIC_ID = 1;\nexport const FRESH_AUTH_PERIOD = 86400; // 1 day\nexport const GIVEAWAY_BOOST_PER_PREMIUM = 4;\nexport const GIVEAWAY_MAX_ADDITIONAL_CHANNELS = 10;\nexport const GIVEAWAY_MAX_ADDITIONAL_USERS = 10;\nexport const GIVEAWAY_MAX_ADDITIONAL_COUNTRIES = 10;\nexport const FRAGMENT_PHONE_CODE = '888';\nexport const FRAGMENT_PHONE_LENGTH = 11;\nexport const BOT_VERIFICATION_PEERS_LIMIT = 20;\n\nexport const LIGHT_THEME_BG_COLOR = '#99BA92';\nexport const DARK_THEME_BG_COLOR = '#000000';\nexport const DEFAULT_PATTERN_COLOR = '#4A8E3A8C';\nexport const DARK_THEME_PATTERN_COLOR = '#48576166';\nexport const PEER_COLOR_BG_OPACITY = '1a';\nexport const PEER_COLOR_BG_ACTIVE_OPACITY = '2b';\nexport const PEER_COLOR_GRADIENT_STEP = 5; // px\nexport const MAX_UPLOAD_FILEPART_SIZE = 524288;\n\nexport const IGNORE_UNHANDLED_ERRORS = new Set([\n 'USER_CANCELED',\n]);\n\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\n\nexport const ONE_TIME_MEDIA_TTL_SECONDS = 2147483647;\n\n// Premium\nexport const PREMIUM_FEATURE_SECTIONS = [\n 'stories',\n 'double_limits',\n 'more_upload',\n 'faster_download',\n 'voice_to_text',\n 'no_ads',\n 'infinite_reactions',\n 'premium_stickers',\n 'animated_emoji',\n 'advanced_chat_management',\n 'profile_badge',\n 'animated_userpics',\n 'emoji_status',\n 'translations',\n 'saved_tags',\n 'last_seen',\n 'message_privacy',\n 'effects',\n 'todo',\n] as const;\n\nexport const PREMIUM_BOTTOM_VIDEOS: ApiPremiumSection[] = [\n 'faster_download',\n 'voice_to_text',\n 'advanced_chat_management',\n 'infinite_reactions',\n 'profile_badge',\n 'animated_userpics',\n 'emoji_status',\n 'translations',\n 'saved_tags',\n 'last_seen',\n 'message_privacy',\n 'effects',\n 'todo',\n];\n\nexport const PREMIUM_LIMITS_ORDER: ApiLimitTypeForPromo[] = [\n 'channels',\n 'dialogFolderPinned',\n 'channelsPublic',\n 'savedGifs',\n 'stickersFaved',\n 'aboutLength',\n 'captionLength',\n 'dialogFilters',\n 'dialogFiltersChats',\n 'moreAccounts',\n 'recommendedChannels',\n];\n\nexport const DEFAULT_GIFT_PROFILE_FILTER_OPTIONS: GiftProfileFilterOptions = {\n sortType: 'byDate',\n shouldIncludeUnlimited: true,\n shouldIncludeLimited: true,\n shouldIncludeUnique: true,\n shouldIncludeDisplayed: true,\n shouldIncludeHidden: true,\n shouldIncludeUpgradable: true,\n} as const;\n\nexport const DEFAULT_RESALE_GIFTS_FILTER_OPTIONS: ResaleGiftsFilterOptions = {\n sortType: 'byDate',\n};\n\nexport const ACCOUNT_TTL_OPTIONS = [1, 3, 6, 12, 18, 24];\n\nexport const SLOT_MACHINE_EMOJI = '🎰';\n","export type Scheduler = typeof requestAnimationFrame | typeof onTickEnd;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n fn(...args);\n }\n\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n fn(...args);\n }\n\n interval = self.setInterval(() => {\n if (!isPending) {\n self.clearInterval(interval);\n interval = undefined;\n return;\n }\n\n isPending = false;\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nconst FAST_RAF_TIMEOUT_FALLBACK_MS = 35; // < 30 FPS\n\nlet fastRafCallbacks: Set | undefined;\nlet fastRafFallbackCallbacks: Set | undefined;\nlet fastRafFallbackTimeout: number | undefined;\n\n// May result in an immediate execution if called from another RAF callback which was scheduled\n// (and therefore is executed) earlier than RAF callback scheduled by `fastRaf`\nexport function fastRaf(callback: NoneToVoidFunction, withTimeoutFallback = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = new Set([callback]);\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n\n fastRafCallbacks = undefined;\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.add(callback);\n }\n\n if (withTimeoutFallback) {\n if (!fastRafFallbackCallbacks) {\n fastRafFallbackCallbacks = new Set([callback]);\n } else {\n fastRafFallbackCallbacks.add(callback);\n }\n\n if (!fastRafFallbackTimeout) {\n fastRafFallbackTimeout = window.setTimeout(() => {\n const currentTimeoutCallbacks = fastRafFallbackCallbacks!;\n\n if (fastRafCallbacks) {\n const currentCallbacks = fastRafCallbacks;\n currentTimeoutCallbacks.forEach((c) => currentCallbacks.delete(c));\n }\n fastRafFallbackCallbacks = undefined;\n\n if (fastRafFallbackTimeout) {\n clearTimeout(fastRafFallbackTimeout);\n fastRafFallbackTimeout = undefined;\n }\n\n currentTimeoutCallbacks.forEach((cb) => cb());\n }, FAST_RAF_TIMEOUT_FALLBACK_MS);\n }\n }\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = [callback];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n onTickEndCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nconst IDLE_TIMEOUT = 500;\n\nlet onIdleCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onIdle(callback: NoneToVoidFunction) {\n if (!self.requestIdleCallback) {\n onTickEnd(callback);\n return;\n }\n\n if (!onIdleCallbacks) {\n onIdleCallbacks = [callback];\n\n requestIdleCallback((deadline) => {\n const currentCallbacks = onIdleCallbacks!;\n onIdleCallbacks = undefined;\n\n while (currentCallbacks.length) {\n const cb = currentCallbacks.shift()!;\n cb();\n\n if (!deadline.timeRemaining()) break;\n }\n\n if (currentCallbacks.length) {\n if (onIdleCallbacks) {\n // Prepend the remaining callbacks if the next pass is already planned\n onIdleCallbacks = currentCallbacks.concat(onIdleCallbacks);\n } else {\n currentCallbacks.forEach(onIdle);\n }\n }\n }, { timeout: IDLE_TIMEOUT });\n } else {\n onIdleCallbacks.push(callback);\n }\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","import { ASSET_CACHE_NAME } from '../config';\nimport { pause } from '../util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\n// An attempt to fix freezing UI on iOS\nconst TIMEOUT = 3000;\n\nexport async function respondWithCacheNetworkFirst(e: FetchEvent) {\n const remote = await withTimeout(() => fetch(e.request), TIMEOUT);\n if (!remote?.ok) {\n return respondWithCache(e);\n }\n\n const toCache = remote.clone();\n self.caches.open(ASSET_CACHE_NAME).then((cache) => {\n return cache?.put(e.request, toCache);\n });\n\n return remote;\n}\n\nexport async function respondWithCache(e: FetchEvent) {\n const cacheResult = await withTimeout(async () => {\n const cache = await self.caches.open(ASSET_CACHE_NAME);\n const cached = await cache.match(e.request);\n\n return { cache, cached };\n }, TIMEOUT);\n\n const { cache, cached } = cacheResult || {};\n\n if (cache && cached) {\n if (cached.ok) {\n return cached;\n } else {\n await cache.delete(e.request);\n }\n }\n\n const remote = await fetch(e.request);\n\n if (remote.ok && cache) {\n cache.put(e.request, remote.clone());\n }\n\n return remote;\n}\n\nasync function withTimeout(cb: () => Promise, timeout: number) {\n let isResolved = false;\n\n try {\n return await Promise.race([\n pause(timeout).then(() => (isResolved ? undefined : Promise.reject(new Error('TIMEOUT')))),\n cb(),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n } finally {\n isResolved = true;\n }\n}\n\nexport function clearAssetCache() {\n return self.caches.delete(ASSET_CACHE_NAME);\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nexport { __classPrivateFieldGet, __classPrivateFieldSet };\n","import { __classPrivateFieldGet, __classPrivateFieldSet } from './external/tslib/tslib.es6.js';\n\n// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\nvar _Channel_onmessage, _Channel_nextMessageIndex, _Channel_pendingMessages, _Channel_messageEndIndex, _Resource_rid;\n/**\n * Invoke your custom commands.\n *\n * This package is also accessible with `window.__TAURI__.core` when [`app.withGlobalTauri`](https://v2.tauri.app/reference/config/#withglobaltauri) in `tauri.conf.json` is set to `true`.\n * @module\n */\n/**\n * A key to be used to implement a special function\n * on your types that define how your type should be serialized\n * when passing across the IPC.\n * @example\n * Given a type in Rust that looks like this\n * ```rs\n * #[derive(serde::Serialize, serde::Deserialize)\n * enum UserId {\n * String(String),\n * Number(u32),\n * }\n * ```\n * `UserId::String(\"id\")` would be serialized into `{ String: \"id\" }`\n * and so we need to pass the same structure back to Rust\n * ```ts\n * import { SERIALIZE_TO_IPC_FN } from \"@tauri-apps/api/core\"\n *\n * class UserIdString {\n * id\n * constructor(id) {\n * this.id = id\n * }\n *\n * [SERIALIZE_TO_IPC_FN]() {\n * return { String: this.id }\n * }\n * }\n *\n * class UserIdNumber {\n * id\n * constructor(id) {\n * this.id = id\n * }\n *\n * [SERIALIZE_TO_IPC_FN]() {\n * return { Number: this.id }\n * }\n * }\n *\n * type UserId = UserIdString | UserIdNumber\n * ```\n *\n */\n// if this value changes, make sure to update it in:\n// 1. ipc.js\n// 2. process-ipc-message-fn.js\nconst SERIALIZE_TO_IPC_FN = '__TAURI_TO_IPC_KEY__';\n/**\n * Stores the callback in a known location, and returns an identifier that can be passed to the backend.\n * The backend uses the identifier to `eval()` the callback.\n *\n * @return An unique identifier associated with the callback function.\n *\n * @since 1.0.0\n */\nfunction transformCallback(\n// TODO: Make this not optional in v3\ncallback, once = false) {\n return window.__TAURI_INTERNALS__.transformCallback(callback, once);\n}\nclass Channel {\n constructor(onmessage) {\n _Channel_onmessage.set(this, void 0);\n // the index is used as a mechanism to preserve message order\n _Channel_nextMessageIndex.set(this, 0);\n _Channel_pendingMessages.set(this, []);\n _Channel_messageEndIndex.set(this, void 0);\n __classPrivateFieldSet(this, _Channel_onmessage, onmessage || (() => { }), \"f\");\n this.id = transformCallback((rawMessage) => {\n const index = rawMessage.index;\n if ('end' in rawMessage) {\n if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n this.cleanupCallback();\n }\n else {\n __classPrivateFieldSet(this, _Channel_messageEndIndex, index, \"f\");\n }\n return;\n }\n const message = rawMessage.message;\n // Process the message if we're at the right order\n if (index == __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")) {\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n // process pending messages\n while (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") in __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")) {\n const message = __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n __classPrivateFieldGet(this, _Channel_onmessage, \"f\").call(this, message);\n // eslint-disable-next-line @typescript-eslint/no-array-delete\n delete __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\")];\n __classPrivateFieldSet(this, _Channel_nextMessageIndex, __classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") + 1, \"f\");\n }\n if (__classPrivateFieldGet(this, _Channel_nextMessageIndex, \"f\") === __classPrivateFieldGet(this, _Channel_messageEndIndex, \"f\")) {\n this.cleanupCallback();\n }\n }\n // Queue the message if we're not\n else {\n // eslint-disable-next-line security/detect-object-injection\n __classPrivateFieldGet(this, _Channel_pendingMessages, \"f\")[index] = message;\n }\n });\n }\n cleanupCallback() {\n window.__TAURI_INTERNALS__.unregisterCallback(this.id);\n }\n set onmessage(handler) {\n __classPrivateFieldSet(this, _Channel_onmessage, handler, \"f\");\n }\n get onmessage() {\n return __classPrivateFieldGet(this, _Channel_onmessage, \"f\");\n }\n [(_Channel_onmessage = new WeakMap(), _Channel_nextMessageIndex = new WeakMap(), _Channel_pendingMessages = new WeakMap(), _Channel_messageEndIndex = new WeakMap(), SERIALIZE_TO_IPC_FN)]() {\n return `__CHANNEL__:${this.id}`;\n }\n toJSON() {\n // eslint-disable-next-line security/detect-object-injection\n return this[SERIALIZE_TO_IPC_FN]();\n }\n}\nclass PluginListener {\n constructor(plugin, event, channelId) {\n this.plugin = plugin;\n this.event = event;\n this.channelId = channelId;\n }\n async unregister() {\n return invoke(`plugin:${this.plugin}|remove_listener`, {\n event: this.event,\n channelId: this.channelId\n });\n }\n}\n/**\n * Adds a listener to a plugin event.\n *\n * @returns The listener object to stop listening to the events.\n *\n * @since 2.0.0\n */\nasync function addPluginListener(plugin, event, cb) {\n const handler = new Channel(cb);\n try {\n await invoke(`plugin:${plugin}|register_listener`, {\n event,\n handler\n });\n return new PluginListener(plugin, event, handler.id);\n }\n catch {\n // TODO(v3): remove this fallback\n // note: we must try with camelCase here for backwards compatibility\n await invoke(`plugin:${plugin}|registerListener`, { event, handler });\n return new PluginListener(plugin, event, handler.id);\n }\n}\n/**\n * Get permission state for a plugin.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function checkPermissions(plugin) {\n return invoke(`plugin:${plugin}|check_permissions`);\n}\n/**\n * Request permissions.\n *\n * This should be used by plugin authors to wrap their actual implementation.\n */\nasync function requestPermissions(plugin) {\n return invoke(`plugin:${plugin}|request_permissions`);\n}\n/**\n * Sends a message to the backend.\n * @example\n * ```typescript\n * import { invoke } from '@tauri-apps/api/core';\n * await invoke('login', { user: 'tauri', password: 'poiwe3h4r5ip3yrhtew9ty' });\n * ```\n *\n * @param cmd The command name.\n * @param args The optional arguments to pass to the command.\n * @param options The request options.\n * @return A promise resolving or rejecting to the backend response.\n *\n * @since 1.0.0\n */\nasync function invoke(cmd, args = {}, options) {\n return window.__TAURI_INTERNALS__.invoke(cmd, args, options);\n}\n/**\n * Convert a device file path to an URL that can be loaded by the webview.\n * Note that `asset:` and `http://asset.localhost` must be added to [`app.security.csp`](https://v2.tauri.app/reference/config/#csp-1) in `tauri.conf.json`.\n * Example CSP value: `\"csp\": \"default-src 'self' ipc: http://ipc.localhost; img-src 'self' asset: http://asset.localhost\"` to use the asset protocol on image sources.\n *\n * Additionally, `\"enable\" : \"true\"` must be added to [`app.security.assetProtocol`](https://v2.tauri.app/reference/config/#assetprotocolconfig)\n * in `tauri.conf.json` and its access scope must be defined on the `scope` array on the same `assetProtocol` object.\n *\n * @param filePath The file path.\n * @param protocol The protocol to use. Defaults to `asset`. You only need to set this when using a custom protocol.\n * @example\n * ```typescript\n * import { appDataDir, join } from '@tauri-apps/api/path';\n * import { convertFileSrc } from '@tauri-apps/api/core';\n * const appDataDirPath = await appDataDir();\n * const filePath = await join(appDataDirPath, 'assets/video.mp4');\n * const assetUrl = convertFileSrc(filePath);\n *\n * const video = document.getElementById('my-video');\n * const source = document.createElement('source');\n * source.type = 'video/mp4';\n * source.src = assetUrl;\n * video.appendChild(source);\n * video.load();\n * ```\n *\n * @return the URL that can be used as source on the webview.\n *\n * @since 1.0.0\n */\nfunction convertFileSrc(filePath, protocol = 'asset') {\n return window.__TAURI_INTERNALS__.convertFileSrc(filePath, protocol);\n}\n/**\n * A rust-backed resource stored through `tauri::Manager::resources_table` API.\n *\n * The resource lives in the main process and does not exist\n * in the Javascript world, and thus will not be cleaned up automatically\n * except on application exit. If you want to clean it up early, call {@linkcode Resource.close}\n *\n * @example\n * ```typescript\n * import { Resource, invoke } from '@tauri-apps/api/core';\n * export class DatabaseHandle extends Resource {\n * static async open(path: string): Promise {\n * const rid: number = await invoke('open_db', { path });\n * return new DatabaseHandle(rid);\n * }\n *\n * async execute(sql: string): Promise {\n * await invoke('execute_sql', { rid: this.rid, sql });\n * }\n * }\n * ```\n */\nclass Resource {\n get rid() {\n return __classPrivateFieldGet(this, _Resource_rid, \"f\");\n }\n constructor(rid) {\n _Resource_rid.set(this, void 0);\n __classPrivateFieldSet(this, _Resource_rid, rid, \"f\");\n }\n /**\n * Destroys and cleans up this resource from memory.\n * **You should not call any method on this object anymore and should drop any reference to it.**\n */\n async close() {\n return invoke('plugin:resources|close', {\n rid: this.rid\n });\n }\n}\n_Resource_rid = new WeakMap();\nfunction isTauri() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n return !!(globalThis || window).isTauri;\n}\n\nexport { Channel, PluginListener, Resource, SERIALIZE_TO_IPC_FN, addPluginListener, checkPermissions, convertFileSrc, invoke, isTauri, requestPermissions, transformCallback };\n","import { isTauri } from '@tauri-apps/api/core';\n\ndeclare const globalThis: ServiceWorkerGlobalScope & WorkerGlobalScope & SharedWorkerGlobalScope & Window;\n\nexport const IS_MULTIACCOUNT_SUPPORTED = 'SharedWorker' in globalThis;\nexport const IS_INTL_LIST_FORMAT_SUPPORTED = 'ListFormat' in Intl;\nexport const IS_BAD_URL_PARSER = new URL('tg://host').host !== 'host';\n\nexport const IS_TAURI = isTauri();\n// @ts-expect-error no types for electron\nexport const IS_ELECTRON = Boolean(globalThis.electron);\n","import type { AccountInfo, SessionUserInfo, SharedSessionData } from '../types';\n\nimport {\n ACCOUNT_QUERY,\n DATA_BROADCAST_CHANNEL_PREFIX,\n ESTABLISH_BROADCAST_CHANNEL_PREFIX,\n GLOBAL_STATE_CACHE_PREFIX,\n MULTITAB_LOCALSTORAGE_KEY_PREFIX,\n SESSION_ACCOUNT_PREFIX,\n} from '../config';\nimport { IS_MULTIACCOUNT_SUPPORTED } from './browser/globalEnvironment';\n\nconst WORKER_NAME = typeof WorkerGlobalScope !== 'undefined' && globalThis.self instanceof WorkerGlobalScope\n ? globalThis.self.name : undefined;\nconst WORKER_ACCOUNT_SLOT = WORKER_NAME ? Number(new URLSearchParams(WORKER_NAME).get(ACCOUNT_QUERY)) : undefined;\n\nexport const ACCOUNT_SLOT = WORKER_ACCOUNT_SLOT || (\n IS_MULTIACCOUNT_SUPPORTED ? getAccountSlot(globalThis.location.href) : undefined\n);\n\nexport const DATA_BROADCAST_CHANNEL_NAME = `${DATA_BROADCAST_CHANNEL_PREFIX}_${ACCOUNT_SLOT || 1}`;\nexport const ESTABLISH_BROADCAST_CHANNEL_NAME = `${ESTABLISH_BROADCAST_CHANNEL_PREFIX}_${ACCOUNT_SLOT || 1}`;\nexport const MULTITAB_STORAGE_KEY = `${MULTITAB_LOCALSTORAGE_KEY_PREFIX}_${ACCOUNT_SLOT || 1}`;\nexport const GLOBAL_STATE_CACHE_KEY = ACCOUNT_SLOT\n ? `${GLOBAL_STATE_CACHE_PREFIX}_${ACCOUNT_SLOT}` : GLOBAL_STATE_CACHE_PREFIX;\n\nexport function getAccountSlot(url: string) {\n const params = new URL(url).searchParams;\n const slot = params.get(ACCOUNT_QUERY);\n const slotNumber = slot ? Number(slot) : 1;\n if (!slotNumber || Number.isNaN(slotNumber) || slotNumber === 1) return undefined;\n return slotNumber;\n}\n\nexport function getAccountsInfo() {\n if (!IS_MULTIACCOUNT_SUPPORTED) return {};\n const allKeys = Object.keys(localStorage);\n const allSlots = allKeys.filter((key) => key.startsWith(SESSION_ACCOUNT_PREFIX));\n const accountInfo: Record = {};\n for (const key of allSlots) {\n const i = Number(key.slice(SESSION_ACCOUNT_PREFIX.length));\n const info = getAccountInfo(i);\n if (info) {\n accountInfo[i] = info;\n }\n }\n return accountInfo;\n}\n\nfunction getAccountInfo(slot: number): AccountInfo | undefined {\n const sessionData = loadSlotSession(slot);\n const {\n userId, avatarUri, color, emojiStatusId, firstName, lastName, isPremium, isTest, phone,\n } = sessionData || {};\n\n if (!userId) return undefined;\n\n return {\n userId,\n avatarUri,\n color,\n emojiStatusId,\n firstName,\n lastName,\n isPremium,\n isTest,\n phone,\n };\n}\n\nexport function loadSlotSession(slot: number | undefined): SharedSessionData | undefined {\n try {\n const data = JSON.parse(localStorage.getItem(`${SESSION_ACCOUNT_PREFIX}${slot || 1}`) || '{}') as SharedSessionData;\n if (!data.dcId) return undefined;\n return data;\n } catch (e) {\n return undefined;\n }\n}\n\nexport function storeAccountData(slot: number | undefined, data: Partial) {\n const currentSlotData = loadSlotSession(slot);\n\n if (!currentSlotData) return;\n\n const updatedSharedData: SharedSessionData = {\n ...currentSlotData,\n ...data,\n };\n\n if (!updatedSharedData.userId) return;\n\n writeSlotSession(slot, updatedSharedData);\n}\n\nexport function writeSlotSession(slot: number | undefined, data: SharedSessionData) {\n localStorage.setItem(`${SESSION_ACCOUNT_PREFIX}${slot || 1}`, JSON.stringify(data));\n}\n\nexport function getAccountSlotUrl(slot: number, forLogin?: boolean, isTest?: boolean) {\n const url = new URL(globalThis.location.href);\n if (slot !== 1) {\n url.searchParams.set(ACCOUNT_QUERY, String(slot));\n } else {\n url.searchParams.delete(ACCOUNT_QUERY);\n }\n\n if (isTest) {\n url.searchParams.set('test', 'true');\n } else {\n url.searchParams.delete('test');\n }\n\n url.hash = forLogin ? 'login' : '';\n return url.toString();\n}\n\n// Validate current version across all tabs to avoid conflicts\nif (typeof window === 'object') {\n const versionChannel = new BroadcastChannel('tt-version');\n versionChannel.postMessage({ version: APP_VERSION });\n\n versionChannel.addEventListener('message', (event) => {\n const { version } = event.data;\n if (!version) return;\n if (semverCompare(APP_VERSION, version) === -1) {\n window.location.reload();\n }\n\n // If incoming version is older, send back the current version\n if (semverCompare(APP_VERSION, version) === 1) {\n versionChannel.postMessage({ version: APP_VERSION });\n }\n });\n}\n\nfunction semverCompare(a: string, b: string) {\n if (a.startsWith(`${b}-`)) return -1;\n if (b.startsWith(`${a}-`)) return 1;\n return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'case', caseFirst: 'upper' });\n}\n","import {\n DEBUG,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_PROGRESSIVE_CACHE_DISABLED,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n} from '../config';\nimport generateUniqueId from '../util/generateUniqueId';\nimport { getAccountSlot } from '../util/multiaccount';\nimport { pause } from '../util/schedulers';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype PartInfo = {\n type: 'PartInfo';\n arrayBuffer: ArrayBuffer;\n mimeType: 'string';\n fullSize: number;\n};\n\ntype RequestStates = {\n resolve: (response: PartInfo) => void;\n reject: () => void;\n};\n\nconst MB = 1024 * 1024;\nconst DEFAULT_PART_SIZE = 0.5 * MB;\nconst MAX_END_TO_CACHE = 2 * MB - 1; // We only cache the first 2 MB of each file\nconst PART_TIMEOUT = 60000;\n\nconst requestStates = new Map();\n\nexport async function respondForProgressive(e: FetchEvent) {\n const { url } = e.request;\n const accountSlot = getAccountSlot(url);\n const range = e.request.headers.get('range');\n const bytes = /^bytes=(\\d+)-(\\d+)?$/g.exec(range || '')!;\n const start = Number(bytes[1]);\n const originalEnd = Number(bytes[2]);\n\n let end = originalEnd;\n if (!end || (end - start + 1) > DEFAULT_PART_SIZE) {\n end = start + DEFAULT_PART_SIZE - 1;\n }\n\n const parsedUrl = new URL(url);\n\n // Optimization for Safari\n if (start === 0 && end === 1) {\n const fileSizeParam = parsedUrl.searchParams.get('fileSize');\n const fileSize = fileSizeParam && Number(fileSizeParam);\n const mimeType = parsedUrl.searchParams.get('mimeType');\n\n if (fileSize && mimeType) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: [\n ['Content-Range', `bytes 0-1/${fileSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', '2'],\n ['Content-Type', mimeType],\n ],\n });\n }\n }\n\n parsedUrl.searchParams.set('start', String(start));\n parsedUrl.searchParams.set('end', String(end));\n const cacheKey = parsedUrl.href;\n const [cachedArrayBuffer, cachedHeaders] = !MEDIA_PROGRESSIVE_CACHE_DISABLED\n ? await fetchFromCache(accountSlot, cacheKey) : [];\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(\n `FETCH PROGRESSIVE ${cacheKey} (request: ${start}-${originalEnd}) CACHED: ${Boolean(cachedArrayBuffer)}`,\n );\n }\n\n if (cachedArrayBuffer) {\n return new Response(cachedArrayBuffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: cachedHeaders,\n });\n }\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start, end });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH PROGRESSIVE', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch progressive part',\n });\n }\n\n const { arrayBuffer, fullSize, mimeType } = partInfo;\n\n const partSize = Math.min(end - start + 1, arrayBuffer.byteLength);\n end = start + partSize - 1;\n const arrayBufferPart = arrayBuffer.slice(0, partSize);\n const headers: [string, string][] = [\n ['Content-Range', `bytes ${start}-${end}/${fullSize}`],\n ['Accept-Ranges', 'bytes'],\n ['Content-Length', String(partSize)],\n ['Content-Type', mimeType],\n ];\n\n if (!MEDIA_PROGRESSIVE_CACHE_DISABLED && partSize <= MEDIA_CACHE_MAX_BYTES && end < MAX_END_TO_CACHE) {\n saveToCache(accountSlot, cacheKey, arrayBufferPart, headers);\n }\n\n return new Response(arrayBufferPart, {\n status: 206,\n statusText: 'Partial Content',\n headers,\n });\n}\n\n// We can not cache 206 responses: https://github.com/GoogleChrome/workbox/issues/1644#issuecomment-638741359\nasync function fetchFromCache(accountSlot: number | undefined, cacheKey: string) {\n const cacheName = !accountSlot ? MEDIA_PROGRESSIVE_CACHE_NAME : `${MEDIA_PROGRESSIVE_CACHE_NAME}_${accountSlot}`;\n const cache = await self.caches.open(cacheName);\n\n return Promise.all([\n cache.match(`${cacheKey}&type=arrayBuffer`).then((r) => (r ? r.arrayBuffer() : undefined)),\n cache.match(`${cacheKey}&type=headers`).then((r) => (r ? r.json() : undefined)),\n ]);\n}\n\nasync function saveToCache(\n accountSlot: number | undefined, cacheKey: string, arrayBuffer: ArrayBuffer, headers: HeadersInit,\n) {\n const cacheName = !accountSlot ? MEDIA_PROGRESSIVE_CACHE_NAME : `${MEDIA_PROGRESSIVE_CACHE_NAME}_${accountSlot}`;\n const cache = await self.caches.open(cacheName);\n\n return Promise.all([\n cache.put(new Request(`${cacheKey}&type=arrayBuffer`), new Response(arrayBuffer)),\n cache.put(new Request(`${cacheKey}&type=headers`), new Response(JSON.stringify(headers))),\n ]);\n}\n\nexport async function requestPart(\n e: FetchEvent,\n params: { url: string; start: number; end: number },\n): Promise {\n const isDownload = params.url.includes('/download/');\n const client = await (isDownload ? getClientForRequest(params.url) : self.clients.get(e.clientId));\n if (!client) {\n return undefined;\n }\n\n const messageId = generateUniqueId();\n const requestState = {} as RequestStates;\n\n let isResolved = false;\n const promise = Promise.race([\n pause(PART_TIMEOUT).then(() => (isResolved ? undefined : Promise.reject(new Error('ERROR_PART_TIMEOUT')))),\n new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n }),\n ]);\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n isResolved = true;\n });\n\n client.postMessage({\n type: 'requestPart',\n messageId,\n params,\n });\n\n return promise;\n}\n\nasync function getClientForRequest(url: string) {\n const urlAccountSlot = getAccountSlot(url);\n const clients = await self.clients.matchAll();\n return clients.find((c) => (\n c.type === 'window' && c.frameType === 'top-level' && getAccountSlot(c.url) === urlAccountSlot\n ));\n}\n\nself.addEventListener('message', (e) => {\n const { type, messageId, result } = e.data as {\n type: string;\n messageId: string;\n result: PartInfo;\n };\n\n if (type === 'partResponse') {\n const requestState = requestStates.get(messageId);\n if (requestState) {\n requestState.resolve(result);\n }\n }\n});\n","export default function generateUniqueId() {\n return Date.now().toString(36) + Math.random().toString(36).slice(2);\n}\n\nexport function generateUniqueNumberId() {\n const timestamp = Date.now() % 100000000;\n const random = Math.floor(Math.random() * 1000);\n return timestamp + random;\n}\n","import { DEBUG } from '../config';\nimport { requestPart } from './progressive';\n\nconst DOWNLOAD_PART_SIZE = 1024 * 1024;\nconst TEST_PART_SIZE = 64 * 1024;\n\nconst QUEUE_SIZE = 8;\n\nclass FilePartQueue {\n queue: Promise[];\n\n constructor() {\n this.queue = [];\n }\n\n push(task: Promise) {\n this.queue.push(task);\n }\n\n async pop(): Promise {\n const result = await this.queue.shift()!;\n return result;\n }\n\n get size() {\n return this.queue.length;\n }\n}\n\nexport async function respondForDownload(e: FetchEvent) {\n const { url } = e.request;\n\n let partInfo;\n try {\n partInfo = await requestPart(e, { url, start: 0, end: TEST_PART_SIZE });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('FETCH DOWNLOAD', err);\n }\n }\n\n if (!partInfo) {\n return new Response('', {\n status: 500,\n statusText: 'Failed to fetch file to download',\n });\n }\n\n const matchedFilename = e.request.url.match(/filename=(.*)/);\n const filenameHeader = matchedFilename ? `filename=\"${decodeURIComponent(matchedFilename[1])}\"` : '';\n const { fullSize, mimeType } = partInfo;\n\n const headers: [string, string][] = [\n ['Content-Length', String(fullSize)],\n ['Content-Type', mimeType],\n ['Content-Disposition', `attachment; ${filenameHeader}`],\n ];\n\n const queue = new FilePartQueue();\n const enqueue = (offset: number) => {\n queue.push(requestPart(e, {\n url, start: offset, end: offset + DOWNLOAD_PART_SIZE - 1,\n })\n .then((part) => part?.arrayBuffer));\n return offset + DOWNLOAD_PART_SIZE;\n };\n let lastOffset = 0;\n const stream = new ReadableStream({\n start() {\n for (let i = 0; i < QUEUE_SIZE; i++) {\n if (lastOffset >= fullSize) break;\n lastOffset = enqueue(lastOffset);\n }\n },\n\n async pull(controller) {\n const buffer = await queue.pop();\n if (!buffer) {\n controller.close();\n return;\n }\n controller.enqueue(new Uint8Array(buffer));\n\n if (buffer.byteLength < DOWNLOAD_PART_SIZE) {\n controller.close();\n return;\n }\n\n if (lastOffset < fullSize) {\n lastOffset = enqueue(lastOffset);\n }\n },\n });\n\n return new Response(stream, {\n status: 200,\n statusText: 'OK',\n headers,\n });\n}\n","import { APP_NAME, DEBUG, DEBUG_MORE } from '../config';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nenum Boolean {\n True = '1',\n False = '0',\n}\n\ntype PushData = {\n custom: {\n msg_id?: string;\n silent?: string;\n channel_id?: string;\n chat_id?: string;\n from_id?: string;\n };\n mute: Boolean;\n badge: Boolean;\n loc_key: string;\n loc_args: string[];\n random_id: number;\n title: string;\n description: string;\n};\n\ntype NotificationData = {\n messageId?: number;\n chatId?: string;\n title: string;\n body: string;\n isSilent?: boolean;\n icon?: string;\n reaction?: string;\n shouldReplaceHistory?: boolean;\n};\n\ntype FocusMessageData = {\n chatId?: string;\n messageId?: number;\n reaction?: string;\n shouldReplaceHistory?: boolean;\n};\n\ntype CloseNotificationData = {\n lastReadInboxMessageId?: number;\n chatId: string;\n};\n\nlet lastSyncAt = new Date().valueOf();\nconst shownNotifications = new Set();\nconst clickBuffer: Record = {};\n\nfunction getPushData(e: PushEvent | Notification): PushData | undefined {\n try {\n return e.data.json();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Unable to parse push notification data', e.data);\n }\n return undefined;\n }\n}\n\nfunction getChatId(data: PushData) {\n if (data.custom.from_id) {\n return data.custom.from_id;\n }\n\n // Chats and channels have “negative” IDs\n if (data.custom.chat_id || data.custom.channel_id) {\n return `-${data.custom.chat_id || data.custom.channel_id}`;\n }\n\n return undefined;\n}\n\nfunction getMessageId(data: PushData) {\n if (!data.custom.msg_id) return undefined;\n return parseInt(data.custom.msg_id, 10);\n}\n\nfunction getNotificationData(data: PushData): NotificationData {\n let title = data.title || APP_NAME;\n const isSilent = data.custom?.silent === Boolean.True;\n if (isSilent) {\n title += ' 🔕';\n }\n return {\n chatId: getChatId(data),\n messageId: getMessageId(data),\n body: data.description,\n isSilent,\n title,\n };\n}\n\nasync function getClients() {\n const appUrl = new URL(self.registration.scope).origin;\n const clients = await self.clients.matchAll({ type: 'window' }) as WindowClient[];\n return clients.filter((client) => {\n return new URL(client.url).origin === appUrl;\n });\n}\n\nasync function playNotificationSound(id: string) {\n const clients = await getClients();\n const client = clients[0];\n if (!client) return;\n client.postMessage({\n type: 'playNotificationSound',\n payload: { id },\n });\n}\n\nfunction showNotification({\n chatId,\n messageId,\n body,\n title,\n icon,\n reaction,\n isSilent,\n shouldReplaceHistory,\n}: NotificationData) {\n const isFirstBatch = new Date().valueOf() - lastSyncAt < 1000;\n const tag = String(isFirstBatch ? 0 : chatId || 0);\n const options: NotificationOptions = {\n body,\n data: {\n chatId,\n messageId,\n reaction,\n count: 1,\n shouldReplaceHistory,\n },\n icon: icon || 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag,\n // @ts-ignore\n vibrate: [200, 100, 200],\n };\n\n return Promise.all([\n // TODO Update condition when reaction badges are implemented\n (!reaction && !isSilent) ? playNotificationSound(String(messageId) || chatId || '') : undefined,\n self.registration.showNotification(title, options),\n ]);\n}\n\nasync function closeNotifications({\n chatId,\n lastReadInboxMessageId,\n}: CloseNotificationData) {\n const notifications = await self.registration.getNotifications();\n const lastMessageId = lastReadInboxMessageId || Number.MAX_VALUE;\n notifications.forEach((notification) => {\n if (\n notification.tag === '0'\n || (notification.data.chatId === chatId && notification.data.messageId <= lastMessageId)\n ) {\n notification.close();\n }\n });\n}\n\nexport function handlePush(e: PushEvent) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received event', e);\n if (e.data) {\n // eslint-disable-next-line no-console\n console.log('[SW] Push received with data', e.data.json());\n }\n }\n\n const data = getPushData(e);\n\n // Do not show muted notifications\n if (!data || data.mute === Boolean.True) return;\n\n const notification = getNotificationData(data);\n\n // Don't show already triggered notification\n if (shownNotifications.has(notification.messageId)) {\n shownNotifications.delete(notification.messageId);\n return;\n }\n\n e.waitUntil(showNotification(notification));\n}\n\nasync function focusChatMessage(client: WindowClient, data: FocusMessageData) {\n if (!data.chatId) return;\n client.postMessage({\n type: 'focusMessage',\n payload: data,\n });\n if (!client.focused) {\n // Catch \"focus not allowed\" DOM Exceptions\n try {\n await client.focus();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n }\n}\n\nexport function handleNotificationClick(e: NotificationEvent) {\n const appUrl = self.registration.scope;\n e.notification.close(); // Android needs explicit close.\n const { data } = e.notification;\n const notifyClients = async () => {\n const clients = await getClients();\n await Promise.all(clients.map((client) => {\n clickBuffer[client.id] = data;\n return focusChatMessage(client, data);\n }));\n if (!self.clients.openWindow || clients.length > 0) return undefined;\n // Store notification data for default client (fix for android)\n clickBuffer[0] = data;\n // If there is no opened client we need to open one and wait until it is fully loaded\n try {\n const newClient = await self.clients.openWindow(appUrl);\n if (newClient) {\n // Store notification data until client is fully loaded\n clickBuffer[newClient.id] = data;\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[SW] ', error);\n }\n }\n return undefined;\n };\n e.waitUntil(notifyClients());\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] New message from client', e);\n }\n if (!e.data) return;\n const source = e.source as WindowClient;\n if (e.data.type === 'clientReady') {\n // focus on chat message when client is fully ready\n const data = clickBuffer[source.id] || clickBuffer[0];\n if (data) {\n delete clickBuffer[source.id];\n delete clickBuffer[0];\n e.waitUntil(focusChatMessage(source, data));\n }\n }\n if (e.data.type === 'showMessageNotification') {\n // store messageId for already shown notification\n const notification: NotificationData = e.data.payload;\n e.waitUntil((async () => {\n // Close existing notification if it is already shown\n if (notification.chatId) {\n const notifications = await self.registration.getNotifications({ tag: notification.chatId });\n notifications.forEach((n) => n.close());\n }\n // Mark this notification as shown if it was handled locally\n shownNotifications.add(notification.messageId);\n return showNotification(notification);\n })());\n }\n\n if (e.data.type === 'closeMessageNotifications') {\n e.waitUntil(closeNotifications(e.data.payload));\n }\n}\n\nself.addEventListener('sync', () => {\n lastSyncAt = Date.now();\n});\n","export default class Deferred {\n promise: Promise;\n\n reject!: (reason?: any) => void;\n\n resolve!: (value: T | PromiseLike) => void;\n\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n\n static resolved(): Deferred;\n static resolved(value: T): Deferred;\n static resolved(value?: T): Deferred {\n const deferred = new Deferred();\n deferred.resolve(value);\n return deferred;\n }\n}\n","import Deferred from '../util/Deferred';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\ntype ShareData = {\n title?: string;\n text?: string;\n url?: string;\n files?: File[];\n};\n\nconst READY_CLIENT_DEFERREDS = new Map>();\n\nexport async function respondForShare(e: FetchEvent) {\n if (e.request.method === 'POST') {\n try {\n const formData = await e.request.formData();\n const data = parseFormData(formData);\n requestShare(data, e.resultingClientId);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[SHARE] Failed to parse input data', err);\n }\n }\n\n return Response.redirect('.');\n}\n\nexport function handleClientMessage(e: ExtendableMessageEvent) {\n const { source, data } = e;\n if (!source) return;\n\n if (data.type === 'clientReady') {\n const { id } = source as Client;\n const deferred = READY_CLIENT_DEFERREDS.get(id);\n if (deferred) {\n deferred.resolve();\n } else {\n READY_CLIENT_DEFERREDS.set(id, Deferred.resolved());\n }\n }\n}\n\nasync function requestShare(data: ShareData, clientId: string) {\n const client = await self.clients.get(clientId);\n if (!client) {\n return;\n }\n\n await getClientReadyDeferred(clientId);\n\n client.postMessage({\n type: 'share',\n payload: data,\n });\n}\n\nfunction getClientReadyDeferred(clientId: string) {\n const deferred = READY_CLIENT_DEFERREDS.get(clientId);\n if (deferred) {\n return deferred.promise;\n }\n\n const newDeferred = new Deferred();\n READY_CLIENT_DEFERREDS.set(clientId, newDeferred);\n return newDeferred.promise;\n}\n\nfunction parseFormData(formData: FormData): ShareData {\n const files = formData.getAll('files') as File[];\n const title = formData.get('title') as string;\n const text = formData.get('text') as string;\n const url = formData.get('url') as string;\n\n return {\n title,\n text,\n url,\n files,\n };\n}\n","import { DEBUG } from '../config';\nimport { pause } from '../util/schedulers';\nimport { clearAssetCache, respondWithCache, respondWithCacheNetworkFirst } from './assetCache';\nimport { respondForDownload } from './download';\nimport { respondForProgressive } from './progressive';\nimport {\n handleClientMessage as handleNotificationMessage,\n handleNotificationClick,\n handlePush,\n} from './pushNotification';\nimport { handleClientMessage as handleShareMessage, respondForShare } from './share';\n\ndeclare const self: ServiceWorkerGlobalScope;\n\nconst RE_NETWORK_FIRST_ASSETS = /\\.(wasm|html)$/;\nconst RE_CACHE_FIRST_ASSETS = /[\\da-f]{20}.*\\.(js|css|woff2?|svg|png|jpg|jpeg|tgs|json|wasm)$/;\nconst ACTIVATE_TIMEOUT = 3000;\n\nself.addEventListener('install', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker installed');\n }\n\n // Activate worker immediately\n e.waitUntil(self.skipWaiting());\n});\n\nself.addEventListener('activate', (e) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('ServiceWorker activated');\n }\n\n e.waitUntil(\n Promise.race([\n // An attempt to fix freezing UI on iOS\n pause(ACTIVATE_TIMEOUT),\n Promise.all([\n clearAssetCache(),\n // Become available to all pages\n self.clients.claim(),\n ]),\n ]),\n );\n});\n\nself.addEventListener('fetch', (e: FetchEvent) => {\n const { url } = e.request;\n const { scope } = self.registration;\n if (!url.startsWith(scope)) {\n return false;\n }\n\n const { pathname, protocol } = new URL(url);\n const { pathname: scopePathname } = new URL(scope);\n\n if (pathname.includes('/progressive/')) {\n e.respondWith(respondForProgressive(e));\n return true;\n }\n\n if (pathname.includes('/download/')) {\n e.respondWith(respondForDownload(e));\n return true;\n }\n\n if (pathname.includes('/share/')) {\n e.respondWith(respondForShare(e));\n }\n\n if (protocol === 'http:' || protocol === 'https:') {\n if (pathname === scopePathname || pathname.match(RE_NETWORK_FIRST_ASSETS)) {\n e.respondWith(respondWithCacheNetworkFirst(e));\n return true;\n }\n\n if (pathname.match(RE_CACHE_FIRST_ASSETS)) {\n e.respondWith(respondWithCache(e));\n return true;\n }\n }\n\n return false;\n});\n\nself.addEventListener('push', handlePush);\nself.addEventListener('notificationclick', handleNotificationClick);\nself.addEventListener('message', (event) => {\n handleNotificationMessage(event);\n handleShareMessage(event);\n});\n"],"names":["ACCOUNT_QUERY","MEDIA_PROGRESSIVE_CACHE_NAME","ASSET_CACHE_NAME","SUPPORTED_PHOTO_CONTENT_TYPES","window","innerHeight","Math","round","Set","SUPPORTED_VIDEO_CONTENT_TYPES","toString","pause","ms","Promise","resolve","setTimeout","async","respondWithCache","e","cacheResult","withTimeout","cache","self","caches","open","cached","match","request","ok","delete","remote","fetch","put","clone","cb","timeout","isResolved","race","then","undefined","reject","Error","err","console","error","SuppressedError","WeakMap","IS_MULTIACCOUNT_SUPPORTED","globalThis","WORKER_NAME","Intl","URL","host","isTauri","Boolean","electron","WorkerGlobalScope","name","getAccountSlot","url","slot","searchParams","get","slotNumber","Number","isNaN","URLSearchParams","location","href","versionChannel","BroadcastChannel","postMessage","version","APP_VERSION","addEventListener","event","data","semverCompare","reload","a","b","startsWith","localeCompare","numeric","sensitivity","caseFirst","DEFAULT_PART_SIZE","requestStates","Map","requestPart","params","isDownload","includes","client","urlAccountSlot","clients","matchAll","find","c","type","frameType","getClientForRequest","clientId","messageId","Date","now","random","slice","requestState","promise","Object","assign","set","catch","finally","result","DOWNLOAD_PART_SIZE","FilePartQueue","constructor","this","queue","push","task","pop","shift","size","length","lastSyncAt","valueOf","shownNotifications","clickBuffer","getChatId","custom","from_id","chat_id","channel_id","getMessageId","msg_id","parseInt","getClients","appUrl","registration","scope","origin","filter","playNotificationSound","id","payload","showNotification","chatId","body","title","icon","reaction","isSilent","shouldReplaceHistory","isFirstBatch","options","count","badge","tag","String","vibrate","all","focusChatMessage","focused","focus","Deferred","resolved","value","deferred","READY_CLIENT_DEFERREDS","RE_NETWORK_FIRST_ASSETS","RE_CACHE_FIRST_ASSETS","waitUntil","skipWaiting","claim","pathname","protocol","scopePathname","respondWith","accountSlot","range","headers","bytes","exec","start","end","parsedUrl","fileSizeParam","fileSize","mimeType","Response","Uint8Array","buffer","status","statusText","cacheKey","cachedArrayBuffer","cachedHeaders","cacheName","r","arrayBuffer","json","fetchFromCache","partInfo","fullSize","partSize","min","byteLength","arrayBufferPart","Request","JSON","stringify","saveToCache","respondForProgressive","matchedFilename","filenameHeader","decodeURIComponent","enqueue","offset","part","lastOffset","stream","ReadableStream","i","pull","controller","close","respondForDownload","method","newDeferred","getClientReadyDeferred","requestShare","formData","files","getAll","text","parseFormData","resultingClientId","warn","redirect","respondForShare","toCache","respondWithCacheNetworkFirst","getPushData","mute","True","notification","silent","description","getNotificationData","has","map","openWindow","newClient","notifyClients","source","getNotifications","forEach","n","add","lastReadInboxMessageId","notifications","lastMessageId","MAX_VALUE","closeNotifications","handleNotificationMessage","handleShareMessage"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/2394.0afa88a3e81dd3f7bc95.js b/dist/2394.0afa88a3e81dd3f7bc95.js new file mode 100644 index 000000000..8f072af72 --- /dev/null +++ b/dist/2394.0afa88a3e81dd3f7bc95.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[2394],{285(e,t,n){n.d(t,{A:()=>u});var a=n(84051),i=n(13439),o=n(90709),s=n(11597),r=n(4961),c=n(59030),l=n(94189),d=n(20021);const u=(0,a.ph)((0,i.EK)((e,{userId:t})=>{const n=(0,s.meB)(e),a=t&&(0,s.mBe)(e,t);return{chat:n,contactName:a?(0,o.u0)(a):void 0}})(({isOpen:e,chat:t,userId:n,contactName:o,onClose:s})=>{const{deleteChatMember:u}=(0,i.ko)(),p=(0,c.A)(),m=(0,a.hb)(()=>{u({chatId:t.id,userId:n}),s()},[t,u,s,n]);if(t&&n)return(0,d.Y)(l.A,{isOpen:e,onClose:s,title:p("GroupRemoved.Remove"),textParts:(0,r.A)(p("PeerInfo.Confirm.RemovePeer",o)),confirmLabel:p("lng_box_remove"),confirmHandler:m,confirmIsDestructive:!0})}))},2578(e,t,n){n.d(t,{A:()=>s});var a=n(84051),i=n(39351),o=n(20021);const s=(0,a.ph)(({fakeType:e})=>{const t=(0,i.A)();return(0,o.Y)("span",{className:"FakeIcon",children:t("fake"===e?"FakeMessage":"ScamMessage")})})},9718(e,t,n){n.d(t,{A:()=>i});var a=n(96454);const i=(e,t)=>{a.pz&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.pz&&(e.style.overflow="")}},32587(e,t,n){n.d(t,{A:()=>o});const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],i=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function o(e,t,n,o,s,r,c){if(Number.isNaN(r)||r<1)return;r|=0,Number.isNaN(c)&&(c=1),(c|=0)>3&&(c=3),c<1&&(c=1);const l=e.getImageData(t,n,o,s),d=l.data;let u,p,m,h,f,g,v,C,y,b,w,A,k=o-1,S=s-1,I=r+1,N=[],T=[],P=[],M=a[r],x=i[r],V=[],F=[];for(;c-- >0;){for(A=w=0,f=0;fk?k:g)<<2),u+=d[v++],p+=d[v++],m+=d[v++];for(h=0;h0?v<<2:0),C=A+V[h],y=A+F[h],u+=d[C++]-d[y++],p+=d[C++]-d[y++],m+=d[C++]-d[y++],w++;A+=o<<2}for(h=0;hS?0:o,u+=N[b],p+=T[b],m+=P[b];for(w=h<<2,f=0;f>>x,d[w+1]=p*M>>>x,d[w+2]=m*M>>>x,0==h&&(V[f]=((v=f+I)0?v*o:0),C=h+V[f],y=h+F[f],u+=N[C]-N[y],p+=T[C]-T[y],m+=P[C]-P[y],w+=o<<2}}e.putImageData(l,t,n)}},34431(e,t,n){n.d(t,{A:()=>A});var a=n(84051),i=n(13439),o=n(31481),s=n(90709),r=n(70636),c=n(87357),l=n(85982),d=n(83868),u=n(4961),p=n(39351),m=n(17712),h=n(59030),f=n(41036),g=n(87412),v=n(2578),C=n(95773),y=n(9267),b=n(20021);const w=()=>(0,b.FD)("svg",{className:"VerifiedIcon",viewBox:"0 0 24 24",children:[(0,b.Y)("path",{d:"M12.3 2.9c.1.1.2.1.3.2.7.6 1.3 1.1 2 1.7.3.2.6.4.9.4.9.1 1.7.2 2.6.2.5 0 .6.1.7.7.1.9.1 1.8.2 2.6 0 .4.2.7.4 1 .6.7 1.1 1.3 1.7 2 .3.4.3.5 0 .8-.5.6-1.1 1.3-1.6 1.9-.3.3-.5.7-.5 1.2-.1.8-.2 1.7-.2 2.5 0 .4-.2.5-.6.6-.8 0-1.6.1-2.5.2-.5 0-1 .2-1.4.5-.6.5-1.3 1.1-1.9 1.6-.3.3-.5.3-.8 0-.7-.6-1.4-1.2-2-1.8-.3-.2-.6-.4-.9-.4-.9-.1-1.8-.2-2.7-.2-.4 0-.5-.2-.6-.5 0-.9-.1-1.7-.2-2.6 0-.4-.2-.8-.4-1.1-.6-.6-1.1-1.3-1.6-2-.4-.4-.3-.5 0-1 .6-.6 1.1-1.3 1.7-1.9.3-.3.4-.6.4-1 0-.8.1-1.6.2-2.5 0-.5.1-.6.6-.6.9-.1 1.7-.1 2.6-.2.4 0 .7-.2 1-.4.7-.6 1.4-1.2 2.1-1.7.1-.2.3-.3.5-.2z",style:"fill: var(--color-fill)"}),(0,b.Y)("path",{d:"M16.4 10.1l-.2.2-5.4 5.4c-.1.1-.2.2-.4 0l-2.6-2.6c-.2-.2-.1-.3 0-.4.2-.2.5-.6.7-.6.3 0 .5.4.7.6l1.1 1.1c.2.2.3.2.5 0l4.3-4.3c.2-.2.4-.3.6 0 .1.2.3.3.4.5.2 0 .3.1.3.1z",style:"fill: var(--color-checkmark)"})]}),A=(0,a.ph)(({className:e,style:t,peer:n,noVerified:A,noFake:k,withEmojiStatus:S,emojiStatusSize:I,isSavedMessages:N,isSavedDialog:T,noLoopLimit:P,canCopyTitle:M,iconElement:x,isMonoforum:V,monoforumBadgeClassName:F,withStatusTextColor:E,onEmojiStatusClick:Y,observeIntersection:D})=>{const{showNotification:B}=(0,i.ko)(),G=(0,h.A)(),R=(0,p.A)(),L="id"in n?n:void 0,O="isCustomPeer"in n?n:void 0,U=L&&(0,r.mO)(L),_=L&&(U?(0,s.Yg)(L):(0,s.Js)(G,L)),$=U&&L.isPremium||O?.isPremium,J=S&&!N,j=L?.emojiStatus||(O?.emojiStatusId?{type:"regular",documentId:O.emojiStatusId}:void 0),z=(0,m.A)(e=>{_&&M&&((0,d.A)(e),(0,l.eM)(_),B({message:(U?"User":"Chat")+" name was copied"}))}),K=(0,a.Kr)(()=>O?(0,u.A)(O.title||G(O.titleKey)):N?G(T?"MyNotes":"SavedMessages"):(0,s.Qe)(L.id)?G("AnonymousForward"):(0,s.kE)(L.id)?G("RepliesTitle"):(0,s.Rl)(L.id)?G("VerifyCodesNotifications"):void 0,[O,T,N,G,L]),H=L?.botVerificationIconId;return(0,b.FD)("div",{className:(0,c.A)("title","QljEeKI5",e),style:t,children:[H&&(0,b.Y)(g.A,{documentId:H,size:I,loopLimit:P?void 0:o.J$1,observeIntersectionForLoading:D}),(0,b.Y)("h3",{dir:"auto",role:"button",className:(0,c.A)("fullName","AS54Cntu",M&&"vr53L_9p"),onClick:z,children:K||(0,u.A)(_||"")}),!x&&n&&(0,b.FD)(b.FK,{children:[!A&&n?.isVerified&&(0,b.Y)(w,{}),!k&&n?.fakeType&&(0,b.Y)(v.A,{fakeType:n.fakeType}),J&&j&&(0,b.Y)(f.Ay,{className:"KBZgFSv7",slideClassName:"xmVxyvNy",activeKey:Number(j.documentId),name:"slideFade",direction:-1,shouldCleanup:!0,children:(0,b.Y)(C.A,{withSparkles:"collectible"===j.type,sparklesClassName:"statusSparkles",sparklesColor:"collectible"!==j.type||E?void 0:j.textColor,children:(0,b.Y)(g.A,{className:(0,c.A)("no-selection",!E&&"z1sLOAjr"),documentId:j.documentId,size:I,loopLimit:P?void 0:o.J$1,observeIntersectionForLoading:D,onClick:Y})})}),J&&!j&&$&&(0,b.Y)(y.A,{}),V&&(0,b.Y)("div",{className:(0,c.A)("Sdwfc851",F),children:R("MonoforumBadge")})]}),x]})})},59324(e,t,n){n.d(t,{A:()=>c});var a=n(84051),i=n(57474),o=n(41036),s=n(18276);var r=n(20021);const c=(0,a.ph)(({iconName:e,isLoading:t})=>(0,r.Y)(o.Ay,{className:"LLqNvbR9",activeKey:t?0:1,name:"fade",children:t?(0,r.Y)(i.A,{className:"PbV71feg",color:"white"}):(0,r.Y)(s.A,{className:"sohV68PB",name:e})}))},71331(e,t,n){n.d(t,{Ip:()=>r,O7:()=>p,iT:()=>d,mD:()=>s,n5:()=>c,qI:()=>l,uu:()=>u});var a=n(90709),i=n(21133),o=n(19926);function s(e,t){const n=(0,i.AW)(e,t);if(n&&n.groupCallId)return r(e,n.groupCallId)}function r(e,t){return e.groupCalls.byId[t]}function c(e,t,n){return r(e,t)?.participants[n]}function l(e){const t=d(e)?.chatId;if(!t)return!1;const n=(0,i.hd)(e,t);return!!n&&((0,a.yn)(n)&&n.isCreator||Boolean(n.adminRights?.manageCall))}function d(e){const{groupCalls:{activeGroupCallId:t}}=e;if(t)return r(e,t)}function u(e){const{phoneCall:t,currentUserId:n}=e;if(!t||!t.participantId||!t.adminId)return;const a=t.adminId===n?t.participantId:t.adminId;return(0,o.mB)(e,a)}function p(e){const t=d(e);if(!t||!t.chatId)return!1;const n=(0,i.hd)(e,t.chatId);if(!n)return!1;if(Boolean((0,a.Kl)(n)))return!0;const o=(0,i.AW)(e,n.id)?.inviteLink;return Boolean(o)}},83320(e,t,n){n.r(t),n.d(t,{ActiveCallHeader:()=>tt,GroupCall:()=>et,PhoneCall:()=>rt,RatePhoneCallModal:()=>lt});var a=n(12859),i=n(96454),o=n(31481);function s(e){return 0|e}function r(e){return e>>>0}function c(e,t=3){if(!e)return 0;const{length:n}=e;let a=0;for(let t=0;t{if(!e||!e.sdp)throw Error("Failed parsing SDP: session description is null");const n=e.sdp.split("\r\nm=").map((e,t)=>0===t?e:`m=${e}`).reduce((e,t)=>{const n=t.match(/^m=(.+?)\s/)?.[1]||"header";return e[e.hasOwnProperty(n)&&"video"===n?"screencast":n]=t.split("\r\n").filter(Boolean),e},{}),a=(e,t)=>t?n[t]?.find(t=>t.startsWith(e))?.substr(e.length):Object.values(n).map(t=>t.find(t=>t.startsWith(e))?.substr(e.length)).filter(Boolean)[0],i=e=>n[e].filter(e=>e.startsWith("a=extmap")).map(e=>{const[,t,n]=e.match(/extmap:(\d+)(?:\/.+)?\s(.+)/);return{id:Number(t),uri:n}}),o=e=>{const t=n[e].filter(e=>e.startsWith("a=rtpmap")).map(e=>{const[,t,n]=e.match(/:(\d+)\s(.+)/)||[],[a,i,o]=n.split("/");return{id:Number(t),name:a,clockrate:Number(i),...o&&{channels:Number(o)}}}),a=n[e].filter(e=>e.startsWith("a=rtcp-fb")).map(e=>{const[,t,n]=e.match(/:(\d+)\s(.+)/)||[],[a,i]=n.split(" ");return{id:Number(t),type:a,subtype:i||""}}),i=n[e].filter(e=>e.startsWith("a=fmtp")).map(e=>{const[,t,n]=e.match(/:(\d+)\s(.+)/)||[],a=n?.split(";").reduce((e,t)=>{const[n,a]=t.split("=");return e[n]=a,e},{});if(a&&!Object.values(a).some(e=>!e))return{id:Number(t),data:a}}).filter(Boolean);return t.map(e=>{const t=i.filter(t=>t.id===e.id).map(e=>e.data).reduce((e,t)=>Object.assign(e,t),{}),n=a.filter(t=>t.id===e.id).map(e=>({type:e.type,subtype:e.subtype}));return{...e,...Object.keys(t).length>0&&{parameters:t},...n.length>0&&{feedbackTypes:n}}})},r=a("a=ssrc:","audio"),c=r&&Number(r.split(" ")[0]),l=a("a=ssrc-group:","video")?.split(" ")||void 0,d=a("a=ssrc-group:","screencast")?.split(" ")||void 0;if(!l)throw Error("Failed parsing SDP: no video ssrc");const[u,p]=a("a=fingerprint:")?.split(" ")||[],m=a("a=setup:");if(!u||!p)throw Error("Failed parsing SDP: no fingerprint");console.log(n);const h=a("a=ice-ufrag:"),f=a("a=ice-pwd:");if(!h||!f)throw Error("Failed parsing SDP: no ICE ufrag or pwd");return{fingerprints:[{fingerprint:p,hash:u,setup:t?m:"active"}],pwd:f,ufrag:h,...c&&{ssrc:s(c)},...l&&{"ssrc-groups":[{semantics:l[0],sources:l.slice(1,l.length).map(Number).map(s)},t&&d&&{semantics:d[0],sources:d.slice(1,d.length).map(Number).map(s)}].filter(Boolean)},...t&&{audioExtmap:i("audio"),videoExtmap:i("video"),screencastExtmap:i("screencast"),audioPayloadTypes:o("audio"),videoPayloadTypes:o("video"),screencastPayloadTypes:o("screencast")}}},f=(e,t=!1,n=!1,a=!1)=>{const i=[],o=e=>{i.push(e)},{sessionId:s,ssrcs:c,audioExtensions:l,videoExtensions:d,audioPayloadTypes:u,videoPayloadTypes:p,transport:{ufrag:m,pwd:h,fingerprints:f,candidates:g}}=e;o("v=0"),o(`o=- ${s} 2 IN IP4 0.0.0.0`),o("s=-"),o("t=0 0"),o("a=ice-options:trickle"),o("a=msid-semantic:WMS *"),o(`a=group:BUNDLE ${c.map(e=>e.mid).join(" ")}${n?"":" "+(a?"3":"2")}`),a||o("a=ice-lite");const v=e=>{if(e.sdpString)o(`a=${e.sdpString}`);else{let t="";t+="a=candidate:",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,"rel-addr"in e&&(t+=` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t+=` generation ${e.generation}`,o(t)}},C=()=>{o(`a=ice-ufrag:${m}`),o(`a=ice-pwd:${h}`),f.forEach(e=>{o(`a=fingerprint:${e.hash} ${e.fingerprint}`),o(`a=setup:${a?e.setup:"passive"}`)}),g.forEach(v)},y=e=>{const{channels:t,id:n,name:a,clockrate:i,parameters:s}=e;if(o(`a=rtpmap:${n} ${a}/${i}${t?`/${t}`:""}`),s){const e=Object.keys(s).map(e=>`${e}=${s[e]};`).join(" ");o(`a=fmtp:${n} ${e}`)}e["rtcp-fbs"]?.forEach(e=>{o(`a=rtcp-fb:${n} ${e.type}${e.subtype?` ${e.subtype}`:""}`)})},b=e=>{const n=e.isVideo?p:u,i=e.isVideo?"video":"audio";if(o(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${n.map(e=>e.id).join(" ")}`),o("c=IN IP4 0.0.0.0"),o("b=AS:1300"),o(`a=mid:${e.mid}`),o("a=rtcp-mux"),n.forEach(y),o("a=rtcp:1 IN IP4 0.0.0.0"),e.isVideo&&o("a=rtcp-rsize"),(e.isVideo?d:l).forEach(({id:e,uri:t})=>{o(`a=extmap:${e} ${t}`)}),e.isRemoved)o("a=inactive");else{if(C(),a)o("a=sendrecv"),o("a=bundle-only");else{if(t)return void o("a=recvonly");e.isMain?o("a=sendrecv"):(o("a=sendonly"),o("a=bundle-only"))}e.sourceGroups.forEach(t=>{t.semantics&&o(`a=ssrc-group:${t.semantics} ${t.sources.map(r).join(" ")}`),t.sources.forEach(t=>{const n=r(t);o(`a=ssrc:${n} cname:${e.endpoint}`),o(`a=ssrc:${n} msid:${e.endpoint} ${e.endpoint}`),o(`a=ssrc:${n} mslabel:${e.endpoint}`),o(`a=ssrc:${n} label:${e.endpoint}`)})})}};return a?c.filter(b):c.filter(e=>"0"===e.mid||"1"===e.mid).map(b),n||(o("m=application 1 UDP/DTLS/SCTP webrtc-datachannel"),o("c=IN IP4 0.0.0.0"),C(),o("a=ice-options:trickle"),o("a=mid:"+(a?"3":n?"1":"2")),o("a=sctp-port:5000"),o("a=max-message-size:262144")),a||c.filter(e=>"0"!==e.mid&&"1"!==e.mid).map(b),`${i.join("\n")}\n`},g=e=>{const t=e.createOscillator(),n=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(n.stream.getAudioTracks()[0],{enabled:!1})])},v=({width:e=640,height:t=480}={})=>{const n=Object.assign(document.createElement("canvas"),{width:e,height:t}),a=n.getContext("2d");if(!a)throw Error("Cannot create canvas ctx");a.fillRect(0,0,e,t);const i=n.captureStream();return new MediaStream([Object.assign(i.getVideoTracks()[0],{enabled:!1})])};var C=n(9705),y=n(41733);let b,w;function A(e){b&&(b.screenshareDataChannel?.close(),b.screenshareConnection?.close(),e||b.onUpdate?.({"@type":"updateGroupCallLeavePresentation"}))}function k(e){return b?.streams?.[e]}function S(e,t){const n=b?.participantFunctions?.[e];n&&n.setVolume?.(t)}function I(e,t){const n=t||b?.myId,a=n&&k(n)?.[e];return!!a&&a.getTracks()[0]?.enabled}function N(e){b?.onUpdate?.({"@type":"updateGroupCallStreams",userId:e,hasAudioStream:I("audio",e),hasVideoStream:I("video",e),hasPresentationStream:I("presentation",e),amplitude:b.speaking?.[e]})}async function T(e,t="user"){if("audio"===e&&b?.audioStream)return b.audioStream;if("presentation"===e)return navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0});const n=await navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...p&&{echoCancellation:!0},...m&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}});if(b&&"audio"===e&&(b.audioStream=n),"video"===e){const e=document.createElement("video");e.srcObject=n;const t=new C.A;e.oncanplay=()=>t.resolve(),await t.promise}return n}async function P(e,t=void 0){if(!(b&&b.myId&&b.connection&&b.streams))return;const n=k(b.myId)?.[e];if(!n)return;const a=n.getTracks()[0];if(!a)return;const i=[...b.connection.getSenders(),...b.screenshareConnection?.getSenders()||[]].find(e=>a.id===e.track?.id);if(i){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await T(e);if(await i.replaceTrack(t.getTracks()[0]),b.streams[b.myId][e]=t,"video"===e)b.facingMode="user";else if("audio"===e){const{audioContext:e}=b;if(!e)return;const n=b.audioSource||e.createMediaStreamSource(t),a=b.audioAnalyser||e.createAnalyser();a.minDecibels=-100,a.maxDecibels=-30,a.smoothingTimeConstant=.05,a.fftSize=1024,n.connect(a),b={...b,audioSource:n,audioAnalyser:a,participantFunctions:{...b.participantFunctions,[b.myId]:{...b.participantFunctions?.[b.myId],getCurrentAmplitude:()=>{const e=new Uint8Array(a.frequencyBinCount);return a.getByteFrequencyData(e),c(e,1.5)}}}}}}else if(!t&&a.enabled){const t="audio"===e?b.silence:b.black;if(!t)return;await i.replaceTrack(t.getTracks()[0]),b.streams[b.myId][e]=t,"video"===e&&(b.facingMode=void 0),"audio"!==e?a.stop():(b.audioSource?.disconnect(),b.audioAnalyser?.disconnect())}N(b.myId),"presentation"!==e||t||A(!0)}catch(e){}}}function M(e){b?.onUpdate?.({"@type":"updateGroupCallConnectionState",connectionState:e})}function x(){b&&(b.myId&&b.streams?.[b.myId]&&Object.values(b.streams[b.myId]||{}).forEach(e=>{e?.getTracks().forEach(e=>{e.stop()})}),b.audioStream?.getTracks().forEach(e=>{e.stop()}),A(!0),b.dataChannel?.close(),b.connection?.close(),M("disconnected"),b.analyserInterval&&clearInterval(b.analyserInterval),b=void 0)}function V(){b&&b.participantFunctions&&Object.keys(b.participantFunctions).forEach(e=>{const{getCurrentAmplitude:t}=b.participantFunctions[Number(e)];if(t){const n=t(),a=b.speaking[e]||0;b.speaking[e]=n,(n>d&&a<=d||n<=d&&a>d)&&N(e)}})}async function F(e){if(!b)return;const{participants:t,conference:n,connection:a,myId:i}=b;if(!(t&&n&&a&&n.ssrcs&&n.transport&&i))return;if(e.find(e=>e.isSelf&&e.source!==b?.conference?.ssrcs?.find(e=>e.isMain&&!e.isVideo)?.sourceGroups[0].sources[0]))return void x();const o=[];if(e.forEach(e=>{if(e.isSelf)return void(e.isMuted&&!e.canSelfUnmute&&(P("audio",!1),P("video",!1),P("presentation",!1)));const{isLeft:t}=e,a=e.isMuted||e.isMutedByMe,i=!e.isVideoJoined||!e.video||t,s=!e.presentation||t;let r=!1,c=!1,l=!1;n.ssrcs.filter(t=>t.userId===e.id).forEach(t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(c=!0),t.isRemoved=a),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(r=!0),t.isRemoved=i),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(l=!0),t.isRemoved=s))}),a||c||(b.lastMid=b.lastMid+1,n.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{sources:[e.source]}],mid:b.lastMid.toString()})),i||r||!e.video||(b.lastMid=b.lastMid+1,o.push(e.video.endpoint),n.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups,mid:b.lastMid.toString()})),s||l||!e.presentation||(b.lastMid=b.lastMid+1,n.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups,mid:b.lastMid.toString()}))}),b.updatingParticipantsQueue)return void b.updatingParticipantsQueue.push(n);b.updatingParticipantsQueue=[];const s=f(n);await a.setRemoteDescription({type:"offer",sdp:s});try{const e=await a.createAnswer();if(await a.setLocalDescription(e),N(i),b.updatingParticipantsQueue.length>0)for(const e of b.updatingParticipantsQueue){await a.setRemoteDescription({type:"offer",sdp:f(e)});const t=await a.createAnswer();await a.setLocalDescription(t),N(i)}b.updatingParticipantsQueue=void 0}catch(e){console.error(e)}}function E(e){if(!(b&&b.audioElement&&b.audioContext&&b.mediaStream))return;const t=b.conference?.ssrcs?.find(t=>t.endpoint===e.track.id);if(!t||!t.userId)return;const{userId:n,isPresentation:a}=t,i=b.participants?.find(e=>e.id===n),o="video"===e.track.kind?a?"presentation":"video":"audio";e.track.onended=()=>{delete b?.streams?.[n][o],N(n)};const s=e.streams[0];if("audio"===e.track.kind){const{mediaStream:e}=b,t=new window.AudioContext,a=t.createMediaStreamSource(s),o=t.createGain();o.gain.value=(i?.volume||1e4)/1e4;const r=t.createGain();o.gain.value=1;const l=t.createAnalyser();l.minDecibels=-100,l.maxDecibels=-30,l.smoothingTimeConstant=.05,l.fftSize=1024,a.connect(l).connect(r).connect(o).connect(t.destination),e.addTrack(a.mediaStream.getAudioTracks()[0]);const d=new Audio;d.srcObject=s,d.muted=!0,d.remove(),b={...b,participantFunctions:{...b.participantFunctions,[n]:{...b.participantFunctions?.[n],setVolume:e=>{o.gain.value=e>1?2*e:e},toggleMute:e=>{r.gain.value=e?0:1},getCurrentAmplitude:()=>{const e=new Uint8Array(l.frequencyBinCount);return l.getByteFrequencyData(e),c(e,1.5)}}}}}b={...b,streams:{...b.streams,[n]:{...b.streams?.[n],[o]:s}}},N(n)}function Y(e,t,n=!1){const a=new RTCPeerConnection,i=n?void 0:function(e){const t=e.createDataChannel("data",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log("%conerror","background: green; font-size: 5em"),console.error(e)},t}(a);return e.forEach(e=>e.getTracks().forEach(t=>{a.addTrack(t,e)})),n||(a.oniceconnectionstatechange=()=>{const e=a.iceConnectionState;console.log("iceconnectionstatechange",e),"connected"===e||"completed"===e?M("connected"):"checking"===e||"new"===e?M("connecting"):"disconnected"===a.iceConnectionState&&M("reconnecting")}),a.onconnectionstatechange=()=>{console.log("connectionstatechange",a.connectionState)},a.ontrack=E,a.onnegotiationneeded=async()=>{if(!b)return;console.log("onnegotiationneeded");const{myId:i}=b;if(!i)return;const o=await a.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!n});if(console.log("offer created"),await a.setLocalDescription(o),console.log("local desc set"),!o.sdp)return;const s=h(o),r=n?void 0:{userId:"",sourceGroups:[{sources:[s.ssrc||0]}],isRemoved:n,isMain:!0,isVideo:!1,isPresentation:n,endpoint:n?"1":"0",mid:n?"1":"0"},c=s["ssrc-groups"]&&{isPresentation:n,userId:"",sourceGroups:s["ssrc-groups"],isMain:!0,isVideo:!0,endpoint:n?"0":"1",mid:n?"0":"1"},l=n?b.screenshareConference:b.conference,d=[];n?(c&&d.push(c),r&&d.push(r)):(r&&d.push(r),c&&d.push(c));const u=e.find(e=>"audio"===e.getTracks()[0].kind),p=e.find(e=>"video"===e.getTracks()[0].kind);b={...b,...n?{screenshareConference:{...l,ssrcs:d}}:{conference:{...l,ssrcs:d}},streams:{...b.streams,[i]:{...b.streams?.[i],...u&&{audio:u},...!n&&p?{video:p}:{presentation:p}}}},N(i),t(s)},{connection:a,dataChannel:i}}function D(){w?.onUpdate({...w.mediaState,"@type":"updatePhoneCallMediaState"})}function B(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...p&&{echoCancellation:!0},...m&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function G(e,t=void 0){if(!w)return;const n="audio"===e?w.streams.ownAudio:"video"===e?w.streams.ownVideo:w.streams.ownPresentation;if(!n)return;const a=n.getTracks()[0];if(!a)return;const i=w.connection.getSenders().find(e=>a.id===e.track?.id);if(i){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await B(e);t.getTracks()[0].onended=()=>{G(e,!1)},await i.replaceTrack(t.getTracks()[0]),"audio"===e?w.streams.ownAudio=t:"video"===e?(w.streams.ownVideo=t,w.facingMode="user"):w.streams.ownPresentation=t,"video"!==e&&"presentation"!==e||G("video"===e?"presentation":"video",!1)}else if(!t&&a.enabled){a.stop();const t="audio"===e?w.silence:"video"===e?w.blackVideo:w.blackPresentation;if(!t)return;await i.replaceTrack(t.getTracks()[0]),"audio"===e?w.streams.ownAudio=t:"video"===e?w.streams.ownVideo=t:w.streams.ownPresentation=t}D(),L()}catch(e){console.error(e)}}}function R(){w&&(w.streams.ownVideo?.getTracks().forEach(e=>e.stop()),w.streams.ownPresentation?.getTracks().forEach(e=>e.stop()),w.streams.ownAudio?.getTracks().forEach(e=>e.stop()),w.dataChannel.close(),w.connection.close(),w=void 0)}function L(){if(!w)return;const{emitSignalingData:e,streams:t}=w;e({"@type":"MediaState",videoRotation:0,isMuted:!t.ownAudio?.getTracks()[0].enabled,isBatteryLow:!0,videoState:t.ownVideo?.getTracks()[0].enabled?"active":"inactive",screencastState:t.ownPresentation?.getTracks()[0].enabled?"active":"inactive"})}function O(e){if(!w||w.isOutgoing)return e;const{payloadTypes:t}=e,n=t.findIndex(e=>"VP8"===e.name),a=t[n],i=t.findIndex(e=>Number(e.parameters?.apt)===a.id);return e.payloadTypes=[t[n],t[i]],e}function U(e){if(!w)return;const{emitSignalingData:t}=w;e.ssrc&&e["ssrc-groups"]&&e["ssrc-groups"][0]&&e["ssrc-groups"][1]&&t({"@type":"InitialSetup",fingerprints:e.fingerprints,ufrag:e.ufrag,pwd:e.pwd,audio:{ssrc:r(e.ssrc).toString(),ssrcGroups:[],payloadTypes:e.audioPayloadTypes,rtpExtensions:e.audioExtmap},video:O({ssrc:r(e["ssrc-groups"][0].sources[0]).toString(),ssrcGroups:[{semantics:e["ssrc-groups"][0].semantics,ssrcs:e["ssrc-groups"][0].sources.map(r)}],payloadTypes:e.videoPayloadTypes,rtpExtensions:e.videoExtmap}),screencast:O({ssrc:r(e["ssrc-groups"][1].sources[0]).toString(),ssrcGroups:[{semantics:e["ssrc-groups"][1].semantics,ssrcs:e["ssrc-groups"][1].sources.map(r)}],payloadTypes:e.screencastPayloadTypes,rtpExtensions:e.screencastExtmap})})}async function _(e){if(w&&w.connection)switch(e["@type"]){case"MediaState":w.mediaState=e,D(),L();break;case"Candidates":{const{pendingCandidates:t,gotInitialSetup:n}=w;e.candidates.forEach(e=>{t.push(e.sdpString)}),n&&await $();break}case"InitialSetup":{const{connection:t,isOutgoing:n}=w;if(!t)return;const a={transport:{candidates:[],ufrag:e.ufrag,pwd:e.pwd,fingerprints:e.fingerprints,"rtcp-mux":!1,xmlns:""},sessionId:Date.now(),ssrcs:[e.audio&&{isVideo:!1,isMain:!1,userId:"123",endpoint:"0",mid:"0",sourceGroups:[{sources:[e.audio.ssrc]}]},e.video&&{isVideo:!0,isPresentation:!1,isMain:!1,userId:"123",endpoint:"1",mid:"1",sourceGroups:e.video.ssrcGroups.map(e=>({semantics:e.semantics,sources:e.ssrcs}))},e.screencast&&{isVideo:!0,isPresentation:!0,isMain:!1,userId:"123",endpoint:"2",mid:"2",sourceGroups:e.screencast.ssrcGroups.map(e=>({semantics:e.semantics,sources:e.ssrcs}))}],audioPayloadTypes:e.audio.payloadTypes?.map(l)||[],audioExtensions:e.audio.rtpExtensions,videoPayloadTypes:O(e.video).payloadTypes?.map(l)||[],videoExtensions:e.video.rtpExtensions};if(await t.setRemoteDescription({sdp:f(a,n,void 0,!0),type:n?"answer":"offer"}),w.conference=a,!n){const e=await t.createAnswer();await t.setLocalDescription(e),U(h(t.localDescription,!0))}w.gotInitialSetup=!0,await $();break}}}async function $(){if(!w)return;const{pendingCandidates:e,connection:t}=w;e.length&&(await Promise.all(e.map(e=>async function(e,t){try{await e.addIceCandidate({candidate:t,sdpMLineIndex:0})}catch(e){console.error(e)}}(t,e))),w.pendingCandidates=[])}async function J(e,t){const n=await e.createOffer(t);await e.setLocalDescription(n),U(h(e.localDescription,!0))}var j=n(14487),z=n(4875),K=n(13439),H=n(80840),q=n(32989),W=n(11597),Z=n(71331),Q=n(42347);(0,K.aJ)("leaveGroupCall",async(e,t,n)=>{const{isFromLibrary:i,shouldDiscard:o,shouldRemove:s,rejoin:r,isPageUnload:c,tabId:l=(0,j.g0)()}=n||{},d=(0,Z.iT)(e);d&&(e=(0,H.R6)(e,{connectionState:"disconnected"},d.participantsCount-1),e={...e,groupCalls:{...e.groupCalls,activeGroupCallId:void 0}},(0,K.UF)(e),await(0,z.px)("leaveGroupCall",{call:d,isPageUnload:c}),await(0,z.px)("abortRequestGroup","call"),o&&await(0,z.px)("discardGroupCall",{call:d}),e=(0,K.mS)(),s&&(e=(0,H.um)(e,d.id)),(0,a.ow)(),(0,K.UF)(e),t.toggleGroupCallPanel({force:void 0,tabId:l}),i||x(),t.afterHangUp(),r&&t.requestMasterAndJoinGroupCall({...r,tabId:l}))}),(0,K.aJ)("toggleGroupCallVideo",async e=>{const t=(0,Z.iT)(e),n=(0,W.mBe)(e,e.currentUserId);n&&t&&(await P("video"),await(0,z.px)("editGroupCallParticipant",{call:t,videoStopped:!I("video"),participant:n}))}),(0,K.aJ)("requestToSpeak",(e,t,n)=>{const{value:a}=n||{value:!0},i=(0,Z.iT)(e),o=(0,W.mBe)(e,e.currentUserId);o&&i&&(0,z.px)("editGroupCallParticipant",{call:i,raiseHand:a,participant:o})}),(0,K.aJ)("setGroupCallParticipantVolume",(e,t,n)=>{const{participantId:a,volume:i}=n,s=(0,Z.iT)(e),r=(0,W.mBe)(e,a);r&&s&&(S(a,Math.floor(i/o.CH0)/100),(0,z.px)("editGroupCallParticipant",{call:s,volume:Number(i),participant:r}))}),(0,K.aJ)("toggleGroupCallMute",async(e,t,n)=>{const{participantId:a,value:i}=n||{},o=(0,Z.iT)(e),s=(0,W.mBe)(e,a||e.currentUserId);if(!s||!o)return;const r=void 0===i?I("audio",s.id):i;a?S(a,r?0:1):await P("audio"),await(0,z.px)("editGroupCallParticipant",{call:o,muted:r,participant:s})}),(0,K.aJ)("toggleGroupCallPresentation",async(e,t,n)=>{const a=(0,Z.iT)(e),i=(0,W.mBe)(e,e.currentUserId);if(i&&a){if(void 0!==n?.value?n?.value:!I("presentation")){const e=await async function(){if(b)try{const e=await T("presentation");if(!e)return;return e.getTracks()[0].onended=()=>{b&&b.myId&&(delete b.streams?.[b.myId].presentation,N(b.myId),A())},await new Promise(t=>{const{connection:n,dataChannel:a}=Y([e],t,!0);b={...b,screenshareConnection:n,screenshareDataChannel:a}})}catch(e){return}}();if(!e)return;await(0,z.px)("joinGroupCallPresentation",{call:a,params:e})}else await P("presentation",!1),await(0,z.px)("leaveGroupCallPresentation",{call:a});await(0,z.px)("editGroupCallParticipant",{call:a,presentationPaused:!I("presentation"),participant:i})}}),(0,K.aJ)("connectToActiveGroupCall",async(e,t,n)=>{const{tabId:i=(0,j.g0)()}=n||{},o=(0,Z.iT)(e);if(!o)return;if("discarded"===o.connectionState)return void t.showNotification({message:"This voice chat is not active",tabId:i});const s=(0,a.sN)(),r=(0,a.Hc)();if(!s||!r)return;const{currentUserId:c}=e;if(!c)return;const l=await function(e,t,n,a){if(b)throw Error("Already in call");M("connecting");const i=new MediaStream;return n.srcObject=i,(0,y.A)(n),b={onUpdate:a,participants:[],myId:e,speaking:{},silence:g(t),black:v({width:640,height:480}),analyserInterval:setInterval(V,1e3),audioElement:n,audioContext:t,mediaStream:i,lastMid:3},T("audio"),new Promise(e=>{b={...b,...Y([b.silence,b.black],e)}})}(c,r,s,t.apiUpdate),d=await(0,z.px)("joinGroupCall",{call:o,params:l,inviteHash:o.inviteHash});if(e=(0,K.mS)(),!d)return t.showNotification({message:"Failed to join voice chat",tabId:i}),void t.leaveGroupCall({tabId:i});if(t.loadMoreGroupCallParticipants(),o.chatId){e=(0,K.mS)();const n=(0,W.hds)(e,o.chatId);if(!n)return;await(0,Q.ad)(e,t,n)}}),(0,K.aJ)("connectToActivePhoneCall",async(e,t)=>{const{phoneCall:n}=e;if(!n)return;const a=(0,Z.uu)(e);if(!a)return;const i=await(0,z.px)("getDhConfig");if(!i)return;await(0,z.px)("createPhoneCallState",[!0]);const o=await(0,z.px)("requestPhoneCall",[i]);await(0,z.px)("requestCall",{user:a,gAHash:o,isVideo:n.isVideo})||"hangUp"in t&&t.hangUp({tabId:(0,j.g0)()})}),(0,K.aJ)("acceptCall",async e=>{const{phoneCall:t}=e;if(!t)return;const n=await(0,z.px)("getDhConfig");if(!n)return;await(0,z.px)("createPhoneCallState",[!1]);const a=await(0,z.px)("acceptPhoneCall",[n]);await(0,z.px)("acceptCall",{call:t,gB:a})}),(0,K.aJ)("sendSignalingData",(e,t,n)=>{const{phoneCall:a}=e;if(!a)return;const i=JSON.stringify(n);(async()=>{const e=await(0,z.px)("encodePhoneCallData",[i]);e&&(0,z.px)("sendSignalingData",{data:e,call:a})})()}),(0,K.aJ)("closeCallRatingModal",(e,t,n)=>{const{tabId:a=(0,j.g0)()}=n||{};return(0,q.w)(e,{ratingPhoneCall:void 0},a)}),(0,K.aJ)("setCallRating",(e,t,n)=>{const{rating:a,comment:i,tabId:o=(0,j.g0)()}=n,{ratingPhoneCall:s}=(0,W.nTw)(e,o);if(s)return(0,z.px)("setCallRating",{call:s,rating:a,comment:i}),(0,q.w)(e,{ratingPhoneCall:void 0},o)}),(0,K.aJ)("hangUp",(e,t,n)=>{const{isPageUnload:a,tabId:i=(0,j.g0)()}=n||{},{phoneCall:o}=e;if(o){if("discarded"===o.state)return(0,z.px)("destroyPhoneCallState"),R(),e={...e,phoneCall:void 0},(0,K.UF)(e),t.toggleGroupCallPanel({force:void 0,tabId:i}),void t.afterHangUp();if((0,z.px)("destroyPhoneCallState"),R(),(0,z.px)("discardCall",{call:o,isPageUnload:a}),"requesting"===o.state)return e={...e,phoneCall:void 0},(0,K.UF)(e),t.toggleGroupCallPanel({force:void 0,tabId:i}),void t.afterHangUp();setTimeout(()=>{e=(0,K.mS)(),e={...e,phoneCall:void 0},(0,K.UF)(e),t.toggleGroupCallPanel({force:void 0,tabId:i}),t.afterHangUp()},500)}});var X=n(87894),ee=n(6e4);const te=new Uint16Array([55357,56841,55357,56845,55357,56859,55357,56877,55357,56881,55357,56865,55357,56846,55357,56884,55357,56885,55357,56840,55357,56876,55357,56839,55357,56847,55357,56430,55357,56439,55357,56450,55357,56438,55357,56424,55357,56425,55357,56436,55357,56437,55357,56891,55357,56893,55357,56896,55357,56442,55357,56904,55357,56905,55357,56906,55357,56448,55357,56445,55357,56489,55357,56613,55357,56485,55357,56484,55357,56386,55357,56384,55357,56387,55357,56389,55357,56388,55357,56397,55357,56398,55357,56396,55357,56394,9996,9995,55357,56400,55357,56390,55357,56391,55357,56393,55357,56392,55357,56911,55357,56399,55357,56490,55357,57014,55356,57283,55357,56451,55357,56427,55357,56426,55357,56428,55357,56429,55357,56453,55356,57257,55357,56401,55357,56402,55357,56415,55357,56414,55357,56416,55357,56405,55357,56407,55357,56406,55357,56409,55357,56412,55357,56403,55356,57216,55357,56452,55357,56475,55357,56473,55357,56476,55357,56474,55357,56461,55357,56462,55357,56374,55357,56378,55357,56369,55357,56365,55357,56377,55357,56368,55357,56376,55357,56367,55357,56360,55357,56379,55357,56375,55357,56366,55357,56343,55357,56372,55357,56337,55357,56344,55357,56380,55357,56359,55357,56357,55357,56340,55357,56333,55357,56354,55357,56347,55357,56349,55357,56348,55357,56350,55357,56332,55357,56345,55357,56346,55357,56351,55357,56364,55357,56331,55357,56336,55357,56330,55357,56363,55356,57152,55356,57145,55356,57147,55356,57153,55356,57150,55356,57156,55356,57141,55356,57140,55356,57139,55356,57118,55356,57114,55356,57113,55356,57102,55356,57099,9889,9748,10052,9924,55356,57088,55356,57096,55356,57098,55356,57235,55356,57222,55356,57219,55357,56443,55356,57221,55356,57220,55356,57217,55356,57224,55357,56622,55356,57253,55357,56567,55357,56511,55357,56507,9742,55357,56545,55357,56570,55357,56571,55357,56585,55357,56596,9203,9200,8986,55357,56594,55357,56593,55357,56590,55357,56481,55357,56614,55357,56588,55357,56587,55357,57023,55357,57021,55357,56615,55357,56616,55357,57002,55357,57004,55357,56483,55357,56619,55357,56618,55357,56458,55357,56457,55357,56496,55357,56501,55357,56499,9993,55357,56555,55357,56550,55357,56517,55357,56513,9986,55357,56524,55357,56526,10002,9999,55357,56528,55357,56538,55357,56620,55357,56621,55356,57256,55356,57260,55356,57252,55356,57255,55356,57269,55356,57273,55356,57275,55356,57274,55356,57272,55357,56446,55356,57262,55356,56527,55356,57266,55356,57263,55356,57288,55356,57280,9917,9918,55356,57278,55356,57265,55356,57289,55356,57267,55356,57281,55356,57287,55356,57286,55356,57290,55356,57284,9749,55356,57212,55356,57210,55356,57207,55356,57204,55356,57173,55356,57172,55356,57183,55356,57175,55356,57201,55356,57178,55356,57180,55356,57185,55356,57203,55356,57182,55356,57193,55356,57190,55356,57218,55356,57200,55356,57194,55356,57195,55356,57197,55356,57199,55356,57166,55356,57167,55356,57162,55356,57163,55356,57170,55356,57159,55356,57161,55356,57171,55356,57169,55356,57164,55356,57168,55356,57165,55356,57158,55356,57157,55356,57149,55356,57313,55356,57317,55356,57318,9962,55356,57328,9978,55356,57325,55357,56827,55357,56829,55356,57248,55356,57249,9970,55356,57250,55357,56994,55357,56996,9875,55357,56960,9992,55357,56961,55357,56962,55357,56971,55357,56974,55357,56972,55357,56985,55357,56983,55357,56981,55357,56987,55357,57e3,55357,56980,55357,56978,55357,56977,55357,57010,55357,56992,55357,56988,55357,56998,9888,55357,56999,9981,55356,57264,55357,56831,55356,57258,55356,57261,55356,56815,55356,56821,55356,56816,55356,56823,55356,56809,55356,56810,55356,56808,55356,56819,55356,56826,55356,56824,55356,56811,55356,56823,55356,56810,55356,56824,55356,56814,55356,56825,55356,56823,55356,56826,55356,56812,55356,56807,49,8419,50,8419,51,8419,52,8419,53,8419,54,8419,55,8419,56,8419,57,8419,48,8419,55357,56607,10071,10067,9829,9830,55357,56495,55357,56599,55357,56625,55357,56628,55357,56629,55357,56630,55357,56631]),ne=[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,87,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,259,260,261,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,295,297,299,301,303,305,306,307,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,351,353,355,357,359,360,362,364,365,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,396,398,400,402,404,406,407,408,410,412,414,416,418,420,422,424,426,427,429,431,433,435,437,439,441,443,445,447,449,451,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,508,510,511,513,515,517,519,521,522,524,526,528,529,531,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,567,569,570,572,574,576,578,582,586,590,594,598,602,606,610,614,618,620,622,624,626,628,630,632,634,636,638,640,641,642,643,644,646,648,650,652,654,656,658];(0,K.aJ)("apiUpdate",(e,t,n)=>{const{activeGroupCallId:a}=e.groupCalls;switch(n["@type"]){case"updateGroupCallLeavePresentation":t.toggleGroupCallPresentation({value:!1});break;case"updateGroupCallStreams":if(!n.userId||!a)break;if(!(0,Z.n5)(e,a,n.userId))break;return(0,H.c5)(e,a,n.userId,(0,X.cJ)(n,["@type","userId"]));case"updateGroupCallConnectionState":if(!a)break;if("disconnected"===n.connectionState){"leaveGroupCall"in t&&t.leaveGroupCall({isFromLibrary:!0,tabId:(0,j.g0)()});break}return(0,H.h9)(e,a,{connectionState:n.connectionState,isSpeakerDisabled:n.isSpeakerDisabled});case"updateGroupCallParticipants":{const{groupCallId:e,participants:t}=n;a===e&&F(t);break}case"updateGroupCallConnection":{if(n.data.stream){t.showNotification({message:"Big live streams are not yet supported",tabId:(0,j.g0)()}),"leaveGroupCall"in t&&t.leaveGroupCall({tabId:(0,j.g0)()});break}!async function(e,t){if(!b)return;const n=t?b.screenshareConference:b.conference,a=t?b.screenshareConnection:b.connection;if(!n||!a||!n.ssrcs)return;const i=Date.now(),o={...n,transport:e.transport,sessionId:i,audioExtensions:e.audio?.["rtp-hdrexts"],audioPayloadTypes:e.audio?.["payload-types"],videoExtensions:e.video?.["rtp-hdrexts"],videoPayloadTypes:e.video?.["payload-types"]};b={...b,...t?{screenshareConference:o}:{conference:o}};try{await a.setRemoteDescription({type:"answer",sdp:f(o,!0,t)})}catch(e){console.error(e)}}(n.data,n.presentation);const a=(0,Z.iT)(e);a?.participants&&Object.keys(a.participants).length>0&&F(Object.values(a.participants));break}case"updatePhoneCallMediaState":return{...e,phoneCall:{...e.phoneCall,...(0,X.cJ)(n,["@type"])}};case"updatePhoneCall":{if(!i.OL)return;const{phoneCall:a,currentUserId:s}=e,r={...a,...n.call},c=a?.adminId===s;if(e={...e,phoneCall:r},(0,K.UF)(e),e=(0,K.mS)(),a&&a.id&&r.id!==a.id)return void("discarded"!==r.state&&(0,z.px)("discardCall",{call:r,isBusy:!0}));const{accessHash:l,state:d,connections:u,gB:p}=r;if(("active"===d||"accepted"===d)&&(o=r.protocol,!o?.libraryVersions.some(e=>"4.0.0"===e||"4.0.1"===e))){const n=(0,Z.uu)(e);return"hangUp"in t&&t.hangUp({tabId:(0,j.g0)()}),void t.showNotification({message:ee.yE("VoipPeerIncompatible",n?.firstName),tabId:(0,j.g0)()})}if("discarded"===d){if(!a)return;return(0,q.w)(e,{...r.needRating&&{ratingPhoneCall:r},isCallPanelVisible:void 0},(0,j.g0)())}return"accepted"===d&&l&&p?(async()=>{const{gA:t,keyFingerprint:n,emojis:a}=await(0,z.px)("confirmPhoneCall",[p,te,ne]),i={...(e=(0,K.mS)()).phoneCall,emojis:a};e={...e,phoneCall:i},(0,K.UF)(e),(0,z.px)("confirmCall",{call:r,gA:t,keyFingerprint:n})})():"active"===d&&u&&"active"!==a?.state&&(c||((0,z.px)("receivedCall",{call:r}),(async()=>{const{emojis:t}=await(0,z.px)("confirmPhoneCall",[r.gAOrB,te,ne]),n={...(e=(0,K.mS)()).phoneCall,emojis:t};e={...e,phoneCall:n},(0,K.UF)(e)})()),async function(e,t,n,a,i,o){const s=new RTCPeerConnection({iceServers:e.map(e=>({urls:[e.isTurn&&`turn:${e.ip}:${e.port}`,e.isStun&&`stun:${e.ip}:${e.port}`].filter(Boolean),username:e.username,credentialType:"password",credential:e.password})),iceTransportPolicy:i?"all":"relay",bundlePolicy:"max-bundle",iceCandidatePoolSize:10});s.onicecandidate=e=>{e.candidate&&t({"@type":"Candidates",candidates:[{sdpString:e.candidate.candidate}]})},s.onconnectionstatechange=()=>{o({"@type":"updatePhoneCallConnectionState",connectionState:s.connectionState})},s.ontrack=e=>{if(!w)return;const t=e.streams[0];"audio"===e.track.kind?(w.audio.srcObject=t,w.audio.play().catch(),w.streams.audio=t):"1"===e.transceiver.mid?w.streams.video=t:w.streams.presentation=t,D()},s.oniceconnectionstatechange=async e=>{switch(s.iceConnectionState){case"disconnected":case"failed":n&&await J(s,{offerToReceiveAudio:!0,offerToReceiveVideo:!0,iceRestart:!0})}};const r=g(new AudioContext),c=v({width:640,height:480}),l=v({width:640,height:480});s.addTrack(r.getTracks()[0],r),s.addTrack(c.getTracks()[0],c),s.addTrack(l.getTracks()[0],l);const d=s.createDataChannel("data",{id:0,negotiated:!0});d.onmessage=e=>{_(JSON.parse(e.data))};const u=new Audio;w={audio:u,connection:s,emitSignalingData:t,isOutgoing:n,pendingCandidates:[],onUpdate:o,streams:{ownVideo:c,ownAudio:r,ownPresentation:l},mediaState:{isBatteryLow:!1,screencastState:"inactive",videoState:"inactive",videoRotation:0,isMuted:!0},blackVideo:c,blackPresentation:l,silence:r,dataChannel:d};try{G("audio",!0)}catch(e){console.error(e)}n&&await J(s,{offerToReceiveAudio:!0,offerToReceiveVideo:!0})}(u,t.sendSignalingData,c,Boolean(r?.isVideo),Boolean(r.isP2pAllowed),t.apiUpdate)),e}case"updatePhoneCallConnectionState":{const{connectionState:a}=n;return e.phoneCall?"closed"===a||"disconnected"===a||"failed"===a?void("hangUp"in t&&t.hangUp({tabId:(0,j.g0)()})):{...e,phoneCall:{...e.phoneCall,isConnected:"connected"===a}}:e}case"updatePhoneCallSignalingData":{const{phoneCall:t}=e;if(!t)break;(0,z.px)("decodePhoneCallData",[n.data])?.then(_);break}}var o});var ae=n(84051),ie=n(87357),oe=n(43874),se=n(37661),re=n(5912),ce=n(17712),le=n(59030),de=n(90423),ue=n(73767),pe=n(93545),me=n(64493),he=n(19806),fe=n(12933),ge=n(22337),ve=n(96374),Ce=n(46222),ye=n(4961);function be(e){return Math.floor((e.volume||o.iRY)/o.CH0).toString()}var we=n(10722),Ae=n(21849),ke=n(34431),Se=n(18276),Ie=n(22720),Ne=n(14957),Te=n(672),Pe=n(4438),Me=n(285),xe=n(71429),Ve=n(24433),Fe=n(20021);const Ee=[0,17],Ye=[17,34],De=(0,ae.ph)((0,K.EK)(e=>({isAdmin:(0,Z.qI)(e)}))(({participant:e,onCloseAnimationEnd:t,onClose:n,isDropdownOpen:a,isAdmin:i,menuRef:s,...r})=>{const{toggleGroupCallMute:c,setGroupCallParticipantVolume:l,toggleGroupCallPanel:d,openChat:u,requestToSpeak:p}=(0,K.ko)(),m=(0,le.A)(),[h,f,g]=(0,se.A)(),v=e?.id,{isMutedByMe:C,isMuted:y,isSelf:b,canSelfUnmute:w}=e||{},A=Boolean(e?.raiseHandRating),k=!w&&y,[S,I]=(0,ae.J0)(C?0:(e?.volume||o.iRY)/o.CH0),[N,T]=(0,ae.J0)(!1),P=0===S,M=P?Ee:Ye;(0,ae.vJ)(()=>{a||T(!1)},[a]);const x=(0,ce.A)(e=>{I(e),T(0===e!==P)});(0,ae.vJ)(()=>{I(C?0:(e?.volume||o.iRY)/o.CH0)},[v]);const V=function(e,t,n=[]){return(0,Te.A)(e=>{e()},n,e,t)}(500),F=(0,ce.A)(e=>{e.stopPropagation(),f(),n()}),E=(0,ce.A)(e=>{e.stopPropagation(),p({value:!1}),n()}),Y=(0,ce.A)(t=>{t.stopPropagation(),n(),i?k&&x((e?.volume??o.iRY)/o.CH0):x(C?o.iRY/o.CH0:0),c({participantId:v,value:i?!k:!C})}),D=(0,ce.A)(e=>{e.stopPropagation(),d(),u({id:v}),n()});return(0,Fe.FD)("div",{children:[(0,Fe.FD)(xe.A,{isOpen:a,ref:s,withPortal:!0,onClose:n,onCloseAnimationEnd:t,className:"participant-menu with-menu-transitions",...r,children:[!b&&!k&&(0,Fe.Y)("div",{className:"group",children:(0,Fe.FD)("div",{className:(0,ie.A)("volume-control",S<50&&"low",S>=50&&S<100&&"medium",S>=100&&S<150&&"normal",S>=150&&"high"),children:[(0,Fe.Y)("input",{type:"range",min:"0",max:"200",value:S,onChange:e=>{const t=Number(e.target.value);x(t),V(()=>{0===t?c({participantId:v,value:!0}):l({participantId:v,volume:Math.floor(t*o.CH0)})})}}),(0,Fe.FD)("div",{className:"info",children:[(0,Fe.Y)(Pe.A,{tgsUrl:Ne.w.Speaker,play:!!N&&M.toString(),playSegment:M,size:24}),(0,Fe.FD)("span",{children:[S,"%"]})]})]})}),(0,Fe.FD)("div",{className:"group",children:[A&&b&&(0,Fe.Y)(Ve.A,{icon:"stop-raising-hand",onClick:E,children:m("VoipGroupCancelRaiseHand")}),!b&&(0,Fe.Y)(Ve.A,{icon:"user",onClick:D,children:m("VoipGroupOpenProfile")}),!b&&(0,Fe.Y)(Ve.A,{icon:y&&i&&k?"allow-speak":"microphone-alt",onClick:Y,children:m(i?k?"VoipGroupAllowToSpeak":"VoipMute":C?"VoipGroupUnmuteForMe":"VoipGroupMuteForMe")}),!b&&i&&(0,Fe.Y)(Ve.A,{icon:"delete-user",destructive:!0,onClick:F,children:m("VoipGroupUserRemove")})]})]}),!b&&i&&(0,Fe.Y)(Me.A,{isOpen:h,userId:v,onClose:g})]})})),Be=(0,ae.ph)(({participant:e,noColor:t,className:n})=>{const{isMuted:a,isMutedByMe:i}=e,o=(e.amplitude||0)>d,s=Boolean(e.raiseHandRating),r=(0,ue.A)(s),c=!Boolean(e?.canSelfUnmute)&&a,l=(0,ue.A)(a),u=(0,ae.Kr)(()=>a&&!l?[43,64]:!a&&l?[22,42]:s&&!r?[65,84]:!c&&r?[0,21]:a?[22,23]:[43,44],[a,c,s]),p=(0,ae.Kr)(()=>t?"#ffffff":s?"#4da6e0":c||i?"#ff706f":o?"#57bc6c":"#aaaaaa",[t,s,c,i,o]);return(0,Fe.Y)(Pe.A,{tgsUrl:Ne.w.VoiceOutlined,play:u.toString(),playSegment:u,size:28,color:p,className:n,forceAlways:!0,nonInteractive:!0})}),Ge={root:"Wk7JwPx3",subtitle:"ShcCNemD",subtitleText:"UZLgp2cx",icon:"vRc6jhKf",subtitleBlue:"yA7bxEWw",subtitleRed:"DnuZwImI",subtitleGreen:"BkgYQGFq",avatar:"ouHUJ9ff"},Re=(0,ae.ph)((0,K.EK)((e,{participant:t})=>({peer:(0,W.mBe)(e,t.id)||(0,W.hds)(e,t.id)}))(({participant:e,peer:t})=>{const n=(0,ae.li)(),a=(0,ae.li)(),i=(0,le.A)(),{isSelf:s,isMutedByMe:r,isMuted:c,hasVideoStream:l,hasPresentationStream:u}=e,p=(e.amplitude||0)>d,m=Boolean(e.raiseHandRating),{isContextMenuOpen:h,contextMenuAnchor:f,handleContextMenu:g,handleBeforeContextMenu:v,handleContextMenuClose:C,handleContextMenuHide:y}=(0,we.A)(n,s),b=(0,ae.hb)(()=>n.current,[]),w=(0,ae.hb)(()=>n.current.closest(".custom-scroll, .no-scrollbar"),[]),A=(0,ae.hb)(()=>a.current,[]),k=(0,ae.hb)(()=>({withPortal:!0}),[]),S=Boolean(!c&&p&&e.volume&&e.volume!==o.iRY),[I,N]=(0,ae.Kr)(()=>r?[i("VoipGroupMutedForMe"),Ge.subtitleRed]:m?[i("WantsToSpeak"),Ge.subtitleBlue]:S?[i("SpeakingWithVolume",be(e)).replace("%%","%"),Ge.subtitleGreen]:!c&&p?[i("Speaking"),Ge.subtitleGreen]:s?[i("ThisIsYou"),Ge.subtitleBlue]:e.about?[e.about,""]:[i("Listening"),Ge.subtitleBlue],[r,m,S,c,p,s,e,i]);if(t)return(0,Fe.FD)(Ie.A,{leftElement:(0,Fe.Y)(Ae.A,{peer:t,className:Ge.avatar}),rightElement:(0,Fe.Y)(Be,{participant:e,className:Ge.icon}),className:Ge.root,onClick:g,onMouseDown:v,onContextMenu:g,multiline:!0,ripple:!0,ref:n,children:[(0,Fe.Y)(ke.A,{peer:t,withEmojiStatus:!0,className:Ge.title}),(0,Fe.FD)("span",{className:(0,ie.A)(Ge.subtitle,"subtitle",N),children:[u&&(0,Fe.Y)(Se.A,{name:"share-screen"}),l&&(0,Fe.Y)(Se.A,{name:"video"}),S&&(0,Fe.Y)(Se.A,{name:"speaker"}),(0,Fe.Y)("span",{className:Ge.subtitleText,children:(0,ye.A)(I)})]}),(0,Fe.Y)(De,{participant:e,isDropdownOpen:h,anchor:f,getTriggerElement:b,getRootElement:w,getMenuElement:A,getLayout:k,onClose:C,onCloseAnimationEnd:y,menuRef:a})]})}));function Le(e,t){return(0,X.zV)(!e.isMuted,!t.isMuted)||(0,X.zV)(e.presentation,t.presentation)||(0,X.zV)(e.video,t.video)||(0,X.zV)(e.raiseHandRating,t.raiseHandRating)}const Oe=(0,ae.ph)((0,K.EK)(e=>{const{participantsCount:t,participants:n}=(0,Z.iT)(e)||{};return{participants:n,participantsCount:t||0}})(({panelOffset:e,participants:t,participantsCount:n,isLandscape:a})=>{const{loadMoreGroupCallParticipants:i}=(0,K.ko)(),o=(0,ae.Kr)(()=>Object.values(t||{}).sort(Le).map(e=>e.id),[t]),s=(0,ce.A)(()=>{i()}),[r,c]=(0,ve.A)(s,o,o.length>=n);return(0,Fe.Y)(Ce.A,{items:r,onLoadMore:c,style:`transform: translateY(${e}px);`,className:(0,ie.A)("npTa6CmI",!a&&"v7oB2HTv"),children:t&&r?.map(e=>t[e]&&(0,Fe.Y)(Re,{teactOrderKey:o.indexOf(e),participant:t[e]},e))})}));var Ue=n(32587),_e=n(66644),$e=n(19822),Je=n(37836),je=n(32625),ze=n(55158);const Ke="eUXuK9Oz",He="O2bTiH2E",qe=(0,ae.ph)((0,K.EK)((e,{participant:t})=>({user:t.isUser?(0,W.mBe)(e,t.id):void 0,chat:t.isUser?void 0:(0,W.hds)(e,t.id)}))(({layout:e,pinnedVideo:t,setPinned:n,canPin:a,className:s,participant:r,user:c,chat:l})=>{const u=(0,le.A)(),p=(0,ae.li)(),m=(0,ae.li)(),h=(0,ae.li)(),{x:f,y:g,width:v,height:C,noAnimate:y,isRemoved:b,type:w}=e,{isSelf:A,isMutedByMe:S,isMuted:I}=r,N=t?.id===r.id&&t?.type===w,T=(r.amplitude||0)>d,P=Boolean(r.raiseHandRating),M="video"===w&&r.isSelf,x=(0,ae.Kr)(()=>A?u("ThisIsYou"):S?u("VoipGroupMutedForMe"):P?u("WantsToSpeak"):I||!T?u("Listening"):r.volume&&r.volume!==o.iRY?u("SpeakingWithVolume",be(r)).replace("%%","%"):u("Speaking"),[A,S,P,I,T,r,u]),V=(0,ae.li)();b||(V.current=e);const{x:F,y:E,width:Y,height:D}=V.current||{},[B,G,R,L]=b?[F,E,Y,D]:[f,g,v,C],[O,U]=(0,ae.J0)(!y),_=k(c?.id||l.id),$="video"===w?_?.video:_?.presentation,J=(0,ae.li)($);$?.active&&$?.getVideoTracks()[0].enabled&&(J.current=$);const j=J.current,z=(0,ce.A)(()=>{const e=m.current;e&&(e.srcObject=null)});(0,ae.vJ)(()=>(j?.addEventListener("inactive",z),()=>{j?.removeEventListener("inactive",z)}),[z,j]),(0,ae.vJ)(()=>{U(!1)},[]);const[K,H]=(0,ae.J0)(!0),q=(0,ce.A)(()=>{H(!1)});(0,je.A)(()=>{if(!j?.active)return;const e=m.current,t=h.current;(0,_e.RK)(()=>{t.width=e.videoWidth,t.height=e.videoHeight,t.getContext("2d").drawImage(e,0,0,t.width,t.height)})},1e3),(0,ae.vJ)(()=>{const e=m.current,t=p.current;if(!e||!t||!j)return;const n=t.getContext("2d",{alpha:!1});if(!n)return;let a=!0;return(0,_e.RK)(()=>{a&&(t.width=16,t.height=16,n.filter="blur(2px)",(0,$e.i0)(()=>!!a&&!!j.active&&(n.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height),i.QH||(0,Ue.A)(n,0,0,t.width,t.height,2,2),!0),Je.IJ))}),()=>{a=!1}},[j]);const W=(0,ae.li)(),Z=(0,ae.li)(),{isContextMenuOpen:Q,contextMenuAnchor:X,handleContextMenu:ee,handleContextMenuClose:te,handleContextMenuHide:ne}=(0,we.A)(W,A),oe=(0,ae.hb)(()=>W.current,[]),se=(0,ae.hb)(()=>W.current.closest(".custom-scroll, .no-scrollbar"),[]),re=(0,ae.hb)(()=>Z.current,[]),de=(0,ae.hb)(()=>({withPortal:!0}),[]),ue=(0,ae.hb)(()=>{n(N?void 0:{id:c?.id||l.id,type:w})},[l,N,n,w,c?.id]);return(0,Fe.FD)("div",{className:(0,ie.A)("DKuzmnN7",(O||b)&&"T_wodAHA",y&&"yPCkJzpi",s,N&&"B4WZhF9P"),style:`--x: ${B}px; --y: ${G}px; --width: ${R}px; --height: ${L}px;`,ref:W,onContextMenu:ee,onDoubleClick:a?ue:void 0,children:[(0,Fe.FD)("div",{className:(0,ie.A)("eBq1NoLo",T&&"h4NcT6OS"),children:[K&&(0,Fe.Y)(ze.A,{className:(0,ie.A)(Ke,"XedVWQii")}),j&&(0,Fe.Y)("video",{className:(0,ie.A)(Ke,M&&He),muted:!0,autoPlay:!0,playsInline:!0,srcObject:j,ref:m,onCanPlay:q}),(0,Fe.Y)("canvas",{className:(0,ie.A)("eTpvBU_b eUXuK9Oz",M&&He),ref:h}),(0,Fe.Y)("div",{className:"R5ULTrF9",children:(0,Fe.Y)("canvas",{className:(0,ie.A)("cjUWuViy",M&&He),ref:p})}),a&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",ripple:!0,color:"translucent",className:"lPdblo0y",ariaLabel:u(N?"lng_group_call_context_unpin_camera":"lng_group_call_context_pin_camera"),onClick:ue,iconName:N?"unpin":"pin"}),(0,Fe.FD)("div",{className:"T1deCDSn",children:[(0,Fe.FD)("div",{className:"LzFFayK3",children:[(0,Fe.Y)(ke.A,{peer:c||l,className:"RBwMAuKp"}),(0,Fe.Y)("div",{className:"z1ZZTsjC",children:x})]}),(0,Fe.Y)(Be,{participant:r,className:"j1aDzn1H",noColor:!0})]})]}),(0,Fe.Y)(De,{participant:r,isDropdownOpen:Q,anchor:X,getTriggerElement:oe,getRootElement:se,getMenuElement:re,getLayout:de,onClose:te,onCloseAnimationEnd:ne,menuRef:Z})]})})),We=()=>{navigator.vibrate?.(50)};var Ze=n(57474);const Qe=(0,ae.ph)((0,K.EK)(e=>{const t=(0,Z.iT)(e),{connectionState:n}=t||{},a=t&&(0,Z.n5)(e,t.id,e.currentUserId),{raiseHandRating:i,hasAudioStream:o,canSelfUnmute:s,isMuted:r}=a||{};return{connectionState:n||"discarded",hasRequestedToSpeak:Boolean(i),noAudioStream:!o,canSelfUnmute:s,isMuted:r}})(({className:e,noAudioStream:t,canSelfUnmute:n,isMuted:a,connectionState:i})=>{const{toggleGroupCallMute:o,requestToSpeak:s,playGroupCallSound:r}=(0,K.ko)(),c=(0,le.A)(),l=(0,ae.li)("up"),[d,u]=(0,ae.J0)(!1),p="connected"!==i,m=!n&&a,h=(0,ue.A)(m);(0,ae.vJ)(()=>{h&&!m&&r({sound:"allowTalk"})},[r,h,m]);const f=(0,ae.Kr)(()=>{if(d){const e=Math.floor(100*Math.random());return e<32?[0,120]:e<64?[120,240]:e<97?[240,420]:[420,540]}return!h&&m?t?[99,135]:[136,172]:h&&!m?[0,36]:m?[0,0]:t?[69,99]:[36,69]},[h,d,t,m]),g=d?"HandFilled":"VoiceMini",v=(0,ae.hb)(()=>{We(),o()},[o]),C=(0,ae.hb)(()=>{if(m){if(d)return;return We(),s(),u(!0),void setTimeout(()=>{u(!1)},3e3)}l.current="down",t&&setTimeout(()=>{"down"===l.current&&(l.current="hold",v())},200)},[d,t,s,m,v]),y=(0,ae.hb)(()=>{m||(v(),l.current="up")},[m,v]);return(0,Fe.FD)(me.A,{round:!0,size:"default",className:(0,ie.A)("lKdhQ5pw",!p&&t&&"bjKqp3SI",!p&&m&&"Ynow5UuE",e),onMouseDown:C,onMouseUp:y,ariaLabel:c(a?"VoipUnmute":"VoipMute"),disabled:p,children:[(0,Fe.Y)(Pe.A,{tgsUrl:Ne.w[g],size:36,play:f.toString(),playSegment:f,className:"Ea1XnQaX",forceAlways:!0}),(0,Fe.Y)(Ze.A,{className:(0,ie.A)("tyQNJC6B",p&&"LowChABq"),color:"white"})]})})),Xe={root:"OsO5GKfn",panelWrapper:"cUVoePr_",panel:"Thuz79M3",panelScrollTrigger:"zoK6Y6IS",panelHeader:"DMBtCL9Z",scrolled:"GdEH1Agb",fullscreen:"JJx0QI2w",landscape:"wamCuzMB",headerButton:"gmyieSid",firstButton:"hVnn6KBp",lastButton:"iy78A5rG",panelHeaderText:"TwEEA77i",title:"pNZ9skLf",bigger:"NumT3v5i",subtitle:"gmfUKabx",participants:"iTeC_RxH",participantVideos:"PZmKIdTl",addParticipantButton:"clmu2oBt",videos:"ATwoMlAV",mainVideoContainer:"hqFon3dV",videosHeader:"KPHc659W",appFullscreen:"cl2sfoBF",videosHeaderLastButton:"_t50HVNJ",videosContent:"oEEQZilE",actions:"uGzi9s97",actionButton:"foXbVcnN",destructive:"YIR9Z9CZ",canRequestToSpeak:"ZoiZQu_O",muted:"wpvv1V6m",portrait:"R6HQcMwx",noVideoParticipants:"aepCFyJQ",noSidebar:"XjgP21E6"},et=(0,ae.ph)((0,K.EK)((e,{groupCallId:t})=>{const{connectionState:n,title:a,participants:i,participantsCount:o,chatId:s}=(0,Z.Ip)(e,t)||{},r=s?(0,W.hds)(e,s):void 0;return{connectionState:n,title:a||r?.title,participantsCount:o,meParticipant:(0,Z.n5)(e,t,e.currentUserId),isCallPanelVisible:Boolean((0,W.nTw)(e).isCallPanelVisible),isAdmin:(0,Z.qI)(e),participants:i,canInvite:(0,Z.O7)(e)}})(({groupCallId:e,isCallPanelVisible:t,connectionState:n,participantsCount:a,title:i,meParticipant:o,isAdmin:s,participants:r,canInvite:c})=>{const{toggleGroupCallVideo:l,toggleGroupCallPresentation:d,leaveGroupCall:p,toggleGroupCallPanel:m,connectToActiveGroupCall:h,playGroupCallSound:f,createGroupCallInviteLink:g}=(0,K.ko)(),v=(0,le.A)(),C=(0,ae.li)(),y=(0,ae.li)(),b=(0,ae.li)(),w=(0,ae.li)(),A=(0,ae.li)(),[k,S]=(0,ae.J0)(!1),I=!t&&!k,{observe:N}=(0,re.BL)({rootRef:A,throttleMs:200,isDisabled:!I}),T=!(0,re.Vz)(w,I?N:void 0),{isMobile:P,isLandscape:M}=(0,oe.Ay)(),[x,V,F]=(0,se.A)(),[E,Y,D]=(0,se.A)(!0),B=Boolean(x&&M),G=(0,de.zk)(),R=(0,ae.Kr)(()=>Object.values(r).find(({presentation:e})=>e),[r]),L=(0,ae.Kr)(()=>Object.values(r).filter(({video:e,presentation:t})=>e||t).flatMap(({id:e,video:t,presentation:n})=>(0,X.oE)([t?{id:e,type:"video"}:void 0,n?{id:e,type:"screen"}:void 0])),[r]),O=L.length>0,U=i||v("VoipGroupVoiceChat"),_=v("Participants",a,"i"),[$,J,j]=(0,se.A)(),[z,H]=(0,ae.J0)(!1),[q,W]=(0,ae.J0)(!1),Z=o?.hasVideoStream,Q=o?.hasPresentationStream,ee=o?.hasAudioStream,te="connected"!==n,ne=o?.canSelfUnmute,ve=!ne&&!ee;(0,ae.vJ)(()=>{"connected"===n?f({sound:"join"}):"reconnecting"===n&&f({sound:"connecting"})},[n]);const Ce=(0,ce.A)(()=>{j(),H(!1)}),ye=(0,ce.A)(()=>{C.current&&!P&&(x?F():V())}),be=(0,ce.A)(()=>{E?D():Y()}),we=(0,ce.A)(()=>{m()}),Ae=(0,ce.A)(()=>{g()}),ke=(0,ce.A)(()=>{l()});(0,ae.vJ)(()=>{h()},[h,e]);const Se=(0,ce.A)(()=>{!s||$?(f({sound:"leave"}),S(!0),j()):J()}),Ie=(0,ce.A)(()=>{k&&p({shouldDiscard:q})}),Ne=(0,ce.A)(()=>{d()}),Te=L.length>1&&!P,Pe=B&&O,[Me,xe]=(0,ae.J0)(void 0),{videoLayout:Ve,panelOffset:Ee}=function({primaryContainerRef:e,secondaryContainerRef:t,videoParticipants:n,isLandscapeLayout:a,pinnedVideo:i}){const[o,s]=(0,ae.J0)([]),[r,c]=(0,ae.J0)(0),l=n.length,d=(0,ue.A)(l),u=(0,ue.A)(n),p=(0,ae.Kr)(()=>u?.filter(({id:e,type:t})=>!n.some(n=>n.id===e&&n.type===t)),[u,n]),m=(0,ce.A)(()=>{const o=e.current,r=t.current;if(!r)return;const u=void 0!==d&&d>l?d-l:0,{x:m,y:h,width:f}=r.getBoundingClientRect(),g=[];if(void 0!==i||!o||!a){const e=!0;let t,r=!1,d=0,v=n;if(i&&o&&a&&(d=v.findIndex(({id:e,type:t})=>e===i.id&&t===i.type),-1!==d)){const{x:e,y:n,width:a,height:s}=o.getBoundingClientRect(),{id:c,type:l}=i;t={x:e,y:n,width:a,height:s,participantId:c,type:l,orderKey:d},r=!0,v=v.filter(({id:e,type:t})=>e!==c||t!==i.type)}const C=r?l-1:l,y=C%2==1,b=2,w=Math.ceil(C/b),A=(f-10*(b-1))/b,k=Math.max(0,y?240+(w-1)*A+8*(w-1):w*A+8*(w-1));for(let t=0;t=d?t+1:t})}if(t&&g.splice(d,0,t),p)for(let t=0;t=25?5:e>=13?4:e>=7?3:e>=3?2:1}(l),A=Math.ceil(l/w),k=A*w>l,S=(y-10*(w-1))/w,I=(b-8*(A-1))/A,N=S*(l%w);for(let e=0;e{xe(e),e&&!x&&V()}),De=(0,ce.A)(()=>{R&&xe({id:R.id,type:"screen"})});return(0,ae.vJ)(De,[De,Boolean(R)]),(0,ae.vJ)(()=>{Me&&(L.some(e=>e.type===Me.type&&e.id===Me.id)||xe(void 0))},[Me,Ve,L]),(0,Fe.FD)(ge.A,{isOpen:I,onClose:m,className:(0,ie.A)(Xe.root,(x||P)&&Xe.fullscreen,G&&Xe.appFullscreen,B&&Xe.landscape,!O&&Xe.noVideoParticipants,!B&&Xe.portrait,!E&&Pe&&Xe.noSidebar),dialogRef:C,onCloseAnimationEnd:Ie,children:[Pe&&(0,Fe.FD)("div",{className:Xe.videos,children:[(0,Fe.FD)("div",{className:Xe.videosHeader,children:[!P&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",onClick:ye,className:(0,ie.A)(Xe.headerButton,Xe.firstButton),ariaLabel:v(x?"AccExitFullscreen":"AccSwitchToFullscreen"),iconName:x?"smallscreen":"fullscreen"}),(0,Fe.Y)("h3",{className:(0,ie.A)(Xe.title,Xe.bigger),children:i||v("VoipGroupVoiceChat")}),Pe&&!E&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",className:(0,ie.A)(Xe.headerButton,Xe.videosHeaderLastButton),onClick:be,ariaLabel:v("AccDescrExpandPanel"),iconName:"sidebar"})]}),(0,Fe.Y)("div",{className:Xe.videosContent,ref:y})]}),(0,Fe.FD)("div",{className:Xe.panelWrapper,ref:A,children:[(0,Fe.FD)("div",{className:(0,ie.A)(Xe.panel,"custom-scroll"),children:[(0,Fe.Y)("div",{className:Xe.panelScrollTrigger,ref:w}),(0,Fe.FD)("div",{className:(0,ie.A)(Xe.panelHeader,T&&Xe.scrolled),children:[!Pe&&!P&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",ripple:!P,className:(0,ie.A)(Xe.firstButton,Xe.headerButton),onClick:ye,ariaLabel:v("AccSwitchToFullscreen"),iconName:"fullscreen"}),P&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",onClick:we,className:(0,ie.A)(Xe.headerButton,Xe.firstButton),ariaLabel:v("Close"),iconName:"close"}),Pe&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",ripple:!P,className:(0,ie.A)(Xe.firstButton,Xe.headerButton),color:"translucent",onClick:be,ariaLabel:v("AccDescrCollapsePanel"),iconName:"sidebar"}),(0,Fe.FD)("div",{className:Xe.panelHeaderText,children:[(0,Fe.Y)("h3",{className:(0,ie.A)(Xe.title,Pe&&Xe.bigger),children:Pe?_:U}),!Pe&&(0,Fe.Y)("span",{className:Xe.subtitle,children:_})]}),!Pe&&c&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",ripple:!P,className:(0,ie.A)(Xe.lastButton,Xe.headerButton),color:"translucent",onClick:Ae,ariaLabel:v("VoipGroupInviteMember"),iconName:"add-user"})]}),(0,Fe.FD)("div",{className:Xe.participants,children:[(0,Fe.Y)("div",{className:Xe.participantVideos,ref:b,style:`height: ${Ee}px;`,children:Ve.map(e=>{const t=r[e.participantId];return e.isRemounted&&t?(0,Fe.Y)(qe,{teactOrderKey:e.orderKey,layout:e,canPin:Te,setPinned:Ye,pinnedVideo:Me,participant:t},`${e.participantId}_${e.type}`):(0,Fe.Y)("div",{teactOrderKey:e.orderKey},`${e.participantId}_${e.type}`)})}),(0,Fe.Y)(Oe,{panelOffset:Ee,isLandscape:Pe})]})]}),(0,Fe.Y)(fe.A,{isShown:Pe&&c,onClick:Ae,className:Xe.addParticipantButton,ariaLabel:v("VoipGroupInviteMember"),iconName:"add-user-filled"},"add-participant")]}),(0,Fe.Y)("div",{className:Xe.mainVideoContainer,children:Ve.map(e=>{const t=r[e.participantId];return e.isRemounted||!t?(0,Fe.Y)("div",{teactOrderKey:e.orderKey},`${e.participantId}_${e.type}`):(0,Fe.Y)(qe,{teactOrderKey:e.orderKey,layout:e,canPin:Te,setPinned:Ye,pinnedVideo:Me,participant:t,className:Xe.video},`${e.participantId}_${e.type}`)})}),(0,Fe.FD)("div",{className:Xe.actions,children:[(0,Fe.Y)(me.A,{round:!0,size:"default",ripple:!0,className:(0,ie.A)(Xe.actionButton,!ee&&Xe.muted,ve&&Xe.canRequestToSpeak),onClick:ke,ariaLabel:v(Z?"VoipStopVideo":"VoipStartVideo"),disabled:te,iconName:Z?"video":"video-stop"}),(0,Fe.Y)(me.A,{round:!0,size:"default",ripple:!0,className:(0,ie.A)(Xe.actionButton,!ee&&Xe.muted,ve&&Xe.canRequestToSpeak),onClick:Ne,ariaLabel:v(Q?"lng_group_call_screen_share_stop":"lng_group_call_tooltip_screen"),disabled:te||!u,iconName:Q?"share-screen":"share-screen-stop"}),(0,Fe.Y)(Qe,{className:Xe.actionButton}),(0,Fe.Y)(me.A,{round:!0,size:"default",ripple:!0,className:(0,ie.A)(Xe.actionButton,!ee&&Xe.muted,ve&&Xe.canRequestToSpeak),ariaLabel:v("lng_group_call_settings"),disabled:!0,iconName:"settings-filled"}),(0,Fe.Y)(me.A,{round:!0,size:"default",ripple:!0,className:(0,ie.A)(Xe.actionButton,Xe.destructive),onClick:Se,ariaLabel:v("lng_group_call_leave"),iconName:"close"})]}),(0,Fe.FD)(ge.A,{isOpen:$,onClose:Ce,className:"error",title:v(z?"VoipGroupEndAlertTitle":"VoipGroupLeaveAlertTitle"),children:[(0,Fe.Y)("p",{children:v(z?"VoipGroupEndAlertText":"VoipGroupLeaveAlertText")}),!z&&(0,Fe.Y)(he.A,{className:"dialog-checkbox",label:v("VoipGroupEndChat"),checked:q,onCheck:W}),(0,Fe.FD)("div",{className:"dialog-buttons",children:[(0,Fe.Y)(me.A,{isText:!0,className:"confirm-dialog-button",onClick:Se,children:v(z?"VoipGroupEnd":"VoipGroupLeave")}),(0,Fe.Y)(me.A,{isText:!0,className:"confirm-dialog-button",onClick:Ce,children:v("Cancel")})]})]})]})})),tt=(0,ae.ph)((0,K.EK)(e=>{const t=(0,W.nTw)(e);return{groupCall:t.isMasterTab?(0,Z.iT)(e):void 0,isCallPanelVisible:t.isCallPanelVisible,phoneCallUser:t.isMasterTab?(0,Z.uu)(e):void 0}})(({groupCall:e,phoneCallUser:t,isCallPanelVisible:n})=>{const{toggleGroupCallPanel:a}=(0,K.ko)(),i=(0,le.A)();if((0,ae.vJ)(()=>(document.body.classList.toggle("has-call-header",Boolean(n)),window.tauri?.markTitleBarOverlay(!n),()=>{document.body.classList.toggle("has-call-header",!1),window.tauri?.markTitleBarOverlay(!0)}),[n]),e||t)return(0,Fe.Y)("div",{className:(0,ie.A)("ActiveCallHeader",n&&"open"),onClick:function(){a()},children:(0,Fe.Y)("span",{className:"title",children:t?.firstName||e?.title||i("VoipGroupVoiceChat")})})}));var nt=n(17663),at=n(80140),it=n(30857);const ot=(0,ae.ph)(({label:e,customIcon:t,icon:n,iconClassName:a,className:i,isDisabled:o,isActive:s,onClick:r})=>(0,Fe.FD)("div",{className:"lBO3RZUM",children:[(0,Fe.Y)(me.A,{round:!0,className:(0,ie.A)(i,"ch2sqAKW",s&&"OQxlsRp7"),onClick:r,disabled:o,children:t||(0,Fe.Y)(Se.A,{name:n,className:a})}),(0,Fe.Y)("div",{className:"aHguvLcL",children:e})]})),st={root:"GNYRVAUg",blurred:"RBmbMiou","single-column":"O7cZE08z",singleColumn:"O7cZE08z",header:"GI6dY5aJ","close-button":"ULiJZuaP",closeButton:"ULiJZuaP","emojis-backdrop":"RFBKZpjx",emojisBackdrop:"RFBKZpjx",open:"zi1NlOXX",emojis:"DFco1VIN","emoji-tooltip":"MRIShZ3V",emojiTooltip:"MRIShZ3V","user-info":"eaUe2A0c",userInfo:"eaUe2A0c",buttons:"qIeflO02",leave:"hclywYYk",accept:"ln_ZBUHy","accept-icon":"cVRd3twS",acceptIcon:"cVRd3twS","main-video":"bGlBFSJq",mainVideo:"bGlBFSJq","second-video":"TOFu1n5x",secondVideo:"TOFu1n5x",visible:"LOnSFN9w",fullscreen:"Omg5T1o6"},rt=(0,ae.ph)((0,K.EK)(e=>{const{phoneCall:t,currentUserId:n}=e,{isCallPanelVisible:a,isMasterTab:i}=(0,W.nTw)(e),o=(0,Z.uu)(e);return{isCallPanelVisible:Boolean(a),user:o,isOutgoing:t?.adminId===n,phoneCall:i?t:void 0}})(({user:e,isOutgoing:t,phoneCall:n,isCallPanelVisible:a})=>{const o=(0,le.A)(),{hangUp:s,requestMasterAndAcceptCall:r,playGroupCallSound:c,toggleGroupCallPanel:l,connectToActivePhoneCall:d}=(0,K.ko)(),p=(0,ae.li)(),[m,h,f]=(0,se.A)(),{isMobile:g}=(0,oe.Ay)(),v=(0,ae.hb)(()=>{m?f():h()},[f,m,h]),C=(0,ae.hb)(()=>{p.current&&(m?document.exitFullscreen().then(f):p.current.requestFullscreen().then(h))},[f,m,h]);(0,ae.vJ)(()=>{if(!i.SC)return;const e=p.current;return e?(e.addEventListener("fullscreenchange",v),()=>{e.removeEventListener("fullscreenchange",v)}):void 0},[v]);const y=(0,ae.hb)(()=>{l(),m&&f()},[f,m,l]),b="discarded"===n?.state,A="busy"===n?.reason,k="requested"===n?.state&&!t,S=("requested"===n?.state||"waiting"===n?.state)&&t,I="active"===n?.state,N=n?.isConnected,[T,P,M]=(0,se.A)(),x=(0,ae.hb)(()=>{P(),s()},[s,P]);(0,ae.vJ)(()=>{T?c({sound:"end"}):k?c({sound:"incoming"}):A?c({sound:"busy"}):b?c({sound:"end"}):S?c({sound:"ringing"}):N&&c({sound:"connect"})},[A,b,k,S,N,c,T]),(0,ae.vJ)(()=>{n?.id?M():d()},[d,n?.id,M]);const V=(0,it.A)();(0,je.A)(V,N?1e3:void 0);const F=(0,ae.Kr)(()=>{const e=n?.state;return T?o("lng_call_status_hanging"):A?"busy":"requesting"===e?o("lng_call_status_requesting"):"requested"===e?o(t?"lng_call_status_ringing":"lng_call_status_incoming"):"waiting"===e?o("lng_call_status_waiting"):"active"===e&&N?void 0:o("lng_call_status_exchanging")},[A,N,T,t,o,n?.state]),E="active"===n?.videoState,Y="active"===n?.screencastState,R=w?.streams,L=R?.ownAudio?.getTracks()[0].enabled,O=R?.ownPresentation?.getTracks()[0].enabled,U=R?.ownVideo?.getTracks()[0].enabled,[_,$,J]=(0,se.A)(),[j,z,H]=(0,se.A)(),q=(0,ae.hb)(()=>{O&&$(),U&&z(),setTimeout(async()=>{await G("presentation"),J(),H()},250)},[O,U,$,z,J,H]),W=(0,ae.hb)(()=>{U&&z(),O&&$(),setTimeout(async()=>{await G("video"),J(),H()},250)},[O,U,$,z,J,H]),Z=(0,ae.hb)(()=>{G("audio")},[]),[Q,X,ee]=(0,se.A)(),[te,ne,re]=(0,se.A)(),ce=(0,ae.hb)(()=>{ne(),async function(){if(!w||!w.facingMode)return;const e=w.streams.ownVideo;if(!e)return;const t=e.getTracks()[0];if(!t)return;const n=w.connection.getSenders().find(e=>t.id===e.track?.id);if(n){w.facingMode="environment"===w.facingMode?"user":"environment";try{const e=await B("video",w.facingMode);await n.replaceTrack(e.getTracks()[0]),w.streams.ownVideo=e,D()}catch(e){}}}(),setTimeout(re,250)},[ne,re]),de=n?.startDate&&(0,at.Fm)()-n.startDate;return(0,ae.vJ)(()=>{"discarded"===n?.state&&setTimeout(s,250)},[s,n?.reason,n?.state]),(0,Fe.FD)(ge.A,{isOpen:n&&"discarded"!==n?.state&&!a,onClose:y,className:(0,ie.A)(st.root,g&&st.singleColumn),dialogRef:p,children:[(0,Fe.Y)(Ae.A,{peer:e,size:"jumbo",className:E||Y?st.blurred:""}),"active"===n?.screencastState&&R?.presentation&&(0,Fe.Y)("video",{className:st.mainVideo,muted:!0,autoPlay:!0,playsInline:!0,srcObject:R.presentation}),"active"===n?.videoState&&R?.video&&(0,Fe.Y)("video",{className:st.mainVideo,muted:!0,autoPlay:!0,playsInline:!0,srcObject:R.video}),(0,Fe.Y)("video",{className:(0,ie.A)(st.secondVideo,!_&&O&&st.visible,m&&st.fullscreen),muted:!0,autoPlay:!0,playsInline:!0,srcObject:R?.ownPresentation}),(0,Fe.Y)("video",{className:(0,ie.A)(st.secondVideo,!j&&U&&st.visible,m&&st.fullscreen),muted:!0,autoPlay:!0,playsInline:!0,srcObject:R?.ownVideo}),(0,Fe.FD)("div",{className:st.header,children:[i.SC&&(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",iconName:m?"smallscreen":"fullscreen",onClick:C,ariaLabel:o(m?"AccExitFullscreen":"AccSwitchToFullscreen")}),(0,Fe.Y)(me.A,{round:!0,size:"smaller",color:"translucent",iconName:"close",onClick:y,className:st.closeButton})]}),(0,Fe.FD)("div",{className:(0,ie.A)(st.emojisBackdrop,Q&&st.open),onClick:Q?ee:X,children:[(0,Fe.Y)("div",{className:(0,ie.A)(st.emojis,Q&&st.open),children:n?.isConnected&&n?.emojis&&(0,ye.A)(n.emojis,["emoji"])}),(0,Fe.Y)("div",{className:(0,ie.A)(st.emojiTooltip,Q&&st.open),children:o("CallEmojiKeyTooltip",e?.firstName).replace("%%","%")})]}),(0,Fe.FD)("div",{className:st.userInfo,children:[(0,Fe.Y)("h1",{children:e?.firstName}),(0,Fe.Y)("span",{className:st.status,children:F||(0,nt.QO)(de||0)})]}),(0,Fe.FD)("div",{className:st.buttons,children:[(0,Fe.Y)(ot,{onClick:Z,icon:"microphone",isDisabled:!I,isActive:L,label:o(L?"lng_call_mute_audio":"lng_call_unmute_audio")}),(0,Fe.Y)(ot,{onClick:W,icon:"video",isDisabled:!I,isActive:U,label:o(U?"lng_call_stop_video":"lng_call_start_video")}),U&&(i.Ni||i.pz)&&(0,Fe.Y)(ot,{onClick:ce,customIcon:(0,Fe.Y)(Pe.A,{tgsUrl:Ne.w.CameraFlip,playSegment:te?[0,10]:[0,1],size:32}),isDisabled:!I,label:o("VoipFlip")}),u&&(0,Fe.Y)(ot,{onClick:q,icon:"share-screen",isDisabled:!I,isActive:O,label:o("lng_call_screencast")}),k&&(0,Fe.Y)(ot,{onClick:r,icon:"phone-discard",isDisabled:b,label:o("lng_call_accept"),className:st.accept,iconClassName:st.acceptIcon}),(0,Fe.Y)(ot,{onClick:x,icon:"phone-discard",isDisabled:b,label:o(k?"lng_call_decline":"lng_call_end_call"),className:st.leave})]})]})}));var ct=n(40664);const lt=(0,ae.ph)(({isOpen:e})=>{const{closeCallRatingModal:t,setCallRating:n}=(0,K.ko)(),a=(0,ae.li)(),i=(0,le.A)(),[o,s]=(0,ae.J0)(),r=(0,ae.hb)(()=>{o?n({rating:o+1,comment:a.current?.value||""}):t()},[t,o,n]),c=(0,ae.hb)(()=>{t()},[t]);return(0,Fe.FD)(ge.A,{title:i("lng_call_rate_label"),className:"narrow",onClose:t,isOpen:e,children:[(0,Fe.Y)("div",{className:"P7EfDKJN",children:new Array(5).fill(void 0).map((e,t)=>{const n=void 0!==o&&o>=t;return(0,Fe.Y)(Se.A,{name:n?"favorite-filled":"favorite",className:(0,ie.A)(n&&"_XX6q8YW","t8LJLFSN"),onClick:(a=t,()=>s(o===a?void 0:a))});var a})}),(0,Fe.Y)(ct.A,{ref:a,placeholder:i("lng_call_rate_comment"),className:(0,ie.A)("EvL0WaKD",4!==o&&void 0!==o&&"v5hn1XvT")}),(0,Fe.FD)("div",{className:"dialog-buttons mt-2",children:[(0,Fe.Y)(me.A,{className:"confirm-dialog-button",isText:!0,onClick:r,children:i("Send")}),(0,Fe.Y)(me.A,{className:"confirm-dialog-button",isText:!0,onClick:c,children:i("Cancel")})]})]})});(i.Yw||i.pz)&&document.addEventListener("click",a.cw,{once:!0})},90423(e,t,n){n.d(t,{Ay:()=>r,j9:()=>d,zk:()=>c});var a=n(84051),i=n(63495),o=n(96454);const s=l();function r(e,t,n){const[i,r]=(0,a.J0)(Boolean(s&&document[s]));return(0,a.Nf)(()=>{const a=e.current,i=()=>{const e=Boolean(s&&document[s]);r(e),e?n?.(!1):t?.(!1),a instanceof HTMLVideoElement&&(a.controls=e)},o=()=>{r(!0),n&&n(!0)},c=()=>{r(!1),t&&t(!1)};return document.addEventListener("fullscreenchange",i,!1),document.addEventListener("webkitfullscreenchange",i,!1),document.addEventListener("mozfullscreenchange",i,!1),a&&(a.addEventListener("webkitbeginfullscreen",o,!1),a.addEventListener("webkitendfullscreen",c,!1)),()=>{document.removeEventListener("fullscreenchange",i,!1),document.removeEventListener("webkitfullscreenchange",i,!1),document.removeEventListener("mozfullscreenchange",i,!1),a&&(a.removeEventListener("webkitbeginfullscreen",o,!1),a.removeEventListener("webkitendfullscreen",c,!1))}},[]),s||o.pz?[i,()=>{var t;e.current&&(s||o.pz)&&!i&&((t=e.current).requestFullscreen?t.requestFullscreen():t.webkitRequestFullscreen?t.webkitRequestFullscreen():t.webkitEnterFullscreen?t.webkitEnterFullscreen():t.mozRequestFullScreen&&t.mozRequestFullScreen(),r(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),r(!1))}]:[!1]}const c=()=>{const[e,t]=(0,a.J0)(!1);return(0,a.vJ)(()=>{const e=()=>{t(d())};let n;return i.Vq&&(window.tauri?.getCurrentWindow().then(e=>{e.isFullscreen().then(t)}),(async()=>{const e=await(window.tauri?.getCurrentWindow());n=await e.onResized(()=>{e.isFullscreen().then(t)})})()),document.addEventListener("fullscreenchange",e,!1),document.addEventListener("webkitfullscreenchange",e,!1),document.addEventListener("mozfullscreenchange",e,!1),()=>{n?.(),document.removeEventListener("fullscreenchange",e,!1),document.removeEventListener("webkitfullscreenchange",e,!1),document.removeEventListener("mozfullscreenchange",e,!1)}},[]),e};function l(){return void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":""}function d(){const e=l();return Boolean(e&&document[e])}},95773(e,t,n){n.d(t,{A:()=>c});var a=n(84051),i=n(87357),o=n(95807),s=n(85118);var r=n(20021);const c=(0,a.ph)(({children:e,ref:t,className:n,style:c,withSparkles:l,sparklesClassName:d,sparklesColor:u,glowColor:p,onClick:m})=>{let h=(0,a.li)();return t&&(h=t),(0,r.FD)("div",{ref:h,className:(0,i.A)("Z9JWyzAs",n),style:(0,o.A)(p&&`--glow-color: ${p}`,c),onClick:m,children:[l&&(0,r.Y)(s.A,{preset:"button",className:(0,i.A)("fQBp2vKr",d),style:(0,o.A)(u&&`color: ${u}`)}),e]})})},96374(e,t,n){n.d(t,{A:()=>d});var a=n(84051),i=n(89925),o=n(87894),s=n(30857),r=n(17712),c=n(73767);function l(e,t,n,a){const{length:o}=e,s=a?e.indexOf(a):0,r=t===i.TN.Forwards?s:s+1||o,c=Math.max(0,r-n),l=r+n-1,d=e.slice(Math.max(0,c),l+1);let u,p;switch(t){case i.TN.Forwards:u=r>=0,p=c>=0;break;case i.TN.Backwards:u=r{const u=(0,a.li)(),p=(0,a.li)();if(!p.current&&t&&!n){const{newViewportIds:e,newIsOnTop:n,fromOffset:a}=l(t,i.TN.Forwards,d,t[0]);p.current={viewportIds:e,isOnTop:n,offset:a}}const m=(0,s.A)();n&&(u.current={});const h=(0,c.A)(t),f=(0,c.A)(n);if(!t||n||t===h&&n===f)t||(p.current=void 0);else{const{viewportIds:e,isOnTop:n}=p.current||{},a=e&&!n?e[Math.round(e.length/2)]:void 0,s=a&&t.includes(a)?a:t[0],{offsetId:r=s,direction:c=i.TN.Forwards}=u.current||{},{newViewportIds:m,newIsOnTop:h,fromOffset:f}=l(t,c,d,r);u.current={},e&&(0,o.k)(e,m)||(p.current={viewportIds:m,isOnTop:h,offset:f})}const g=(0,r.A)(({direction:n,noScroll:a})=>{const{viewportIds:s}=p.current||{},r=s?n===i.TN.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:r}));const{newViewportIds:c,areSomeLocal:h,areAllLocal:f,newIsOnTop:g,fromOffset:v}=l(t,n,d,r);!h||s&&(0,o.k)(s,c)||(p.current={viewportIds:c,isOnTop:g,offset:v},m()),!f&&e&&(a||(u.current={...u.current,direction:n,offsetId:r}),e({offsetId:r}))});return n?[t]:[p.current?.viewportIds,g,p.current?.offset]}}}]); +//# sourceMappingURL=2394.0afa88a3e81dd3f7bc95.js.map \ No newline at end of file diff --git a/dist/2394.0afa88a3e81dd3f7bc95.js.map b/dist/2394.0afa88a3e81dd3f7bc95.js.map new file mode 100644 index 000000000..b3c2e3acb --- /dev/null +++ b/dist/2394.0afa88a3e81dd3f7bc95.js.map @@ -0,0 +1 @@ +{"version":3,"file":"2394.0afa88a3e81dd3f7bc95.js","mappings":"gNAyBA,MAiCA,GAAeA,EAAAA,EAAAA,KAAKC,EAAAA,EAAAA,IAClB,CAACC,GAAUC,aACT,MAAMC,GAAOC,EAAAA,EAAAA,KAAkBH,GACzBI,EAAOH,IAAUI,EAAAA,EAAAA,KAAWL,EAAQC,GAG1C,MAAO,CACLC,OACAI,YAJkBF,GAAOG,EAAAA,EAAAA,IAAuBH,QAAQI,IAJ1CT,CAjCiCU,EACnDC,SACAR,OACAD,SACAK,cACAK,cAEA,MAAM,iBAAEC,IAAqBC,EAAAA,EAAAA,MAEvBC,GAAOC,EAAAA,EAAAA,KAEPC,GAAyBC,EAAAA,EAAAA,IAAY,KACzCL,EAAiB,CAAEM,OAAQhB,EAAMiB,GAAIlB,OAAQA,IAC7CU,KACC,CAACT,EAAMU,EAAkBD,EAASV,IAErC,GAAKC,GAASD,EAId,OACEmB,EAAAA,EAAAA,GAACC,EAAAA,EAAa,CACZX,OAAQA,EACRC,QAASA,EACTW,MAAOR,EAAK,uBACZS,WAAWC,EAAAA,EAAAA,GAAWV,EAAK,8BAA+BR,IAC1DmB,aAAcX,EAAK,kBACnBY,eAAgBV,EAChBW,sBAAoB,M,oECzC1B,MAYA,GAAe7B,EAAAA,EAAAA,IAZE8B,EACfC,eAEA,MAAMf,GAAOgB,EAAAA,EAAAA,KAEb,OACEV,EAAAA,EAAAA,GAAA,QAAMW,UAAU,WAAUC,SACvBlB,EAAkB,SAAbe,EAAsB,cAAgB,kB,8CCIlD,QApBoBI,CAACC,EAA2BC,KAC1CC,EAAAA,KACFF,EAAUG,MAAMC,SAAW,eAGX9B,IAAd2B,IACFD,EAAUC,UAAYA,GAGpBC,EAAAA,KACFF,EAAUG,MAAMC,SAAW,I,gCC4B/B,MAAMC,EAAY,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAElgC,SAASC,EAAiBC,EAASC,EAAOC,EAAOC,EAAOC,EAAQC,EAAQC,GACrF,GAAIC,OAAOC,MAAMH,IAAWA,EAAS,EAAG,OAExCA,GAAU,EAENE,OAAOC,MAAMF,KAAaA,EAAa,IAC3CA,GAAc,GACG,IAAGA,EAAa,GAC7BA,EAAa,IAAGA,EAAa,GAEjC,MAAMG,EAAYT,EAAQU,aAAaT,EAAOC,EAAOC,EAAOC,GAEtDO,EAASF,EAAUG,KAEzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAKtB,EAAQ,EACbuB,EAAKtB,EAAS,EACduB,EAAOtB,EAAS,EAEhBuB,EAAI,GACJC,EAAI,GACJC,EAAI,GAEJC,EAAUlC,EAAUQ,GACpB2B,EAAUlC,EAAUO,GAEpB4B,EAAO,GACPC,EAAO,GAEX,KAAO5B,KAAe,GAAG,CAGvB,IAFAkB,EAAKD,EAAK,EAELN,EAAI,EAAGA,EAAIb,EAAQa,IAAK,CAK3B,IAJAJ,EAAOF,EAAOa,GAAMG,EACpBb,EAAOH,EAAOa,EAAK,GAAKG,EACxBZ,EAAOJ,EAAOa,EAAK,GAAKG,EAEnBT,EAAI,EAAGA,GAAKb,EAAQa,IACvBC,EAAIK,IAAQN,EAAIO,EAAKA,EAAKP,IAAO,GACjCL,GAAQF,EAAOQ,KACfL,GAAQH,EAAOQ,KACfJ,GAAQJ,EAAOQ,KAGjB,IAAKH,EAAI,EAAGA,EAAIb,EAAOa,IACrBY,EAAEL,GAAMV,EACRgB,EAAEN,GAAMT,EACRgB,EAAEP,GAAMR,EAEC,GAALE,IACFgB,EAAKjB,KAAOG,EAAIH,EAAIW,GAAQF,EAAKN,EAAIM,IAAO,EAC5CS,EAAKlB,IAAOG,EAAIH,EAAIX,GAAU,EAAIc,GAAK,EAAI,GAG7CC,EAAKI,EAAKS,EAAKjB,GACfK,EAAKG,EAAKU,EAAKlB,GAEfH,GAAQF,EAAOS,KAAQT,EAAOU,KAC9BP,GAAQH,EAAOS,KAAQT,EAAOU,KAC9BN,GAAQJ,EAAOS,KAAQT,EAAOU,KAE9BE,IAEFC,GAAOrB,GAAS,CAClB,CAEA,IAAKa,EAAI,EAAGA,EAAIb,EAAOa,IAAK,CAM1B,IALAM,EAAKN,EACLH,EAAOe,EAAEN,GAAMK,EACfb,EAAOe,EAAEP,GAAMK,EACfZ,EAAOe,EAAER,GAAMK,EAEVT,EAAI,EAAGA,GAAKb,EAAQa,IACvBI,GAAOJ,EAAIQ,EAAK,EAAIvB,EACpBU,GAAQe,EAAEN,GACVR,GAAQe,EAAEP,GACVP,GAAQe,EAAER,GAIZ,IADAC,EAAKP,GAAK,EACLC,EAAI,EAAGA,EAAIb,EAAQa,IACtBN,EAAOY,GAAOV,EAAOkB,IAAaC,EAClCrB,EAAOY,EAAK,GAAMT,EAAOiB,IAAaC,EACtCrB,EAAOY,EAAK,GAAMR,EAAOgB,IAAaC,EAE7B,GAALhB,IACFiB,EAAKhB,KAAOE,EAAIF,EAAIU,GAAQD,EAAKP,EAAIO,GAAMvB,EAC3C+B,EAAKjB,IAAOE,EAAIF,EAAIZ,GAAU,EAAIc,EAAIhB,EAAQ,GAGhDiB,EAAKJ,EAAIiB,EAAKhB,GACdI,EAAKL,EAAIkB,EAAKjB,GAEdJ,GAAQe,EAAER,GAAMQ,EAAEP,GAClBP,GAAQe,EAAET,GAAMS,EAAER,GAClBN,GAAQe,EAAEV,GAAMU,EAAET,GAElBE,GAAMpB,GAAS,CAEnB,CACF,CAEAH,EAAQmC,aAAa1B,EAAWR,EAAOC,EACzC,C,uOC7JA,MASA,EATqBkC,KAEjBC,EAAAA,EAAAA,IAAA,OAAKhD,UAAU,eAAeiD,QAAQ,YAAWhD,SAAA,EAC/CZ,EAAAA,EAAAA,GAAA,QAAM6D,EAAE,8jBAA8jB5C,MAAM,6BAC5kBjB,EAAAA,EAAAA,GAAA,QAAM6D,EAAE,yKAAyK5C,MAAM,oCCyL7L,GAAevC,EAAAA,EAAAA,IArIqBoF,EAClCnD,YACAM,QACA8C,OACAC,aACAC,SACAC,kBACAC,kBACAC,kBACAC,gBACAC,cACAC,eACAC,cACAC,cACAC,0BACAC,sBACAC,qBACAC,0BAEA,MAAM,iBAAEC,IAAqBrF,EAAAA,EAAAA,MAEvBsF,GAAUpF,EAAAA,EAAAA,KACVD,GAAOgB,EAAAA,EAAAA,KAEPsE,EAAW,OAAQjB,EAAOA,OAAO3E,EACjC6F,EAAa,iBAAkBlB,EAAOA,OAAO3E,EAC7C8F,EAASF,IAAYG,EAAAA,EAAAA,IAAcH,GACnC9E,EAAQ8E,IAAaE,GAASE,EAAAA,EAAAA,IAAgBJ,IAAYK,EAAAA,EAAAA,IAAaN,EAASC,IAChFM,EAAaJ,GAAUF,EAASM,WAAcL,GAAYK,UAC1DC,EAAqBrB,IAAoBE,EACzCoB,EAAcR,GAAUQ,cACxBP,GAAYQ,cAAgB,CAAEC,KAAM,UAAWC,WAAYV,EAAWQ,oBAAkBrG,GAExFwG,GAAmBC,EAAAA,EAAAA,GAAiBC,IACnC5F,GAAUqE,KAIfwB,EAAAA,EAAAA,GAAUD,IACVE,EAAAA,EAAAA,IAAoB9F,GACpB4E,EAAiB,CAAEmB,SAAYf,EAAS,OAAS,QAArB,wBAGxBgB,GAAeC,EAAAA,EAAAA,IAAQ,IACvBlB,GACK7E,EAAAA,EAAAA,GAAW6E,EAAW/E,OAAS6E,EAAQE,EAAWmB,WAGvDhC,EACKW,EAAQV,EAAgB,UAAY,kBAGzCgC,EAAAA,EAAAA,IAAwBrB,EAAUjF,IAC7BgF,EAAQ,qBAGbuB,EAAAA,EAAAA,IAAqBtB,EAAUjF,IAC1BgF,EAAQ,iBAGbwB,EAAAA,EAAAA,IAA+BvB,EAAUjF,IACpCgF,EAAQ,iCADjB,EAKC,CAACE,EAAYZ,EAAeD,EAAiBW,EAASC,IACnDwB,EAAwBxB,GAAUwB,sBAExC,OACE7C,EAAAA,EAAAA,IAAA,OAAKhD,WAAW8F,EAAAA,EAAAA,GAAe,QC9HZ,WD8HkC9F,GAAYM,MAAOA,EAAML,SAAA,CAC3E4F,IACCxG,EAAAA,EAAAA,GAAC0G,EAAAA,EAAW,CACVf,WAAYa,EACZG,KAAMxC,EACNyC,UAAYtC,OAAwClF,EAA1ByH,EAAAA,IAC1BC,8BAA+BjC,KAGnC7E,EAAAA,EAAAA,GAAA,MACE+G,IAAI,OACJC,KAAK,SACLrG,WAAW8F,EAAAA,EAAAA,GACT,WC3IiE,WD6IjElC,GC7IsF,YD+IxF0C,QAASrB,EAAiBhF,SAEzBsF,IAAgB9F,EAAAA,EAAAA,GAAWF,GAAS,OAErCsE,GAAeT,IACfJ,EAAAA,EAAAA,IAAAuD,EAAAA,GAAA,CAAAtG,SAAA,EACIoD,GAAcD,GAAMoD,aAAcnH,EAAAA,EAAAA,GAAC0D,EAAY,KAC/CO,GAAUF,GAAMtD,WAAYT,EAAAA,EAAAA,GAACQ,EAAAA,EAAQ,CAACC,SAAUsD,EAAKtD,WACtD8E,GAAsBC,IACrBxF,EAAAA,EAAAA,GAACoH,EAAAA,GAAU,CACTzG,UCzJuC,WD0JvC0G,eC1JqH,WD2JrHC,UAAWzF,OAAO2D,EAAYG,YAC9B4B,KAAK,YACLC,WAAY,EACZC,eAAa,EAAA7G,UAEbZ,EAAAA,EAAAA,GAAC0H,EAAAA,EAAiB,CAChBC,aAAmC,gBAArBnC,EAAYE,KAC1BkC,kBAAkB,iBAClBC,cAAoC,gBAArBrC,EAAYE,MAA2Bf,OAC1BvF,EAAxBoG,EAAYsC,UAAsBlH,UAEtCZ,EAAAA,EAAAA,GAAC0G,EAAAA,EAAW,CACV/F,WAAW8F,EAAAA,EAAAA,GAAe,gBAAiB9B,GCvKkI,YDwK7KgB,WAAYH,EAAYG,WACxBgB,KAAMxC,EACNyC,UAAYtC,OAAwClF,EAA1ByH,EAAAA,IAC1BC,8BAA+BjC,EAC/BoC,QAASrC,QAKhBW,IAAuBC,GAAeF,IAAatF,EAAAA,EAAAA,GAAC+H,EAAAA,EAAQ,IAC5DtD,IACCzE,EAAAA,EAAAA,GAAA,OAAKW,WAAW8F,EAAAA,EAAAA,GCnLmI,WDmL7F/B,GAAyB9D,SAC5ElB,EAAK,uBAKb8E,M,+FE3KP,MAYA,GAAe9F,EAAAA,EAAAA,IAZSsJ,EAAGC,WAAUC,gBAEjClI,EAAAA,EAAAA,GAACoH,EAAAA,GAAU,CAACzG,UChBO,WDgBiB2G,UAAWY,EAAY,EAAI,EAAGX,KAAK,OAAM3G,SAC1EsH,GACClI,EAAAA,EAAAA,GAACmI,EAAAA,EAAO,CAACxH,UClB2B,WDkBAyH,MAAM,WAE1CpI,EAAAA,EAAAA,GAACqI,EAAAA,EAAI,CAAC1H,UCpBgD,WDoBxB4G,KAAMU,M,4HEfrC,SAASK,EAA2C1J,EAAWkB,GACpE,MAAMyI,GAAWC,EAAAA,EAAAA,IAAmB5J,EAAQkB,GAC5C,GAAKyI,GAAaA,EAASE,YAE3B,OAAOC,EAAgB9J,EAAQ2J,EAASE,YAC1C,CAEO,SAASC,EAAuC9J,EAAW6J,GAChE,OAAO7J,EAAO+J,WAAWC,KAAKH,EAChC,CAEO,SAASI,EACdjK,EAAW6J,EAAqBK,GAEhC,OAAOJ,EAAgB9J,EAAQ6J,IAAcM,aAAaD,EAC5D,CAEO,SAASE,EAAsDpK,GACpE,MAAMkB,EAASmJ,EAAsBrK,IAASkB,OAE9C,IAAKA,EAAQ,OAAO,EAEpB,MAAMhB,GAAOoK,EAAAA,EAAAA,IAAWtK,EAAQkB,GAChC,QAAKhB,KAEGqK,EAAAA,EAAAA,IAAiBrK,IAASA,EAAKsK,WAAcC,QAAQvK,EAAKwK,aAAaC,YACjF,CAEO,SAASN,EAA6CrK,GAC3D,MAAQ+J,YAAY,kBAAEa,IAAwB5K,EAC9C,GAAK4K,EAIL,OAAOd,EAAgB9J,EAAQ4K,EACjC,CAEO,SAASC,EAA2C7K,GACzD,MAAM,UAAE8K,EAAS,cAAEC,GAAkB/K,EACrC,IAAK8K,IAAcA,EAAUZ,gBAAkBY,EAAUE,QACvD,OAGF,MAAM7J,EAAK2J,EAAUE,UAAYD,EAAgBD,EAAUZ,cAAgBY,EAAUE,QACrF,OAAO3K,EAAAA,EAAAA,IAAWL,EAAQmB,EAC5B,CAEO,SAAS8J,EAAwDjL,GACtE,MAAMkL,EAAYb,EAAsBrK,GAExC,IAAKkL,IAAcA,EAAUhK,OAC3B,OAAO,EAGT,MAAMhB,GAAOoK,EAAAA,EAAAA,IAAWtK,EAAQkL,EAAUhK,QAC1C,IAAKhB,EACH,OAAO,EAIT,GAD0BuK,SAAQU,EAAAA,EAAAA,IAAgBjL,IAEhD,OAAO,EAGT,MAAMkL,GAAaxB,EAAAA,EAAAA,IAAmB5J,EAAQE,EAAKiB,KAAKiK,WACxD,OAAOX,QAAQW,EACjB,C,wJCnEO,SAASC,EAAiBC,GAE/B,OAAiB,EAAVA,CACT,CAIO,SAASC,EAAmBD,GAEjC,OAAOA,IAAW,CACpB,CAEO,SAASE,EAAaC,EAAmBC,EAAQ,GACtD,IAAKD,EAAO,OAAO,EAEnB,MAAM,OAAEE,GAAWF,EACnB,IAAIG,EAAQ,EACZ,IAAK,IAAIhI,EAAI,EAAGA,EAAI+H,EAAQ/H,IAC1BgI,GAASH,EAAM7H,GAAK6H,EAAM7H,GAE5B,MAAMiI,EAAMC,KAAKC,KAAKH,EAAQD,GAAU,IAExC,OAAOG,KAAKE,IAAI,EAAGH,EAAMH,EAC3B,CAEO,SAASO,EAA2BpI,GACzC,MAAO,CACL1C,GAAI0C,EAAE1C,GACNwH,KAAM9E,EAAE8E,KACR,WAAY9E,EAAEqI,cACdC,UAAWtI,EAAEsI,UACbC,WAAYvI,EAAEuI,WACdC,SAAUxI,EAAEwI,SAEhB,CAuBO,MAAMC,EAAY,GAEZC,EAA2B,oBAAsBC,WAAWC,cAAgB,CAAC,GAC7EC,EAAiCF,WAAWC,cAAcE,0BAA0BC,iBAEpFC,EAAiCL,WAAWC,cAAcE,0BAA0BG,iBChEjG,GAAgBC,EAA+CC,GAAQ,KACrE,IAAKD,IAAuBA,EAAmBE,IAC7C,MAAMC,MAAM,mDAGd,MAAMC,EAAWJ,EACdE,IACAG,MAAM,UACNC,IAAI,CAACC,EAAG1J,IAAa,IAANA,EAAU0J,EAAI,KAAKA,KAClCC,OAAO,CAACC,EAA+BC,KACtC,MAAM9E,EAAO8E,EAAGC,MAAM,gBAAgB,IAAM,SAE5C,OADAF,EAAIA,EAAIG,eAAehF,IAAkB,UAATA,EAAmB,aAAeA,GAAQ8E,EAAGL,MAAM,QAAQQ,OAAOnD,SAC3F+C,GACN,CAAC,GAEAK,EAASA,CAACC,EAAgBC,IACzBA,EAKIZ,EAASY,IAAcC,KAAMC,GAASA,EAAKC,WAAWJ,KAAUK,OAAOL,EAAOnC,QAJ9EyC,OAAOC,OAAOlB,GAAUE,IAAKiB,GAC3BA,EAAQN,KAAMC,GAASA,EAAKC,WAAWJ,KAAUK,OAAOL,EAAOnC,SACrEiC,OAAOnD,SAAS,GAMjB8D,EAAgBR,GACbZ,EAASY,GAAaH,OAAQY,GAAMA,EAAEN,WAAW,aAAab,IAAKmB,IACxE,MAAO,CAAErN,EAAIsN,GAAOD,EAAEd,MAAM,+BAC5B,MAAO,CAAEvM,GAAI8B,OAAO9B,GAAKsN,SAIvBC,EAAqBX,IACzB,MAAMY,EAAWxB,EAASY,GAAaH,OAAQY,GAAMA,EAAEN,WAAW,aAAab,IAAKmB,IAClF,MAAO,CAAErN,EAAImC,GAAQkL,EAAEd,MAAM,iBAAmB,IACzC/E,EAAMwD,EAAWE,GAAY/I,EAAK8J,MAAM,KAC/C,MAAO,CACLjM,GAAI8B,OAAO9B,GAAKwH,OAAMwD,UAAWlJ,OAAOkJ,MAAgBE,GAAY,CAAEA,SAAUpJ,OAAOoJ,OAIrFuC,EAAWzB,EAASY,GAAaH,OAAQY,GAAMA,EAAEN,WAAW,cAAcb,IAAKmB,IACnF,MAAO,CAAErN,EAAImC,GAAQkL,EAAEd,MAAM,iBAAmB,IACzC5G,EAAM+H,GAAWvL,EAAK8J,MAAM,KACnC,MAAO,CAAEjM,GAAI8B,OAAO9B,GAAK2F,OAAM+H,QAASA,GAAW,MAG/CzC,EAAae,EAASY,GAAaH,OAAQY,GAAMA,EAAEN,WAAW,WAAWb,IAAKmB,IAClF,MAAO,CAAErN,EAAImC,GAAQkL,EAAEd,MAAM,iBAAmB,GAC1CzI,EAAI3B,GAAM8J,MAAM,KAAKG,OAAO,CAACC,EAA6BsB,KAC9D,MAAOnG,EAAMoG,GAASD,EAAE1B,MAAM,KAE9B,OADAI,EAAI7E,GAAQoG,EACLvB,GACN,CAAC,GACJ,GAAKvI,IAAKmJ,OAAOC,OAAOpJ,GAAG+J,KAAMC,IAAOA,GACxC,MAAO,CAAE9N,GAAI8B,OAAO9B,GAAKmC,KAAM2B,KAC9B2I,OAAOnD,SAEV,OAAOkE,EAAStB,IAAK6B,IACnB,MAAMrL,EAAIuI,EAAWwB,OAAQY,GAAMA,EAAGrN,KAAO+N,EAAQ/N,IAAIkM,IAAKyB,GAAMA,EAAGxL,MAAMiK,OAAO,CAACC,EAAKC,IACjFW,OAAOe,OAAO3B,EAAKC,GACzB,CAAC,GACE2B,EAAIR,EAAShB,OAAQY,GAAMA,EAAErN,KAAO+N,EAAQ/N,IAAIkM,IAAKmB,IAClD,CACL1H,KAAM0H,EAAE1H,KACR+H,QAASL,EAAEK,WAIf,MAAO,IACFK,KACCd,OAAOiB,KAAKxL,GAAG8H,OAAS,GAAK,CAAES,WAAYvI,MAC3CuL,EAAEzD,OAAS,GAAK,CAAEO,cAAekD,OAKrCE,EAAYzB,EAAO,UAAW,SAC9B0B,EAAcD,GAAarM,OAAOqM,EAAUlC,MAAM,KAAK,IAGvDoC,EAAiB3B,EAAO,gBAAiB,UAAUT,MAAM,WAAQ5M,EACjEiP,EAAsB5B,EAAO,gBAAiB,eAAeT,MAAM,WAAQ5M,EAEjF,IAAKgP,EACH,MAAMtC,MAAM,qCAGd,MAAOwC,EAAMC,GAAe9B,EAAO,mBAAmBT,MAAM,MAAQ,GAE9DwC,EAAQ/B,EAAO,YACrB,IAAK6B,IAASC,EACZ,MAAMzC,MAAM,sCAGd2C,QAAQC,IAAI3C,GAEZ,MAAM4C,EAAQlC,EAAO,gBACfmC,EAAMnC,EAAO,cAEnB,IAAKkC,IAAUC,EACb,MAAM9C,MAAM,2CAGd,MAAO,CACL+C,aAAc,CACZ,CACEN,cACAD,OACAE,MAAO5C,EAAQ4C,EAAS,WAG5BI,MACAD,WACIR,GAAe,CAAEW,KAAM7E,EAAiBkE,OACxCC,GAAkB,CACpB,cAAe,CACb,CACEW,UAAWX,EAAe,GAC1BY,QAASZ,EAAea,MAAM,EAAGb,EAAe7D,QAAQ0B,IAAIpK,QAAQoK,IAAIhC,IAEzE2B,GAASyC,GAAuB,CAC/BU,UAAWV,EAAoB,GAC/BW,QAASX,EAAoBY,MAAM,EAAGZ,EAAoB9D,QAAQ0B,IAAIpK,QAAQoK,IAAIhC,KAEpFuC,OAAOnD,aAEPuC,GAAS,CACXsD,YAAa/B,EAAa,SAC1BgC,YAAahC,EAAa,SAC1BiC,iBAAkBjC,EAAa,cAC/BkC,kBAAmB/B,EAAkB,SACrCgC,kBAAmBhC,EAAkB,SACrCiC,uBAAwBjC,EAAkB,eAG/C,ECjHD,GAAgBkC,EAAwBC,GAAW,EAAOC,GAAiB,EAAO9D,GAAQ,KACxF,MAAM+D,EAAkB,GAElBC,EAAOjC,IACXgC,EAAME,KAAKlC,KAGP,UACJmC,EAAS,MACTC,EAAK,gBACLC,EAAe,gBACfC,EAAe,kBACfZ,EAAiB,kBACjBC,EACAY,WAAW,MACTvB,EAAK,IACLC,EAAG,aACHC,EAAY,WACZsB,IAEAX,EAGJI,EAAI,OACJA,EAAI,OAAOE,sBACXF,EAAI,OACJA,EAAI,SACJA,EAAI,yBACJA,EAAI,yBACJA,EAAI,kBAAkBG,EAAM9D,IAAK6C,GAASA,EAAKsB,KAAKC,KAAK,OAAOX,EAAiB,GAAK,KAAI9D,EAAQ,IAAM,QAEnGA,GAAOgE,EAAI,cAEhB,MAAMU,EAAgBC,IACpB,GAAIA,EAAEC,UACJZ,EAAI,KAAKW,EAAEC,iBACN,CACL,IAAIC,EAAM,GACVA,GAAO,eACPA,GAAO,GAAGF,EAAEG,cAAcH,EAAEI,aAAaJ,EAAEK,YAAYL,EAAEM,YAAYN,EAAEO,MAAMP,EAAEQ,YAAYR,EAAE7K,OACzF,aAAc6K,IAChBE,GAAO,UAAUF,EAAE,qBAAqBA,EAAE,eAE5CE,GAAO,eAAeF,EAAES,aACxBpB,EAAIa,EACN,GAGIQ,EAAeA,KACnBrB,EAAI,eAAejB,KACnBiB,EAAI,aAAahB,KACjBC,EAAaqC,QAAS3C,IACpBqB,EAAI,iBAAiBrB,EAAYD,QAAQC,EAAYA,eACrDqB,EAAI,WAAWhE,EAAS2C,EAAYC,MAAS,eAG/C2B,EAAWe,QAAQZ,IAGfa,EAAkBC,IACtB,MAAM,SACJnG,EAAQ,GAAElL,EAAE,KAAEwH,EAAI,UAAEwD,EAAS,WAAEC,GAC7BoG,EAKJ,GAFAxB,EAAI,YAAY7P,KAAMwH,KAAQwD,IADPE,EAAW,IAAIA,IAAa,MAG/CD,EAAY,CACd,MAAMqG,EAAmBrE,OAAOiB,KAAKjD,GAAYiB,IAAKqF,GAC7C,GAAGA,KAAOtG,EAAYsG,OAC5BjB,KAAK,KAERT,EAAI,UAAU7P,KAAMsR,IACtB,CAEAD,EAAY,aAAaF,QAASK,IAChC3B,EAAI,aAAa7P,KAAMwR,EAAQ7L,OAAO6L,EAAQ9D,QAAU,IAAI8D,EAAQ9D,UAAY,SAI9E+D,EAAgBC,IACpB,MAAMC,EAAeD,EAAME,QAAUrC,EAAoBD,EAEnD3J,EAAO+L,EAAME,QAAU,QAAU,QAiBvC,GAhBA/B,EAAI,KAAKlK,KAAQ+L,EAAMG,OAAS,EAAI,eAAeF,EAAazF,IAAKmB,GAAMA,EAAErN,IAAIsQ,KAAK,QACtFT,EAAI,oBACJA,EAAI,aACJA,EAAI,SAAS6B,EAAMrB,OACnBR,EAAI,cACJ8B,EAAaR,QAAQC,GAErBvB,EAAI,2BACA6B,EAAME,SACR/B,EAAI,iBAGL6B,EAAME,QAAU1B,EAAkBD,GAAiBkB,QAAQ,EAAGnR,KAAIsN,UACjEuC,EAAI,YAAY7P,KAAMsN,OAGpBoE,EAAMI,UACRjC,EAAI,kBADN,CAOA,GAFAqB,IAEIrF,EACFgE,EAAI,cACJA,EAAI,qBACC,CACL,GAAIH,EAEF,YADAG,EAAI,cAGF6B,EAAMG,OACRhC,EAAI,eAEJA,EAAI,cACJA,EAAI,iBAER,CAEA6B,EAAMK,aAAaZ,QAASa,IACtBA,EAAYhD,WACda,EAAI,gBAAgBmC,EAAYhD,aAAagD,EAAY/C,QAAQ/C,IAAI9B,GAAoBkG,KAAK,QAEhG0B,EAAY/C,QAAQkC,QAASc,IAC3B,MAAMlD,EAAO3E,EAAmB6H,GAChCpC,EAAI,UAAUd,WAAc2C,EAAMQ,YAClCrC,EAAI,UAAUd,UAAa2C,EAAMQ,YAAYR,EAAMQ,YACnDrC,EAAI,UAAUd,aAAgB2C,EAAMQ,YACpCrC,EAAI,UAAUd,WAAc2C,EAAMQ,eA7BtC,GAsDF,OApBKrG,EAGHmE,EAAMvD,OAAOgF,GAFbzB,EAAMvD,OAAQsC,GAAsB,MAAbA,EAAKsB,KAA4B,MAAbtB,EAAKsB,KAAanE,IAAIuF,GAK9D9B,IACHE,EAAI,oDACJA,EAAI,oBACJqB,IACArB,EAAI,yBACJA,EAAI,UAAShE,EAAQ,IAAO8D,EAAiB,IAAM,MACnDE,EAAI,oBACJA,EAAI,8BAGDhE,GACHmE,EAAMvD,OAAQsC,GAAsB,MAAbA,EAAKsB,KAA4B,MAAbtB,EAAKsB,KAAanE,IAAIuF,GAG5D,GAAG7B,EAAMU,KAAK,SACtB,ECtLY6B,EAAWC,IACtB,MAAMC,EAAaD,EAAIE,mBACjBC,EAAMF,EAAWG,QAAQJ,EAAIK,gCAEnC,OADAJ,EAAWK,QACJ,IAAIC,YAAY,CAAC1F,OAAOe,OAAQuE,EAAYK,OAAOC,iBAAiB,GAAI,CAAEC,SAAS,OAG/EC,EAAQA,EAAGrR,QAAQ,IAAKC,SAAS,KAAQ,CAAC,KACrD,MAAMqR,EAAS/F,OAAOe,OAAOiF,SAASC,cAAc,UAAW,CAAExR,QAAOC,WAClEyQ,EAAMY,EAAOG,WAAW,MAC9B,IAAKf,EAAK,MAAMrG,MAAM,4BAEtBqG,EAAIgB,SAAS,EAAG,EAAG1R,EAAOC,GAC1B,MAAMiR,EAASI,EAAOK,gBACtB,OAAO,IAAIV,YAAY,CAAC1F,OAAOe,OAAO4E,EAAOU,iBAAiB,GAAI,CAAER,SAAS,O,yBCuC/E,IAAIS,ECjBAA,ED0CJ,SAASC,EAAkBC,GACpBF,IAGLA,EAAMG,wBAAwBC,QAC9BJ,EAAMK,uBAAuBD,QAExBF,GACHF,EAAMM,WAAW,CACf,QAAS,qCAGf,CA4BO,SAASC,EAAehV,GAC7B,OAAOyU,GAAOQ,UAAUjV,EAC1B,CAEO,SAASkV,EAAUlV,EAAgBmV,GACxC,MAAMC,EAAuBX,GAAOW,uBAAuBpV,GACtDoV,GACLA,EAAqBF,YAAYC,EACnC,CAEO,SAASE,EAAgBC,EAAwBtV,GACtD,MAAMkB,EAAKlB,GAAUyU,GAAOc,KACtBzB,EAAS5S,GAAM8T,EAAe9T,KAAMoU,GAC1C,QAAKxB,GAEEA,EAAO0B,YAAY,IAAIxB,OAChC,CAEA,SAASyB,EAAuBzV,GAC9ByU,GAAOM,WAAW,CAChB,QAAS,yBACT/U,SACA0V,eAAgBL,EAAgB,QAASrV,GACzC2V,eAAgBN,EAAgB,QAASrV,GACzC4V,sBAAuBP,EAAgB,eAAgBrV,GACvD6V,UAAWpB,EAAMqB,WAAW9V,IAEhC,CAEA+V,eAAeC,EAAcV,EAAwBW,EAA8B,QACjF,GAAmB,UAAfX,GAA0Bb,GAAOyB,YACnC,OAAOzB,EAAMyB,YAGf,GAAmB,iBAAfZ,EACF,OAAQ/I,UAAUC,aAAqB2J,gBAAgB,CACrDC,OAAO,EACPC,OAAO,IAIX,MAAMC,QAAc/J,UAAUC,aAAa+J,aAAa,CACtDH,MAAsB,UAAfd,GAAyB,IAE1B7I,GAAkC,CAACE,kBAAkB,MACrDC,GAAkC,CAACC,kBAAkB,IAE3DwJ,MAAsB,UAAff,GAAyB,CAC9BkB,WAAYP,KAQhB,GAJIxB,GAAwB,UAAfa,IACXb,EAAMyB,YAAcI,GAGH,UAAfhB,EAAwB,CAC1B,MAAMmB,EAAMtC,SAASC,cAAc,SACnCqC,EAAIC,UAAYJ,EAEhB,MAAMK,EAAW,IAAIC,EAAAA,EACrBH,EAAII,UAAY,IAAMF,EAASG,gBACzBH,EAASI,OACjB,CAEA,OAAOT,CACT,CAkCOP,eAAeiB,EAAa1B,EAAwBxG,OAA6BvO,GACtF,KAAKkU,GAAUA,EAAMc,MAASd,EAAMwC,YAAexC,EAAMQ,SACvD,OAGF,MAAMnB,EAASkB,EAAeP,EAAMc,QAAQD,GAC5C,IAAKxB,EAAQ,OAEb,MAAMoD,EAAQpD,EAAO0B,YAAY,GAEjC,IAAK0B,EACH,OAGF,MAAMC,EAAS,IACV1C,EAAMwC,WAAWG,gBAChB3C,EAAMK,uBAAuBsC,cAAgB,IACjDrJ,KAAMQ,GAAM2I,EAAMhW,KAAOqN,EAAE2I,OAAOhW,IAEpC,GAAKiW,EAAL,CAIArI,OAAkBvO,IAAVuO,GAAuBoI,EAAMlD,QAAUlF,EAE/C,IACE,GAAIA,IAAUoI,EAAMlD,QAAS,CAC3B,MAAMqD,QAAkBrB,EAAcV,GAGtC,SAFM6B,EAAOG,aAAaD,EAAU7B,YAAY,IAChDf,EAAMQ,QAAQR,EAAMc,MAAMD,GAAc+B,EACrB,UAAf/B,EACFb,EAAM+B,WAAa,YACd,GAAmB,UAAflB,EAAwB,CACjC,MAAM,aAAEiC,GAAiB9C,EACzB,IAAK8C,EAAc,OACnB,MAAMlM,EAASoJ,EAAM+C,aAAeD,EAAaE,wBAAwBJ,GAEnEK,EAAWjD,EAAMkD,eAAiBJ,EAAaK,iBACrDF,EAASG,aAAe,IACxBH,EAASI,aAAe,GACxBJ,EAASK,sBAAwB,IACjCL,EAASM,QAAU,KAEnB3M,EAAOqI,QAAQgE,GAEfjD,EAAQ,IACHA,EACH+C,YAAanM,EACbsM,cAAeD,EACftC,qBAAsB,IACjBX,EAAMW,qBACT,CAACX,EAAMc,MAAO,IACTd,EAAMW,uBAAuBX,EAAMc,MACtC0C,oBAAqBA,KACnB,MAAMzM,EAAQ,IAAI0M,WAAWR,EAASS,mBAEtC,OADAT,EAASU,qBAAqB5M,GACvBD,EAAaC,EAAO,QAKrC,CACF,MAAO,IAAKsD,GAASoI,EAAMlD,QAAS,CAClC,MAAMqD,EAA2B,UAAf/B,EAAyBb,EAAMpB,QAAUoB,EAAMR,MACjE,IAAKoD,EAAW,aAEVF,EAAOG,aAAaD,EAAU7B,YAAY,IAChDf,EAAMQ,QAAQR,EAAMc,MAAMD,GAAc+B,EACrB,UAAf/B,IACFb,EAAM+B,gBAAajW,GAGH,UAAf+U,EAED4B,EAAMmB,QAEN5D,EAAM+C,aAAac,aACnB7D,EAAMkD,eAAeW,aAEzB,CACA7C,EAAuBhB,EAAMc,MACV,iBAAfD,GAAkCxG,GAAO4F,GAAkB,EACjE,CAAE,MAAOzN,GAET,CA/DA,CAgEF,CAEA,SAASsR,EAAsBC,GAC7B/D,GAAOM,WAAW,CAChB,QAAS,iCACTyD,mBAEJ,CAEO,SAASC,IACThE,IAIDA,EAAMc,MAAQd,EAAMQ,UAAUR,EAAMc,OACtCpH,OAAOC,OAAOqG,EAAMQ,QAAQR,EAAMc,OAAS,CAAC,GAAGlD,QAASyB,IACtDA,GAAQ0B,YAAYnD,QAAS6E,IAC3BA,EAAMmB,WAKZ5D,EAAMyB,aAAaV,YAAYnD,QAAS6E,IACtCA,EAAMmB,SAER3D,GAAkB,GAClBD,EAAMiE,aAAa7D,QACnBJ,EAAMwC,YAAYpC,QAClB0D,EAAsB,gBAElB9D,EAAMkE,kBACRC,cAAcnE,EAAMkE,kBAGtBlE,OAAQlU,EACV,CAEA,SAASsY,IACFpE,GAAUA,EAAMW,sBAErBjH,OAAOiB,KAAKqF,EAAMW,sBAAsB/C,QAASnR,IAC/C,MAAM,oBAAE+W,GAAwBxD,EAAOW,qBAAsBpS,OAAO9B,IAEpE,GAAI+W,EAAqB,CACvB,MAAMpC,EAAYoC,IACZa,EAAgBrE,EAAOqB,SAAU5U,IAAO,EAC9CuT,EAAOqB,SAAU5U,GAAM2U,GAClBA,EAAYxJ,GAAayM,GAAiBzM,GACzCwJ,GAAaxJ,GAAayM,EAAgBzM,IAC9CoJ,EAAuBvU,EAE3B,GAEJ,CAmCO6U,eAAegD,EAAkCC,GACtD,IAAKvE,EACH,OAGF,MAAM,aACJvK,EAAY,WAAEyG,EAAU,WAAEsG,EAAU,KAAE1B,GACpCd,EAEJ,KAAKvK,GAAiByG,GAAesG,GAAetG,EAAWO,OAAUP,EAAWU,WAAckE,GAChG,OAIF,GAAIyD,EAAoBjL,KAAMkL,GACrBA,EAAYC,QACdD,EAAY5N,SACXoJ,GAAO9D,YAAYO,OAAOnD,KAAMQ,GAAMA,EAAEwE,SAAWxE,EAAEuE,UAAUG,aAAa,GAAG9C,QAAQ,IAG7F,YADAsI,IAIF,MAAMU,EAAyB,GA8F/B,GA7FAH,EAAoB3G,QAAS4G,IAC3B,GAAIA,EAAYC,OAOd,YANID,EAAYG,UAAYH,EAAYI,gBAEtCrC,EAAa,SAAS,GACtBA,EAAa,SAAS,GACtBA,EAAa,gBAAgB,KAKjC,MAAM,OAAEsC,GAAWL,EACbM,EAAcN,EAAYG,SAAWH,EAAYO,YACjDC,GAAeR,EAAYS,gBAAkBT,EAAY5C,OAASiD,EAClEK,GAAsBV,EAAYW,cAAgBN,EAExD,IAAIO,GAAW,EACXC,GAAW,EACXC,GAAkB,EAEtBpJ,EAAWO,MAAOvD,OAAQY,GAAMA,EAAEvO,SAAWiZ,EAAY/X,IAAImR,QAASpC,IAC/DA,EAAK6C,UACJ7C,EAAKgD,aAAa,GAAG9C,QAAQ,KAAO8I,EAAY5N,SAClDyO,GAAW,GAGb7J,EAAK+C,UAAYuG,GAGftJ,EAAK6C,UACF7C,EAAKY,iBACFoI,EAAY5C,OAASpG,EAAKmD,WAAa6F,EAAY5C,MAAMjD,WAC7DyG,GAAW,GAGb5J,EAAK+C,UAAYyG,GAGfxJ,EAAKY,iBACDoI,EAAYW,cAAgB3J,EAAKmD,WAAa6F,EAAYW,aAAaxG,WAC3E2G,GAAkB,GAGpB9J,EAAK+C,UAAY2G,MAKlBJ,GAAgBO,IAEnBrF,EAAOuF,QAAUvF,EAAOuF,QAAU,EAClCrJ,EAAWO,MAAOF,KAAK,CACrBhR,OAAQiZ,EAAY/X,GACpB6R,QAAQ,EACRK,SAAU,QAAQ6F,EAAY5N,SAC9ByH,SAAS,EACTG,aAAc,CAAC,CACb9C,QAAS,CAAC8I,EAAY5N,UAExBkG,IAAKkD,EAAOuF,QAAQC,cAInBR,GAAgBI,IAAYZ,EAAY5C,QAE3C5B,EAAOuF,QAAUvF,EAAOuF,QAAU,EAElCb,EAAanI,KAAKiI,EAAY5C,MAAMjD,UACpCzC,EAAWO,MAAOF,KAAK,CACrBhR,OAAQiZ,EAAY/X,GACpB6R,QAAQ,EACRK,SAAU6F,EAAY5C,MAAMjD,SAC5BN,SAAS,EACTG,aAAcgG,EAAY5C,MAAMpD,aAChC1B,IAAKkD,EAAOuF,QAAQC,cAInBN,GAAuBI,IAAmBd,EAAYW,eAEzDnF,EAAOuF,QAAUvF,EAAOuF,QAAU,EAClCrJ,EAAWO,MAAOF,KAAK,CACrBH,gBAAgB,EAChB7Q,OAAQiZ,EAAY/X,GACpB6R,QAAQ,EACRK,SAAU6F,EAAYW,aAAaxG,SACnCN,SAAS,EACTG,aAAcgG,EAAYW,aAAa3G,aACvC1B,IAAKkD,EAAOuF,QAAQC,gBAKtBxF,EAAMyF,0BAER,YADAzF,EAAMyF,0BAA0BlJ,KAAKL,GAGrC8D,EAAMyF,0BAA4B,GAGpC,MAAMlN,EAAMmN,EAASxJ,SACfsG,EAAWmD,qBAAqB,CACpCvT,KAAM,QACNmG,QAGF,IACE,MAAMqN,QAAepD,EAAWqD,eAIhC,SAHMrD,EAAWsD,oBAAoBF,GAErC5E,EAAuBF,GACnBd,EAAMyF,0BAA0BxO,OAAS,EAE3C,IAAK,MAAM8O,KAAiB/F,EAAMyF,0BAA2B,OACrDjD,EAAWmD,qBAAqB,CACpCvT,KAAM,QACNmG,IAAKmN,EAASK,KAEhB,MAAMC,QAAkBxD,EAAWqD,qBAC7BrD,EAAWsD,oBAAoBE,GACrChF,EAAuBF,EAoBzB,CAEFd,EAAMyF,+BAA4B3Z,CACpC,CAAE,MAAO0G,GACP2I,QAAQ8K,MAAMzT,EAChB,CACF,CAoDA,SAAS0T,EAAY1T,GACnB,KAAKwN,GAAUA,EAAMmG,cAAiBnG,EAAM8C,cAAiB9C,EAAMoG,aACjE,OAEF,MAAM5K,EAAOwE,EAAM9D,YAAYO,OAAOnD,KAAMQ,GAAMA,EAAE6E,WAAanM,EAAEiQ,MAAMhW,IACzE,IAAK+O,IAASA,EAAKjQ,OACjB,OAGF,MAAM,OAAEA,EAAM,eAAE6Q,GAAmBZ,EAC7BgJ,EAAcxE,EAAMvK,cAAc6D,KAAMnK,GAAMA,EAAE1C,KAAOlB,GAEvDsV,EAA+B,UAAjBrO,EAAEiQ,MAAM4D,KAAoBjK,EAAiB,eAAiB,QAAW,QAE7F5J,EAAEiQ,MAAM6D,QAAU,YACTtG,GAAOQ,UAAUjV,GAAQsV,GAChCG,EAAuBzV,IAGzB,MAAM8T,EAAS7M,EAAEgO,QAAQ,GAEzB,GAAqB,UAAjBhO,EAAEiQ,MAAM4D,KAAkB,CAC5B,MAAM,YAAED,GAAgBpG,EAClB8C,EAAe,IAAKyD,OAAOC,aAC3B5P,EAASkM,EAAaE,wBAAwB3D,GAE9CoH,EAAW3D,EAAa4D,aAC9BD,EAASE,KAAKtM,OAASmK,GAAa9D,QAAU,KAAS,IAEvD,MAAMkG,EAAW9D,EAAa4D,aAC9BD,EAASE,KAAKtM,MAAQ,EAEtB,MAAM4I,EAAWH,EAAaK,iBAC9BF,EAASG,aAAe,IACxBH,EAASI,aAAe,GACxBJ,EAASK,sBAAwB,IACjCL,EAASM,QAAU,KAEnB3M,EAAOqI,QAAQgE,GAAUhE,QAAQ2H,GAAU3H,QAAQwH,GAAUxH,QAAQ6D,EAAa+D,aAElFT,EAAaU,SAASlQ,EAAOwP,YAAY9G,iBAAiB,IAG1D,MAAMyH,EAAO,IAAIC,MACjBD,EAAK9E,UAAY5C,EAEjB0H,EAAKE,OAAQ,EACbF,EAAKG,SAELlH,EAAQ,IACHA,EACHW,qBAAsB,IACjBX,EAAMW,qBACT,CAACpV,GAAS,IACLyU,EAAMW,uBAAuBpV,GAChCkV,UAAYC,IACV+F,EAASE,KAAKtM,MAAQqG,EAAS,EAAa,EAATA,EAAaA,GAElDyG,WAAaF,IACXL,EAASD,KAAKtM,MAAQ4M,EAAQ,EAAI,GAEpCzD,oBAAqBA,KACnB,MAAMzM,EAAQ,IAAI0M,WAAWR,EAASS,mBAEtC,OADAT,EAASU,qBAAqB5M,GACvBD,EAAaC,EAAO,QAKrC,CAEAiJ,EAAQ,IACHA,EACHQ,QAAS,IACJR,EAAMQ,QACT,CAACjV,GAAS,IACLyU,EAAMQ,UAAUjV,GACnB,CAACsV,GAAaxB,KAKpB2B,EAAuBzV,EACzB,CAEA,SAAS6b,EACP5G,EACA6B,EACAjG,GAAiB,GAEjB,MAAMoG,EAAa,IAAI6E,kBAEjBpD,EAAc7H,OAAiBtQ,EA3VvC,SAA2B0W,GACzB,MAAMyB,EAAczB,EAAW8E,kBAAkB,OAAQ,CACvD7a,GAAI,IA4BN,OAzBAwX,EAAYsD,OAAS,OAIrBtD,EAAYuD,UAAahV,IAEViV,KAAKC,MAAMlV,EAAE5D,MAEb+Y,cAYf1D,EAAY2D,QAAWpV,IACrB2I,QAAQC,IAAI,YAAa,qCACzBD,QAAQ8K,MAAMzT,IAGTyR,CACT,CA4TmDqD,CAAkB9E,GAkHnE,OAhHAhC,EAAQ5C,QAASyB,GAAWA,EAAO0B,YAAYnD,QAAS6E,IACtDD,EAAWsE,SAASrE,EAAOpD,MAGxBjD,IACHoG,EAAWqF,2BAA6B,KACtC,MAAM9D,EAAkBvB,EAAWsF,mBACnC3M,QAAQC,IAAI,2BAA4B2I,GAChB,cAApBA,GAAuD,cAApBA,EACrCD,EAAsB,aACO,aAApBC,GAAsD,QAApBA,EAC3CD,EAAsB,cACqB,iBAAlCtB,EAAWsF,oBACpBhE,EAAsB,kBAI5BtB,EAAWuF,wBAA0B,KACnC5M,QAAQC,IAAI,wBAAyBoH,EAAWuB,kBAElDvB,EAAWwF,QAAU9B,EACrB1D,EAAWyF,oBAAsB3G,UAC/B,IAAKtB,EAAO,OAEZ7E,QAAQC,IAAI,uBAEZ,MAAM,KAAE0F,GAASd,EAEjB,IAAKc,EACH,OAEF,MAAMoH,QAAc1F,EAAW2F,YAAY,CACzCC,qBAAqB,EACrBC,qBAAsBjM,IAOxB,GALAjB,QAAQC,IAAI,uBAENoH,EAAWsD,oBAAoBoC,GACrC/M,QAAQC,IAAI,mBAEP8M,EAAM3P,IACT,OAGF,MAAMA,EAAM+P,EAASJ,GACfK,EAA+BnM,OAajCtQ,EAbkD,CACpDP,OAAQ,GACRiT,aAAc,CACZ,CACE9C,QAAS,CAACnD,EAAIiD,MAAQ,KAG1B+C,UAAWnC,EACXkC,QAAQ,EACRD,SAAS,EACTjC,iBACAuC,SAAUvC,EAAiB,IAAM,IACjCU,IAAKV,EAAiB,IAAM,KAGxBoM,EAA8BjQ,EAAI,gBAAkB,CACxD6D,iBACA7Q,OAAQ,GACRiT,aAAcjG,EAAI,eAClB+F,QAAQ,EACRD,SAAS,EACTM,SAAUvC,EAAiB,IAAM,IACjCU,IAAKV,EAAiB,IAAM,KAGxBF,EAAaE,EAAiB4D,EAAMyI,sBAAwBzI,EAAM9D,WAElEO,EAAgB,GAClBL,GACEoM,GAAW/L,EAAMF,KAAKiM,GACtBD,GAAW9L,EAAMF,KAAKgM,KAEtBA,GAAW9L,EAAMF,KAAKgM,GACtBC,GAAW/L,EAAMF,KAAKiM,IAG5B,MAAM/G,EAAcjB,EAAQlH,KAAMQ,GAAgC,UAA1BA,EAAEiH,YAAY,GAAGsF,MACnDqC,EAAclI,EAAQlH,KAAMQ,GAAgC,UAA1BA,EAAEiH,YAAY,GAAGsF,MAEzDrG,EAAQ,IACHA,KACE5D,EAKD,CACFqM,sBAAuB,IAClBvM,EACHO,UARkB,CACpBP,WAAY,IACPA,EACHO,UAQJ+D,QAAS,IACJR,EAAMQ,QACT,CAACM,GAAO,IACHd,EAAMQ,UAAUM,MACfW,GAAe,CAAEE,MAAOF,OACvBrF,GAAkBsM,EAAc,CAAE9G,MAAO8G,GAAgB,CAAEvD,aAAcuD,MAKpF1H,EAAuBF,GAEvBuB,EAAQ9J,IAGH,CAAEiK,aAAYyB,cACvB,CCxwBA,SAAS0E,IACP3I,GAAOM,SAAS,IACXN,EAAM4I,WACT,QAAS,6BAEb,CAEA,SAASrH,EAAcV,EAAwBW,EAA8B,QAC3E,MAAmB,iBAAfX,EACM/I,UAAUC,aAAqB2J,gBAAgB,CACrDC,OAAO,EACPC,OAAO,IAIJ9J,UAAUC,aAAa+J,aAAa,CACzCH,MAAsB,UAAfd,GAAyB,IAC1B7I,GAAkC,CAAEE,kBAAkB,MACtDC,GAAkC,CAAEC,kBAAkB,IAE5DwJ,MAAsB,UAAff,GAAyB,CAC9BkB,WAAYP,IAGlB,CAmCOF,eAAeuH,EAAgBhI,EAAwBxG,OAA6BvO,GACzF,IAAKkU,EAAO,OACZ,MAAMX,EAAwB,UAAfwB,EAAyBb,EAAMQ,QAAQsI,SAClC,UAAfjI,EAAyBb,EAAMQ,QAAQuI,SAAW/I,EAAMQ,QAAQwI,gBAErE,IAAK3J,EAAQ,OACb,MAAMoD,EAAQpD,EAAO0B,YAAY,GAEjC,IAAK0B,EACH,OAGF,MAAMC,EAAS1C,EAAMwC,WAAWG,aAAarJ,KAAMQ,GAAM2I,EAAMhW,KAAOqN,EAAE2I,OAAOhW,IAE/E,GAAKiW,EAAL,CAIArI,OAAkBvO,IAAVuO,GAAuBoI,EAAMlD,QAAUlF,EAE/C,IACE,GAAIA,IAAUoI,EAAMlD,QAAS,CAC3B,MAAMqD,QAAkBrB,EAAcV,GACtC+B,EAAU7B,YAAY,GAAGuF,QAAU,KACjCuC,EAAgBhI,GAAY,UAExB6B,EAAOG,aAAaD,EAAU7B,YAAY,IAC7B,UAAfF,EACFb,EAAMQ,QAAQsI,SAAWlG,EACD,UAAf/B,GACTb,EAAMQ,QAAQuI,SAAWnG,EACzB5C,EAAM+B,WAAa,QAEnB/B,EAAMQ,QAAQwI,gBAAkBpG,EAEf,UAAf/B,GAAyC,iBAAfA,GAC5BgI,EAA+B,UAAfhI,EAAyB,eAAiB,SAAS,EAKvE,MAAO,IAAKxG,GAASoI,EAAMlD,QAAS,CAClCkD,EAAMmB,OACN,MAAMhB,EAA2B,UAAf/B,EAAyBb,EAAMpB,QAC7B,UAAfiC,EAAyBb,EAAMiJ,WAAajJ,EAAMkJ,kBACvD,IAAKtG,EAAW,aAEVF,EAAOG,aAAaD,EAAU7B,YAAY,IAE7B,UAAfF,EACFb,EAAMQ,QAAQsI,SAAWlG,EACD,UAAf/B,EACTb,EAAMQ,QAAQuI,SAAWnG,EAEzB5C,EAAMQ,QAAQwI,gBAAkBpG,CAKpC,CACA+F,IACAQ,GACF,CAAE,MAAOC,GACPjO,QAAQ8K,MAAMmD,EAChB,CAhDA,CAiDF,CAwIO,SAASC,IACTrJ,IAELA,EAAMQ,QAAQuI,UAAUhI,YAAYnD,QAAS6E,GAAUA,EAAMmB,QAC7D5D,EAAMQ,QAAQwI,iBAAiBjI,YAAYnD,QAAS6E,GAAUA,EAAMmB,QACpE5D,EAAMQ,QAAQsI,UAAU/H,YAAYnD,QAAS6E,GAAUA,EAAMmB,QAC7D5D,EAAMiE,YAAY7D,QAClBJ,EAAMwC,WAAWpC,QACjBJ,OAAQlU,EACV,CAEA,SAASqd,IACP,IAAKnJ,EAAO,OACZ,MAAM,kBAAEsJ,EAAiB,QAAE9I,GAAYR,EAEvCsJ,EAAkB,CAChB,QAAS,aACTC,cAAe,EACf5E,SAAUnE,EAAQsI,UAAU/H,YAAY,GAAGxB,QAC3CiK,cAAc,EACdC,WAAYjJ,EAAQuI,UAAUhI,YAAY,GAAGxB,QAAU,SAAW,WAClEmK,gBAAiBlJ,EAAQwI,iBAAiBjI,YAAY,GAAGxB,QAAU,SAAW,YAElF,CAEA,SAASoK,EAAUC,GACjB,IAAK5J,GAASA,EAAM6J,WAAY,OAAOD,EAEvC,MAAM,aAAExL,GAAiBwL,EACnBE,EAAM1L,EAAa2L,UAAWjM,GAAqC,QAArBA,EAAY7J,MAC1D+V,EAAiB5L,EAAa0L,GAC9BG,EAAS7L,EAAa2L,UAAWjM,GAAgBvP,OAAOuP,EAAYpG,YAAYwS,OAASF,EAAevd,IAG9G,OAFAmd,EAAaxL,aAAe,CAACA,EAAa0L,GAAM1L,EAAa6L,IAEtDL,CACT,CAEA,SAASO,EAAiB5R,GACxB,IAAKyH,EAAO,OACZ,MAAM,kBAAEsJ,GAAsBtJ,EAEzBzH,EAAIiD,MAASjD,EAAI,gBAAmBA,EAAI,eAAe,IAAOA,EAAI,eAAe,IAEtF+Q,EAAkB,CAChB,QAAS,eACT/N,aAAchD,EAAIgD,aAClBF,MAAO9C,EAAI8C,MACXC,IAAK/C,EAAI+C,IACTqG,MAAO,CACLnG,KAAM3E,EAAmB0B,EAAIiD,MAAMgK,WACnC4E,WAAY,GACZhM,aAAc7F,EAAIwD,kBAClBsO,cAAe9R,EAAIqD,aAErBgG,MAAO+H,EAAU,CACfnO,KAAM3E,EAAmB0B,EAAI,eAAe,GAAGmD,QAAQ,IAAI8J,WAC3D4E,WAAY,CAAC,CACX3O,UAAWlD,EAAI,eAAe,GAAGkD,UACjCgB,MAAOlE,EAAI,eAAe,GAAGmD,QAAQ/C,IAAI9B,KAE3CuH,aAAc7F,EAAIyD,kBAClBqO,cAAe9R,EAAIsD,cAErByO,WAAYX,EAAU,CACpBnO,KAAM3E,EAAmB0B,EAAI,eAAe,GAAGmD,QAAQ,IAAI8J,WAC3D4E,WAAY,CAAC,CACX3O,UAAWlD,EAAI,eAAe,GAAGkD,UACjCgB,MAAOlE,EAAI,eAAe,GAAGmD,QAAQ/C,IAAI9B,KAE3CuH,aAAc7F,EAAI0D,uBAClBoO,cAAe9R,EAAIuD,oBAGzB,CAEOwF,eAAeiJ,EAAwB5X,GAC5C,GAAKqN,GAAUA,EAAMwC,WAErB,OAAQ7P,EAAQ,UACd,IAAK,aACHqN,EAAM4I,WAAajW,EACnBgW,IACAQ,IACA,MAEF,IAAK,aAAc,CACjB,MAAM,kBAAEqB,EAAiB,gBAAEC,GAAoBzK,EAC/CrN,EAAQkK,WAAWe,QAAS8M,IAC1BF,EAAkBjO,KAAKmO,EAAUxN,aAE/BuN,SACIE,IAER,KACF,CACA,IAAK,eAAgB,CACnB,MAAM,WACJnI,EAAU,WAAEqH,GACV7J,EACJ,IAAKwC,EAAY,OAEjB,MAAMuD,EAAgB,CACpBnJ,UAAW,CACTC,WAAY,GACZxB,MAAO1I,EAAQ0I,MACfC,IAAK3I,EAAQ2I,IACbC,aAAc5I,EAAQ4I,aACtB,YAAY,EACZqP,MAAO,IAETpO,UAAWqO,KAAKC,MAChBrO,MAAO,CACL9J,EAAQgP,OAAS,CACftD,SAAS,EACTC,QAAQ,EACR/S,OAAQ,MACRoT,SAAU,IACV7B,IAAK,IACL0B,aAAc,CAAC,CACb9C,QAAS,CAAC/I,EAAQgP,MAAMnG,SAG5B7I,EAAQiP,OAAS,CACfvD,SAAS,EACTjC,gBAAgB,EAChBkC,QAAQ,EACR/S,OAAQ,MACRoT,SAAU,IACV7B,IAAK,IACL0B,aAAc7L,EAAQiP,MAAMwI,WAAWzR,IAAKmB,IAAC,CAC3C2B,UAAW3B,EAAE2B,UACbC,QAAS5B,EAAE2C,UAGf9J,EAAQ2X,YAAc,CACpBjM,SAAS,EACTjC,gBAAgB,EAChBkC,QAAQ,EACR/S,OAAQ,MACRoT,SAAU,IACV7B,IAAK,IACL0B,aAAc7L,EAAQ2X,WAAWF,WAAWzR,IAAKmB,IAAC,CAChD2B,UAAW3B,EAAE2B,UACbC,QAAS5B,EAAE2C,WAIjBV,kBAAmBpJ,EAAQgP,MAAOvD,cAAczF,IAAIpB,IAA+B,GACnFmF,gBAAiB/J,EAAQgP,MAAO0I,cAChCrO,kBAAmB2N,EAAUhX,EAAQiP,OAAQxD,cAAczF,IAAIpB,IAA+B,GAC9FoF,gBAAiBhK,EAAQiP,MAAOyI,eAUlC,SAPM7H,EAAWmD,qBAAqB,CACpCpN,IAAKmN,EAASK,EAAe8D,OAAY/d,GAAW,GACpDsG,KAAMyX,EAAa,SAAW,UAGhC7J,EAAM9D,WAAa6J,GAEd8D,EAAY,CACf,MAAMjE,QAAepD,EAAWqD,qBAC1BrD,EAAWsD,oBAAoBF,GACrCuE,EAAiB7B,EAAS9F,EAAWuI,kBAAmB,GAC1D,CACA/K,EAAMyK,iBAAkB,QAClBE,IACN,KACF,EAEJ,CAEArJ,eAAeqJ,IACb,IAAK3K,EACH,OAEF,MAAM,kBAAEwK,EAAiB,WAAEhI,GAAexC,EACrCwK,EAAkBvT,eAGjB+T,QAAQC,IAAIT,EAAkB7R,IAAKsE,GAI3CqE,eAA+BkB,EAA+BkI,GAC5D,UACQlI,EAAW0I,gBAAgB,CAC/BR,YACAS,cAAe,GAEnB,CAAE,MAAO/B,GACPjO,QAAQ8K,MAAMmD,EAChB,CACF,CAbiDgC,CAAgB5I,EAAYvF,KAC3E+C,EAAMwK,kBAAoB,GAC5B,CAaAlJ,eAAe6G,EAAYkD,EAAyBC,GAClD,MAAMpD,QAAcmD,EAAKlD,YAAYmD,SAC/BD,EAAKvF,oBAAoBoC,GAC/BiC,EAAiB7B,EAAS+C,EAAKN,kBAAmB,GACpD,C,4FC7dAQ,EAAAA,EAAAA,IAAiB,iBAAkBjK,MAAOhW,EAAQkgB,EAAShR,KACzD,MAAM,cACJiR,EAAa,cAAEC,EAAa,aAAEC,EAAY,OAAEC,EAAM,aAClDC,EAAY,MAAEC,GAAQC,EAAAA,EAAAA,OACpBvR,GAAW,CAAC,EAEVhE,GAAYb,EAAAA,EAAAA,IAAsBrK,GACnCkL,IAILlL,GAAS0gB,EAAAA,EAAAA,IAAsB1gB,EAAQ,CAAEyY,gBAAiB,gBAAkBvN,EAAUyV,kBAAoB,GAC1G3gB,EAAS,IACJA,EACH+J,WAAY,IACP/J,EAAO+J,WACVa,uBAAmBpK,KAGvBogB,EAAAA,EAAAA,IAAU5gB,SAEJ6gB,EAAAA,EAAAA,IAAQ,iBAAkB,CAC9BC,KAAM5V,EAAWqV,uBAEbM,EAAAA,EAAAA,IAAQ,oBAAqB,QAE/BT,SACIS,EAAAA,EAAAA,IAAQ,mBAAoB,CAChCC,KAAM5V,IAIVlL,GAAS+gB,EAAAA,EAAAA,MACLV,IACFrgB,GAASghB,EAAAA,EAAAA,IAAgBhhB,EAAQkL,EAAU/J,MAG7C8f,EAAAA,EAAAA,OAEAL,EAAAA,EAAAA,IAAU5gB,GAEVkgB,EAAQgB,qBAAqB,CAAEC,WAAO3gB,EAAWggB,UAE5CL,GACHzH,IAGFwH,EAAQkB,cAEJd,GACFJ,EAAQmB,8BAA8B,IACjCf,EACHE,cAKNP,EAAAA,EAAAA,IAAiB,uBAAwBjK,UACvC,MAAM9K,GAAYb,EAAAA,EAAAA,IAAsBrK,GAClCI,GAAOC,EAAAA,EAAAA,KAAWL,EAAQA,EAAO+K,eAClC3K,GAAS8K,UAIR+L,EAAa,eAEb4J,EAAAA,EAAAA,IAAQ,2BAA4B,CACxCC,KAAM5V,EACNoW,cAAehM,EAAgB,SAC/B4D,YAAa9Y,QAIjB6f,EAAAA,EAAAA,IAAiB,iBAAkB,CAACjgB,EAAQkgB,EAAShR,KACnD,MAAM,MAAEH,GAAUG,GAAW,CAAEH,OAAO,GAChC7D,GAAYb,EAAAA,EAAAA,IAAsBrK,GAClCI,GAAOC,EAAAA,EAAAA,KAAWL,EAAQA,EAAO+K,eAClC3K,GAAS8K,IAIT2V,EAAAA,EAAAA,IAAQ,2BAA4B,CACvCC,KAAM5V,EACNqW,UAAWxS,EACXmK,YAAa9Y,OAIjB6f,EAAAA,EAAAA,IAAiB,gCAAiC,CAACjgB,EAAQkgB,EAAShR,KAClE,MAAM,cAAEhF,EAAa,OAAEkL,GAAWlG,EAE5BhE,GAAYb,EAAAA,EAAAA,IAAsBrK,GAClCI,GAAOC,EAAAA,EAAAA,KAAWL,EAAQkK,GAC3B9J,GAAS8K,IAIdiK,EAAUjL,EAAe4B,KAAK0V,MAAMpM,EAASqM,EAAAA,KAAgC,MAExEZ,EAAAA,EAAAA,IAAQ,2BAA4B,CACvCC,KAAM5V,EACNkK,OAAQnS,OAAOmS,GACf8D,YAAa9Y,QAIjB6f,EAAAA,EAAAA,IAAiB,sBAAuBjK,MAAOhW,EAAQkgB,EAAShR,KAC9D,MAAM,cAAEhF,EAAa,MAAE6E,GAAUG,GAAW,CAAC,EACvChE,GAAYb,EAAAA,EAAAA,IAAsBrK,GAClCI,GAAOC,EAAAA,EAAAA,KAAWL,EAAQkK,GAAiBlK,EAAO+K,eACxD,IAAK3K,IAAS8K,EACZ,OAGF,MAAMyQ,OAAkBnb,IAAVuO,EAAsBuG,EAAgB,QAASlV,EAAKe,IAAM4N,EAEnE7E,EAGHiL,EAAUjL,EAAeyR,EAAQ,EAAI,SAF/B1E,EAAa,eAKf4J,EAAAA,EAAAA,IAAQ,2BAA4B,CACxCC,KAAM5V,EACNyQ,QACAzC,YAAa9Y,OAIjB6f,EAAAA,EAAAA,IAAiB,8BAA+BjK,MAAOhW,EAAQkgB,EAAShR,KACtE,MAAMhE,GAAYb,EAAAA,EAAAA,IAAsBrK,GAClCI,GAAOC,EAAAA,EAAAA,KAAWL,EAAQA,EAAO+K,eACvC,GAAK3K,GAAS8K,EAAd,CAKA,QADiC1K,IAAnB0O,GAASH,MAAsBG,GAASH,OAASuG,EAAgB,gBACpE,CACT,MAAM0K,QFkpBHhK,iBACL,GAAKtB,EAIL,IACE,MAAMX,QAAwCkC,EAAc,gBAE5D,IAAKlC,EACH,OAWF,OARAA,EAAO0B,YAAY,GAAGuF,QAAU,KAC1BtG,GAASA,EAAMc,cACVd,EAAMQ,UAAUR,EAAMc,MAAMqE,aACnCnE,EAAuBhB,EAAMc,MAC7Bb,YAIS,IAAI+K,QAAS3I,IACxB,MAAM,WAAEG,EAAU,YAAEyB,GAAgBmD,EAAqB,CAAC/H,GAASgD,GAAS,GAC5ErC,EAAQ,IACHA,EACHK,sBAAuBmC,EACvBrC,uBAAwB8D,IAG9B,CAAE,MAAOzR,GACP,MACF,CACF,CEjrByBwa,GACrB,IAAK1B,EACH,aAGIa,EAAAA,EAAAA,IAAQ,4BAA6B,CACzCC,KAAM5V,EACN8U,UAEJ,YACQ/I,EAAa,gBAAgB,SAC7B4J,EAAAA,EAAAA,IAAQ,6BAA8B,CAC1CC,KAAM5V,UAIJ2V,EAAAA,EAAAA,IAAQ,2BAA4B,CACxCC,KAAM5V,EACNyW,oBAAqBrM,EAAgB,gBACrC4D,YAAa9Y,GAvBf,KA2BF6f,EAAAA,EAAAA,IAAiB,2BAA4BjK,MAAOhW,EAAQkgB,EAAShR,KACnE,MAAM,MAAEsR,GAAQC,EAAAA,EAAAA,OAAsBvR,GAAW,CAAC,EAC5ChE,GAAYb,EAAAA,EAAAA,IAAsBrK,GACxC,IAAKkL,EAAW,OAEhB,GAAkC,cAA9BA,EAAUuN,gBAEZ,YADAyH,EAAQha,iBAAiB,CAAEmB,QAAS,gCAAiCmZ,UAIvE,MAAM3F,GAAe+G,EAAAA,EAAAA,MACfpK,GAAeqK,EAAAA,EAAAA,MAErB,IAAKhH,IAAiBrD,EACpB,OAGF,MAAM,cACJzM,GACE/K,EAEJ,IAAK+K,EAAe,OAEpB,MAAMiV,QFqoBD,SACLxK,EACAgC,EACAqD,EACA7F,GAEA,GAAIN,EACF,MAAMxH,MAAM,mBAGdsL,EAAsB,cAEtB,MAAMsC,EAAc,IAAIhH,YAuBxB,OAtBA+G,EAAalE,UAAYmE,GACzBgH,EAAAA,EAAAA,GAASjH,GAETnG,EAAQ,CACNM,WACA7K,aAAc,GACdqL,OACAO,SAAU,CAAC,EACXzC,QAASA,EAAQkE,GACjBtD,MAAOA,EAAM,CAAErR,MAAO,IAAKC,OAAQ,MAEnC8V,iBAAkBmJ,YAAYjJ,EAAmB,KACjD+B,eAEArD,eACAsD,cACAb,QAr2BgB,GAy2BlBhE,EAAc,SAEP,IAAIyJ,QAAS3I,IAClBrC,EAAQ,IACHA,KACAoH,EAAqB,CAACpH,EAAOpB,QAAUoB,EAAOR,OAAS6C,KAGhE,CE9qBuBiL,CAAcjX,EAAeyM,EAAcqD,EAAcqF,EAAQ+B,WAEhFC,QAAerB,EAAAA,EAAAA,IAAQ,gBAAiB,CAC5CC,KAAM5V,EACN8U,SACAmC,WAAYjX,EAAUiX,aAKxB,GAFAniB,GAAS+gB,EAAAA,EAAAA,OAEJmB,EAOH,OANAhC,EAAQha,iBAAiB,CAEvBmB,QAAS,4BACTmZ,eAEFN,EAAQxH,eAAe,CAAE8H,UAM3B,GAFAN,EAAQkC,gCAEJlX,EAAUhK,OAAQ,CACpBlB,GAAS+gB,EAAAA,EAAAA,MACT,MAAM7gB,GAAOoK,EAAAA,EAAAA,KAAWtK,EAAQkL,EAAUhK,QAC1C,IAAKhB,EAAM,aACLmiB,EAAAA,EAAAA,IAAariB,EAAQkgB,EAAShgB,EACtC,KAGF+f,EAAAA,EAAAA,IAAiB,2BAA4BjK,MAAOhW,EAAQkgB,KAC1D,MAAM,UAAEpV,GAAc9K,EAEtB,IAAK8K,EAAW,OAEhB,MAAM1K,GAAOyK,EAAAA,EAAAA,IAAoB7K,GAEjC,IAAKI,EAAM,OAEX,MAAMkiB,QAAiBzB,EAAAA,EAAAA,IAAQ,eAE/B,IAAKyB,EAAU,aAETzB,EAAAA,EAAAA,IAAQ,uBAAwB,EAAC,IAEvC,MAAM0B,QAAe1B,EAAAA,EAAAA,IAAQ,mBAAoB,CAACyB,UAE7BzB,EAAAA,EAAAA,IAAQ,cAAe,CAAEzgB,OAAMmiB,SAAQxP,QAASjI,EAAUiI,WAGzE,WAAYmN,GAASA,EAAQsC,OAAO,CAAEhC,OAAOC,EAAAA,EAAAA,WAIrDR,EAAAA,EAAAA,IAAiB,aAAcjK,UAC7B,MAAM,UAAElL,GAAc9K,EAEtB,IAAK8K,EAAW,OAEhB,MAAMwX,QAAiBzB,EAAAA,EAAAA,IAAQ,eAC/B,IAAKyB,EAAU,aAETzB,EAAAA,EAAAA,IAAQ,uBAAwB,EAAC,IAEvC,MAAM4B,QAAW5B,EAAAA,EAAAA,IAAQ,kBAAmB,CAACyB,UACvCzB,EAAAA,EAAAA,IAAQ,aAAc,CAAEC,KAAMhW,EAAW2X,UAGjDxC,EAAAA,EAAAA,IAAiB,oBAAqB,CAACjgB,EAAQkgB,EAAShR,KACtD,MAAM,UAAEpE,GAAc9K,EACtB,IAAK8K,EACH,OAGF,MAAMxH,EAAO6Y,KAAKuG,UAAUxT,GAE5B,WACE,MAAMyT,QAAoB9B,EAAAA,EAAAA,IAAQ,sBAAuB,CAACvd,IAErDqf,IAEL9B,EAAAA,EAAAA,IAAQ,oBAAqB,CAAEvd,KAAMqf,EAAa7B,KAAMhW,GACzD,EAND,MASFmV,EAAAA,EAAAA,IAAiB,uBAAwB,CAACjgB,EAAQkgB,EAAShR,KACzD,MAAM,MAAEsR,GAAQC,EAAAA,EAAAA,OAAsBvR,GAAW,CAAC,EAClD,OAAO0T,EAAAA,EAAAA,GAAe5iB,EAAQ,CAC5B6iB,qBAAiBriB,GAChBggB,MAGLP,EAAAA,EAAAA,IAAiB,gBAAiB,CAACjgB,EAAQkgB,EAAShR,KAClD,MAAM,OAAE4T,EAAM,QAAEC,EAAO,MAAEvC,GAAQC,EAAAA,EAAAA,OAAsBvR,GAEjD,gBAAE2T,IAAoBG,EAAAA,EAAAA,KAAehjB,EAAQwgB,GACnD,GAAKqC,EAML,OAFAhC,EAAAA,EAAAA,IAAQ,gBAAiB,CAAEC,KAAM+B,EAAiBC,SAAQC,aAEnDH,EAAAA,EAAAA,GAAe5iB,EAAQ,CAC5B6iB,qBAAiBriB,GAChBggB,MAGLP,EAAAA,EAAAA,IAAiB,SAAU,CAACjgB,EAAQkgB,EAAShR,KAC3C,MAAM,aAAEqR,EAAY,MAAEC,GAAQC,EAAAA,EAAAA,OAAsBvR,GAAW,CAAC,GAC1D,UAAEpE,GAAc9K,EAEtB,GAAK8K,EAAL,CAEA,GAAwB,cAApBA,EAAU4J,MAaZ,OAZAmM,EAAAA,EAAAA,IAAQ,yBACR9C,IAEA/d,EAAS,IACJA,EACH8K,eAAWtK,IAEbogB,EAAAA,EAAAA,IAAU5gB,GACVkgB,EAAQgB,qBAAqB,CAAEC,WAAO3gB,EAAWggB,eAEjDN,EAAQkB,cASV,IAJAP,EAAAA,EAAAA,IAAQ,yBACR9C,KACA8C,EAAAA,EAAAA,IAAQ,cAAe,CAAEC,KAAMhW,EAAWyV,iBAElB,eAApBzV,EAAU4J,MAUZ,OATA1U,EAAS,IACJA,EACH8K,eAAWtK,IAEbogB,EAAAA,EAAAA,IAAU5gB,GACVkgB,EAAQgB,qBAAqB,CAAEC,WAAO3gB,EAAWggB,eAEjDN,EAAQkB,cAKV6B,WAAW,KACTjjB,GAAS+gB,EAAAA,EAAAA,MACT/gB,EAAS,IACJA,EACH8K,eAAWtK,IAEbogB,EAAAA,EAAAA,IAAU5gB,GAEVkgB,EAAQgB,qBAAqB,CAAEC,WAAO3gB,EAAWggB,UACjDN,EAAQkB,eArVa,IAySS,I,yBCnU3B,MAAM8B,GAAa,IAAIC,YAAY,CACxC,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,KAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,KAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,KACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,KAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxF,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,GAAQ,KAAQ,GAAQ,KAAQ,GAAQ,KACxF,GAAQ,KAAQ,GAAQ,KAAQ,GAAQ,KAAQ,GAAQ,KAAQ,GAAQ,KAAQ,GAAQ,KACxF,GAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,KA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","sources":["webpack://telegram-t/./src/components/right/DeleteMemberModal.tsx","webpack://telegram-t/./src/components/common/FakeIcon.tsx","webpack://telegram-t/./src/util/resetScroll.ts","webpack://telegram-t/./src/lib/fastBlur.js","webpack://telegram-t/./src/components/common/VerifiedIcon.tsx","webpack://telegram-t/./src/components/common/FullNameTitle.tsx","webpack://telegram-t/./src/components/common/FullNameTitle.module.scss?6448","webpack://telegram-t/./src/components/common/IconWithSpinner.tsx","webpack://telegram-t/./src/components/common/IconWithSpinner.module.scss?fa87","webpack://telegram-t/./src/global/selectors/calls.ts","webpack://telegram-t/./src/lib/secret-sauce/utils.ts","webpack://telegram-t/./src/lib/secret-sauce/parseSdp.ts","webpack://telegram-t/./src/lib/secret-sauce/buildSdp.ts","webpack://telegram-t/./src/lib/secret-sauce/blacksilence.ts","webpack://telegram-t/./src/lib/secret-sauce/secretsauce.ts","webpack://telegram-t/./src/lib/secret-sauce/p2p.ts","webpack://telegram-t/./src/global/actions/api/calls.async.ts","webpack://telegram-t/./src/util/phoneCallEmojiConstants.ts","webpack://telegram-t/./src/global/actions/apiUpdaters/calls.async.ts","webpack://telegram-t/./src/components/calls/group/helpers/formatGroupCallVolume.ts","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantMenu.tsx","webpack://telegram-t/./src/hooks/useRunThrottled.ts","webpack://telegram-t/./src/components/calls/group/OutlinedMicrophoneIcon.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.module.scss?2375","webpack://telegram-t/./src/components/calls/group/GroupCallParticipant.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantList.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantList.module.scss?6462","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.module.scss?799e","webpack://telegram-t/./src/components/calls/group/GroupCallParticipantVideo.tsx","webpack://telegram-t/./src/util/vibrate.ts","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.module.scss?3a9a","webpack://telegram-t/./src/components/calls/group/MicrophoneButton.tsx","webpack://telegram-t/./src/components/calls/group/GroupCall.module.scss?4417","webpack://telegram-t/./src/components/calls/group/GroupCall.tsx","webpack://telegram-t/./src/components/calls/group/hooks/useGroupCallVideoLayout.ts","webpack://telegram-t/./src/components/calls/ActiveCallHeader.tsx","webpack://telegram-t/./src/components/calls/phone/PhoneCallButton.module.scss?9dea","webpack://telegram-t/./src/components/calls/phone/PhoneCallButton.tsx","webpack://telegram-t/./src/components/calls/phone/PhoneCall.module.scss?a250","webpack://telegram-t/./src/components/calls/phone/PhoneCall.tsx","webpack://telegram-t/./src/components/calls/phone/RatePhoneCallModal.module.scss?64f6","webpack://telegram-t/./src/components/calls/phone/RatePhoneCallModal.tsx","webpack://telegram-t/./src/bundles/calls.ts","webpack://telegram-t/./src/hooks/window/useFullscreen.ts","webpack://telegram-t/./src/components/common/gift/GiftEffectWrapper.tsx","webpack://telegram-t/./src/components/common/gift/GiftEffectWrapper.module.scss?3608","webpack://telegram-t/./src/hooks/useInfiniteScroll.ts"],"sourcesContent":["import type { FC } from '../../lib/teact/teact';\nimport { memo, useCallback } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { ApiChat } from '../../api/types';\n\nimport { getUserFirstOrLastName } from '../../global/helpers';\nimport { selectCurrentChat, selectUser } from '../../global/selectors';\nimport renderText from '../common/helpers/renderText';\n\nimport useOldLang from '../../hooks/useOldLang';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\nconst DeleteMemberModal: FC = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n}) => {\n const { deleteChatMember } = getActions();\n\n const lang = useOldLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId: userId! });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): Complete => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n)(DeleteMemberModal));\n","import { memo } from '../../lib/teact/teact';\n\nimport type { ApiFakeType } from '../../api/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport './FakeIcon.scss';\n\ntype OwnProps = {\n fakeType: ApiFakeType;\n};\n\nconst FakeIcon = ({\n fakeType,\n}: OwnProps) => {\n const lang = useLang();\n\n return (\n \n {lang(fakeType === 'fake' ? 'FakeMessage' : 'ScamMessage')}\n \n );\n};\n\nexport default memo(FakeIcon);\n","import { IS_IOS } from './browser/windowEnvironment';\nimport forceReflow from './forceReflow';\n\nconst resetScroll = (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n\nexport function stopScrollInertia(element: HTMLElement) {\n element.style.display = 'none';\n forceReflow(element);\n element.style.display = '';\n}\n\nexport default resetScroll;\n","/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line @stylistic/max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line @stylistic/max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import './VerifiedIcon.scss';\n\nconst VerifiedIcon = () => {\n return (\n \n \n \n \n );\n};\n\nexport default VerifiedIcon;\n","import type { FC } from '../../lib/teact/teact';\nimport type React from '../../lib/teact/teact';\nimport { memo, useMemo } from '../../lib/teact/teact';\nimport { getActions } from '../../global';\n\nimport type {\n ApiPeer,\n} from '../../api/types';\nimport type { ObserveFn } from '../../hooks/useIntersectionObserver';\nimport type { CustomPeer } from '../../types';\n\nimport { EMOJI_STATUS_LOOP_LIMIT } from '../../config';\nimport {\n getChatTitle,\n getUserFullName,\n isAnonymousForwardsChat,\n isChatWithRepliesBot,\n isChatWithVerificationCodesBot,\n} from '../../global/helpers';\nimport { isApiPeerUser } from '../../global/helpers/peers';\nimport buildClassName from '../../util/buildClassName';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport stopEvent from '../../util/stopEvent';\nimport renderText from './helpers/renderText';\n\nimport useLang from '../../hooks/useLang';\nimport useLastCallback from '../../hooks/useLastCallback';\nimport useOldLang from '../../hooks/useOldLang';\n\nimport Transition from '../ui/Transition';\nimport CustomEmoji from './CustomEmoji';\nimport FakeIcon from './FakeIcon';\nimport GiftEffectWrapper from './gift/GiftEffectWrapper';\nimport StarIcon from './icons/StarIcon';\nimport VerifiedIcon from './VerifiedIcon';\n\nimport styles from './FullNameTitle.module.scss';\n\ntype OwnProps = {\n peer: ApiPeer | CustomPeer;\n className?: string;\n style?: string;\n noVerified?: boolean;\n noFake?: boolean;\n withEmojiStatus?: boolean;\n emojiStatusSize?: number;\n isSavedMessages?: boolean;\n isSavedDialog?: boolean;\n isMonoforum?: boolean;\n monoforumBadgeClassName?: string;\n noLoopLimit?: boolean;\n canCopyTitle?: boolean;\n iconElement?: React.ReactNode;\n withStatusTextColor?: boolean;\n onEmojiStatusClick?: NoneToVoidFunction;\n observeIntersection?: ObserveFn;\n};\n\nconst FullNameTitle: FC = ({\n className,\n style,\n peer,\n noVerified,\n noFake,\n withEmojiStatus,\n emojiStatusSize,\n isSavedMessages,\n isSavedDialog,\n noLoopLimit,\n canCopyTitle,\n iconElement,\n isMonoforum,\n monoforumBadgeClassName,\n withStatusTextColor,\n onEmojiStatusClick,\n observeIntersection,\n}) => {\n const { showNotification } = getActions();\n\n const oldLang = useOldLang();\n const lang = useLang();\n\n const realPeer = 'id' in peer ? peer : undefined;\n const customPeer = 'isCustomPeer' in peer ? peer : undefined;\n const isUser = realPeer && isApiPeerUser(realPeer);\n const title = realPeer && (isUser ? getUserFullName(realPeer) : getChatTitle(oldLang, realPeer));\n const isPremium = (isUser && realPeer.isPremium) || customPeer?.isPremium;\n const canShowEmojiStatus = withEmojiStatus && !isSavedMessages;\n const emojiStatus = realPeer?.emojiStatus\n || (customPeer?.emojiStatusId ? { type: 'regular', documentId: customPeer.emojiStatusId } : undefined);\n\n const handleTitleClick = useLastCallback((e) => {\n if (!title || !canCopyTitle) {\n return;\n }\n\n stopEvent(e);\n copyTextToClipboard(title);\n showNotification({ message: `${isUser ? 'User' : 'Chat'} name was copied` });\n });\n\n const specialTitle = useMemo(() => {\n if (customPeer) {\n return renderText(customPeer.title || oldLang(customPeer.titleKey!));\n }\n\n if (isSavedMessages) {\n return oldLang(isSavedDialog ? 'MyNotes' : 'SavedMessages');\n }\n\n if (isAnonymousForwardsChat(realPeer!.id)) {\n return oldLang('AnonymousForward');\n }\n\n if (isChatWithRepliesBot(realPeer!.id)) {\n return oldLang('RepliesTitle');\n }\n\n if (isChatWithVerificationCodesBot(realPeer!.id)) {\n return oldLang('VerifyCodesNotifications');\n }\n\n return undefined;\n }, [customPeer, isSavedDialog, isSavedMessages, oldLang, realPeer]);\n const botVerificationIconId = realPeer?.botVerificationIconId;\n\n return (\n
\n {botVerificationIconId && (\n \n )}\n \n {specialTitle || renderText(title || '')}\n \n {!iconElement && peer && (\n <>\n {!noVerified && peer?.isVerified && }\n {!noFake && peer?.fakeType && }\n {canShowEmojiStatus && emojiStatus && (\n \n \n \n \n \n )}\n {canShowEmojiStatus && !emojiStatus && isPremium && }\n {isMonoforum && (\n
\n {lang('MonoforumBadge')}\n
\n )}\n \n )}\n {iconElement}\n
\n );\n};\n\nexport default memo(FullNameTitle);\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"QljEeKI5\",\"statusTransition\":\"KBZgFSv7\",\"fullName\":\"AS54Cntu\",\"canCopy\":\"vr53L_9p\",\"statusTransitionSlide\":\"xmVxyvNy\",\"monoforumBadge\":\"Sdwfc851\",\"statusPrimaryColor\":\"z1sLOAjr\"};","import { memo } from '../../lib/teact/teact';\n\nimport type { IconName } from '../../types/icons';\n\nimport Spinner from '../ui/Spinner';\nimport Transition from '../ui/Transition';\nimport Icon from './icons/Icon';\n\nimport styles from './IconWithSpinner.module.scss';\n\ntype OwnProps = {\n iconName: IconName;\n isLoading?: boolean;\n};\n\nconst IconWithSpinner = ({ iconName, isLoading }: OwnProps) => {\n return (\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(IconWithSpinner);\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"LLqNvbR9\",\"spinner\":\"PbV71feg\",\"icon\":\"sohV68PB\"};","import type { GlobalState } from '../types';\n\nimport { getMainUsername, isChatBasicGroup } from '../helpers';\nimport { selectChat, selectChatFullInfo } from './chats';\nimport { selectUser } from './users';\n\nexport function selectChatGroupCall(global: T, chatId: string) {\n const fullInfo = selectChatFullInfo(global, chatId);\n if (!fullInfo || !fullInfo.groupCallId) return undefined;\n\n return selectGroupCall(global, fullInfo.groupCallId);\n}\n\nexport function selectGroupCall(global: T, groupCallId: string) {\n return global.groupCalls.byId[groupCallId];\n}\n\nexport function selectGroupCallParticipant(\n global: T, groupCallId: string, participantId: string,\n) {\n return selectGroupCall(global, groupCallId)?.participants[participantId];\n}\n\nexport function selectIsAdminInActiveGroupCall(global: T): boolean {\n const chatId = selectActiveGroupCall(global)?.chatId;\n\n if (!chatId) return false;\n\n const chat = selectChat(global, chatId);\n if (!chat) return false;\n\n return (isChatBasicGroup(chat) && chat.isCreator) || Boolean(chat.adminRights?.manageCall);\n}\n\nexport function selectActiveGroupCall(global: T) {\n const { groupCalls: { activeGroupCallId } } = global;\n if (!activeGroupCallId) {\n return undefined;\n }\n\n return selectGroupCall(global, activeGroupCallId);\n}\n\nexport function selectPhoneCallUser(global: T) {\n const { phoneCall, currentUserId } = global;\n if (!phoneCall || !phoneCall.participantId || !phoneCall.adminId) {\n return undefined;\n }\n\n const id = phoneCall.adminId === currentUserId ? phoneCall.participantId : phoneCall.adminId;\n return selectUser(global, id);\n}\n\nexport function selectCanInviteToActiveGroupCall(global: T) {\n const groupCall = selectActiveGroupCall(global);\n\n if (!groupCall || !groupCall.chatId) {\n return false;\n }\n\n const chat = selectChat(global, groupCall.chatId);\n if (!chat) {\n return false;\n }\n\n const hasPublicUsername = Boolean(getMainUsername(chat));\n if (hasPublicUsername) {\n return true;\n }\n\n const inviteLink = selectChatFullInfo(global, chat.id)?.inviteLink;\n return Boolean(inviteLink);\n}\n","import type { P2PPayloadType } from './p2pMessage';\nimport type { PayloadType } from './types';\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n // eslint-disable-next-line no-bitwise\n return source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n // eslint-disable-next-line no-bitwise\n return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if (!array) return 0;\n\n const { length } = array;\n let total = 0;\n for (let i = 0; i < length; i++) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n\nexport function p2pPayloadTypeToConference(p: P2PPayloadType): PayloadType {\n return {\n id: p.id,\n name: p.name,\n 'rtcp-fbs': p.feedbackTypes,\n clockrate: p.clockrate,\n parameters: p.parameters,\n channels: p.channels,\n };\n}\n\nexport function isRelayAddress(candidate: string) {\n const parts = candidate.split(' ');\n return parts.some((part) => part === 'relay');\n}\n\nexport function removeRelatedAddress(candidate: string) {\n const parts = candidate.split(' ');\n\n const raddrIndex = parts.indexOf('raddr');\n if (raddrIndex !== -1) {\n parts.splice(raddrIndex, 2);\n }\n\n const rportIndex = parts.indexOf('rport');\n if (rportIndex !== -1) {\n parts.splice(rportIndex, 2);\n }\n\n return parts.join(' ');\n}\n\nexport const THRESHOLD = 0.1;\n\nexport const IS_SCREENSHARE_SUPPORTED = 'getDisplayMedia' in (navigator?.mediaDevices || {});\nexport const IS_ECHO_CANCELLATION_SUPPORTED = navigator?.mediaDevices?.getSupportedConstraints().echoCancellation;\n// @ts-ignore\nexport const IS_NOISE_SUPPRESSION_SUPPORTED = navigator?.mediaDevices?.getSupportedConstraints().noiseSuppression;\n","import { toTelegramSource } from './utils';\nimport type { JoinGroupCallPayload, SsrcGroup } from './types';\n\nexport default (sessionDescription: RTCSessionDescriptionInit, isP2p = false): JoinGroupCallPayload => {\n if (!sessionDescription || !sessionDescription.sdp) {\n throw Error('Failed parsing SDP: session description is null');\n }\n\n const sections = sessionDescription\n .sdp\n .split('\\r\\nm=')\n .map((s, i) => (i === 0 ? s : `m=${s}`))\n .reduce((acc: Record, el) => {\n const name = el.match(/^m=(.+?)\\s/)?.[1] || 'header';\n acc[acc.hasOwnProperty(name) && name === 'video' ? 'screencast' : name] = el.split('\\r\\n').filter(Boolean);\n return acc;\n }, {});\n\n const lookup = (prefix: string, sectionName?: string) => {\n if (!sectionName) {\n return Object.values(sections).map((section) => {\n return section.find((line) => line.startsWith(prefix))?.substr(prefix.length);\n }).filter(Boolean)[0];\n } else {\n return sections[sectionName]?.find((line) => line.startsWith(prefix))?.substr(prefix.length);\n }\n };\n\n const parseExtmaps = (sectionName: string) => {\n return sections[sectionName].filter((l) => l.startsWith('a=extmap')).map((l) => {\n const [, id, uri] = l.match(/extmap:(\\d+)(?:\\/.+)?\\s(.+)/)!;\n return { id: Number(id), uri };\n });\n };\n\n const parsePayloadTypes = (sectionName: string) => {\n const payloads = sections[sectionName].filter((l) => l.startsWith('a=rtpmap')).map((l) => {\n const [, id, data] = l.match(/:(\\d+)\\s(.+)/) || [];\n const [name, clockrate, channels] = data.split('/');\n return {\n id: Number(id), name, clockrate: Number(clockrate), ...(channels && { channels: Number(channels) }),\n };\n });\n\n const fbParams = sections[sectionName].filter((l) => l.startsWith('a=rtcp-fb')).map((l) => {\n const [, id, data] = l.match(/:(\\d+)\\s(.+)/) || [];\n const [type, subtype] = data.split(' ');\n return { id: Number(id), type, subtype: subtype || '' };\n });\n\n const parameters = sections[sectionName].filter((l) => l.startsWith('a=fmtp')).map((l) => {\n const [, id, data] = l.match(/:(\\d+)\\s(.+)/) || [];\n const d = data?.split(';').reduce((acc: Record, q) => {\n const [name, value] = q.split('=');\n acc[name] = value;\n return acc;\n }, {});\n if (!d || Object.values(d).some((z) => !z)) return undefined;\n return { id: Number(id), data: d };\n }).filter(Boolean);\n\n return payloads.map((payload) => {\n const p = parameters.filter((l) => l!.id === payload.id).map((q) => q!.data).reduce((acc, el) => {\n return Object.assign(acc, el);\n }, {});\n const f = fbParams.filter((l) => l.id === payload.id).map((l) => {\n return {\n type: l.type,\n subtype: l.subtype,\n };\n });\n\n return {\n ...payload,\n ...(Object.keys(p).length > 0 && { parameters: p }),\n ...(f.length > 0 && { feedbackTypes: f }),\n };\n });\n };\n\n const rawSource = lookup('a=ssrc:', 'audio');\n const sourceAudio = rawSource && Number(rawSource.split(' ')[0]);\n\n // TODO multiple source groups\n const rawSourceVideo = lookup('a=ssrc-group:', 'video')?.split(' ') || undefined;\n const rawSourceScreencast = lookup('a=ssrc-group:', 'screencast')?.split(' ') || undefined;\n\n if (!rawSourceVideo) {\n throw Error('Failed parsing SDP: no video ssrc');\n }\n\n const [hash, fingerprint] = lookup('a=fingerprint:')?.split(' ') || [];\n\n const setup = lookup('a=setup:');\n if (!hash || !fingerprint) {\n throw Error('Failed parsing SDP: no fingerprint');\n }\n\n console.log(sections);\n\n const ufrag = lookup('a=ice-ufrag:');\n const pwd = lookup('a=ice-pwd:');\n\n if (!ufrag || !pwd) {\n throw Error('Failed parsing SDP: no ICE ufrag or pwd');\n }\n\n return {\n fingerprints: [\n {\n fingerprint,\n hash,\n setup: isP2p ? setup! : 'active',\n },\n ],\n pwd,\n ufrag,\n ...(sourceAudio && { ssrc: toTelegramSource(sourceAudio) }),\n ...(rawSourceVideo && {\n 'ssrc-groups': [\n {\n semantics: rawSourceVideo[0],\n sources: rawSourceVideo.slice(1, rawSourceVideo.length).map(Number).map(toTelegramSource),\n },\n (isP2p && rawSourceScreencast && {\n semantics: rawSourceScreencast[0],\n sources: rawSourceScreencast.slice(1, rawSourceScreencast.length).map(Number).map(toTelegramSource),\n }),\n ].filter(Boolean) as SsrcGroup[],\n }),\n ...(isP2p && {\n audioExtmap: parseExtmaps('audio'),\n videoExtmap: parseExtmaps('video'),\n screencastExtmap: parseExtmaps('screencast'),\n audioPayloadTypes: parsePayloadTypes('audio'),\n videoPayloadTypes: parsePayloadTypes('video'),\n screencastPayloadTypes: parsePayloadTypes('screencast'),\n }),\n };\n};\n","import type {\n Candidate, GroupCallTransport, PayloadType, RTPExtension, SsrcGroup,\n} from './types';\nimport { fromTelegramSource } from './utils';\n\nexport type Conference = {\n sessionId: number;\n audioExtensions: RTPExtension[];\n videoExtensions: RTPExtension[];\n audioPayloadTypes: PayloadType[];\n videoPayloadTypes: PayloadType[];\n ssrcs: Ssrc[];\n transport: GroupCallTransport;\n};\n\nexport type Ssrc = {\n userId: string;\n endpoint: string;\n mid: string;\n isMain: boolean;\n isRemoved?: boolean;\n isVideo: boolean;\n isPresentation?: boolean;\n sourceGroups: SsrcGroup[];\n};\n\nexport default (conference: Conference, isAnswer = false, isPresentation = false, isP2p = false) => {\n const lines: string[] = [];\n\n const add = (value: string) => {\n lines.push(value);\n };\n\n const {\n sessionId,\n ssrcs,\n audioExtensions,\n videoExtensions,\n audioPayloadTypes,\n videoPayloadTypes,\n transport: {\n ufrag,\n pwd,\n fingerprints,\n candidates,\n },\n } = conference;\n\n // Header\n add('v=0'); // version\n add(`o=- ${sessionId} 2 IN IP4 0.0.0.0`); // sessionId, 2=sessionVersion\n add('s=-'); // name of the session\n add('t=0 0'); // time when session is valid\n add('a=ice-options:trickle');\n add('a=msid-semantic:WMS *');\n add(`a=group:BUNDLE ${ssrcs.map((ssrc) => ssrc.mid).join(' ')}${isPresentation ? '' : ` ${isP2p ? '3' : '2'}`}`);\n // ice-lite: is a minimal version of the ICE specification, intended only for servers running on a public IP address\n if (!isP2p) add('a=ice-lite');\n\n const addCandidate = (c: Candidate) => {\n if (c.sdpString) {\n add(`a=${c.sdpString}`);\n } else {\n let str = '';\n str += 'a=candidate:';\n str += `${c.foundation} ${c.component} ${c.protocol} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`;\n if ('rel-addr' in c) {\n str += ` raddr ${c['rel-addr']} rport ${c['rel-port']}`;\n }\n str += ` generation ${c.generation}`;\n add(str);\n }\n };\n\n const addTransport = () => {\n add(`a=ice-ufrag:${ufrag}`);\n add(`a=ice-pwd:${pwd}`);\n fingerprints.forEach((fingerprint) => {\n add(`a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`);\n add(`a=setup:${isP2p ? (fingerprint.setup) : 'passive'}`);\n });\n\n candidates.forEach(addCandidate);\n };\n\n const addPayloadType = (payloadType: PayloadType) => {\n const {\n channels, id, name, clockrate, parameters,\n } = payloadType;\n\n const channelsString = channels ? `/${channels}` : '';\n add(`a=rtpmap:${id} ${name}/${clockrate}${channelsString}`);\n\n if (parameters) {\n const parametersString = Object.keys(parameters).map((key) => {\n return `${key}=${parameters![key]};`;\n }).join(' ');\n\n add(`a=fmtp:${id} ${parametersString}`);\n }\n\n payloadType['rtcp-fbs']?.forEach((fbParam) => {\n add(`a=rtcp-fb:${id} ${fbParam.type}${fbParam.subtype ? ` ${fbParam.subtype}` : ''}`);\n });\n };\n\n const addSsrcEntry = (entry: Ssrc) => {\n const payloadTypes = entry.isVideo ? videoPayloadTypes : audioPayloadTypes;\n\n const type = entry.isVideo ? 'video' : 'audio';\n add(`m=${type} ${entry.isMain ? 1 : 0} RTP/SAVPF ${payloadTypes.map((l) => l.id).join(' ')}`);\n add('c=IN IP4 0.0.0.0');\n add('b=AS:1300'); // 1300000 / 1000\n add(`a=mid:${entry.mid}`);\n add('a=rtcp-mux');\n payloadTypes.forEach(addPayloadType);\n\n add('a=rtcp:1 IN IP4 0.0.0.0');\n if (entry.isVideo) {\n add('a=rtcp-rsize');\n }\n\n (entry.isVideo ? videoExtensions : audioExtensions).forEach(({ id, uri }) => {\n add(`a=extmap:${id} ${uri}`);\n });\n\n if (entry.isRemoved) {\n add('a=inactive');\n return;\n }\n\n addTransport();\n\n if (isP2p) {\n add('a=sendrecv');\n add('a=bundle-only');\n } else {\n if (isAnswer) {\n add('a=recvonly');\n return;\n }\n if (entry.isMain) {\n add('a=sendrecv');\n } else {\n add('a=sendonly');\n add('a=bundle-only');\n }\n }\n\n entry.sourceGroups.forEach((sourceGroup) => {\n if (sourceGroup.semantics) {\n add(`a=ssrc-group:${sourceGroup.semantics} ${sourceGroup.sources.map(fromTelegramSource).join(' ')}`);\n }\n sourceGroup.sources.forEach((ssrcTelegram) => {\n const ssrc = fromTelegramSource(ssrcTelegram);\n add(`a=ssrc:${ssrc} cname:${entry.endpoint}`);\n add(`a=ssrc:${ssrc} msid:${entry.endpoint} ${entry.endpoint}`);\n add(`a=ssrc:${ssrc} mslabel:${entry.endpoint}`);\n add(`a=ssrc:${ssrc} label:${entry.endpoint}`);\n });\n });\n };\n\n if (!isP2p) {\n ssrcs.filter((ssrc) => ssrc.mid === '0' || ssrc.mid === '1').map(addSsrcEntry);\n } else {\n ssrcs.filter(addSsrcEntry);\n }\n\n if (!isPresentation) {\n add('m=application 1 UDP/DTLS/SCTP webrtc-datachannel');\n add('c=IN IP4 0.0.0.0');\n addTransport();\n add('a=ice-options:trickle');\n add(`a=mid:${isP2p ? '3' : (isPresentation ? '1' : '2')}`);\n add('a=sctp-port:5000');\n add('a=max-message-size:262144');\n }\n\n if (!isP2p) {\n ssrcs.filter((ssrc) => ssrc.mid !== '0' && ssrc.mid !== '1').map(addSsrcEntry);\n }\n\n return `${lines.join('\\n')}\\n`;\n};\n","// https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/\n\nexport const silence = (ctx: AudioContext) => {\n const oscillator = ctx.createOscillator();\n const dst = oscillator.connect(ctx.createMediaStreamDestination());\n oscillator.start();\n return new MediaStream([Object.assign((dst as any).stream.getAudioTracks()[0], { enabled: false })]);\n};\n\nexport const black = ({ width = 640, height = 480 } = {}) => {\n const canvas = Object.assign(document.createElement('canvas'), { width, height });\n const ctx = canvas.getContext('2d');\n if (!ctx) throw Error('Cannot create canvas ctx');\n\n ctx.fillRect(0, 0, width, height);\n const stream = canvas.captureStream();\n return new MediaStream([Object.assign(stream.getVideoTracks()[0], { enabled: false })]);\n};\n","import parseSdp from './parseSdp';\nimport { ColibriClass } from './colibriClass';\nimport type {\n GroupCallConnectionData, GroupCallConnectionState, GroupCallParticipant, JoinGroupCallPayload,\n} from './types';\nimport buildSdp, { Conference, Ssrc } from './buildSdp';\nimport { black, silence } from './blacksilence';\nimport {\n getAmplitude,\n IS_ECHO_CANCELLATION_SUPPORTED,\n IS_NOISE_SUPPRESSION_SUPPORTED,\n THRESHOLD,\n} from './utils';\nimport Deferred from \"../../util/Deferred\";\nimport safePlay from \"../../util/safePlay\";\n\nexport type StreamType = 'audio' | 'video' | 'presentation';\nconst DEFAULT_MID = 3;\ntype GroupCallState = {\n connection?: RTCPeerConnection;\n screenshareConnection?: RTCPeerConnection;\n dataChannel?: RTCDataChannel;\n screenshareDataChannel?: RTCDataChannel;\n participants?: GroupCallParticipant[];\n conference?: Partial;\n screenshareConference?: Partial;\n streams?: Record;\n participantFunctions?: Record void;\n toggleMute?: (muted: boolean) => void;\n getCurrentAmplitude?: () => number;\n }>;\n onUpdate?: (...args: any[]) => void;\n myId?: string;\n black?: MediaStream;\n silence?: MediaStream;\n updatingParticipantsQueue?: any[];\n facingMode?: VideoFacingModeEnum;\n isSpeakerDisabled?: boolean;\n analyserInterval?: number;\n speaking?: Record;\n audioElement?: HTMLAudioElement;\n destination?: MediaStreamAudioDestinationNode;\n audioContext?: AudioContext;\n mediaStream?: MediaStream;\n lastMid: number;\n audioStream?: MediaStream;\n audioSource?: MediaStreamAudioSourceNode;\n audioAnalyser?: AnalyserNode;\n};\n\nlet state: GroupCallState | undefined;\n\nexport async function getDevices(streamType: StreamType, isInput = true) {\n return (await navigator.mediaDevices.enumerateDevices())\n .filter((l) => l.kind === `${streamType}${isInput ? 'input' : 'output'}`);\n}\n\nexport function toggleSpeaker() {\n if (!state) {\n return;\n }\n\n state.isSpeakerDisabled = !state.isSpeakerDisabled;\n state?.onUpdate?.({\n '@type': 'updateGroupCallConnectionState',\n connectionState: 'connected',\n isSpeakerDisabled: state.isSpeakerDisabled,\n });\n if (state.participantFunctions) {\n Object.values(state.participantFunctions).forEach((l) => {\n l.toggleMute?.(!!state?.isSpeakerDisabled);\n });\n }\n}\n\nfunction leavePresentation(isFromToggle?: boolean) {\n if (!state) {\n return;\n }\n state.screenshareDataChannel?.close();\n state.screenshareConnection?.close();\n\n if (!isFromToggle) {\n state.onUpdate?.({\n '@type': 'updateGroupCallLeavePresentation',\n });\n }\n}\n\nexport function toggleNoiseSuppression() {\n if (!state || !state.myId || !state.streams) {\n return;\n }\n\n const audioStream = state.streams[state.myId].audio;\n if (!audioStream) {\n return;\n }\n\n const track = audioStream.getTracks()[0];\n\n if (!track) {\n return;\n }\n\n // @ts-ignore\n const { echoCancellation, noiseSuppression } = track.getConstraints();\n\n track.applyConstraints({\n echoCancellation: !echoCancellation,\n // @ts-ignore\n noiseSuppression: !noiseSuppression,\n });\n}\n\nexport function getUserStreams(userId: string) {\n return state?.streams?.[userId];\n}\n\nexport function setVolume(userId: string, volume: number) {\n const participantFunctions = state?.participantFunctions?.[userId];\n if (!participantFunctions) return;\n participantFunctions.setVolume?.(volume);\n}\n\nexport function isStreamEnabled(streamType: StreamType, userId?: string) {\n const id = userId || state?.myId;\n const stream = id && getUserStreams(id)?.[streamType];\n if (!stream) return false;\n\n return stream.getTracks()[0]?.enabled;\n}\n\nfunction updateGroupCallStreams(userId: string) {\n state?.onUpdate?.({\n '@type': 'updateGroupCallStreams',\n userId,\n hasAudioStream: isStreamEnabled('audio', userId),\n hasVideoStream: isStreamEnabled('video', userId),\n hasPresentationStream: isStreamEnabled('presentation', userId),\n amplitude: state.speaking?.[userId],\n });\n}\n\nasync function getUserStream(streamType: StreamType, facing: VideoFacingModeEnum = 'user') {\n if (streamType === 'audio' && state?.audioStream) {\n return state.audioStream;\n }\n\n if (streamType === 'presentation') {\n return (navigator.mediaDevices as any).getDisplayMedia({\n audio: false,\n video: true,\n });\n }\n\n const media = await navigator.mediaDevices.getUserMedia({\n audio: streamType === 'audio' ? {\n // @ts-ignore\n ...(IS_ECHO_CANCELLATION_SUPPORTED && {echoCancellation: true}),\n ...(IS_NOISE_SUPPRESSION_SUPPORTED && {noiseSuppression: true}),\n } : false,\n video: streamType === 'video' ? {\n facingMode: facing,\n } : false,\n });\n\n if (state && streamType === 'audio') {\n state.audioStream = media;\n }\n\n if (streamType === 'video') {\n const vid = document.createElement('video');\n vid.srcObject = media;\n\n const deferred = new Deferred();\n vid.oncanplay = () => deferred.resolve();\n await deferred.promise;\n }\n\n return media;\n}\n\nexport async function switchCameraInput() {\n if (!state?.myId || !state.connection || !state.streams || !state.facingMode) {\n return;\n }\n\n const stream = getUserStreams(state.myId)?.video;\n\n if (!stream) return;\n\n const track = stream.getTracks()[0];\n\n if (!track) {\n return;\n }\n\n const sender = state.connection.getSenders().find((l) => track.id === l.track?.id);\n\n if (!sender) {\n return;\n }\n\n state.facingMode = state.facingMode === 'environment' ? 'user' : 'environment';\n try {\n const newStream = await getUserStream('video', state.facingMode);\n\n await sender.replaceTrack(newStream.getTracks()[0]);\n state.streams[state.myId].video = newStream;\n } catch (e) {\n\n }\n}\n\nexport async function toggleStream(streamType: StreamType, value: boolean | undefined = undefined) {\n if (!state || !state.myId || !state.connection || !state.streams) {\n return;\n }\n\n const stream = getUserStreams(state.myId)?.[streamType];\n if (!stream) return;\n\n const track = stream.getTracks()[0];\n\n if (!track) {\n return;\n }\n\n const sender = [\n ...state.connection.getSenders(),\n ...(state.screenshareConnection?.getSenders() || []),\n ].find((l) => track.id === l.track?.id);\n\n if (!sender) {\n return;\n }\n\n value = value === undefined ? !track.enabled : value;\n\n try {\n if (value && !track.enabled) {\n const newStream = await getUserStream(streamType);\n await sender.replaceTrack(newStream.getTracks()[0]);\n state.streams[state.myId][streamType] = newStream;\n if (streamType === 'video') {\n state.facingMode = 'user';\n } else if (streamType === 'audio') {\n const { audioContext } = state;\n if (!audioContext) return;\n const source = state.audioSource || audioContext.createMediaStreamSource(newStream);\n\n const analyser = state.audioAnalyser || audioContext.createAnalyser();\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n source.connect(analyser);\n\n state = {\n ...state,\n audioSource: source,\n audioAnalyser: analyser,\n participantFunctions: {\n ...state.participantFunctions,\n [state.myId]: {\n ...state.participantFunctions?.[state.myId],\n getCurrentAmplitude: () => {\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n return getAmplitude(array, 1.5);\n },\n },\n },\n };\n }\n } else if (!value && track.enabled) {\n const newStream = streamType === 'audio' ? state.silence : state.black;\n if (!newStream) return;\n\n await sender.replaceTrack(newStream.getTracks()[0]);\n state.streams[state.myId][streamType] = newStream;\n if (streamType === 'video') {\n state.facingMode = undefined;\n }\n\n if(streamType !== 'audio') {\n // We only want to stop video streams\n track.stop();\n } else {\n state.audioSource?.disconnect();\n state.audioAnalyser?.disconnect();\n }\n }\n updateGroupCallStreams(state.myId!);\n if (streamType === 'presentation' && !value) leavePresentation(true);\n } catch (e) {\n\n }\n}\n\nfunction updateConnectionState(connectionState: GroupCallConnectionState) {\n state?.onUpdate?.({\n '@type': 'updateGroupCallConnectionState',\n connectionState,\n });\n}\n\nexport function leaveGroupCall() {\n if (!state) {\n return;\n }\n\n if (state.myId && state.streams?.[state.myId]) {\n Object.values(state.streams[state.myId] || {}).forEach((stream) => {\n stream?.getTracks().forEach((track) => {\n track.stop();\n });\n });\n }\n\n state.audioStream?.getTracks().forEach((track) => {\n track.stop();\n });\n leavePresentation(true);\n state.dataChannel?.close();\n state.connection?.close();\n updateConnectionState('disconnected');\n\n if (state.analyserInterval) {\n clearInterval(state.analyserInterval);\n }\n\n state = undefined;\n}\n\nfunction analyzeAmplitudes() {\n if (!state || !state.participantFunctions) return;\n\n Object.keys(state.participantFunctions).forEach((id) => {\n const { getCurrentAmplitude } = state!.participantFunctions![Number(id)];\n\n if (getCurrentAmplitude) {\n const amplitude = getCurrentAmplitude();\n const prevAmplitude = state!.speaking![id] || 0;\n state!.speaking![id] = amplitude;\n if ((amplitude > THRESHOLD && prevAmplitude <= THRESHOLD)\n || (amplitude <= THRESHOLD && prevAmplitude > THRESHOLD)) {\n updateGroupCallStreams(id);\n }\n }\n });\n}\n\nfunction createDataChannel(connection: RTCPeerConnection) {\n const dataChannel = connection.createDataChannel('data', {\n id: 0,\n });\n\n dataChannel.onopen = () => {\n // console.log('Data channel open!');\n };\n\n dataChannel.onmessage = (e) => {\n // console.log('onmessage');\n const data = JSON.parse(e.data) as ColibriClass;\n // console.log(data);\n switch (data.colibriClass) {\n case 'DominantSpeakerEndpointChangeEvent':\n break;\n case 'SenderVideoConstraints':\n\n break;\n case 'EndpointConnectivityStatusChangeEvent':\n\n break;\n }\n };\n\n dataChannel.onerror = (e) => {\n console.log('%conerror', 'background: green; font-size: 5em');\n console.error(e);\n };\n\n return dataChannel;\n}\n\nexport async function handleUpdateGroupCallParticipants(updatedParticipants: GroupCallParticipant[]) {\n if (!state) {\n return;\n }\n\n const {\n participants, conference, connection, myId,\n } = state;\n\n if (!participants || !conference || !connection || !conference.ssrcs || !conference.transport || !myId) {\n return;\n }\n\n // Joined from another client\n if (updatedParticipants.find((participant) => {\n return participant.isSelf\n && participant.source\n !== state?.conference?.ssrcs?.find((l) => l.isMain && !l.isVideo)?.sourceGroups[0].sources[0];\n })) {\n leaveGroupCall();\n return;\n }\n\n const newEndpoints: string[] = [];\n updatedParticipants.forEach((participant) => {\n if (participant.isSelf) {\n if (participant.isMuted && !participant.canSelfUnmute) {\n // Muted by admin\n toggleStream('audio', false);\n toggleStream('video', false);\n toggleStream('presentation', false);\n }\n return;\n }\n\n const { isLeft } = participant;\n const isAudioLeft = participant.isMuted || participant.isMutedByMe;\n const isVideoLeft = !participant.isVideoJoined || !participant.video || isLeft;\n const isPresentationLeft = !participant.presentation || isLeft;\n\n let hasVideo = false;\n let hasAudio = false;\n let hasPresentation = false;\n\n conference.ssrcs!.filter((l) => l.userId === participant.id).forEach((ssrc) => {\n if (!ssrc.isVideo) {\n if (ssrc.sourceGroups[0].sources[0] === participant.source) {\n hasAudio = true;\n }\n // console.log('has audio, removed=', isAudioLeft);\n ssrc.isRemoved = isAudioLeft;\n }\n\n if (ssrc.isVideo) {\n if (!ssrc.isPresentation) {\n if (!!participant.video && ssrc.endpoint === participant.video.endpoint) {\n hasVideo = true;\n }\n // console.log('has video = ', hasVideo, ' removed=', isVideoLeft);\n ssrc.isRemoved = isVideoLeft;\n }\n\n if (ssrc.isPresentation) {\n if (!!participant.presentation && ssrc.endpoint === participant.presentation.endpoint) {\n hasPresentation = true;\n }\n // console.log('has presentation, removed=', isPresentationLeft);\n ssrc.isRemoved = isPresentationLeft;\n }\n }\n });\n\n if (!isAudioLeft && !hasAudio) {\n // console.log('add audio');\n state!.lastMid = state!.lastMid + 1;\n conference.ssrcs!.push({\n userId: participant.id,\n isMain: false,\n endpoint: `audio${participant.source}`,\n isVideo: false,\n sourceGroups: [{\n sources: [participant.source],\n }],\n mid: state!.lastMid.toString()\n });\n }\n\n if (!isVideoLeft && !hasVideo && participant.video) {\n // console.log('add video', participant.video);\n state!.lastMid = state!.lastMid + 1;\n\n newEndpoints.push(participant.video.endpoint);\n conference.ssrcs!.push({\n userId: participant.id,\n isMain: false,\n endpoint: participant.video.endpoint,\n isVideo: true,\n sourceGroups: participant.video.sourceGroups,\n mid: state!.lastMid.toString()\n });\n }\n\n if (!isPresentationLeft && !hasPresentation && participant.presentation) {\n // console.log('add presentation');\n state!.lastMid = state!.lastMid + 1;\n conference.ssrcs!.push({\n isPresentation: true,\n userId: participant.id,\n isMain: false,\n endpoint: participant.presentation.endpoint,\n isVideo: true,\n sourceGroups: participant.presentation.sourceGroups,\n mid: state!.lastMid.toString()\n });\n }\n });\n\n if (state.updatingParticipantsQueue) {\n state.updatingParticipantsQueue.push(conference);\n return;\n } else {\n state.updatingParticipantsQueue = [];\n }\n\n const sdp = buildSdp(conference as Conference);\n await connection.setRemoteDescription({\n type: 'offer',\n sdp,\n });\n\n try {\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n\n updateGroupCallStreams(myId);\n if (state.updatingParticipantsQueue.length > 0) {\n // eslint-disable-next-line no-restricted-syntax\n for (const newConference of state.updatingParticipantsQueue) {\n await connection.setRemoteDescription({\n type: 'offer',\n sdp: buildSdp(newConference as Conference),\n });\n const answerNew = await connection.createAnswer();\n await connection.setLocalDescription(answerNew);\n updateGroupCallStreams(myId);\n\n // if (newEndpoints.length > 0) {\n // sendDataChannelMessage({\n // colibriClass: 'ReceiverVideoConstraints',\n // defaultConstraints: {\n // maxHeight: 0,\n // },\n // constraints: {\n // ...(newEndpoints.reduce((acc: Record, el) => {\n // acc[el] = {\n // minHeight: 0,\n // maxHeight: 1080,\n // };\n // return acc;\n // }, {})),\n // },\n // onStageEndpoints: [],\n // });\n // }\n }\n }\n state.updatingParticipantsQueue = undefined;\n } catch (e) {\n console.error(e);\n }\n}\n//\n// function sendDataChannelMessage(message: ColibriClass) {\n// if (!state || !state.dataChannel || state.dataChannel.readyState !== 'open') {\n// return;\n// }\n//\n// // console.log('SEND!', message);\n// state.dataChannel.send(JSON.stringify(message));\n// }\n\nexport async function handleUpdateGroupCallConnection(data: GroupCallConnectionData, isPresentation: boolean) {\n if (!state) {\n return;\n }\n\n const conference = isPresentation ? state.screenshareConference : state.conference;\n const connection = isPresentation ? state.screenshareConnection : state.connection;\n\n if (!conference || !connection || !conference.ssrcs) {\n return;\n }\n\n const sessionId = Date.now();\n const newConference = {\n ...conference,\n transport: data.transport,\n sessionId,\n audioExtensions: data.audio?.['rtp-hdrexts'],\n audioPayloadTypes: data.audio?.['payload-types'],\n videoExtensions: data.video?.['rtp-hdrexts'],\n videoPayloadTypes: data.video?.['payload-types'],\n } as Conference;\n\n state = {\n ...state,\n ...(!isPresentation ? { conference: newConference } : { screenshareConference: newConference }),\n };\n\n try {\n await connection.setRemoteDescription({\n type: 'answer',\n sdp: buildSdp(newConference, true, isPresentation),\n });\n\n // state.resolveTest();\n // state.test = true;\n } catch (e) {\n console.error(e);\n }\n}\n\nfunction handleTrack(e: RTCTrackEvent) {\n if (!state || !state.audioElement || !state.audioContext || !state.mediaStream) {\n return;\n }\n const ssrc = state.conference?.ssrcs?.find((l) => l.endpoint === e.track.id);\n if (!ssrc || !ssrc.userId) {\n return;\n }\n\n const { userId, isPresentation } = ssrc;\n const participant = state.participants?.find((p) => p.id === userId);\n\n const streamType = (e.track.kind === 'video' ? (isPresentation ? 'presentation' : 'video') : 'audio') as StreamType;\n\n e.track.onended = () => {\n delete state?.streams?.[userId][streamType];\n updateGroupCallStreams(userId);\n };\n\n const stream = e.streams[0];\n\n if (e.track.kind === 'audio') {\n const { mediaStream } = state;\n const audioContext = new (window.AudioContext)();\n const source = audioContext.createMediaStreamSource(stream);\n\n const gainNode = audioContext.createGain();\n gainNode.gain.value = (participant?.volume || 10000) / 10000;\n\n const muteNode = audioContext.createGain();\n gainNode.gain.value = 1;\n\n const analyser = audioContext.createAnalyser();\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n source.connect(analyser).connect(muteNode).connect(gainNode).connect(audioContext.destination);\n\n mediaStream!.addTrack(source.mediaStream.getAudioTracks()[0]);\n\n // https://stackoverflow.com/questions/41784137/webrtc-doesnt-work-with-audiocontext#comment117600018_41784241\n const test = new Audio();\n test.srcObject = stream;\n // test.srcObject = source.mediaStream;\n test.muted = true;\n test.remove();\n\n state = {\n ...state,\n participantFunctions: {\n ...state.participantFunctions,\n [userId]: {\n ...state.participantFunctions?.[userId],\n setVolume: (volume: number) => {\n gainNode.gain.value = volume > 1 ? volume * 2 : volume;\n },\n toggleMute: (muted?: boolean) => {\n muteNode.gain.value = muted ? 0 : 1;\n },\n getCurrentAmplitude: () => {\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n return getAmplitude(array, 1.5);\n },\n },\n },\n };\n }\n\n state = {\n ...state,\n streams: {\n ...state.streams,\n [userId]: {\n ...state.streams?.[userId],\n [streamType]: stream,\n },\n },\n };\n\n updateGroupCallStreams(userId);\n}\n\nfunction initializeConnection(\n streams: MediaStream[],\n resolve: (payload: JoinGroupCallPayload) => void,\n isPresentation = false,\n) {\n const connection = new RTCPeerConnection();\n\n const dataChannel = isPresentation ? undefined : createDataChannel(connection);\n\n streams.forEach((stream) => stream.getTracks().forEach((track) => {\n connection.addTrack(track, stream);\n }));\n\n if (!isPresentation) {\n connection.oniceconnectionstatechange = () => {\n const connectionState = connection.iceConnectionState;\n console.log('iceconnectionstatechange', connectionState);\n if (connectionState === 'connected' || connectionState === 'completed') {\n updateConnectionState('connected');\n } else if (connectionState === 'checking' || connectionState === 'new') {\n updateConnectionState('connecting');\n } else if (connection.iceConnectionState === 'disconnected') {\n updateConnectionState('reconnecting');\n }\n };\n }\n connection.onconnectionstatechange = () => {\n console.log('connectionstatechange', connection.connectionState);\n }\n connection.ontrack = handleTrack;\n connection.onnegotiationneeded = async () => {\n if (!state) return;\n\n console.log('onnegotiationneeded');\n\n const { myId } = state;\n\n if (!myId) {\n return;\n }\n const offer = await connection.createOffer({\n offerToReceiveVideo: true,\n offerToReceiveAudio: !isPresentation,\n });\n console.log('offer created');\n\n await connection.setLocalDescription(offer);\n console.log('local desc set');\n\n if (!offer.sdp) {\n return;\n }\n\n const sdp = parseSdp(offer);\n const audioSsrc: Ssrc | undefined = !isPresentation ? {\n userId: '',\n sourceGroups: [\n {\n sources: [sdp.ssrc || 0],\n },\n ],\n isRemoved: isPresentation,\n isMain: true,\n isVideo: false,\n isPresentation,\n endpoint: isPresentation ? '1' : '0',\n mid: isPresentation ? '1' : '0'\n } : undefined;\n\n const videoSsrc: Ssrc | undefined = sdp['ssrc-groups'] && {\n isPresentation,\n userId: '',\n sourceGroups: sdp['ssrc-groups'],\n isMain: true,\n isVideo: true,\n endpoint: isPresentation ? '0' : '1',\n mid: isPresentation ? '0' : '1'\n };\n\n const conference = isPresentation ? state.screenshareConference : state.conference;\n\n const ssrcs: Ssrc[] = [];\n if (isPresentation) {\n if (videoSsrc) ssrcs.push(videoSsrc);\n if (audioSsrc) ssrcs.push(audioSsrc);\n } else {\n if (audioSsrc) ssrcs.push(audioSsrc);\n if (videoSsrc) ssrcs.push(videoSsrc);\n }\n\n const audioStream = streams.find((l) => l.getTracks()[0].kind === 'audio');\n const videoStream = streams.find((l) => l.getTracks()[0].kind === 'video');\n\n state = {\n ...state,\n ...(!isPresentation ? {\n conference: {\n ...conference,\n ssrcs,\n },\n } : {\n screenshareConference: {\n ...conference,\n ssrcs,\n },\n }),\n streams: {\n ...state.streams,\n [myId]: {\n ...state.streams?.[myId],\n ...(audioStream && { audio: audioStream }),\n ...(!isPresentation && videoStream ? { video: videoStream } : { presentation: videoStream }),\n },\n },\n };\n\n updateGroupCallStreams(myId);\n\n resolve(sdp);\n };\n\n return { connection, dataChannel };\n}\n\nexport async function startSharingScreen(): Promise {\n if (!state) {\n return undefined;\n }\n\n try {\n const stream: MediaStream | undefined = await getUserStream('presentation');\n\n if (!stream) {\n return undefined;\n }\n\n stream.getTracks()[0].onended = () => {\n if (state && state.myId) {\n delete state.streams?.[state.myId].presentation;\n updateGroupCallStreams(state.myId);\n leavePresentation();\n }\n };\n\n return await new Promise((resolve) => {\n const { connection, dataChannel } = initializeConnection([stream], resolve, true);\n state = {\n ...state!,\n screenshareConnection: connection,\n screenshareDataChannel: dataChannel,\n };\n });\n } catch (e) {\n return undefined;\n }\n}\n\nexport function joinGroupCall(\n myId: string,\n audioContext: AudioContext,\n audioElement: HTMLAudioElement,\n onUpdate: (...args: any[]) => void,\n): Promise {\n if (state) {\n throw Error('Already in call');\n }\n\n updateConnectionState('connecting');\n\n const mediaStream = new MediaStream();\n audioElement.srcObject = mediaStream;\n safePlay(audioElement);\n\n state = {\n onUpdate,\n participants: [],\n myId,\n speaking: {},\n silence: silence(audioContext),\n black: black({ width: 640, height: 480 }),\n // @ts-ignore\n analyserInterval: setInterval(analyzeAmplitudes, 1000),\n audioElement,\n // destination,\n audioContext,\n mediaStream,\n lastMid: DEFAULT_MID,\n };\n\n // Prepare microphone\n getUserStream('audio');\n\n return new Promise((resolve) => {\n state = {\n ...state!,\n ...initializeConnection([state!.silence!, state!.black!], resolve),\n };\n });\n}\n","import { black, silence } from './blacksilence';\nimport type { ApiPhoneCallConnection, P2pParsedSdp } from './types';\nimport parseSdp from './parseSdp';\nimport type { MediaContent, MediaStateMessage, P2pMessage } from './p2pMessage';\nimport {\n fromTelegramSource,\n IS_ECHO_CANCELLATION_SUPPORTED,\n IS_NOISE_SUPPRESSION_SUPPORTED, \n p2pPayloadTypeToConference,\n} from './utils';\nimport buildSdp, { Conference } from './buildSdp';\nimport { StreamType } from './secretsauce';\n\ntype P2pState = {\n connection: RTCPeerConnection;\n dataChannel: RTCDataChannel;\n emitSignalingData: (data: P2pMessage) => void;\n onUpdate: (...args: any[]) => void;\n conference?: Partial;\n isOutgoing: boolean;\n pendingCandidates: string[];\n streams: {\n video?: MediaStream;\n audio?: MediaStream;\n presentation?: MediaStream;\n ownAudio?: MediaStream;\n ownVideo?: MediaStream;\n ownPresentation?: MediaStream;\n };\n silence: MediaStream;\n blackVideo: MediaStream;\n blackPresentation: MediaStream;\n mediaState: Omit;\n audio: HTMLAudioElement;\n gotInitialSetup?: boolean;\n facingMode?: VideoFacingModeEnum;\n};\n\nlet state: P2pState | undefined;\n\nconst ICE_CANDIDATE_POOL_SIZE = 10;\n\nexport function getStreams() {\n return state?.streams;\n}\n\nfunction updateStreams() {\n state?.onUpdate({\n ...state.mediaState,\n '@type': 'updatePhoneCallMediaState',\n });\n}\n\nfunction getUserStream(streamType: StreamType, facing: VideoFacingModeEnum = 'user') {\n if (streamType === 'presentation') {\n return (navigator.mediaDevices as any).getDisplayMedia({\n audio: false,\n video: true,\n });\n }\n\n return navigator.mediaDevices.getUserMedia({\n audio: streamType === 'audio' ? {\n ...(IS_ECHO_CANCELLATION_SUPPORTED && { echoCancellation: true }),\n ...(IS_NOISE_SUPPRESSION_SUPPORTED && { noiseSuppression: true }),\n } : false,\n video: streamType === 'video' ? {\n facingMode: facing,\n } : false,\n });\n}\n\nexport async function switchCameraInputP2p() {\n if (!state || !state.facingMode) {\n return;\n }\n\n const stream = state.streams.ownVideo;\n\n if (!stream) return;\n\n const track = stream.getTracks()[0];\n\n if (!track) {\n return;\n }\n\n const sender = state.connection.getSenders().find((l) => track.id === l.track?.id);\n\n if (!sender) {\n return;\n }\n\n state.facingMode = state.facingMode === 'environment' ? 'user' : 'environment';\n try {\n const newStream = await getUserStream('video', state.facingMode);\n\n await sender.replaceTrack(newStream.getTracks()[0]);\n state.streams.ownVideo = newStream;\n updateStreams();\n } catch (e) {\n\n }\n}\n\nexport async function toggleStreamP2p(streamType: StreamType, value: boolean | undefined = undefined) {\n if (!state) return;\n const stream = streamType === 'audio' ? state.streams.ownAudio\n : (streamType === 'video' ? state.streams.ownVideo : state.streams.ownPresentation);\n\n if (!stream) return;\n const track = stream.getTracks()[0];\n\n if (!track) {\n return;\n }\n\n const sender = state.connection.getSenders().find((l) => track.id === l.track?.id);\n\n if (!sender) {\n return;\n }\n\n value = value === undefined ? !track.enabled : value;\n\n try {\n if (value && !track.enabled) {\n const newStream = await getUserStream(streamType);\n newStream.getTracks()[0].onended = () => {\n toggleStreamP2p(streamType, false);\n };\n await sender.replaceTrack(newStream.getTracks()[0]);\n if (streamType === 'audio') {\n state.streams.ownAudio = newStream;\n } else if (streamType === 'video') {\n state.streams.ownVideo = newStream;\n state.facingMode = 'user';\n } else {\n state.streams.ownPresentation = newStream;\n }\n if (streamType === 'video' || streamType === 'presentation') {\n toggleStreamP2p(streamType === 'video' ? 'presentation' : 'video', false);\n }\n // if (streamType === 'video') {\n // state.facingMode = 'user';\n // }\n } else if (!value && track.enabled) {\n track.stop();\n const newStream = streamType === 'audio' ? state.silence\n : (streamType === 'video' ? state.blackVideo : state.blackPresentation);\n if (!newStream) return;\n\n await sender.replaceTrack(newStream.getTracks()[0]);\n\n if (streamType === 'audio') {\n state.streams.ownAudio = newStream;\n } else if (streamType === 'video') {\n state.streams.ownVideo = newStream;\n } else {\n state.streams.ownPresentation = newStream;\n }\n // if (streamType === 'video') {\n // state.facingMode = undefined;\n // }\n }\n updateStreams();\n sendMediaState();\n } catch (err) {\n console.error(err)\n }\n}\n\nexport async function joinPhoneCall(\n connections: ApiPhoneCallConnection[],\n emitSignalingData: (data: P2pMessage) => void,\n isOutgoing: boolean,\n shouldStartVideo: boolean,\n isP2p: boolean,\n onUpdate: (...args: any[]) => void,\n) {\n const conn = new RTCPeerConnection({\n iceServers: connections.map((connection) => (\n {\n urls: [\n connection.isTurn && `turn:${connection.ip}:${connection.port}`,\n connection.isStun && `stun:${connection.ip}:${connection.port}`,\n ].filter(Boolean),\n username: connection.username,\n credentialType: 'password',\n credential: connection.password,\n }\n )),\n iceTransportPolicy: isP2p ? 'all' : 'relay',\n bundlePolicy: 'max-bundle',\n iceCandidatePoolSize: ICE_CANDIDATE_POOL_SIZE,\n });\n\n conn.onicecandidate = (e) => {\n if (!e.candidate) {\n return;\n };\n emitSignalingData({\n '@type': 'Candidates',\n candidates: [{\n sdpString: e.candidate.candidate,\n }],\n });\n };\n\n conn.onconnectionstatechange = () => {\n onUpdate({\n '@type': 'updatePhoneCallConnectionState',\n connectionState: conn.connectionState,\n });\n };\n\n conn.ontrack = (e) => {\n if (!state) return;\n\n const stream = e.streams[0];\n if (e.track.kind === 'audio') {\n state.audio.srcObject = stream;\n state.audio.play().catch();\n state.streams.audio = stream;\n } else if (e.transceiver.mid === '1') {\n state.streams.video = stream;\n } else {\n state.streams.presentation = stream;\n }\n\n updateStreams();\n };\n\n conn.oniceconnectionstatechange = async (e) => {\n switch(conn.iceConnectionState) {\n case 'disconnected':\n case 'failed':\n if (isOutgoing) {\n await createOffer(conn, {\n offerToReceiveAudio: true,\n offerToReceiveVideo: true,\n iceRestart: true,\n });\n }\n default:\n break;\n }\n }\n\n const slnc = silence(new AudioContext());\n const video = black({ width: 640, height: 480 });\n const screenshare = black({ width: 640, height: 480 });\n conn.addTrack(slnc.getTracks()[0], slnc);\n conn.addTrack(video.getTracks()[0], video);\n conn.addTrack(screenshare.getTracks()[0], screenshare);\n\n const dc = conn.createDataChannel('data', {\n id: 0,\n negotiated: true,\n });\n\n dc.onmessage = (e) => {\n processSignalingMessage(JSON.parse(e.data));\n };\n\n const audio = new Audio();\n\n state = {\n audio,\n connection: conn,\n emitSignalingData,\n isOutgoing,\n pendingCandidates: [],\n onUpdate,\n streams: {\n ownVideo: video,\n ownAudio: slnc,\n ownPresentation: screenshare,\n },\n mediaState: {\n isBatteryLow: false,\n screencastState: 'inactive',\n videoState: 'inactive',\n videoRotation: 0,\n isMuted: true,\n },\n blackVideo: video,\n blackPresentation: screenshare,\n silence: slnc,\n dataChannel: dc,\n };\n\n try {\n toggleStreamP2p('audio', true);\n } catch (err) {\n console.error(err)\n }\n\n if (isOutgoing) {\n await createOffer(conn, {\n offerToReceiveAudio: true,\n offerToReceiveVideo: true,\n })\n }\n}\n\nexport function stopPhoneCall() {\n if (!state) return;\n\n state.streams.ownVideo?.getTracks().forEach((track) => track.stop());\n state.streams.ownPresentation?.getTracks().forEach((track) => track.stop());\n state.streams.ownAudio?.getTracks().forEach((track) => track.stop());\n state.dataChannel.close();\n state.connection.close();\n state = undefined;\n}\n\nfunction sendMediaState() {\n if (!state) return;\n const { emitSignalingData, streams } = state;\n\n emitSignalingData({\n '@type': 'MediaState',\n videoRotation: 0,\n isMuted: !streams.ownAudio?.getTracks()[0].enabled,\n isBatteryLow: true,\n videoState: streams.ownVideo?.getTracks()[0].enabled ? 'active' : 'inactive',\n screencastState: streams.ownPresentation?.getTracks()[0].enabled ? 'active' : 'inactive',\n });\n}\n\nfunction filterVP8(mediaContent: MediaContent) {\n if (!state || state.isOutgoing) return mediaContent;\n\n const { payloadTypes } = mediaContent!;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => Number(payloadType.parameters?.apt) === vp8PayloadType.id);\n mediaContent.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n\n return mediaContent;\n}\n\nfunction sendInitialSetup(sdp: P2pParsedSdp) {\n if (!state) return;\n const { emitSignalingData } = state;\n\n if (!sdp.ssrc || !sdp['ssrc-groups'] || !sdp['ssrc-groups'][0] || !sdp['ssrc-groups'][1]) return;\n\n emitSignalingData({\n '@type': 'InitialSetup',\n fingerprints: sdp.fingerprints,\n ufrag: sdp.ufrag,\n pwd: sdp.pwd,\n audio: {\n ssrc: fromTelegramSource(sdp.ssrc).toString(),\n ssrcGroups: [],\n payloadTypes: sdp.audioPayloadTypes,\n rtpExtensions: sdp.audioExtmap,\n },\n video: filterVP8({\n ssrc: fromTelegramSource(sdp['ssrc-groups'][0].sources[0]).toString(),\n ssrcGroups: [{\n semantics: sdp['ssrc-groups'][0].semantics,\n ssrcs: sdp['ssrc-groups'][0].sources.map(fromTelegramSource),\n }],\n payloadTypes: sdp.videoPayloadTypes,\n rtpExtensions: sdp.videoExtmap,\n }),\n screencast: filterVP8({\n ssrc: fromTelegramSource(sdp['ssrc-groups'][1].sources[0]).toString(),\n ssrcGroups: [{\n semantics: sdp['ssrc-groups'][1].semantics,\n ssrcs: sdp['ssrc-groups'][1].sources.map(fromTelegramSource),\n }],\n payloadTypes: sdp.screencastPayloadTypes,\n rtpExtensions: sdp.screencastExtmap,\n }),\n });\n}\n\nexport async function processSignalingMessage(message: P2pMessage) {\n if (!state || !state.connection) return;\n\n switch (message['@type']) {\n case 'MediaState': {\n state.mediaState = message;\n updateStreams();\n sendMediaState();\n break;\n }\n case 'Candidates': {\n const { pendingCandidates, gotInitialSetup } = state;\n message.candidates.forEach((candidate) => {\n pendingCandidates.push(candidate.sdpString);\n });\n if (gotInitialSetup) {\n await commitPendingIceCandidates();\n }\n break;\n }\n case 'InitialSetup': {\n const {\n connection, isOutgoing,\n } = state;\n if (!connection) return;\n\n const newConference = {\n transport: {\n candidates: [],\n ufrag: message.ufrag,\n pwd: message.pwd,\n fingerprints: message.fingerprints,\n 'rtcp-mux': false,\n xmlns: '',\n },\n sessionId: Date.now(),\n ssrcs: [\n message.audio && {\n isVideo: false,\n isMain: false,\n userId: '123',\n endpoint: '0',\n mid: '0',\n sourceGroups: [{\n sources: [message.audio.ssrc],\n }],\n },\n message.video && {\n isVideo: true,\n isPresentation: false,\n isMain: false,\n userId: '123',\n endpoint: '1',\n mid: '1',\n sourceGroups: message.video.ssrcGroups.map((l) => ({\n semantics: l.semantics,\n sources: l.ssrcs,\n })),\n },\n message.screencast && {\n isVideo: true,\n isPresentation: true,\n isMain: false,\n userId: '123',\n endpoint: '2',\n mid: '2',\n sourceGroups: message.screencast.ssrcGroups.map((l) => ({\n semantics: l.semantics,\n sources: l.ssrcs,\n })),\n },\n ],\n audioPayloadTypes: message.audio!.payloadTypes?.map(p2pPayloadTypeToConference) || [],\n audioExtensions: message.audio!.rtpExtensions,\n videoPayloadTypes: filterVP8(message.video!).payloadTypes?.map(p2pPayloadTypeToConference) || [],\n videoExtensions: message.video!.rtpExtensions,\n } as Conference;\n\n await connection.setRemoteDescription({\n sdp: buildSdp(newConference, isOutgoing, undefined, true),\n type: isOutgoing ? 'answer' : 'offer',\n });\n\n state.conference = newConference;\n\n if (!isOutgoing) {\n const answer = await connection.createAnswer();\n await connection.setLocalDescription(answer);\n sendInitialSetup(parseSdp(connection.localDescription!, true) as P2pParsedSdp);\n }\n state.gotInitialSetup = true;\n await commitPendingIceCandidates();\n break;\n }\n }\n}\n\nasync function commitPendingIceCandidates() {\n if (!state) {\n return;\n }\n const { pendingCandidates, connection } = state;\n if (!pendingCandidates.length) {\n return;\n }\n await Promise.all(pendingCandidates.map((c) => tryAddCandidate(connection, c)));\n state.pendingCandidates = [];\n}\n\nasync function tryAddCandidate(connection: RTCPeerConnection, candidate: string) {\n try {\n await connection.addIceCandidate({\n candidate,\n sdpMLineIndex: 0,\n })\n } catch (err) {\n console.error(err);\n }\n}\n\nasync function createOffer(conn: RTCPeerConnection, params: RTCOfferOptions) {\n const offer = await conn.createOffer(params);\n await conn.setLocalDescription(offer);\n sendInitialSetup(parseSdp(conn.localDescription!, true) as P2pParsedSdp);\n}\n","import type { ActionReturnType } from '../../types';\n\nimport { GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\nimport {\n isStreamEnabled,\n joinGroupCall,\n leaveGroupCall,\n setVolume, startSharingScreen,\n stopPhoneCall,\n toggleStream,\n} from '../../../lib/secret-sauce';\nimport { getCurrentTabId } from '../../../util/establishMultitabRole';\nimport { callApi } from '../../../api/gramjs';\nimport { addActionHandler, getGlobal, setGlobal } from '../../index';\nimport {\n removeGroupCall,\n updateActiveGroupCall,\n} from '../../reducers/calls';\nimport { updateTabState } from '../../reducers/tabs';\nimport { selectChat, selectTabState, selectUser } from '../../selectors';\nimport {\n selectActiveGroupCall, selectPhoneCallUser,\n} from '../../selectors/calls';\nimport { getGroupCallAudioContext, getGroupCallAudioElement, removeGroupCallAudioElement } from '../ui/calls';\nimport { loadFullChat } from './chats';\n\nconst HANG_UP_UI_DELAY = 500;\n\naddActionHandler('leaveGroupCall', async (global, actions, payload): Promise => {\n const {\n isFromLibrary, shouldDiscard, shouldRemove, rejoin,\n isPageUnload, tabId = getCurrentTabId(),\n } = payload || {};\n\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n global = updateActiveGroupCall(global, { connectionState: 'disconnected' }, groupCall.participantsCount - 1);\n global = {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n activeGroupCallId: undefined,\n },\n };\n setGlobal(global);\n\n await callApi('leaveGroupCall', {\n call: groupCall, isPageUnload,\n });\n await callApi('abortRequestGroup', 'call');\n\n if (shouldDiscard) {\n await callApi('discardGroupCall', {\n call: groupCall,\n });\n }\n\n global = getGlobal();\n if (shouldRemove) {\n global = removeGroupCall(global, groupCall.id);\n }\n\n removeGroupCallAudioElement();\n\n setGlobal(global);\n\n actions.toggleGroupCallPanel({ force: undefined, tabId });\n\n if (!isFromLibrary) {\n leaveGroupCall();\n }\n\n actions.afterHangUp();\n\n if (rejoin) {\n actions.requestMasterAndJoinGroupCall({\n ...rejoin,\n tabId,\n });\n }\n});\n\naddActionHandler('toggleGroupCallVideo', async (global): Promise => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n await toggleStream('video');\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n videoStopped: !isStreamEnabled('video'),\n participant: user,\n });\n});\n\naddActionHandler('requestToSpeak', (global, actions, payload): ActionReturnType => {\n const { value } = payload || { value: true };\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n raiseHand: value,\n participant: user,\n });\n});\n\naddActionHandler('setGroupCallParticipantVolume', (global, actions, payload): ActionReturnType => {\n const { participantId, volume } = payload;\n\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId);\n if (!user || !groupCall) {\n return;\n }\n\n setVolume(participantId, Math.floor(volume / GROUP_CALL_VOLUME_MULTIPLIER) / 100);\n\n void callApi('editGroupCallParticipant', {\n call: groupCall,\n volume: Number(volume),\n participant: user,\n });\n});\n\naddActionHandler('toggleGroupCallMute', async (global, actions, payload): Promise => {\n const { participantId, value } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, participantId || global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n const muted = value === undefined ? isStreamEnabled('audio', user.id) : value;\n\n if (!participantId) {\n await toggleStream('audio');\n } else {\n setVolume(participantId, muted ? 0 : 1);\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n muted,\n participant: user,\n });\n});\n\naddActionHandler('toggleGroupCallPresentation', async (global, actions, payload): Promise => {\n const groupCall = selectActiveGroupCall(global);\n const user = selectUser(global, global.currentUserId!);\n if (!user || !groupCall) {\n return;\n }\n\n const value = payload?.value !== undefined ? payload?.value : !isStreamEnabled('presentation');\n if (value) {\n const params = await startSharingScreen();\n if (!params) {\n return;\n }\n\n await callApi('joinGroupCallPresentation', {\n call: groupCall,\n params,\n });\n } else {\n await toggleStream('presentation', false);\n await callApi('leaveGroupCallPresentation', {\n call: groupCall,\n });\n }\n\n await callApi('editGroupCallParticipant', {\n call: groupCall,\n presentationPaused: !isStreamEnabled('presentation'),\n participant: user,\n });\n});\n\naddActionHandler('connectToActiveGroupCall', async (global, actions, payload): Promise => {\n const { tabId = getCurrentTabId() } = payload || {};\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) return;\n\n if (groupCall.connectionState === 'discarded') {\n actions.showNotification({ message: 'This voice chat is not active', tabId });\n return;\n }\n\n const audioElement = getGroupCallAudioElement();\n const audioContext = getGroupCallAudioContext();\n\n if (!audioElement || !audioContext) {\n return;\n }\n\n const {\n currentUserId,\n } = global;\n\n if (!currentUserId) return;\n\n const params = await joinGroupCall(currentUserId, audioContext, audioElement, actions.apiUpdate);\n\n const result = await callApi('joinGroupCall', {\n call: groupCall,\n params,\n inviteHash: groupCall.inviteHash,\n });\n\n global = getGlobal();\n\n if (!result) {\n actions.showNotification({\n // TODO[lang] Localize error message\n message: 'Failed to join voice chat',\n tabId,\n });\n actions.leaveGroupCall({ tabId });\n return;\n }\n\n actions.loadMoreGroupCallParticipants();\n\n if (groupCall.chatId) {\n global = getGlobal();\n const chat = selectChat(global, groupCall.chatId);\n if (!chat) return;\n await loadFullChat(global, actions, chat);\n }\n});\n\naddActionHandler('connectToActivePhoneCall', async (global, actions): Promise => {\n const { phoneCall } = global;\n\n if (!phoneCall) return;\n\n const user = selectPhoneCallUser(global);\n\n if (!user) return;\n\n const dhConfig = await callApi('getDhConfig');\n\n if (!dhConfig) return;\n\n await callApi('createPhoneCallState', [true]);\n\n const gAHash = await callApi('requestPhoneCall', [dhConfig]);\n\n const result = await callApi('requestCall', { user, gAHash, isVideo: phoneCall.isVideo });\n\n if (!result) {\n if ('hangUp' in actions) actions.hangUp({ tabId: getCurrentTabId() });\n }\n});\n\naddActionHandler('acceptCall', async (global): Promise => {\n const { phoneCall } = global;\n\n if (!phoneCall) return;\n\n const dhConfig = await callApi('getDhConfig');\n if (!dhConfig) return;\n\n await callApi('createPhoneCallState', [false]);\n\n const gB = await callApi('acceptPhoneCall', [dhConfig]);\n await callApi('acceptCall', { call: phoneCall, gB });\n});\n\naddActionHandler('sendSignalingData', (global, actions, payload): ActionReturnType => {\n const { phoneCall } = global;\n if (!phoneCall) {\n return;\n }\n\n const data = JSON.stringify(payload);\n\n (async () => {\n const encodedData = await callApi('encodePhoneCallData', [data]);\n\n if (!encodedData) return;\n\n callApi('sendSignalingData', { data: encodedData, call: phoneCall });\n })();\n});\n\naddActionHandler('closeCallRatingModal', (global, actions, payload): ActionReturnType => {\n const { tabId = getCurrentTabId() } = payload || {};\n return updateTabState(global, {\n ratingPhoneCall: undefined,\n }, tabId);\n});\n\naddActionHandler('setCallRating', (global, actions, payload): ActionReturnType => {\n const { rating, comment, tabId = getCurrentTabId() } = payload;\n\n const { ratingPhoneCall } = selectTabState(global, tabId);\n if (!ratingPhoneCall) {\n return undefined;\n }\n\n callApi('setCallRating', { call: ratingPhoneCall, rating, comment });\n\n return updateTabState(global, {\n ratingPhoneCall: undefined,\n }, tabId);\n});\n\naddActionHandler('hangUp', (global, actions, payload): ActionReturnType => {\n const { isPageUnload, tabId = getCurrentTabId() } = payload || {};\n const { phoneCall } = global;\n\n if (!phoneCall) return undefined;\n\n if (phoneCall.state === 'discarded') {\n callApi('destroyPhoneCallState');\n stopPhoneCall();\n\n global = {\n ...global,\n phoneCall: undefined,\n };\n setGlobal(global);\n actions.toggleGroupCallPanel({ force: undefined, tabId });\n\n actions.afterHangUp();\n\n return undefined;\n }\n\n callApi('destroyPhoneCallState');\n stopPhoneCall();\n callApi('discardCall', { call: phoneCall, isPageUnload });\n\n if (phoneCall.state === 'requesting') {\n global = {\n ...global,\n phoneCall: undefined,\n };\n setGlobal(global);\n actions.toggleGroupCallPanel({ force: undefined, tabId });\n\n actions.afterHangUp();\n\n return undefined;\n }\n\n setTimeout(() => {\n global = getGlobal();\n global = {\n ...global,\n phoneCall: undefined,\n };\n setGlobal(global);\n\n actions.toggleGroupCallPanel({ force: undefined, tabId });\n actions.afterHangUp();\n }, HANG_UP_UI_DELAY);\n\n return undefined;\n});\n","export const EMOJI_DATA = new Uint16Array([\n 0xd83d, 0xde09, 0xd83d, 0xde0d, 0xd83d, 0xde1b, 0xd83d, 0xde2d, 0xd83d, 0xde31, 0xd83d, 0xde21,\n 0xd83d, 0xde0e, 0xd83d, 0xde34, 0xd83d, 0xde35, 0xd83d, 0xde08, 0xd83d, 0xde2c, 0xd83d, 0xde07,\n 0xd83d, 0xde0f, 0xd83d, 0xdc6e, 0xd83d, 0xdc77, 0xd83d, 0xdc82, 0xd83d, 0xdc76, 0xd83d, 0xdc68,\n 0xd83d, 0xdc69, 0xd83d, 0xdc74, 0xd83d, 0xdc75, 0xd83d, 0xde3b, 0xd83d, 0xde3d, 0xd83d, 0xde40,\n 0xd83d, 0xdc7a, 0xd83d, 0xde48, 0xd83d, 0xde49, 0xd83d, 0xde4a, 0xd83d, 0xdc80, 0xd83d, 0xdc7d,\n 0xd83d, 0xdca9, 0xd83d, 0xdd25, 0xd83d, 0xdca5, 0xd83d, 0xdca4, 0xd83d, 0xdc42, 0xd83d, 0xdc40,\n 0xd83d, 0xdc43, 0xd83d, 0xdc45, 0xd83d, 0xdc44, 0xd83d, 0xdc4d, 0xd83d, 0xdc4e, 0xd83d, 0xdc4c,\n 0xd83d, 0xdc4a, 0x270c, 0x270b, 0xd83d, 0xdc50, 0xd83d, 0xdc46, 0xd83d, 0xdc47, 0xd83d, 0xdc49,\n 0xd83d, 0xdc48, 0xd83d, 0xde4f, 0xd83d, 0xdc4f, 0xd83d, 0xdcaa, 0xd83d, 0xdeb6, 0xd83c, 0xdfc3,\n 0xd83d, 0xdc83, 0xd83d, 0xdc6b, 0xd83d, 0xdc6a, 0xd83d, 0xdc6c, 0xd83d, 0xdc6d, 0xd83d, 0xdc85,\n 0xd83c, 0xdfa9, 0xd83d, 0xdc51, 0xd83d, 0xdc52, 0xd83d, 0xdc5f, 0xd83d, 0xdc5e, 0xd83d, 0xdc60,\n 0xd83d, 0xdc55, 0xd83d, 0xdc57, 0xd83d, 0xdc56, 0xd83d, 0xdc59, 0xd83d, 0xdc5c, 0xd83d, 0xdc53,\n 0xd83c, 0xdf80, 0xd83d, 0xdc84, 0xd83d, 0xdc9b, 0xd83d, 0xdc99, 0xd83d, 0xdc9c, 0xd83d, 0xdc9a,\n 0xd83d, 0xdc8d, 0xd83d, 0xdc8e, 0xd83d, 0xdc36, 0xd83d, 0xdc3a, 0xd83d, 0xdc31, 0xd83d, 0xdc2d,\n 0xd83d, 0xdc39, 0xd83d, 0xdc30, 0xd83d, 0xdc38, 0xd83d, 0xdc2f, 0xd83d, 0xdc28, 0xd83d, 0xdc3b,\n 0xd83d, 0xdc37, 0xd83d, 0xdc2e, 0xd83d, 0xdc17, 0xd83d, 0xdc34, 0xd83d, 0xdc11, 0xd83d, 0xdc18,\n 0xd83d, 0xdc3c, 0xd83d, 0xdc27, 0xd83d, 0xdc25, 0xd83d, 0xdc14, 0xd83d, 0xdc0d, 0xd83d, 0xdc22,\n 0xd83d, 0xdc1b, 0xd83d, 0xdc1d, 0xd83d, 0xdc1c, 0xd83d, 0xdc1e, 0xd83d, 0xdc0c, 0xd83d, 0xdc19,\n 0xd83d, 0xdc1a, 0xd83d, 0xdc1f, 0xd83d, 0xdc2c, 0xd83d, 0xdc0b, 0xd83d, 0xdc10, 0xd83d, 0xdc0a,\n 0xd83d, 0xdc2b, 0xd83c, 0xdf40, 0xd83c, 0xdf39, 0xd83c, 0xdf3b, 0xd83c, 0xdf41, 0xd83c, 0xdf3e,\n 0xd83c, 0xdf44, 0xd83c, 0xdf35, 0xd83c, 0xdf34, 0xd83c, 0xdf33, 0xd83c, 0xdf1e, 0xd83c, 0xdf1a,\n 0xd83c, 0xdf19, 0xd83c, 0xdf0e, 0xd83c, 0xdf0b, 0x26a1, 0x2614, 0x2744, 0x26c4, 0xd83c, 0xdf00,\n 0xd83c, 0xdf08, 0xd83c, 0xdf0a, 0xd83c, 0xdf93, 0xd83c, 0xdf86, 0xd83c, 0xdf83, 0xd83d, 0xdc7b,\n 0xd83c, 0xdf85, 0xd83c, 0xdf84, 0xd83c, 0xdf81, 0xd83c, 0xdf88, 0xd83d, 0xdd2e, 0xd83c, 0xdfa5,\n 0xd83d, 0xdcf7, 0xd83d, 0xdcbf, 0xd83d, 0xdcbb, 0x260e, 0xd83d, 0xdce1, 0xd83d, 0xdcfa, 0xd83d,\n 0xdcfb, 0xd83d, 0xdd09, 0xd83d, 0xdd14, 0x23f3, 0x23f0, 0x231a, 0xd83d, 0xdd12, 0xd83d, 0xdd11,\n 0xd83d, 0xdd0e, 0xd83d, 0xdca1, 0xd83d, 0xdd26, 0xd83d, 0xdd0c, 0xd83d, 0xdd0b, 0xd83d, 0xdebf,\n 0xd83d, 0xdebd, 0xd83d, 0xdd27, 0xd83d, 0xdd28, 0xd83d, 0xdeaa, 0xd83d, 0xdeac, 0xd83d, 0xdca3,\n 0xd83d, 0xdd2b, 0xd83d, 0xdd2a, 0xd83d, 0xdc8a, 0xd83d, 0xdc89, 0xd83d, 0xdcb0, 0xd83d, 0xdcb5,\n 0xd83d, 0xdcb3, 0x2709, 0xd83d, 0xdceb, 0xd83d, 0xdce6, 0xd83d, 0xdcc5, 0xd83d, 0xdcc1, 0x2702,\n 0xd83d, 0xdccc, 0xd83d, 0xdcce, 0x2712, 0x270f, 0xd83d, 0xdcd0, 0xd83d, 0xdcda, 0xd83d, 0xdd2c,\n 0xd83d, 0xdd2d, 0xd83c, 0xdfa8, 0xd83c, 0xdfac, 0xd83c, 0xdfa4, 0xd83c, 0xdfa7, 0xd83c, 0xdfb5,\n 0xd83c, 0xdfb9, 0xd83c, 0xdfbb, 0xd83c, 0xdfba, 0xd83c, 0xdfb8, 0xd83d, 0xdc7e, 0xd83c, 0xdfae,\n 0xd83c, 0xdccf, 0xd83c, 0xdfb2, 0xd83c, 0xdfaf, 0xd83c, 0xdfc8, 0xd83c, 0xdfc0, 0x26bd, 0x26be,\n 0xd83c, 0xdfbe, 0xd83c, 0xdfb1, 0xd83c, 0xdfc9, 0xd83c, 0xdfb3, 0xd83c, 0xdfc1, 0xd83c, 0xdfc7,\n 0xd83c, 0xdfc6, 0xd83c, 0xdfca, 0xd83c, 0xdfc4, 0x2615, 0xd83c, 0xdf7c, 0xd83c, 0xdf7a, 0xd83c,\n 0xdf77, 0xd83c, 0xdf74, 0xd83c, 0xdf55, 0xd83c, 0xdf54, 0xd83c, 0xdf5f, 0xd83c, 0xdf57, 0xd83c,\n 0xdf71, 0xd83c, 0xdf5a, 0xd83c, 0xdf5c, 0xd83c, 0xdf61, 0xd83c, 0xdf73, 0xd83c, 0xdf5e, 0xd83c,\n 0xdf69, 0xd83c, 0xdf66, 0xd83c, 0xdf82, 0xd83c, 0xdf70, 0xd83c, 0xdf6a, 0xd83c, 0xdf6b, 0xd83c,\n 0xdf6d, 0xd83c, 0xdf6f, 0xd83c, 0xdf4e, 0xd83c, 0xdf4f, 0xd83c, 0xdf4a, 0xd83c, 0xdf4b, 0xd83c,\n 0xdf52, 0xd83c, 0xdf47, 0xd83c, 0xdf49, 0xd83c, 0xdf53, 0xd83c, 0xdf51, 0xd83c, 0xdf4c, 0xd83c,\n 0xdf50, 0xd83c, 0xdf4d, 0xd83c, 0xdf46, 0xd83c, 0xdf45, 0xd83c, 0xdf3d, 0xd83c, 0xdfe1, 0xd83c,\n 0xdfe5, 0xd83c, 0xdfe6, 0x26ea, 0xd83c, 0xdff0, 0x26fa, 0xd83c, 0xdfed, 0xd83d, 0xddfb, 0xd83d,\n 0xddfd, 0xd83c, 0xdfa0, 0xd83c, 0xdfa1, 0x26f2, 0xd83c, 0xdfa2, 0xd83d, 0xdea2, 0xd83d, 0xdea4,\n 0x2693, 0xd83d, 0xde80, 0x2708, 0xd83d, 0xde81, 0xd83d, 0xde82, 0xd83d, 0xde8b, 0xd83d, 0xde8e,\n 0xd83d, 0xde8c, 0xd83d, 0xde99, 0xd83d, 0xde97, 0xd83d, 0xde95, 0xd83d, 0xde9b, 0xd83d, 0xdea8,\n 0xd83d, 0xde94, 0xd83d, 0xde92, 0xd83d, 0xde91, 0xd83d, 0xdeb2, 0xd83d, 0xdea0, 0xd83d, 0xde9c,\n 0xd83d, 0xdea6, 0x26a0, 0xd83d, 0xdea7, 0x26fd, 0xd83c, 0xdfb0, 0xd83d, 0xddff, 0xd83c, 0xdfaa,\n 0xd83c, 0xdfad, 0xd83c, 0xddef, 0xd83c, 0xddf5, 0xd83c, 0xddf0, 0xd83c, 0xddf7, 0xd83c, 0xdde9,\n 0xd83c, 0xddea, 0xd83c, 0xdde8, 0xd83c, 0xddf3, 0xd83c, 0xddfa, 0xd83c, 0xddf8, 0xd83c, 0xddeb,\n 0xd83c, 0xddf7, 0xd83c, 0xddea, 0xd83c, 0xddf8, 0xd83c, 0xddee, 0xd83c, 0xddf9, 0xd83c, 0xddf7,\n 0xd83c, 0xddfa, 0xd83c, 0xddec, 0xd83c, 0xdde7, 0x0031, 0x20e3, 0x0032, 0x20e3, 0x0033, 0x20e3,\n 0x0034, 0x20e3, 0x0035, 0x20e3, 0x0036, 0x20e3, 0x0037, 0x20e3, 0x0038, 0x20e3, 0x0039, 0x20e3,\n 0x0030, 0x20e3, 0xd83d, 0xdd1f, 0x2757, 0x2753, 0x2665, 0x2666, 0xd83d, 0xdcaf, 0xd83d, 0xdd17,\n 0xd83d, 0xdd31, 0xd83d, 0xdd34, 0xd83d, 0xdd35, 0xd83d, 0xdd36, 0xd83d, 0xdd37,\n]);\n\nexport const EMOJI_OFFSETS = [\n 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,\n 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46,\n 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70,\n 72, 74, 76, 78, 80, 82, 84, 86, 87, 88, 90, 92,\n 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116,\n 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140,\n 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164,\n 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188,\n 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212,\n 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236,\n 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 259,\n 260, 261, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280,\n 282, 284, 286, 288, 290, 292, 294, 295, 297, 299, 301, 303,\n 305, 306, 307, 308, 310, 312, 314, 316, 318, 320, 322, 324,\n 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348,\n 350, 351, 353, 355, 357, 359, 360, 362, 364, 365, 366, 368,\n 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392,\n 394, 396, 398, 400, 402, 404, 406, 407, 408, 410, 412, 414,\n 416, 418, 420, 422, 424, 426, 427, 429, 431, 433, 435, 437,\n 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459, 461,\n 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, 485,\n 487, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507, 508,\n 510, 511, 513, 515, 517, 519, 521, 522, 524, 526, 528, 529,\n 531, 532, 534, 536, 538, 540, 542, 544, 546, 548, 550, 552,\n 554, 556, 558, 560, 562, 564, 566, 567, 569, 570, 572, 574,\n 576, 578, 582, 586, 590, 594, 598, 602, 606, 610, 614, 618,\n 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 641,\n 642, 643, 644, 646, 648, 650, 652, 654, 656, 658,\n];\n","import type { ApiPhoneCall } from '../../../api/types';\nimport type { ApiCallProtocol } from '../../../lib/secret-sauce';\nimport type { ActionReturnType } from '../../types';\n\nimport {\n handleUpdateGroupCallConnection,\n handleUpdateGroupCallParticipants,\n joinPhoneCall, processSignalingMessage,\n} from '../../../lib/secret-sauce';\nimport { ARE_CALLS_SUPPORTED } from '../../../util/browser/windowEnvironment';\nimport { getCurrentTabId } from '../../../util/establishMultitabRole';\nimport { omit } from '../../../util/iteratees';\nimport * as langProvider from '../../../util/oldLangProvider';\nimport { EMOJI_DATA, EMOJI_OFFSETS } from '../../../util/phoneCallEmojiConstants';\nimport { callApi } from '../../../api/gramjs';\nimport { addActionHandler, getGlobal, setGlobal } from '../../index';\nimport { updateGroupCall, updateGroupCallParticipant } from '../../reducers/calls';\nimport { updateTabState } from '../../reducers/tabs';\nimport { selectActiveGroupCall, selectGroupCallParticipant, selectPhoneCallUser } from '../../selectors/calls';\n\naddActionHandler('apiUpdate', (global, actions, update): ActionReturnType => {\n const { activeGroupCallId } = global.groupCalls;\n\n switch (update['@type']) {\n case 'updateGroupCallLeavePresentation': {\n actions.toggleGroupCallPresentation({ value: false });\n break;\n }\n case 'updateGroupCallStreams': {\n if (!update.userId || !activeGroupCallId) break;\n if (!selectGroupCallParticipant(global, activeGroupCallId, update.userId)) break;\n\n return updateGroupCallParticipant(global, activeGroupCallId, update.userId, omit(update, ['@type', 'userId']));\n }\n case 'updateGroupCallConnectionState': {\n if (!activeGroupCallId) break;\n\n if (update.connectionState === 'disconnected') {\n if ('leaveGroupCall' in actions) actions.leaveGroupCall({ isFromLibrary: true, tabId: getCurrentTabId() });\n break;\n }\n\n return updateGroupCall(global, activeGroupCallId, {\n connectionState: update.connectionState,\n isSpeakerDisabled: update.isSpeakerDisabled,\n });\n }\n case 'updateGroupCallParticipants': {\n const { groupCallId, participants } = update;\n if (activeGroupCallId === groupCallId) {\n void handleUpdateGroupCallParticipants(participants);\n }\n break;\n }\n case 'updateGroupCallConnection': {\n if (update.data.stream) {\n actions.showNotification({ message: 'Big live streams are not yet supported', tabId: getCurrentTabId() });\n if ('leaveGroupCall' in actions) actions.leaveGroupCall({ tabId: getCurrentTabId() });\n break;\n }\n void handleUpdateGroupCallConnection(update.data, update.presentation);\n\n const groupCall = selectActiveGroupCall(global);\n if (groupCall?.participants && Object.keys(groupCall.participants).length > 0) {\n void handleUpdateGroupCallParticipants(Object.values(groupCall.participants));\n }\n break;\n }\n case 'updatePhoneCallMediaState':\n return {\n ...global,\n phoneCall: {\n ...global.phoneCall,\n ...omit(update, ['@type']),\n } as ApiPhoneCall,\n };\n case 'updatePhoneCall': {\n if (!ARE_CALLS_SUPPORTED) return undefined;\n const { phoneCall, currentUserId } = global;\n\n const call: ApiPhoneCall = {\n ...phoneCall,\n ...update.call,\n };\n\n const isOutgoing = phoneCall?.adminId === currentUserId;\n\n global = {\n ...global,\n phoneCall: call,\n };\n setGlobal(global);\n global = getGlobal();\n\n if (phoneCall && phoneCall.id && call.id !== phoneCall.id) {\n if (call.state !== 'discarded') {\n callApi('discardCall', {\n call,\n isBusy: true,\n });\n }\n return undefined;\n }\n\n const {\n accessHash, state, connections, gB,\n } = call;\n\n if (state === 'active' || state === 'accepted') {\n if (!verifyPhoneCallProtocol(call.protocol)) {\n const user = selectPhoneCallUser(global);\n if ('hangUp' in actions) actions.hangUp({ tabId: getCurrentTabId() });\n actions.showNotification({\n message: langProvider.oldTranslate('VoipPeerIncompatible', user?.firstName),\n tabId: getCurrentTabId(),\n });\n return undefined;\n }\n }\n\n if (state === 'discarded') {\n // Discarded from other device\n if (!phoneCall) return undefined;\n\n return updateTabState(global, {\n ...(call.needRating && { ratingPhoneCall: call }),\n isCallPanelVisible: undefined,\n }, getCurrentTabId());\n } else if (state === 'accepted' && accessHash && gB) {\n (async () => {\n const { gA, keyFingerprint, emojis } = await callApi('confirmPhoneCall', [gB, EMOJI_DATA, EMOJI_OFFSETS]);\n\n global = getGlobal();\n const newCall = {\n ...global.phoneCall,\n emojis,\n } as ApiPhoneCall;\n\n global = {\n ...global,\n phoneCall: newCall,\n };\n setGlobal(global);\n\n callApi('confirmCall', {\n call, gA, keyFingerprint,\n });\n })();\n } else if (state === 'active' && connections && phoneCall?.state !== 'active') {\n if (!isOutgoing) {\n callApi('receivedCall', { call });\n (async () => {\n const { emojis } = await callApi('confirmPhoneCall', [call.gAOrB!, EMOJI_DATA, EMOJI_OFFSETS]);\n\n global = getGlobal();\n const newCall = {\n ...global.phoneCall,\n emojis,\n } as ApiPhoneCall;\n\n global = {\n ...global,\n phoneCall: newCall,\n };\n setGlobal(global);\n })();\n }\n void joinPhoneCall(\n connections,\n actions.sendSignalingData,\n isOutgoing,\n Boolean(call?.isVideo),\n Boolean(call.isP2pAllowed),\n actions.apiUpdate,\n );\n }\n\n return global;\n }\n case 'updatePhoneCallConnectionState': {\n const { connectionState } = update;\n\n if (!global.phoneCall) return global;\n\n if (connectionState === 'closed' || connectionState === 'disconnected' || connectionState === 'failed') {\n if ('hangUp' in actions) actions.hangUp({ tabId: getCurrentTabId() });\n return undefined;\n }\n\n return {\n ...global,\n phoneCall: {\n ...global.phoneCall,\n isConnected: connectionState === 'connected',\n },\n };\n }\n case 'updatePhoneCallSignalingData': {\n const { phoneCall } = global;\n\n if (!phoneCall) {\n break;\n }\n\n callApi('decodePhoneCallData', [update.data])?.then(processSignalingMessage);\n break;\n }\n }\n\n return undefined;\n});\n\nfunction verifyPhoneCallProtocol(protocol?: ApiCallProtocol) {\n return protocol?.libraryVersions.some((version) => {\n return version === '4.0.0' || version === '4.0.1';\n });\n}\n","import type { GroupCallParticipant } from '../../../../lib/secret-sauce';\n\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../../config';\n\nexport default function formatGroupCallVolume(participant: GroupCallParticipant) {\n return Math.floor((participant.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER).toString();\n}\n","import type { ElementRef, FC } from '../../../lib/teact/teact';\nimport type React from '../../../lib/teact/teact';\nimport { memo, useEffect, useState } from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport type { MenuPositionOptions } from '../../ui/Menu';\n\nimport { GROUP_CALL_DEFAULT_VOLUME, GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config';\nimport { selectIsAdminInActiveGroupCall } from '../../../global/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { LOCAL_TGS_URLS } from '../../common/helpers/animatedAssets';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useLastCallback from '../../../hooks/useLastCallback';\nimport useOldLang from '../../../hooks/useOldLang';\nimport useRunThrottled from '../../../hooks/useRunThrottled';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport DeleteMemberModal from '../../right/DeleteMemberModal';\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './GroupCallParticipantMenu.scss';\n\nconst SPEAKER_ICON_DISABLED_SEGMENT: [number, number] = [0, 17];\nconst SPEAKER_ICON_ENABLED_SEGMENT: [number, number] = [17, 34];\n\ntype OwnProps =\n {\n participant?: GroupCallParticipant;\n onCloseAnimationEnd: VoidFunction;\n onClose: VoidFunction;\n isDropdownOpen: boolean;\n menuRef?: ElementRef;\n }\n & MenuPositionOptions;\n\ntype StateProps = {\n isAdmin: boolean;\n};\n\nconst VOLUME_ZERO = 0;\nconst VOLUME_LOW = 50;\nconst VOLUME_MEDIUM = 100;\nconst VOLUME_NORMAL = 150;\n\nconst VOLUME_CHANGE_THROTTLE = 500;\n\nconst SPEAKER_ICON_SIZE = 24;\n\nconst GroupCallParticipantMenu: FC = ({\n participant,\n onCloseAnimationEnd,\n onClose,\n isDropdownOpen,\n isAdmin,\n menuRef,\n ...menuPositionOptions\n}) => {\n const {\n toggleGroupCallMute,\n setGroupCallParticipantVolume,\n toggleGroupCallPanel,\n openChat,\n requestToSpeak,\n } = getActions();\n\n const lang = useOldLang();\n const [isDeleteUserModalOpen, openDeleteUserModal, closeDeleteUserModal] = useFlag();\n\n const id = participant?.id;\n const {\n isMutedByMe, isMuted, isSelf, canSelfUnmute,\n } = participant || {};\n const isRaiseHand = Boolean(participant?.raiseHandRating);\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n\n const [localVolume, setLocalVolume] = useState(\n isMutedByMe ? VOLUME_ZERO : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER),\n );\n\n const [shouldPlay, setShouldPlay] = useState(false);\n\n const isLocalVolumeZero = localVolume === VOLUME_ZERO;\n const speakerIconPlaySegment = isLocalVolumeZero ? SPEAKER_ICON_DISABLED_SEGMENT : SPEAKER_ICON_ENABLED_SEGMENT;\n\n useEffect(() => {\n if (isDropdownOpen) return;\n setShouldPlay(false);\n }, [isDropdownOpen]);\n\n const handleSetLocalVolume = useLastCallback((volume: number) => {\n setLocalVolume(volume);\n const isNewLocalVolumeZero = volume === VOLUME_ZERO;\n setShouldPlay(isNewLocalVolumeZero !== isLocalVolumeZero);\n });\n\n useEffect(() => {\n setLocalVolume(isMutedByMe\n ? VOLUME_ZERO\n : ((participant?.volume || GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER));\n // We only want to initialize local volume when switching participants and ignore following updates from server\n // eslint-disable-next-line react-hooks-static-deps/exhaustive-deps\n }, [id]);\n\n const runThrottled = useRunThrottled(VOLUME_CHANGE_THROTTLE);\n\n const handleRemove = useLastCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n openDeleteUserModal();\n onClose();\n });\n\n const handleCancelRequestToSpeak = useLastCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n requestToSpeak({\n value: false,\n });\n onClose();\n });\n\n const handleMute = useLastCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n onClose();\n\n if (!isAdmin) {\n handleSetLocalVolume(isMutedByMe ? GROUP_CALL_DEFAULT_VOLUME / GROUP_CALL_VOLUME_MULTIPLIER : VOLUME_ZERO);\n } else if (shouldRaiseHand) {\n handleSetLocalVolume((participant?.volume ?? GROUP_CALL_DEFAULT_VOLUME) / GROUP_CALL_VOLUME_MULTIPLIER);\n }\n\n toggleGroupCallMute({\n participantId: id!,\n value: isAdmin ? !shouldRaiseHand : !isMutedByMe,\n });\n });\n\n const handleOpenProfile = useLastCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n toggleGroupCallPanel();\n openChat({\n id,\n });\n onClose();\n });\n\n const handleChangeVolume = (e: React.ChangeEvent) => {\n const value = Number(e.target.value);\n handleSetLocalVolume(value);\n\n runThrottled(() => {\n if (value === VOLUME_ZERO) {\n toggleGroupCallMute({\n participantId: id!,\n value: true,\n });\n } else {\n setGroupCallParticipantVolume({\n participantId: id!,\n volume: Math.floor(value * GROUP_CALL_VOLUME_MULTIPLIER),\n });\n }\n });\n };\n\n return (\n
\n \n {!isSelf && !shouldRaiseHand && (\n
\n
= VOLUME_LOW && localVolume < VOLUME_MEDIUM && 'medium',\n localVolume >= VOLUME_MEDIUM && localVolume < VOLUME_NORMAL && 'normal',\n localVolume >= VOLUME_NORMAL && 'high',\n )}\n >\n \n
\n \n \n {localVolume}\n %\n \n
\n
\n
\n )}\n
\n {(isRaiseHand && isSelf) && (\n \n {lang('VoipGroupCancelRaiseHand')}\n \n )}\n {!isSelf && {lang('VoipGroupOpenProfile')}}\n {!isSelf && (\n // TODO cross mic\n \n {isAdmin\n ? lang(shouldRaiseHand ? 'VoipGroupAllowToSpeak' : 'VoipMute')\n : lang(isMutedByMe ? 'VoipGroupUnmuteForMe' : 'VoipGroupMuteForMe')}\n \n )}\n {!isSelf && isAdmin && (\n // TODO replace with hand\n \n {lang('VoipGroupUserRemove')}\n \n )}\n
\n \n\n {!isSelf && isAdmin && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): Complete => {\n return {\n isAdmin: selectIsAdminInActiveGroupCall(global),\n };\n },\n)(GroupCallParticipantMenu));\n","import useThrottledCallback from './useThrottledCallback';\n\nexport default function useRunThrottled(ms: number, noFirst?: boolean, deps: any = []) {\n return useThrottledCallback((cb: NoneToVoidFunction) => {\n cb();\n // eslint-disable-next-line react-hooks-static-deps/exhaustive-deps\n }, deps, ms, noFirst);\n}\n","import type { FC } from '../../../lib/teact/teact';\nimport { memo, useMemo } from '../../../lib/teact/teact';\n\nimport type { GroupCallParticipant } from '../../../lib/secret-sauce';\n\nimport { THRESHOLD } from '../../../lib/secret-sauce';\nimport { LOCAL_TGS_URLS } from '../../common/helpers/animatedAssets';\n\nimport usePreviousDeprecated from '../../../hooks/usePreviousDeprecated';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\n\ntype OwnProps = {\n participant: GroupCallParticipant;\n noColor?: boolean;\n className?: string;\n};\n\nconst OutlinedMicrophoneIcon: FC = ({\n participant,\n noColor,\n className,\n}) => {\n const { isMuted, isMutedByMe } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n const prevIsRaiseHand = usePreviousDeprecated(isRaiseHand);\n const canSelfUnmute = Boolean(participant?.canSelfUnmute);\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevIsMuted = usePreviousDeprecated(isMuted);\n\n const playSegment: [number, number] = useMemo(() => {\n if (isMuted && !prevIsMuted) {\n return [43, 64];\n }\n\n if (!isMuted && prevIsMuted) {\n return [22, 42];\n }\n\n if (isRaiseHand && !prevIsRaiseHand) {\n return [65, 84];\n }\n\n if (!shouldRaiseHand && prevIsRaiseHand) {\n return [0, 21];\n }\n\n // TODO cancel request to speak should play in reverse\n // if (!isRaiseHand && prevIsRaiseHand) {\n // return [84, 65];\n // }\n\n return isMuted ? [22, 23] : [43, 44];\n // eslint-disable-next-line\n }, [isMuted, shouldRaiseHand, isRaiseHand]);\n\n const microphoneColor: string = useMemo(() => {\n if (noColor) {\n return '#ffffff';\n }\n\n if (isRaiseHand) {\n return '#4da6e0';\n }\n\n if (shouldRaiseHand || isMutedByMe) {\n return '#ff706f';\n }\n\n if (isSpeaking) {\n return '#57bc6c';\n }\n\n return '#aaaaaa';\n }, [noColor, isRaiseHand, shouldRaiseHand, isMutedByMe, isSpeaking]);\n\n return (\n \n );\n};\n\nexport default memo(OutlinedMicrophoneIcon);\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"Wk7JwPx3\",\"subtitle\":\"ShcCNemD\",\"subtitleText\":\"UZLgp2cx\",\"icon\":\"vRc6jhKf\",\"subtitleBlue\":\"yA7bxEWw\",\"subtitleRed\":\"DnuZwImI\",\"subtitleGreen\":\"BkgYQGFq\",\"avatar\":\"ouHUJ9ff\"};","import type { FC } from '../../../lib/teact/teact';\nimport {\n memo, useCallback, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../global';\n\nimport type { ApiPeer } from '../../../api/types';\nimport type { GroupCallParticipant as TypeGroupCallParticipant } from '../../../lib/secret-sauce';\n\nimport { GROUP_CALL_DEFAULT_VOLUME } from '../../../config';\nimport { THRESHOLD } from '../../../lib/secret-sauce';\nimport { selectChat, selectUser } from '../../../global/selectors';\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\nimport formatGroupCallVolume from './helpers/formatGroupCallVolume';\n\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useOldLang from '../../../hooks/useOldLang';\n\nimport Avatar from '../../common/Avatar';\nimport FullNameTitle from '../../common/FullNameTitle';\nimport Icon from '../../common/icons/Icon';\nimport ListItem from '../../ui/ListItem';\nimport GroupCallParticipantMenu from './GroupCallParticipantMenu';\nimport OutlinedMicrophoneIcon from './OutlinedMicrophoneIcon';\n\nimport styles from './GroupCallParticipant.module.scss';\n\ntype OwnProps = {\n participant: TypeGroupCallParticipant;\n};\n\ntype StateProps = {\n peer?: ApiPeer;\n};\n\nconst GroupCallParticipant: FC = ({\n participant,\n peer,\n}) => {\n const ref = useRef();\n const menuRef = useRef();\n const lang = useOldLang();\n\n const {\n isSelf, isMutedByMe, isMuted, hasVideoStream, hasPresentationStream,\n } = participant;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n\n const {\n isContextMenuOpen,\n contextMenuAnchor,\n handleContextMenu,\n handleBeforeContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(ref, isSelf);\n\n const getTriggerElement = useCallback(() => ref.current, []);\n\n const getRootElement = useCallback(\n () => ref.current!.closest('.custom-scroll, .no-scrollbar'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => menuRef.current!,\n [],\n );\n\n const getLayout = useCallback(\n () => ({ withPortal: true }),\n [],\n );\n\n const hasCustomVolume = Boolean(\n !isMuted && isSpeaking && participant.volume && participant.volume !== GROUP_CALL_DEFAULT_VOLUME,\n );\n\n const [aboutText, aboutColor] = useMemo(() => {\n if (isMutedByMe) {\n return [lang('VoipGroupMutedForMe'), styles.subtitleRed];\n }\n\n if (isRaiseHand) {\n return [lang('WantsToSpeak'), styles.subtitleBlue];\n }\n\n if (hasCustomVolume) {\n return [\n lang('SpeakingWithVolume', formatGroupCallVolume(participant))\n .replace('%%', '%'),\n styles.subtitleGreen,\n ];\n }\n\n if (!isMuted && isSpeaking) {\n return [\n lang('Speaking'),\n styles.subtitleGreen,\n ];\n }\n\n if (isSelf) {\n return [lang('ThisIsYou'), styles.subtitleBlue];\n }\n\n return participant.about ? [participant.about, ''] : [lang('Listening'), styles.subtitleBlue];\n }, [isMutedByMe, isRaiseHand, hasCustomVolume, isMuted, isSpeaking, isSelf, participant, lang]);\n\n if (!peer) {\n return undefined;\n }\n\n return (\n }\n rightElement={}\n className={styles.root}\n onClick={handleContextMenu}\n onMouseDown={handleBeforeContextMenu}\n onContextMenu={handleContextMenu}\n multiline\n ripple\n ref={ref}\n >\n \n \n {hasPresentationStream && }\n {hasVideoStream && }\n {hasCustomVolume && }\n {renderText(aboutText)}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { participant }): Complete => {\n return {\n peer: selectUser(global, participant.id) || selectChat(global, participant.id),\n };\n },\n)(GroupCallParticipant));\n","import type { FC } from '../../../lib/teact/teact';\nimport { memo, useMemo } from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { GroupCallParticipant as TypeGroupCallParticipant } from '../../../lib/secret-sauce';\n\nimport { selectActiveGroupCall } from '../../../global/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { compareFields } from '../../../util/iteratees';\n\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useLastCallback from '../../../hooks/useLastCallback';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport GroupCallParticipant from './GroupCallParticipant';\n\nimport styles from './GroupCallParticipantList.module.scss';\n\ntype OwnProps = {\n panelOffset: number;\n isLandscape: boolean;\n};\n\ntype StateProps = {\n participantsCount: number;\n participants?: Record;\n};\n\nconst GroupCallParticipantList: FC = ({\n panelOffset,\n participants,\n participantsCount,\n isLandscape,\n}) => {\n const {\n loadMoreGroupCallParticipants,\n } = getActions();\n\n const orderedParticipantIds = useMemo(() => {\n return Object.values(participants || {}).sort(compareParticipants).map((participant) => participant.id);\n }, [participants]);\n\n const handleLoadMoreGroupCallParticipants = useLastCallback(() => {\n loadMoreGroupCallParticipants();\n });\n\n const [viewportIds, getMore] = useInfiniteScroll(\n handleLoadMoreGroupCallParticipants,\n orderedParticipantIds,\n orderedParticipantIds.length >= participantsCount,\n );\n\n return (\n \n {participants && viewportIds?.map(\n (participantId) => (\n participants[participantId] && (\n \n )\n ),\n )}\n \n );\n};\n\nfunction compareParticipants(a: TypeGroupCallParticipant, b: TypeGroupCallParticipant) {\n return compareFields(!a.isMuted, !b.isMuted)\n || compareFields(a.presentation, b.presentation)\n || compareFields(a.video, b.video)\n || compareFields(a.raiseHandRating, b.raiseHandRating);\n}\n\nexport default memo(withGlobal(\n (global): Complete => {\n const { participantsCount, participants } = selectActiveGroupCall(global) || {};\n\n return {\n participants,\n participantsCount: participantsCount || 0,\n };\n },\n)(GroupCallParticipantList));\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"npTa6CmI\",\"portrait\":\"v7oB2HTv\"};","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"DKuzmnN7\",\"hidden\":\"T_wodAHA\",\"noAnimate\":\"yPCkJzpi\",\"root\":\"eBq1NoLo\",\"speaking\":\"h4NcT6OS\",\"loader\":\"XedVWQii\",\"video\":\"eUXuK9Oz\",\"videoFallback\":\"eTpvBU_b eUXuK9Oz\",\"thumbnailWrapper\":\"R5ULTrF9\",\"thumbnail\":\"cjUWuViy\",\"flipped\":\"O2bTiH2E\",\"pinButton\":\"lPdblo0y\",\"bottomPanel\":\"T1deCDSn\",\"info\":\"LzFFayK3\",\"pinned\":\"B4WZhF9P\",\"name\":\"RBwMAuKp\",\"status\":\"z1ZZTsjC\",\"icon\":\"j1aDzn1H\"};","import type { FC } from '../../../lib/teact/teact';\nimport {\n memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../global';\n\nimport type { ApiChat, ApiUser } from '../../../api/types';\nimport type { GroupCallParticipant as TypeGroupCallParticipant } from '../../../lib/secret-sauce';\nimport type { VideoLayout, VideoParticipant } from './hooks/useGroupCallVideoLayout';\n\nimport { GROUP_CALL_DEFAULT_VOLUME } from '../../../config';\nimport fastBlur from '../../../lib/fastBlur';\nimport { requestMutation } from '../../../lib/fasterdom/fasterdom';\nimport { getUserStreams, THRESHOLD } from '../../../lib/secret-sauce';\nimport { selectChat, selectUser } from '../../../global/selectors';\nimport { animate } from '../../../util/animation';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../../../util/browser/windowEnvironment';\nimport buildClassName from '../../../util/buildClassName';\nimport { fastRaf } from '../../../util/schedulers';\nimport formatGroupCallVolume from './helpers/formatGroupCallVolume';\n\nimport useInterval from '../../../hooks/schedulers/useInterval';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLastCallback from '../../../hooks/useLastCallback';\nimport useOldLang from '../../../hooks/useOldLang';\n\nimport FullNameTitle from '../../common/FullNameTitle';\nimport Button from '../../ui/Button';\nimport Skeleton from '../../ui/placeholder/Skeleton';\nimport GroupCallParticipantMenu from './GroupCallParticipantMenu';\nimport OutlinedMicrophoneIcon from './OutlinedMicrophoneIcon';\n\nimport styles from './GroupCallParticipantVideo.module.scss';\n\nconst BLUR_RADIUS = 2;\nconst BLUR_ITERATIONS = 2;\nconst VIDEO_FALLBACK_UPDATE_INTERVAL = 1000;\n\ntype OwnProps = {\n layout: VideoLayout;\n setPinned: (participant?: VideoParticipant) => void;\n pinnedVideo: VideoParticipant | undefined;\n canPin: boolean;\n participant: TypeGroupCallParticipant;\n className?: string;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n};\n\nconst GroupCallParticipantVideo: FC = ({\n layout,\n pinnedVideo,\n setPinned,\n canPin,\n className,\n participant,\n user,\n chat,\n}) => {\n const lang = useOldLang();\n\n const thumbnailRef = useRef();\n const videoRef = useRef();\n const videoFallbackRef = useRef();\n\n const {\n x, y, width, height, noAnimate, isRemoved,\n type,\n } = layout;\n const {\n isSelf, isMutedByMe, isMuted,\n } = participant;\n const isPinned = pinnedVideo?.id === participant.id && pinnedVideo?.type === type;\n const isSpeaking = (participant.amplitude || 0) > THRESHOLD;\n const isRaiseHand = Boolean(participant.raiseHandRating);\n const shouldFlipVideo = type === 'video' && participant.isSelf;\n\n const status = useMemo(() => {\n if (isSelf) {\n return lang('ThisIsYou');\n }\n\n if (isMutedByMe) {\n return lang('VoipGroupMutedForMe');\n }\n\n if (isRaiseHand) {\n return lang('WantsToSpeak');\n }\n\n if (isMuted || !isSpeaking) {\n return lang('Listening');\n }\n\n if (participant.volume && participant.volume !== GROUP_CALL_DEFAULT_VOLUME) {\n return lang('SpeakingWithVolume', formatGroupCallVolume(participant))\n .replace('%%', '%');\n }\n\n return lang('Speaking');\n }, [isSelf, isMutedByMe, isRaiseHand, isMuted, isSpeaking, participant, lang]);\n\n const prevLayoutRef = useRef();\n if (!isRemoved) {\n prevLayoutRef.current = layout;\n }\n const {\n x: prevX, y: prevY, width: prevWidth, height: prevHeight,\n } = prevLayoutRef.current || {};\n\n const [currentX, currentY, currentWidth, currentHeight] = isRemoved\n ? [prevX, prevY, prevWidth, prevHeight] : [x, y, width, height];\n\n const [isHidden, setIsHidden] = useState(!noAnimate);\n\n const streams = getUserStreams(user?.id || chat!.id);\n const actualStream = type === 'video' ? streams?.video : streams?.presentation;\n const streamRef = useRef(actualStream);\n if (actualStream?.active && actualStream?.getVideoTracks()[0].enabled) {\n streamRef.current = actualStream;\n }\n const stream = streamRef.current;\n\n const handleInactive = useLastCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n // eslint-disable-next-line no-null/no-null\n video.srcObject = null;\n });\n\n useEffect(() => {\n stream?.addEventListener('inactive', handleInactive);\n return () => {\n stream?.removeEventListener('inactive', handleInactive);\n };\n }, [handleInactive, stream]);\n\n useEffect(() => {\n setIsHidden(false);\n }, []);\n\n const [isLoading, setIsLoading] = useState(true);\n\n const handleCanPlay = useLastCallback(() => {\n setIsLoading(false);\n });\n\n // When video stream is removed, the video element starts showing empty black screen.\n // To avoid that, we hide the video element and show the fallback frame instead, which is constantly updated\n // every VIDEO_FALLBACK_UPDATE_INTERVAL milliseconds.\n useInterval(() => {\n if (!stream?.active) return;\n const video = videoRef.current!;\n const canvas = videoFallbackRef.current!;\n\n requestMutation(() => {\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n canvas.getContext('2d')!.drawImage(video, 0, 0, canvas.width, canvas.height);\n });\n }, VIDEO_FALLBACK_UPDATE_INTERVAL);\n\n useEffect(() => {\n const video = videoRef.current;\n const thumbnail = thumbnailRef.current;\n if (!video || !thumbnail || !stream) return undefined;\n\n const ctx = thumbnail.getContext('2d', { alpha: false });\n if (!ctx) return undefined;\n\n let isDrawing = true;\n requestMutation(() => {\n if (!isDrawing) return;\n thumbnail.width = 16;\n thumbnail.height = 16;\n ctx.filter = 'blur(2px)';\n\n const draw = () => {\n if (!isDrawing) return false;\n if (!stream.active) {\n return false;\n }\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, thumbnail.width, thumbnail.height);\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, thumbnail.width, thumbnail.height, BLUR_RADIUS, BLUR_ITERATIONS);\n }\n return true;\n };\n\n animate(draw, fastRaf);\n });\n\n return () => {\n isDrawing = false;\n };\n }, [stream]);\n\n const ref = useRef();\n const menuRef = useRef();\n\n const {\n isContextMenuOpen,\n contextMenuAnchor,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(ref, isSelf);\n\n const getTriggerElement = useCallback(() => ref.current, []);\n\n const getRootElement = useCallback(\n () => ref.current!.closest('.custom-scroll, .no-scrollbar'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => menuRef.current!,\n [],\n );\n\n const getLayout = useCallback(\n () => ({ withPortal: true }),\n [],\n );\n\n const handleClickPin = useCallback(() => {\n setPinned(!isPinned ? {\n id: user?.id || chat!.id,\n type,\n } : undefined);\n }, [chat, isPinned, setPinned, type, user?.id]);\n\n return (\n \n \n {isLoading && (\n \n )}\n {stream && (\n \n )}\n \n
\n \n
\n {canPin && (\n \n )}\n
\n
\n \n
{status}
\n
\n \n
\n \n\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { participant }): Complete => {\n return {\n user: participant.isUser ? selectUser(global, participant.id) : undefined,\n chat: !participant.isUser ? selectChat(global, participant.id) : undefined,\n };\n },\n)(GroupCallParticipantVideo));\n","export const vibrateShort = () => {\n navigator.vibrate?.(50);\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"lKdhQ5pw\",\"spinner\":\"tyQNJC6B\",\"spinnerVisible\":\"LowChABq\",\"mutedByAdmin\":\"Ynow5UuE\",\"canUnmute\":\"bjKqp3SI\",\"icon\":\"Ea1XnQaX\"};","import type { FC } from '../../../lib/teact/teact';\nimport {\n memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { GroupCallConnectionState } from '../../../lib/secret-sauce';\n\nimport { selectActiveGroupCall, selectGroupCallParticipant } from '../../../global/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { vibrateShort } from '../../../util/vibrate';\nimport { LOCAL_TGS_URLS } from '../../common/helpers/animatedAssets';\n\nimport useOldLang from '../../../hooks/useOldLang';\nimport usePreviousDeprecated from '../../../hooks/usePreviousDeprecated';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport Button from '../../ui/Button';\nimport Spinner from '../../ui/Spinner';\n\nimport styles from './MicrophoneButton.module.scss';\n\nconst CONNECTION_STATE_DEFAULT = 'discarded';\n\ntype OwnProps = {\n className?: string;\n};\n\ntype StateProps = {\n connectionState?: GroupCallConnectionState;\n hasRequestedToSpeak: boolean;\n isMuted?: boolean;\n canSelfUnmute?: boolean;\n noAudioStream: boolean;\n};\n\nconst REQUEST_TO_SPEAK_THROTTLE = 3000;\nconst HOLD_TO_SPEAK_TIME = 200;\nconst ICON_SIZE = 36;\n\nconst MicrophoneButton: FC = ({\n className,\n noAudioStream,\n canSelfUnmute,\n isMuted,\n connectionState,\n}) => {\n const {\n toggleGroupCallMute,\n requestToSpeak,\n playGroupCallSound,\n } = getActions();\n\n const lang = useOldLang();\n const muteMouseDownState = useRef('up');\n\n const [isRequestingToSpeak, setIsRequestingToSpeak] = useState(false);\n const isConnecting = connectionState !== 'connected';\n const shouldRaiseHand = !canSelfUnmute && isMuted;\n const prevShouldRaiseHand = usePreviousDeprecated(shouldRaiseHand);\n\n useEffect(() => {\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n playGroupCallSound({ sound: 'allowTalk' });\n }\n }, [playGroupCallSound, prevShouldRaiseHand, shouldRaiseHand]);\n\n // Voice mini\n // unmuted -> muted [69, 99]\n // muted -> unmuted [36, 69]\n // raise -> muted [0, 36]\n // muted -> raise [99, 136]\n // unmuted -> raise [136, 172]\n // TODO should probably move to other component\n const playSegment: [number, number] = useMemo(() => {\n if (isRequestingToSpeak) {\n const r = Math.floor(Math.random() * 100);\n return (r < 32 ? [0, 120]\n : (r < 64 ? [120, 240]\n : (r < 97 ? [240, 420]\n : [420, 540]\n )\n )\n );\n }\n if (!prevShouldRaiseHand && shouldRaiseHand) {\n return noAudioStream ? [99, 135] : [136, 172];\n }\n if (prevShouldRaiseHand && !shouldRaiseHand) {\n return [0, 36];\n }\n if (!shouldRaiseHand) {\n return noAudioStream ? [69, 99] : [36, 69];\n }\n return [0, 0];\n }, [prevShouldRaiseHand, isRequestingToSpeak, noAudioStream, shouldRaiseHand]);\n\n const animatedIconName = isRequestingToSpeak ? 'HandFilled' : 'VoiceMini';\n\n const toggleMute = useCallback(() => {\n vibrateShort();\n toggleGroupCallMute();\n }, [toggleGroupCallMute]);\n\n const handleMouseDownMute = useCallback(() => {\n if (shouldRaiseHand) {\n if (isRequestingToSpeak) return;\n vibrateShort();\n requestToSpeak();\n setIsRequestingToSpeak(true);\n setTimeout(() => {\n setIsRequestingToSpeak(false);\n }, REQUEST_TO_SPEAK_THROTTLE);\n return;\n }\n muteMouseDownState.current = 'down';\n if (noAudioStream) {\n setTimeout(() => {\n if (muteMouseDownState.current === 'down') {\n muteMouseDownState.current = 'hold';\n toggleMute();\n }\n }, HOLD_TO_SPEAK_TIME);\n }\n }, [isRequestingToSpeak, noAudioStream, requestToSpeak, shouldRaiseHand, toggleMute]);\n\n const handleMouseUpMute = useCallback(() => {\n if (shouldRaiseHand) {\n return;\n }\n toggleMute();\n muteMouseDownState.current = 'up';\n }, [shouldRaiseHand, toggleMute]);\n\n return (\n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): Complete => {\n const groupCall = selectActiveGroupCall(global);\n\n const { connectionState } = groupCall || {};\n const meParticipant = groupCall && selectGroupCallParticipant(global, groupCall.id, global.currentUserId!);\n\n const {\n raiseHandRating, hasAudioStream, canSelfUnmute, isMuted,\n } = meParticipant || {};\n\n return {\n connectionState: connectionState || CONNECTION_STATE_DEFAULT,\n hasRequestedToSpeak: Boolean(raiseHandRating),\n noAudioStream: !hasAudioStream,\n canSelfUnmute,\n isMuted,\n };\n },\n)(MicrophoneButton));\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"OsO5GKfn\",\"panelWrapper\":\"cUVoePr_\",\"panel\":\"Thuz79M3\",\"panelScrollTrigger\":\"zoK6Y6IS\",\"panelHeader\":\"DMBtCL9Z\",\"scrolled\":\"GdEH1Agb\",\"fullscreen\":\"JJx0QI2w\",\"landscape\":\"wamCuzMB\",\"headerButton\":\"gmyieSid\",\"firstButton\":\"hVnn6KBp\",\"lastButton\":\"iy78A5rG\",\"panelHeaderText\":\"TwEEA77i\",\"title\":\"pNZ9skLf\",\"bigger\":\"NumT3v5i\",\"subtitle\":\"gmfUKabx\",\"participants\":\"iTeC_RxH\",\"participantVideos\":\"PZmKIdTl\",\"addParticipantButton\":\"clmu2oBt\",\"videos\":\"ATwoMlAV\",\"mainVideoContainer\":\"hqFon3dV\",\"videosHeader\":\"KPHc659W\",\"appFullscreen\":\"cl2sfoBF\",\"videosHeaderLastButton\":\"_t50HVNJ\",\"videosContent\":\"oEEQZilE\",\"actions\":\"uGzi9s97\",\"actionButton\":\"foXbVcnN\",\"destructive\":\"YIR9Z9CZ\",\"canRequestToSpeak\":\"ZoiZQu_O\",\"muted\":\"wpvv1V6m\",\"portrait\":\"R6HQcMwx\",\"noVideoParticipants\":\"aepCFyJQ\",\"noSidebar\":\"XjgP21E6\"};","import '../../../global/actions/calls';\n\nimport type { FC } from '../../../lib/teact/teact';\nimport {\n memo, useEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type {\n GroupCallConnectionState, GroupCallParticipant as TypeGroupCallParticipant,\n} from '../../../lib/secret-sauce';\nimport type { VideoParticipant } from './hooks/useGroupCallVideoLayout';\n\nimport { IS_SCREENSHARE_SUPPORTED } from '../../../lib/secret-sauce';\nimport { selectChat, selectTabState } from '../../../global/selectors';\nimport {\n selectCanInviteToActiveGroupCall,\n selectGroupCall,\n selectGroupCallParticipant,\n selectIsAdminInActiveGroupCall,\n} from '../../../global/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { compact } from '../../../util/iteratees';\n\nimport useAppLayout from '../../../hooks/useAppLayout';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useLastCallback from '../../../hooks/useLastCallback';\nimport useOldLang from '../../../hooks/useOldLang';\nimport { useFullscreenStatus } from '../../../hooks/window/useFullscreen';\nimport useGroupCallVideoLayout from './hooks/useGroupCallVideoLayout';\n\nimport Button from '../../ui/Button';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Modal from '../../ui/Modal';\nimport GroupCallParticipantList from './GroupCallParticipantList';\nimport GroupCallParticipantVideo from './GroupCallParticipantVideo';\nimport MicrophoneButton from './MicrophoneButton';\n\nimport styles from './GroupCall.module.scss';\n\nconst INTERSECTION_THROTTLE = 200;\n\nexport type OwnProps = {\n groupCallId: string;\n};\n\ntype StateProps = {\n isCallPanelVisible: boolean;\n connectionState: GroupCallConnectionState;\n title?: string;\n meParticipant?: TypeGroupCallParticipant;\n participantsCount?: number;\n isAdmin: boolean;\n participants: Record;\n canInvite: boolean;\n};\n\nconst GroupCall: FC = ({\n groupCallId,\n isCallPanelVisible,\n connectionState,\n participantsCount,\n title,\n meParticipant,\n isAdmin,\n participants,\n canInvite,\n}) => {\n const {\n toggleGroupCallVideo,\n toggleGroupCallPresentation,\n leaveGroupCall,\n toggleGroupCallPanel,\n connectToActiveGroupCall,\n playGroupCallSound,\n createGroupCallInviteLink,\n } = getActions();\n\n const lang = useOldLang();\n const containerRef = useRef();\n\n const primaryVideoContainerRef = useRef();\n const secondaryVideoContainerRef = useRef();\n\n const panelScrollTriggerRef = useRef();\n const panelRef = useRef();\n\n const [isLeaving, setIsLeaving] = useState(false);\n const isOpen = !isCallPanelVisible && !isLeaving;\n\n const { observe } = useIntersectionObserver({\n rootRef: panelRef,\n throttleMs: INTERSECTION_THROTTLE,\n isDisabled: !isOpen,\n });\n\n const hasScrolled = !useIsIntersecting(panelScrollTriggerRef, isOpen ? observe : undefined);\n\n const { isMobile, isLandscape } = useAppLayout();\n\n const [isFullscreen, openFullscreen, closeFullscreen] = useFlag();\n const [isSidebarOpen, openSidebar, closeSidebar] = useFlag(true);\n const isLandscapeLayout = Boolean(isFullscreen && isLandscape);\n const isAppFullscreen = useFullscreenStatus();\n\n const firstPresentation = useMemo(() => {\n return Object.values(participants).find(({ presentation }) => presentation);\n }, [participants]);\n const videoParticipants = useMemo(() => Object.values(participants)\n .filter(({ video, presentation }) => video || presentation)\n .flatMap(({ id, video, presentation }) => compact([\n video ? {\n id,\n type: 'video' as const,\n } : undefined,\n presentation ? {\n id,\n type: 'screen' as const,\n } : undefined,\n ])),\n [participants]);\n const hasVideoParticipants = videoParticipants.length > 0;\n\n const groupCallTitle = title || lang('VoipGroupVoiceChat');\n const membersString = lang('Participants', participantsCount, 'i');\n\n const [isConfirmLeaveModalOpen, openConfirmLeaveModal, closeConfirmLeaveModal] = useFlag();\n const [isEndGroupCallModal, setIsEndGroupCallModal] = useState(false);\n const [shouldEndGroupCall, setShouldEndGroupCall] = useState(false);\n\n const hasVideo = meParticipant?.hasVideoStream;\n const hasPresentation = meParticipant?.hasPresentationStream;\n const hasAudioStream = meParticipant?.hasAudioStream;\n const isConnecting = connectionState !== 'connected';\n const canSelfUnmute = meParticipant?.canSelfUnmute;\n const canRequestToSpeak = !canSelfUnmute && !hasAudioStream;\n\n useEffect(() => {\n if (connectionState === 'connected') {\n playGroupCallSound({ sound: 'join' });\n } else if (connectionState === 'reconnecting') {\n playGroupCallSound({ sound: 'connecting' });\n }\n }, [connectionState]);\n\n const handleCloseConfirmLeaveModal = useLastCallback(() => {\n closeConfirmLeaveModal();\n setIsEndGroupCallModal(false);\n });\n\n const handleToggleFullscreen = useLastCallback(() => {\n if (!containerRef.current || isMobile) return;\n\n if (isFullscreen) {\n closeFullscreen();\n } else {\n openFullscreen();\n }\n });\n\n const handleToggleSidebar = useLastCallback(() => {\n if (isSidebarOpen) {\n closeSidebar();\n } else {\n openSidebar();\n }\n });\n\n const handleToggleGroupCallPanel = useLastCallback(() => {\n toggleGroupCallPanel();\n });\n\n const handleInviteMember = useLastCallback(() => {\n createGroupCallInviteLink();\n });\n\n const handleClickVideo = useLastCallback(() => {\n toggleGroupCallVideo();\n });\n\n useEffect(() => {\n connectToActiveGroupCall();\n }, [connectToActiveGroupCall, groupCallId]);\n\n const handleLeaveGroupCall = useLastCallback(() => {\n if (isAdmin && !isConfirmLeaveModalOpen) {\n openConfirmLeaveModal();\n return;\n }\n playGroupCallSound({ sound: 'leave' });\n setIsLeaving(true);\n closeConfirmLeaveModal();\n });\n\n const handleCloseAnimationEnd = useLastCallback(() => {\n if (!isLeaving) return;\n\n leaveGroupCall({\n shouldDiscard: shouldEndGroupCall,\n });\n });\n\n const handleToggleGroupCallPresentation = useLastCallback(() => {\n toggleGroupCallPresentation();\n });\n\n const canPinVideo = videoParticipants.length > 1 && !isMobile;\n const isLandscapeWithVideos = isLandscapeLayout && hasVideoParticipants;\n const [pinnedVideo, setPinnedVideo] = useState(undefined);\n const {\n videoLayout,\n panelOffset,\n } = useGroupCallVideoLayout({\n primaryContainerRef: primaryVideoContainerRef,\n secondaryContainerRef: secondaryVideoContainerRef,\n videoParticipants,\n isLandscapeLayout,\n pinnedVideo,\n });\n\n const handleSetPinnedVideo = useLastCallback((video: VideoParticipant | undefined) => {\n setPinnedVideo(video);\n if (video && !isFullscreen) {\n openFullscreen();\n }\n });\n\n const handleOpenFirstPresentation = useLastCallback(() => {\n if (!firstPresentation) return;\n\n setPinnedVideo({\n id: firstPresentation.id,\n type: 'screen',\n });\n });\n\n useEffect(handleOpenFirstPresentation, [handleOpenFirstPresentation, Boolean(firstPresentation)]);\n\n useEffect(() => {\n if (!pinnedVideo) return;\n if (!videoParticipants.some((l) => l.type === pinnedVideo.type && l.id === pinnedVideo.id)) {\n setPinnedVideo(undefined);\n }\n }, [pinnedVideo, videoLayout, videoParticipants]);\n\n return (\n \n {isLandscapeWithVideos && (\n
\n
\n {!isMobile && (\n \n )}\n\n

\n {title || lang('VoipGroupVoiceChat')}\n

\n\n {isLandscapeWithVideos && !isSidebarOpen && (\n \n )}\n
\n\n \n
\n )}\n\n
\n
\n
\n\n
\n {!isLandscapeWithVideos && !isMobile && (\n \n )}\n\n {isMobile && (\n \n )}\n\n {isLandscapeWithVideos && (\n \n )}\n\n
\n

\n {isLandscapeWithVideos ? membersString : groupCallTitle}\n

\n {!isLandscapeWithVideos && (\n \n {membersString}\n \n )}\n
\n\n {!isLandscapeWithVideos && canInvite && (\n \n )}\n
\n\n
\n \n {videoLayout.map((layout) => {\n const participant = participants[layout.participantId];\n if (!layout.isRemounted || !participant) {\n return (\n \n );\n }\n\n return (\n \n );\n })}\n
\n \n
\n
\n\n \n
\n\n
\n {videoLayout.map((layout) => {\n const participant = participants[layout.participantId];\n if (layout.isRemounted || !participant) {\n return (\n \n );\n }\n return (\n \n );\n })}\n
\n\n
\n \n\n \n\n \n\n \n\n \n
\n\n \n

{lang(isEndGroupCallModal ? 'VoipGroupEndAlertText' : 'VoipGroupLeaveAlertText')}

\n {!isEndGroupCallModal && (\n \n )}\n
\n \n \n
\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { groupCallId }): Complete => {\n const {\n connectionState, title, participants, participantsCount, chatId,\n } = selectGroupCall(global, groupCallId) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n return {\n connectionState,\n title: title || chat?.title,\n participantsCount,\n meParticipant: selectGroupCallParticipant(global, groupCallId, global.currentUserId!),\n isCallPanelVisible: Boolean(selectTabState(global).isCallPanelVisible),\n isAdmin: selectIsAdminInActiveGroupCall(global),\n participants,\n canInvite: selectCanInviteToActiveGroupCall(global),\n };\n },\n)(GroupCall));\n","import type {\n ElementRef } from '../../../../lib/teact/teact';\nimport {\n useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport useLastCallback from '../../../../hooks/useLastCallback';\nimport usePreviousDeprecated from '../../../../hooks/usePreviousDeprecated';\nimport useResizeObserver from '../../../../hooks/useResizeObserver';\n\nconst PADDING_HORIZONTAL = 10;\nconst PADDING_VERTICAL = 8;\nconst PREFERRED_PANEL_VIDEO_HEIGHT = 240;\n\nexport type VideoLayout = {\n participantId: string;\n type: 'video' | 'screen';\n x: number;\n y: number;\n width: number;\n height: number;\n shouldRemount?: boolean;\n isRemounted?: boolean;\n noAnimate?: boolean;\n isRemoved?: boolean;\n orderKey: number;\n};\n\nexport type VideoParticipant = {\n id: string;\n type: 'video' | 'screen';\n};\n\nexport default function useGroupCallVideoLayout({\n primaryContainerRef,\n secondaryContainerRef,\n videoParticipants,\n isLandscapeLayout,\n pinnedVideo,\n}: {\n primaryContainerRef: ElementRef;\n secondaryContainerRef: ElementRef;\n videoParticipants: VideoParticipant[];\n isLandscapeLayout: boolean;\n pinnedVideo: VideoParticipant | undefined;\n}) {\n const [videoLayout, setVideoLayout] = useState([]);\n const [panelOffset, setPanelOffset] = useState(0);\n const videosCount = videoParticipants.length;\n const prevVideosCount = usePreviousDeprecated(videosCount);\n const prevVideoParticipants = usePreviousDeprecated(videoParticipants);\n const removedVideoParticipants = useMemo(() => {\n return prevVideoParticipants?.filter(\n ({ id, type }) => !videoParticipants.some((p) => p.id === id && p.type === type),\n );\n }, [prevVideoParticipants, videoParticipants]);\n\n const recalculateLayout = useLastCallback(() => {\n const primaryContainer = primaryContainerRef.current;\n const secondaryContainer = secondaryContainerRef.current;\n if (!secondaryContainer) return;\n\n const removed = prevVideosCount !== undefined && prevVideosCount > videosCount\n ? prevVideosCount - videosCount : 0;\n\n const {\n x: secondaryInitialX,\n y: secondaryInitialY,\n width: secondaryContainerWidth,\n } = secondaryContainer.getBoundingClientRect();\n\n const layout: VideoLayout[] = [];\n if (pinnedVideo !== undefined || !primaryContainer || !isLandscapeLayout) {\n const isRemounted = true;\n let skip = false;\n let pinnedSkipIndex = 0;\n let pinnedPush: VideoLayout | undefined;\n let participants = videoParticipants;\n if (pinnedVideo && primaryContainer && isLandscapeLayout) {\n pinnedSkipIndex = participants\n .findIndex(({ id, type }) => id === pinnedVideo.id && type === pinnedVideo.type);\n if (pinnedSkipIndex !== -1) {\n const {\n x: initialX,\n y: initialY,\n width: containerWidth,\n height: containerHeight,\n } = primaryContainer.getBoundingClientRect();\n\n const { id: participantId, type } = pinnedVideo;\n\n pinnedPush = {\n x: initialX,\n y: initialY,\n width: containerWidth,\n height: containerHeight,\n participantId,\n type,\n orderKey: pinnedSkipIndex,\n };\n skip = true;\n participants = participants\n .filter(({ id, type: videoType }) => id !== participantId || videoType !== pinnedVideo.type);\n }\n }\n\n const secondaryVideosCounts = skip ? videosCount - 1 : videosCount;\n\n const isFirstBig = secondaryVideosCounts % 2 === 1;\n const columns = 2;\n const rows = Math.ceil(secondaryVideosCounts / columns);\n const smallWidth = (secondaryContainerWidth - (columns - 1) * PADDING_HORIZONTAL) / columns;\n const heightTotal = Math.max(0, isFirstBig\n ? (PREFERRED_PANEL_VIDEO_HEIGHT + (rows - 1) * smallWidth + (rows - 1) * PADDING_VERTICAL)\n : rows * smallWidth + (rows - 1) * PADDING_VERTICAL);\n\n for (let i = 0; i < secondaryVideosCounts; i++) {\n const isBig = isFirstBig && i === 0;\n const width = isBig ? secondaryContainerWidth : smallWidth;\n const height = isBig ? PREFERRED_PANEL_VIDEO_HEIGHT : smallWidth;\n\n const realIndex = isFirstBig && i !== 0 ? i + 1 : i;\n\n const x = (isRemounted ? 0 : secondaryInitialX) + (realIndex % columns) * (width + PADDING_HORIZONTAL);\n const y = (isRemounted ? 0 : secondaryInitialY) + (isFirstBig && i !== 0 ? (\n PREFERRED_PANEL_VIDEO_HEIGHT + PADDING_VERTICAL\n + (Math.floor(realIndex / columns) - 1) * (height + PADDING_VERTICAL)\n ) : (\n Math.floor(realIndex / columns) * (height + PADDING_VERTICAL)\n ));\n layout.push({\n x,\n y,\n width,\n height,\n shouldRemount: !isRemounted,\n isRemounted,\n noAnimate: true,\n participantId: participants[i].id,\n type: participants[i].type,\n orderKey: i >= pinnedSkipIndex ? i + 1 : i,\n });\n }\n\n if (pinnedPush) {\n layout.splice(pinnedSkipIndex, 0, pinnedPush);\n }\n\n if (removedVideoParticipants) {\n for (let i = 0; i < removed; i++) {\n layout.push({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n isRemounted,\n isRemoved: true,\n participantId: removedVideoParticipants[i].id,\n type: removedVideoParticipants[i].type,\n orderKey: i + videosCount,\n });\n }\n }\n\n setPanelOffset(heightTotal);\n setVideoLayout(layout);\n return;\n }\n\n const {\n x: initialX,\n y: initialY,\n width: containerWidth,\n height: containerHeight,\n } = primaryContainer.getBoundingClientRect();\n\n const columns = calculateColumnsCount(videosCount);\n const rows = Math.ceil(videosCount / columns);\n const totalGridSize = rows * columns;\n const shouldFillLastRow = totalGridSize > videosCount;\n const width = (containerWidth - (columns - 1) * PADDING_HORIZONTAL) / columns;\n const height = (containerHeight - (rows - 1) * PADDING_VERTICAL) / rows;\n\n const lastRowWidth = width * (videosCount % columns);\n for (let i = 0; i < videosCount; i++) {\n const row = Math.floor(i / columns);\n const shouldCenter = shouldFillLastRow && row === rows - 1;\n const x = initialX + (i % columns) * (width + PADDING_HORIZONTAL)\n + (shouldCenter ? (containerWidth - lastRowWidth) / 2 : 0);\n const y = initialY + Math.floor(i / columns) * (height + PADDING_VERTICAL);\n layout.push({\n x,\n y,\n width,\n height,\n participantId: videoParticipants[i].id,\n type: videoParticipants[i].type,\n orderKey: i,\n });\n }\n\n if (removedVideoParticipants) {\n for (let i = 0; i < removed; i++) {\n layout.push({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n isRemoved: true,\n participantId: removedVideoParticipants[i].id,\n type: removedVideoParticipants[i].type,\n orderKey: i + videosCount,\n });\n }\n }\n\n setPanelOffset(0);\n setVideoLayout(layout);\n });\n\n useEffect(recalculateLayout, [\n recalculateLayout, videoParticipants, isLandscapeLayout, pinnedVideo,\n ]);\n\n useResizeObserver(primaryContainerRef, recalculateLayout, !primaryContainerRef.current);\n useResizeObserver(secondaryContainerRef, recalculateLayout, !secondaryContainerRef.current);\n\n return {\n videoLayout, panelOffset,\n };\n}\n\nfunction calculateColumnsCount(videosCount: number) {\n if (videosCount >= 25) {\n return 5;\n } else if (videosCount >= 13) {\n return 4;\n } else if (videosCount >= 7) {\n return 3;\n } else if (videosCount >= 3) {\n return 2;\n } else {\n return 1;\n }\n}\n","import { memo, useEffect } from '../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../global';\n\nimport type { ApiGroupCall, ApiUser } from '../../api/types';\n\nimport { selectTabState } from '../../global/selectors';\nimport { selectActiveGroupCall, selectPhoneCallUser } from '../../global/selectors/calls';\nimport buildClassName from '../../util/buildClassName';\n\nimport useOldLang from '../../hooks/useOldLang';\n\nimport './ActiveCallHeader.scss';\n\ntype StateProps = {\n isCallPanelVisible?: boolean;\n groupCall?: ApiGroupCall;\n phoneCallUser?: ApiUser;\n};\n\nconst ActiveCallHeader = ({\n groupCall,\n phoneCallUser,\n isCallPanelVisible,\n}: StateProps) => {\n const { toggleGroupCallPanel } = getActions();\n\n const lang = useOldLang();\n\n useEffect(() => {\n document.body.classList.toggle('has-call-header', Boolean(isCallPanelVisible));\n window.tauri?.markTitleBarOverlay(!isCallPanelVisible);\n\n return () => {\n document.body.classList.toggle('has-call-header', false);\n window.tauri?.markTitleBarOverlay(true);\n };\n }, [isCallPanelVisible]);\n\n function handleToggleGroupCallPanel() {\n toggleGroupCallPanel();\n }\n\n if (!groupCall && !phoneCallUser) return undefined;\n\n return (\n \n {phoneCallUser?.firstName || groupCall?.title || lang('VoipGroupVoiceChat')}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): Complete => {\n const tabState = selectTabState(global);\n return {\n groupCall: tabState.isMasterTab ? selectActiveGroupCall(global) : undefined,\n isCallPanelVisible: tabState.isCallPanelVisible,\n phoneCallUser: tabState.isMasterTab ? selectPhoneCallUser(global) : undefined,\n };\n },\n)(ActiveCallHeader));\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"lBO3RZUM\",\"button\":\"ch2sqAKW\",\"active\":\"OQxlsRp7\",\"button-text\":\"aHguvLcL\",\"buttonText\":\"aHguvLcL\"};","import type { TeactNode } from '../../../lib/teact/teact';\nimport { memo } from '../../../lib/teact/teact';\n\nimport type { IconName } from '../../../types/icons';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport Icon from '../../common/icons/Icon';\nimport Button from '../../ui/Button';\n\nimport styles from './PhoneCallButton.module.scss';\n\ntype OwnProps = {\n label: string;\n icon?: IconName;\n iconClassName?: string;\n customIcon?: TeactNode;\n className?: string;\n isDisabled?: boolean;\n isActive?: boolean;\n onClick: VoidFunction;\n};\n\nconst PhoneCallButton = ({\n label,\n customIcon,\n icon,\n iconClassName,\n className,\n isDisabled,\n isActive,\n onClick,\n}: OwnProps) => {\n return (\n
\n \n {customIcon || }\n \n
{label}
\n
\n );\n};\n\nexport default memo(PhoneCallButton);\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"GNYRVAUg\",\"blurred\":\"RBmbMiou\",\"single-column\":\"O7cZE08z\",\"singleColumn\":\"O7cZE08z\",\"header\":\"GI6dY5aJ\",\"close-button\":\"ULiJZuaP\",\"closeButton\":\"ULiJZuaP\",\"emojis-backdrop\":\"RFBKZpjx\",\"emojisBackdrop\":\"RFBKZpjx\",\"open\":\"zi1NlOXX\",\"emojis\":\"DFco1VIN\",\"emoji-tooltip\":\"MRIShZ3V\",\"emojiTooltip\":\"MRIShZ3V\",\"user-info\":\"eaUe2A0c\",\"userInfo\":\"eaUe2A0c\",\"buttons\":\"qIeflO02\",\"leave\":\"hclywYYk\",\"accept\":\"ln_ZBUHy\",\"accept-icon\":\"cVRd3twS\",\"acceptIcon\":\"cVRd3twS\",\"main-video\":\"bGlBFSJq\",\"mainVideo\":\"bGlBFSJq\",\"second-video\":\"TOFu1n5x\",\"secondVideo\":\"TOFu1n5x\",\"visible\":\"LOnSFN9w\",\"fullscreen\":\"Omg5T1o6\"};","import '../../../global/actions/calls';\n\nimport {\n memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getActions, withGlobal } from '../../../global';\n\nimport type { ApiPhoneCall, ApiUser } from '../../../api/types';\n\nimport {\n getStreams, IS_SCREENSHARE_SUPPORTED, switchCameraInputP2p, toggleStreamP2p,\n} from '../../../lib/secret-sauce';\nimport { selectTabState } from '../../../global/selectors';\nimport { selectPhoneCallUser } from '../../../global/selectors/calls';\nimport {\n IS_ANDROID,\n IS_IOS,\n IS_REQUEST_FULLSCREEN_SUPPORTED,\n} from '../../../util/browser/windowEnvironment';\nimport buildClassName from '../../../util/buildClassName';\nimport { formatMediaDuration } from '../../../util/dates/dateFormat';\nimport { getServerTime } from '../../../util/serverTime';\nimport { LOCAL_TGS_URLS } from '../../common/helpers/animatedAssets';\nimport renderText from '../../common/helpers/renderText';\n\nimport useInterval from '../../../hooks/schedulers/useInterval';\nimport useAppLayout from '../../../hooks/useAppLayout';\nimport useFlag from '../../../hooks/useFlag';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\nimport useOldLang from '../../../hooks/useOldLang';\n\nimport AnimatedIcon from '../../common/AnimatedIcon';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport PhoneCallButton from './PhoneCallButton';\n\nimport styles from './PhoneCall.module.scss';\n\ntype StateProps = {\n user?: ApiUser;\n phoneCall?: ApiPhoneCall;\n isOutgoing: boolean;\n isCallPanelVisible?: boolean;\n};\n\nconst PhoneCall = ({\n user,\n isOutgoing,\n phoneCall,\n isCallPanelVisible,\n}: StateProps) => {\n const lang = useOldLang();\n const {\n hangUp, requestMasterAndAcceptCall, playGroupCallSound, toggleGroupCallPanel, connectToActivePhoneCall,\n } = getActions();\n const containerRef = useRef();\n\n const [isFullscreen, openFullscreen, closeFullscreen] = useFlag();\n const { isMobile } = useAppLayout();\n\n const toggleFullscreen = useCallback(() => {\n if (isFullscreen) {\n closeFullscreen();\n } else {\n openFullscreen();\n }\n }, [closeFullscreen, isFullscreen, openFullscreen]);\n\n const handleToggleFullscreen = useCallback(() => {\n if (!containerRef.current) return;\n\n if (isFullscreen) {\n document.exitFullscreen().then(closeFullscreen);\n } else {\n containerRef.current.requestFullscreen().then(openFullscreen);\n }\n }, [closeFullscreen, isFullscreen, openFullscreen]);\n\n useEffect(() => {\n if (!IS_REQUEST_FULLSCREEN_SUPPORTED) return undefined;\n const container = containerRef.current;\n if (!container) return undefined;\n\n container.addEventListener('fullscreenchange', toggleFullscreen);\n\n return () => {\n container.removeEventListener('fullscreenchange', toggleFullscreen);\n };\n }, [toggleFullscreen]);\n\n const handleClose = useCallback(() => {\n toggleGroupCallPanel();\n if (isFullscreen) {\n closeFullscreen();\n }\n }, [closeFullscreen, isFullscreen, toggleGroupCallPanel]);\n\n const isDiscarded = phoneCall?.state === 'discarded';\n const isBusy = phoneCall?.reason === 'busy';\n\n const isIncomingRequested = phoneCall?.state === 'requested' && !isOutgoing;\n const isOutgoingRequested = (phoneCall?.state === 'requested' || phoneCall?.state === 'waiting') && isOutgoing;\n const isActive = phoneCall?.state === 'active';\n const isConnected = phoneCall?.isConnected;\n\n const [isHangingUp, startHangingUp, stopHangingUp] = useFlag();\n const handleHangUp = useCallback(() => {\n startHangingUp();\n hangUp();\n }, [hangUp, startHangingUp]);\n\n useEffect(() => {\n if (isHangingUp) {\n playGroupCallSound({ sound: 'end' });\n } else if (isIncomingRequested) {\n playGroupCallSound({ sound: 'incoming' });\n } else if (isBusy) {\n playGroupCallSound({ sound: 'busy' });\n } else if (isDiscarded) {\n playGroupCallSound({ sound: 'end' });\n } else if (isOutgoingRequested) {\n playGroupCallSound({ sound: 'ringing' });\n } else if (isConnected) {\n playGroupCallSound({ sound: 'connect' });\n }\n }, [isBusy, isDiscarded, isIncomingRequested, isOutgoingRequested, isConnected, playGroupCallSound, isHangingUp]);\n\n useEffect(() => {\n if (phoneCall?.id) {\n stopHangingUp();\n } else {\n connectToActivePhoneCall();\n }\n }, [connectToActivePhoneCall, phoneCall?.id, stopHangingUp]);\n\n const forceUpdate = useForceUpdate();\n\n useInterval(forceUpdate, isConnected ? 1000 : undefined);\n\n const callStatus = useMemo(() => {\n const state = phoneCall?.state;\n if (isHangingUp) {\n return lang('lng_call_status_hanging');\n }\n if (isBusy) return 'busy';\n if (state === 'requesting') {\n return lang('lng_call_status_requesting');\n } else if (state === 'requested') {\n return isOutgoing ? lang('lng_call_status_ringing') : lang('lng_call_status_incoming');\n } else if (state === 'waiting') {\n return lang('lng_call_status_waiting');\n } else if (state === 'active' && isConnected) {\n return undefined;\n } else {\n return lang('lng_call_status_exchanging');\n }\n }, [isBusy, isConnected, isHangingUp, isOutgoing, lang, phoneCall?.state]);\n\n const hasVideo = phoneCall?.videoState === 'active';\n const hasPresentation = phoneCall?.screencastState === 'active';\n\n const streams = getStreams();\n const hasOwnAudio = streams?.ownAudio?.getTracks()[0].enabled;\n const hasOwnPresentation = streams?.ownPresentation?.getTracks()[0].enabled;\n const hasOwnVideo = streams?.ownVideo?.getTracks()[0].enabled;\n\n const [isHidingPresentation, startHidingPresentation, stopHidingPresentation] = useFlag();\n const [isHidingVideo, startHidingVideo, stopHidingVideo] = useFlag();\n\n const handleTogglePresentation = useCallback(() => {\n if (hasOwnPresentation) {\n startHidingPresentation();\n }\n if (hasOwnVideo) {\n startHidingVideo();\n }\n setTimeout(async () => {\n await toggleStreamP2p('presentation');\n stopHidingPresentation();\n stopHidingVideo();\n }, 250);\n }, [\n hasOwnPresentation, hasOwnVideo, startHidingPresentation, startHidingVideo, stopHidingPresentation, stopHidingVideo,\n ]);\n\n const handleToggleVideo = useCallback(() => {\n if (hasOwnVideo) {\n startHidingVideo();\n }\n if (hasOwnPresentation) {\n startHidingPresentation();\n }\n setTimeout(async () => {\n await toggleStreamP2p('video');\n stopHidingPresentation();\n stopHidingVideo();\n }, 250);\n }, [\n hasOwnPresentation, hasOwnVideo, startHidingPresentation, startHidingVideo, stopHidingPresentation, stopHidingVideo,\n ]);\n\n const handleToggleAudio = useCallback(() => {\n void toggleStreamP2p('audio');\n }, []);\n\n const [isEmojiOpen, openEmoji, closeEmoji] = useFlag();\n\n const [isFlipping, startFlipping, stopFlipping] = useFlag();\n\n const handleFlipCamera = useCallback(() => {\n startFlipping();\n switchCameraInputP2p();\n setTimeout(stopFlipping, 250);\n }, [startFlipping, stopFlipping]);\n\n const timeElapsed = phoneCall?.startDate && (getServerTime() - phoneCall.startDate);\n\n useEffect(() => {\n if (phoneCall?.state === 'discarded') {\n setTimeout(hangUp, 250);\n }\n }, [hangUp, phoneCall?.reason, phoneCall?.state]);\n\n return (\n \n \n {phoneCall?.screencastState === 'active' && streams?.presentation\n &&