{"version":3,"file":"main.a8f30d600accf16466c0.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = new Map();\n var countMap = new Map();\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result + (queryMap.has(chunkId) ? '?' + queryMap.get(chunkId) : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.has(chunkId) ? countMap.get(chunkId) : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n setTimeout(function () {\n var retryAttempt = 999999 - retries + 1;\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap.set(chunkId, cacheBust);\n countMap.set(chunkId, retries - 1);\n resolve(__webpack_require__.e(chunkId));\n }, 3000);\n });\n });\n };\n }\n})();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\r\nimport {IS_MOBILE} from '../environment/userAgent';\r\nimport getTimeFormat from '../helpers/getTimeFormat';\r\nimport {nextRandomUint} from '../helpers/random';\r\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\r\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\r\nimport DialogsStorage from '../lib/storages/dialogs';\r\nimport FiltersStorage from '../lib/storages/filters';\r\nimport {AuthState} from '../types';\r\nimport App from './app';\r\n\r\nconst STATE_VERSION = App.version;\r\nconst BUILD = App.build;\r\n\r\nexport type Background = {\r\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\r\n blur: boolean,\r\n highlightningColor?: string,\r\n color?: string,\r\n slug?: string, // image slug\r\n intensity?: number, // pattern intensity\r\n id: string | number, // wallpaper id\r\n};\r\n\r\nexport type Theme = {\r\n name: 'day' | 'night' | 'system',\r\n background: Background\r\n};\r\n\r\nexport type AutoDownloadPeerTypeSettings = {\r\n contacts: boolean,\r\n private: boolean,\r\n groups: boolean,\r\n channels: boolean\r\n};\r\n\r\nexport type State = {\r\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\r\n pinnedOrders: DialogsStorage['pinnedOrders'],\r\n // contactsList: UserId[],\r\n contactsListCachedTime: number,\r\n updates: Partial<{\r\n seq: number,\r\n pts: number,\r\n date: number\r\n }>,\r\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\r\n filtersArr?: FiltersStorage['filtersArr'],\r\n maxSeenMsgId: number,\r\n stateCreatedTime: number,\r\n recentEmoji: string[],\r\n recentCustomEmoji: DocId[],\r\n topPeersCache: {\r\n [type in TopPeerType]?: {\r\n peers: MyTopPeer[],\r\n cachedTime: number\r\n }\r\n },\r\n recentSearch: PeerId[],\r\n version: typeof STATE_VERSION,\r\n build: typeof BUILD,\r\n authState: AuthState,\r\n hiddenPinnedMessages: {[peerId: PeerId]: number},\r\n settings: {\r\n messagesTextSize: number,\r\n distanceUnit: 'kilometers' | 'miles',\r\n sendShortcut: 'enter' | 'ctrlEnter',\r\n animationsEnabled: boolean,\r\n autoDownload: {\r\n contacts?: boolean, // ! DEPRECATED\r\n private?: boolean, // ! DEPRECATED\r\n groups?: boolean, // ! DEPRECATED\r\n channels?: boolean, // ! DEPRECATED\r\n photo: AutoDownloadPeerTypeSettings,\r\n video: AutoDownloadPeerTypeSettings,\r\n file: AutoDownloadPeerTypeSettings\r\n },\r\n autoDownloadNew: AutoDownloadSettings,\r\n autoPlay: {\r\n gifs: boolean,\r\n videos: boolean\r\n },\r\n stickers: {\r\n suggest: boolean,\r\n loop: boolean\r\n },\r\n emoji: {\r\n suggest: boolean,\r\n big: boolean\r\n },\r\n background?: Background, // ! DEPRECATED\r\n themes: Theme[],\r\n theme: Theme['name'],\r\n notifications: {\r\n sound: boolean\r\n },\r\n nightTheme?: boolean, // ! DEPRECATED\r\n timeFormat: 'h12' | 'h23'\r\n },\r\n playbackParams: ReturnType,\r\n keepSigned: boolean,\r\n chatContextMenuHintWasShown: boolean,\r\n stateId: number,\r\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\r\n};\r\n\r\nconst BACKGROUND_DAY_DESKTOP: Background = {\r\n blur: false,\r\n slug: 'pattern',\r\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\r\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\r\n intensity: 50,\r\n id: '1'\r\n};\r\n\r\nconst BACKGROUND_DAY_MOBILE: Background = {\r\n blur: false,\r\n slug: '',\r\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\r\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\r\n intensity: 0,\r\n id: '1'\r\n};\r\n\r\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\r\n blur: false,\r\n slug: 'pattern',\r\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\r\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\r\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\r\n intensity: -50,\r\n id: '-1'\r\n};\r\n\r\nconst BACKGROUND_NIGHT_MOBILE: Background = {\r\n blur: false,\r\n slug: '',\r\n color: '#0f0f0f',\r\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\r\n intensity: 0,\r\n id: '-1'\r\n};\r\n\r\nexport const STATE_INIT: State = {\r\n allDialogsLoaded: {},\r\n pinnedOrders: {},\r\n // contactsList: [],\r\n contactsListCachedTime: 0,\r\n updates: {},\r\n filtersArr: [],\r\n maxSeenMsgId: 0,\r\n stateCreatedTime: Date.now(),\r\n recentEmoji: [],\r\n recentCustomEmoji: [],\r\n topPeersCache: {},\r\n recentSearch: [],\r\n version: STATE_VERSION,\r\n build: BUILD,\r\n authState: {\r\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\r\n },\r\n hiddenPinnedMessages: {},\r\n settings: {\r\n messagesTextSize: 16,\r\n distanceUnit: 'kilometers',\r\n sendShortcut: 'enter',\r\n animationsEnabled: true,\r\n autoDownload: {\r\n photo: {\r\n contacts: true,\r\n private: true,\r\n groups: true,\r\n channels: true\r\n },\r\n video: {\r\n contacts: true,\r\n private: true,\r\n groups: true,\r\n channels: true\r\n },\r\n file: {\r\n contacts: true,\r\n private: true,\r\n groups: true,\r\n channels: true\r\n }\r\n },\r\n autoDownloadNew: {\r\n _: 'autoDownloadSettings',\r\n file_size_max: 3145728,\r\n pFlags: {\r\n video_preload_large: true,\r\n audio_preload_next: true\r\n },\r\n photo_size_max: 1048576,\r\n video_size_max: 15728640,\r\n video_upload_maxbitrate: 100\r\n },\r\n autoPlay: {\r\n gifs: true,\r\n videos: true\r\n },\r\n stickers: {\r\n suggest: true,\r\n loop: true\r\n },\r\n emoji: {\r\n suggest: true,\r\n big: true\r\n },\r\n themes: [{\r\n name: 'day',\r\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\r\n }, {\r\n name: 'night',\r\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\r\n }],\r\n theme: 'system',\r\n notifications: {\r\n sound: false\r\n },\r\n timeFormat: getTimeFormat()\r\n },\r\n playbackParams: {\r\n volume: 1,\r\n muted: false,\r\n playbackRate: 1,\r\n playbackRates: {\r\n voice: 1,\r\n video: 1,\r\n audio: 1\r\n },\r\n loop: false,\r\n round: false\r\n },\r\n keepSigned: true,\r\n chatContextMenuHintWasShown: false,\r\n stateId: nextRandomUint(32),\r\n notifySettings: {}\r\n};\r\n","export default function getTimeFormat(): 'h12' | 'h23' {\r\n // try {\r\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\r\n // if('hourCycle' in resolvedOptions) {\r\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\r\n // } else {\r\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\r\n // }\r\n // } catch(err) {\r\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\r\n // }\r\n}\r\n","let IS_APPLE_MX = false;\r\n\r\ntry {\r\n // Awesome detect from https://stackoverflow.com/a/65412357\r\n const ctx = document.createElement('canvas').getContext('webgl');\r\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\r\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\r\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\r\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\r\n IS_APPLE_MX = true;\r\n }\r\n} catch(err) {\r\n\r\n}\r\n\r\nexport default IS_APPLE_MX;\r\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\r\n\r\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\r\n\r\nexport default IS_CALL_SUPPORTED;\r\n","import {IS_SAFARI} from './userAgent';\r\n\r\n/*\r\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\r\n * transfer data between WebWorkers and the main thread.\r\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\r\n *\r\n * This should be removed once the underlying Safari issue is fixed.\r\n */\r\n\r\nlet CAN_USE_TRANSFERABLES: boolean;\r\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\r\nelse {\r\n try {\r\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\r\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\r\n } catch(err) {\r\n CAN_USE_TRANSFERABLES = false;\r\n }\r\n}\r\n\r\nexport default CAN_USE_TRANSFERABLES;\r\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\n\r\nexport default IS_CANVAS_FILTER_SUPPORTED;\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\r\n\r\nexport default IS_GEOLOCATION_SUPPORTED;\r\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\r\n\r\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\r\n\r\nexport default IS_GROUP_CALL_SUPPORTED;\r\n","import IS_WEBP_SUPPORTED from './webpSupport';\r\n\r\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/bmp'\r\n]);\r\n\r\nif(IS_WEBP_SUPPORTED) {\r\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\r\n}\r\n\r\nexport default IMAGE_MIME_TYPES_SUPPORTED;\r\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\r\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\r\n\r\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\r\n\r\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\r\n\r\nexport default MEDIA_MIME_TYPES_SUPPORTED;\r\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\r\n\r\n// mov is not supported in Chrome on macOS\r\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\r\n\r\nexport default IS_MOV_SUPPORTED;\r\n","const audio = document.createElement('audio');\r\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n\r\nexport default IS_OPUS_SUPPORTED;\r\n","import {IS_FIREFOX} from './userAgent';\r\n\r\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\r\n\r\nexport default IS_PARALLAX_SUPPORTED;\r\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\r\n\r\nexport default IS_SCREEN_SHARING_SUPPORTED;\r\n","const IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined'/* && false */;\r\n\r\nexport default IS_SHARED_WORKER_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\nexport default IS_TOUCH_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\r\n\r\nexport default IS_VIBRATE_SUPPORTED;\r\n","import IS_MOV_SUPPORTED from './movSupport';\r\n\r\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\r\n 'image/gif', // have to display it as video\r\n 'video/mp4',\r\n 'video/webm'\r\n]);\r\n\r\nif(IS_MOV_SUPPORTED) {\r\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\r\n}\r\n\r\nexport default VIDEO_MIME_TYPES_SUPPORTED;\r\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\r\n\r\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\r\n\r\nexport default IS_WEBM_SUPPORTED;\r\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\r\n\r\nexport default IS_WEBP_SUPPORTED;\r\n","import {IS_FIREFOX} from './userAgent';\r\n\r\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\r\n\r\nexport default IS_WEBRTC_SUPPORTED;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h: number, s: number;\r\n const l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch(max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n\r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = hexa[0] === '#' ? 1 : 0;\r\n if(hexa.length === (5 + offset)) {\r\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\r\n }\r\n\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","export default function compareVersion(v1: string, v2: string): number {\r\n v1 = v1.split(' ', 1)[0];\r\n v2 = v2.split(' ', 1)[0];\r\n const s1 = v1.split('.');\r\n const s2 = v2.split('.');\r\n\r\n for(let i = 0; i < s1.length; ++i) {\r\n const v1 = +s1[i];\r\n const v2 = +s2[i];\r\n if(v1 > v2) return 1;\r\n else if(v1 < v2) return -1;\r\n }\r\n\r\n return 0;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if((document.activeElement as HTMLInputElement)?.blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className))\r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {doubleRaf} from '../schedulers';\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n\r\n // setTimeout(() => {\r\n doubleRaf().then(() => {\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n\r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n });\r\n // }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\r\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\r\nimport findUpClassName from './findUpClassName';\r\nimport fixSafariStickyInput from './fixSafariStickyInput';\r\n\r\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\r\n\r\nif(IS_STICKY_INPUT_BUGGED) {\r\n const key: 'clientY' | 'pageY' = 'clientY';\r\n let startY = 0;\r\n const o = {capture: true, passive: false};\r\n const onTouchMove = (e: TouchEvent) => {\r\n const touch = e.touches[0];\r\n\r\n // console.log('touchmove y', touch[key], startY);\r\n\r\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\r\n if(scrollable) {\r\n const y = touch[key];\r\n const scrolled = startY - y;\r\n\r\n /* if(y < startY) {\r\n startY = y;\r\n } */\r\n\r\n const scrollTop = scrollable.scrollTop;\r\n const scrollHeight = scrollable.scrollHeight;\r\n const clientHeight = scrollable.clientHeight;\r\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\r\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\r\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\r\n if(needCancel) {\r\n e.preventDefault();\r\n }\r\n\r\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\r\n } else {\r\n e.preventDefault();\r\n\r\n // console.log('touchmove no scrollable', e, touch);\r\n }\r\n\r\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\r\n };\r\n\r\n // let el = document.createElement('div');\r\n // document.body.prepend(el);\r\n // let a = 0;\r\n\r\n // let hasFocus = false;\r\n let lastFocusOutTimeStamp = 0;\r\n document.addEventListener('focusin', (e) => {\r\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\r\n return;\r\n }\r\n\r\n // console.log('focusin', e, e.timeStamp);\r\n\r\n // hasFocus = true;\r\n // document.body.classList.add('is-keyboard-opened');\r\n\r\n // el.innerText = 'focusin ' + ++a;\r\n\r\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\r\n\r\n document.addEventListener('touchmove', onTouchMove, o);\r\n document.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n const touchStart = e.touches[0];\r\n\r\n startY = touchStart[key];\r\n });\r\n }, {passive: true});\r\n\r\n document.addEventListener('focusout', (e) => {\r\n // console.log('focusout', e, e.timeStamp);\r\n document.removeEventListener('touchmove', onTouchMove, o);\r\n\r\n lastFocusOutTimeStamp = e.timeStamp;\r\n\r\n // el.innerText = 'focusout ' + ++a;\r\n\r\n // if(hasFocus) {\r\n // hasFocus = false;\r\n // document.body.classList.remove('is-keyboard-opened');\r\n // }\r\n }, {passive: true});\r\n\r\n document.addEventListener('visibilitychange', () => {\r\n // console.log('window visibilitychange');\r\n if(document.activeElement &&\r\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\r\n (document.activeElement as HTMLElement).blur) {\r\n fixSafariStickyInput(document.activeElement as HTMLElement);\r\n }\r\n\r\n /* blurActiveElement();\r\n window.scrollTo(0, 0);\r\n setVH(); */\r\n }, {passive: true});\r\n}\r\n\r\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\r\n if(!IS_STICKY_INPUT_BUGGED) return;\r\n input.classList.add('is-sticky-input-bugged');\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from '../noop';\r\nimport pause from '../schedulers/pause';\r\n\r\nconst texts = ['b', 'б'];\r\ntype FontType = 'text' | 'icons' | 'monospace';\r\n\r\nconst cache: {\r\n [key: string]: {\r\n [text: string]: Promise\r\n }\r\n} = {};\r\n\r\nconst fonts: {[type in FontType]: string} = {\r\n text: 'Roboto',\r\n icons: 'tgico',\r\n monospace: 'Roboto Mono'\r\n};\r\n\r\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\r\n text: texts,\r\n icons: undefined,\r\n monospace: texts\r\n}): Promise {\r\n if(!('fonts' in document)) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises: Promise[] = [];\r\n for(const type in types) {\r\n let _texts = types[type as FontType];\r\n if(_texts === 'all') {\r\n _texts = texts;\r\n }\r\n\r\n const font = fonts[type as FontType];\r\n const weights = type === 'icons' ? [500] : [400, 500];\r\n for(const weight of weights) {\r\n const _promises = (_texts || [undefined]).map((text) => {\r\n const key = [weight, '1rem', font].join(' ');\r\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\r\n return promise;\r\n });\r\n promises.push(..._promises);\r\n }\r\n }\r\n\r\n return Promise.race([\r\n Promise.all(promises).catch(noop),\r\n pause(1000)\r\n ]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport EventListenerBase from './eventListenerBase';\r\n\r\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\r\nconst DO_NOT_IDLE = false;\r\n\r\nexport class IdleController extends EventListenerBase<{\r\n change: (idle: boolean) => void\r\n}> {\r\n private _isIdle: boolean;\r\n\r\n private focusPromise: Promise;\r\n private focusResolve: () => void;\r\n\r\n constructor() {\r\n super();\r\n\r\n this._isIdle = true;\r\n this.focusPromise = Promise.resolve();\r\n this.focusResolve = () => {};\r\n\r\n window.addEventListener('blur', () => {\r\n this.isIdle = true;\r\n\r\n window.addEventListener('focus', () => {\r\n this.isIdle = false;\r\n }, {once: true});\r\n });\r\n\r\n // * Prevent setting online after reloading page\r\n window.addEventListener(FOCUS_EVENT_NAME, () => {\r\n this.isIdle = false;\r\n }, {once: true, passive: true});\r\n\r\n this.addEventListener('change', (idle) => {\r\n if(idle) {\r\n this.focusPromise = new Promise((resolve) => {\r\n this.focusResolve = resolve;\r\n });\r\n } else {\r\n this.focusResolve();\r\n }\r\n });\r\n }\r\n\r\n public getFocusPromise() {\r\n return this.focusPromise;\r\n }\r\n\r\n public get isIdle() {\r\n return this._isIdle;\r\n }\r\n\r\n public set isIdle(value: boolean) {\r\n if(this._isIdle === value) {\r\n return;\r\n }\r\n\r\n if(DO_NOT_IDLE && value) {\r\n return;\r\n }\r\n\r\n this._isIdle = value;\r\n this.dispatchEvent('change', value);\r\n }\r\n}\r\n\r\nconst idleController = new IdleController();\r\nexport default idleController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from './eventListenerBase';\r\n\r\nexport class OverlayCounter extends EventListenerBase<{\r\n change: (isActive: boolean) => void\r\n}> {\r\n public overlaysActive = 0;\r\n\r\n get isOverlayActive() {\r\n return this.overlaysActive > 0;\r\n }\r\n\r\n set isOverlayActive(value: boolean) {\r\n this.overlaysActive += value ? 1 : -1;\r\n this.dispatchEvent('change', this.isOverlayActive);\r\n }\r\n}\r\n\r\nconst overlayCounter = new OverlayCounter();\r\nexport default overlayCounter;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport {NoneToVoidFunction} from '../types';\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\r\n const params: any = {};\r\n if(!splitted[1]) return params;\r\n splitted[1].split('&').forEach((item) => {\r\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\r\n });\r\n\r\n return params;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Theme} from '../config/state';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport {hslaStringToHex} from './color';\r\n\r\nexport class ThemeController {\r\n private themeColor: string;\r\n private _themeColorElem: Element;\r\n private systemTheme: Theme['name'];\r\n\r\n constructor() {\r\n rootScope.addEventListener('theme_change', () => {\r\n this.setTheme();\r\n });\r\n\r\n // rootScope.addEventListener('settings_updated', ())\r\n }\r\n\r\n private get themeColorElem() {\r\n if(this._themeColorElem !== undefined) {\r\n return this._themeColorElem;\r\n }\r\n\r\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\r\n }\r\n\r\n public setThemeColor(color = this.themeColor) {\r\n if(!color) {\r\n color = this.isNight() ? '#212121' : '#ffffff';\r\n }\r\n\r\n const themeColorElem = this.themeColorElem;\r\n if(themeColorElem) {\r\n themeColorElem.setAttribute('content', color);\r\n }\r\n }\r\n\r\n public setThemeListener() {\r\n try {\r\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const checkDarkMode = () => {\r\n // const theme = this.getTheme();\r\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\r\n // const newTheme = this.getTheme();\r\n\r\n if(rootScope.myId) {\r\n rootScope.dispatchEvent('theme_change');\r\n } else {\r\n this.setTheme();\r\n }\r\n };\r\n\r\n if('addEventListener' in darkModeMediaQuery) {\r\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\r\n } else if('addListener' in darkModeMediaQuery) {\r\n (darkModeMediaQuery as any).addListener(checkDarkMode);\r\n }\r\n\r\n checkDarkMode();\r\n } catch(err) {\r\n\r\n }\r\n }\r\n\r\n public applyHighlightningColor() {\r\n let hsla: string;\r\n const theme = themeController.getTheme();\r\n if(theme.background.highlightningColor) {\r\n hsla = theme.background.highlightningColor;\r\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\r\n } else {\r\n document.documentElement.style.removeProperty('--message-highlightning-color');\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && hsla) {\r\n themeController.themeColor = hslaStringToHex(hsla);\r\n }\r\n }\r\n\r\n public setTheme() {\r\n const isNight = this.isNight();\r\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\r\n if(colorScheme) {\r\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\r\n }\r\n\r\n document.documentElement.classList.toggle('night', isNight);\r\n this.setThemeColor();\r\n\r\n this.applyHighlightningColor();\r\n }\r\n\r\n public isNight() {\r\n return this.getTheme().name === 'night';\r\n }\r\n\r\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\r\n return rootScope.settings.themes.find((t) => t.name === name);\r\n }\r\n}\r\n\r\nconst themeController = new ThemeController();\r\nexport default themeController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setWorkerProxy() {\r\n // * hook worker constructor to set search parameters (test, debug, etc)\r\n const workerHandler = {\r\n construct(target: any, args: any) {\r\n let url = args[0] + '';\r\n if(url.indexOf('blob:') !== 0) {\r\n url += location.search;\r\n }\r\n\r\n return new target(url);\r\n }\r\n };\r\n\r\n [\r\n Worker,\r\n typeof(SharedWorker) !== 'undefined' && SharedWorker\r\n ].filter(Boolean).forEach((w) => {\r\n window[w.name as any] = new Proxy(w, workerHandler);\r\n });\r\n}\r\n\r\nsetWorkerProxy();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from './config/app';\r\nimport blurActiveElement from './helpers/dom/blurActiveElement';\r\nimport cancelEvent from './helpers/dom/cancelEvent';\r\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\r\nimport loadFonts from './helpers/dom/loadFonts';\r\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\r\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\r\nimport './materialize.scss';\r\nimport './scss/style.scss';\r\nimport pause from './helpers/schedulers/pause';\r\nimport setWorkerProxy from './helpers/setWorkerProxy';\r\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\r\nimport rootScope from './lib/rootScope';\r\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\r\nimport I18n from './lib/langPack';\r\nimport './helpers/peerIdPolyfill';\r\nimport './lib/polyfill';\r\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\r\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\r\nimport themeController from './helpers/themeController';\r\nimport overlayCounter from './helpers/overlayCounter';\r\nimport singleInstance from './lib/mtproto/singleInstance';\r\nimport parseUriParams from './helpers/string/parseUriParams';\r\nimport Modes from './config/modes';\r\nimport {AuthState} from './types';\r\n// import appNavigationController from './components/appNavigationController';\r\n\r\ndocument.addEventListener('DOMContentLoaded', async() => {\r\n toggleAttributePolyfill();\r\n\r\n // polyfill for replaceChildren\r\n if((Node as any).prototype.replaceChildren === undefined) {\r\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\r\n this.textContent = '';\r\n // while(this.lastChild) {\r\n // this.removeChild(this.lastChild);\r\n // }\r\n if(nodes) {\r\n this.append(...nodes);\r\n }\r\n }\r\n }\r\n\r\n rootScope.managers = getProxiedManagers();\r\n\r\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\r\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\r\n\r\n singleInstance.start();\r\n\r\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\r\n const w = window.visualViewport || window; // * handle iOS keyboard\r\n let setViewportVH = false/* , hasFocus = false */;\r\n let lastVH: number;\r\n const setVH = () => {\r\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\r\n if(lastVH === vh) {\r\n return;\r\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\r\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\r\n }\r\n\r\n lastVH = vh;\r\n\r\n // const vh = document.documentElement.scrollHeight * 0.01;\r\n document.documentElement.style.setProperty('--vh', `${vh}px`);\r\n\r\n // console.log('setVH', vh, setViewportVH ? w : window);\r\n\r\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\r\n const rect = document.activeElement.getBoundingClientRect();\r\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\r\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\r\n }\r\n } */\r\n };\r\n\r\n setWorkerProxy;\r\n\r\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\r\n // import('./lib/polyfill'),\r\n // import('./environment/touchSupport'),\r\n // import('./environment/userAgent'),\r\n // import('./lib/rootScope'),\r\n // import('./lib/appManagers/appStateManager'),\r\n // import('./lib/langPack'),\r\n // import('./helpers/peerIdPolyfill'),\r\n // // import('./helpers/cacheFunctionPolyfill')\r\n // ]);\r\n\r\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\r\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\r\n const rootScope = _rootScope.default;\r\n const appStateManager = _appStateManager.default;\r\n const I18n = _I18n.default; */\r\n\r\n window.addEventListener('resize', setVH);\r\n setVH();\r\n\r\n if(IS_STICKY_INPUT_BUGGED) {\r\n const toggleResizeMode = () => {\r\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\r\n setVH();\r\n\r\n if(w !== window) {\r\n if(setViewportVH) {\r\n window.removeEventListener('resize', setVH);\r\n w.addEventListener('resize', setVH);\r\n } else {\r\n w.removeEventListener('resize', setVH);\r\n window.addEventListener('resize', setVH);\r\n }\r\n }\r\n };\r\n\r\n let tabId: number;\r\n (window as any).onImTabChange = (id: number) => {\r\n const wasTabId = tabId !== undefined;\r\n tabId = id;\r\n\r\n if(wasTabId || tabId === 1) {\r\n toggleResizeMode();\r\n }\r\n };\r\n\r\n overlayCounter.addEventListener('change', () => {\r\n toggleResizeMode();\r\n });\r\n }\r\n\r\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\r\n document.addEventListener('dragstart', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\r\n cancelEvent(e);\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if(IS_EMOJI_SUPPORTED) {\r\n document.documentElement.classList.add('native-emoji');\r\n }\r\n\r\n // prevent firefox image dragging\r\n document.addEventListener('dragstart', (e) => {\r\n if((e.target as HTMLElement)?.tagName === 'IMG') {\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n\r\n // restrict contextmenu on images (e.g. webp stickers)\r\n document.addEventListener('contextmenu', (e) => {\r\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\r\n cancelEvent(e);\r\n }\r\n });\r\n\r\n if(IS_FIREFOX) {\r\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\r\n }\r\n\r\n if(IS_MOBILE) {\r\n document.documentElement.classList.add('is-mobile');\r\n }\r\n\r\n if(IS_APPLE) {\r\n if(IS_SAFARI) {\r\n document.documentElement.classList.add('is-safari');\r\n }\r\n\r\n // document.documentElement.classList.add('emoji-supported');\r\n\r\n if(IS_APPLE_MOBILE) {\r\n document.documentElement.classList.add('is-ios');\r\n } else {\r\n document.documentElement.classList.add('is-mac');\r\n }\r\n } else if(IS_ANDROID) {\r\n document.documentElement.classList.add('is-android');\r\n\r\n /* document.addEventListener('focusin', (e) => {\r\n hasFocus = true;\r\n focusTime = Date.now();\r\n }, {passive: true});\r\n\r\n document.addEventListener('focusout', () => {\r\n hasFocus = false;\r\n }, {passive: true}); */\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n document.documentElement.classList.add('no-touch');\r\n } else {\r\n document.documentElement.classList.add('is-touch');\r\n /* document.addEventListener('touchmove', (event: any) => {\r\n event = event.originalEvent || event;\r\n if(event.scale && event.scale !== 1) {\r\n event.preventDefault();\r\n }\r\n }, {capture: true, passive: false}); */\r\n }\r\n\r\n const perf = performance.now();\r\n\r\n // await pause(1000000);\r\n\r\n const langPromise = I18n.getCacheLangPack();\r\n\r\n const [stateResult, langPack] = await Promise.all([\r\n // loadState(),\r\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\r\n langPromise\r\n ]);\r\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\r\n\r\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\r\n rootScope.premium = isPremium;\r\n });\r\n\r\n themeController.setThemeListener();\r\n\r\n if(langPack.appVersion !== App.langPackVersion) {\r\n I18n.getLangPack(langPack.lang_code);\r\n }\r\n\r\n /**\r\n * won't fire if font is loaded too fast\r\n */\r\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\r\n elem.style.opacity = '0';\r\n\r\n promise.then(() => {\r\n window.requestAnimationFrame(() => {\r\n elem.style.opacity = '';\r\n });\r\n });\r\n }\r\n\r\n console.log('got state, time:', performance.now() - perf);\r\n\r\n let authState = stateResult.state.authState;\r\n\r\n const hash = location.hash;\r\n const splitted = hash.split('?');\r\n const params = parseUriParams(hash, splitted);\r\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\r\n const data: AuthState.signImport['data'] = {\r\n token: params.tgWebAuthToken,\r\n dcId: +params.tgWebAuthDcId,\r\n userId: params.tgWebAuthUserId.toUserId(),\r\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\r\n tgAddr: params.tgaddr\r\n };\r\n\r\n if(data.isTest !== Modes.test) {\r\n const urlSearchParams = new URLSearchParams(location.search);\r\n if(+params.tgWebAuthTest) {\r\n urlSearchParams.set('test', '1');\r\n } else {\r\n urlSearchParams.delete('test');\r\n }\r\n\r\n location.search = urlSearchParams.toString();\r\n return;\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\r\n\r\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\r\n }\r\n\r\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\r\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\r\n\r\n const el = document.getElementById('auth-pages');\r\n let scrollable: HTMLElement;\r\n if(el) {\r\n scrollable = el.querySelector('.scrollable') as HTMLElement;\r\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\r\n scrollable.classList.add('no-scrollbar');\r\n }\r\n\r\n // * don't remove this line\r\n scrollable.style.opacity = '0';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.classList.add('auth-placeholder');\r\n\r\n scrollable.prepend(placeholder);\r\n scrollable.append(placeholder.cloneNode());\r\n }\r\n\r\n try {\r\n await Promise.all([\r\n import('./lib/mtproto/telegramMeWebManager'),\r\n import('./lib/mtproto/webPushApiManager')\r\n ]).then(([meModule, pushModule]) => {\r\n meModule.default.setAuthorized(false);\r\n pushModule.default.forceUnsubscribe();\r\n });\r\n } catch(err) {\r\n\r\n }\r\n\r\n let pagePromise: Promise;\r\n // langPromise.then(async() => {\r\n switch(authState._) {\r\n case 'authStateSignIn':\r\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\r\n break;\r\n case 'authStateSignQr':\r\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\r\n break;\r\n case 'authStateAuthCode':\r\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\r\n break;\r\n case 'authStatePassword':\r\n pagePromise = (await import('./pages/pagePassword')).default.mount();\r\n break;\r\n case 'authStateSignUp':\r\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\r\n break;\r\n case 'authStateSignImport':\r\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\r\n break;\r\n }\r\n // });\r\n\r\n if(scrollable) {\r\n // wait for text appear\r\n if(pagePromise) {\r\n await pagePromise;\r\n }\r\n\r\n const promise = 'fonts' in document ?\r\n Promise.race([\r\n pause(1000),\r\n document.fonts.ready\r\n ]) :\r\n Promise.resolve();\r\n fadeInWhenFontsReady(scrollable, promise);\r\n }\r\n\r\n /* setTimeout(async() => {\r\n (await import('./pages/pageAuthCode')).default.mount({\r\n \"_\": \"auth.sentCode\",\r\n \"pFlags\": {},\r\n \"flags\": 6,\r\n \"type\": {\r\n \"_\": \"auth.sentCodeTypeSms\",\r\n \"length\": 5\r\n },\r\n \"phone_code_hash\": \"\",\r\n \"next_type\": {\r\n \"_\": \"auth.codeTypeCall\"\r\n },\r\n \"timeout\": 120,\r\n \"phone_number\": \"\"\r\n });\r\n\r\n (await import('./pages/pageSignQR')).default.mount();\r\n\r\n (await import('./pages/pagePassword')).default.mount();\r\n\r\n (await import('./pages/pageSignUp')).default.mount({\r\n \"phone_code_hash\": \"\",\r\n \"phone_number\": \"\"\r\n });\r\n }, 500); */\r\n } else {\r\n console.log('Will mount IM page:', Date.now() / 1000);\r\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\r\n (await import('./pages/pageIm')).default.mount();\r\n }\r\n});\r\n","export default function toggleAttributePolyfill() {\r\n if(!Element.prototype.toggleAttribute) {\r\n Element.prototype.toggleAttribute = function(name, force) {\r\n if(force !== void 0) force = !!force;\r\n\r\n if(this.hasAttribute(name)) {\r\n if(force) return true;\r\n\r\n this.removeAttribute(name);\r\n return false;\r\n }\r\n if(force === false) return false;\r\n\r\n this.setAttribute(name, '');\r\n return true;\r\n };\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type createManagers from './createManagers';\r\nimport {ModifyFunctionsToAsync} from '../../types';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\nimport {AckedResult} from '../mtproto/superMessagePort';\r\nimport noop from '../../helpers/noop';\r\nimport dT from '../../helpers/dT';\r\nimport DEBUG from '../../config/debug';\r\n\r\n// let stats: {\r\n// [manager: string]: {\r\n// [method: string]: {\r\n// times: number[],\r\n// byArgs: {\r\n// [args: string]: number[]\r\n// }\r\n// }\r\n// }\r\n// } = {};\r\n\r\n// let sentCount = 0;\r\n// let sentMethods: {[key: string]: number} = {};\r\n// let sentMethods2: {[key: string]: number} = {};\r\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\r\n// ++sentCount;\r\n\r\n// const key = [manager, method].join('-');\r\n// if(!sentMethods[key]) sentMethods[key] = 0;\r\n// ++sentMethods[key];\r\n\r\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\r\n\r\n// let byManager = stats[manager] ??= {};\r\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\r\n\r\n// const perf = performance.now();\r\n// promise.catch(noop).finally(() => {\r\n// const time = performance.now() - perf;\r\n// byMethod.times.push(time);\r\n\r\n// sentMethods2[key2] = time;\r\n\r\n// try {\r\n// const argsString = JSON.stringify(args);\r\n// byMethod.byArgs[argsString].push(time);\r\n// } catch(err) {}\r\n// });\r\n// }\r\n\r\n// setInterval(() => {\r\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\r\n// sentCount = 0;\r\n// sentMethods = {};\r\n// sentMethods2 = {};\r\n// }, 2000);\r\n\r\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\r\nif(DEBUG) {\r\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\r\n}\r\n\r\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\r\n const proxy = new Proxy({}, {\r\n get: (target, p, receiver) => {\r\n // console.log('get', target, p, receiver);\r\n // @ts-ignore\r\n // const value = source[p];\r\n // if(typeof(value) !== 'function') {\r\n // return value;\r\n // }\r\n\r\n return (...args: any[]) => {\r\n const promise = apiManagerProxy.invoke('manager', {\r\n name,\r\n method: p as string,\r\n args\r\n }, ack as any);\r\n\r\n if(DEBUG) {\r\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\r\n console.warn('manager request', name, p, args);\r\n }\r\n }\r\n\r\n // collectStats(name, p as string, args, promise);\r\n\r\n return promise;\r\n\r\n // @ts-ignore\r\n // return Promise.resolve(value.call(source, ...args));\r\n };\r\n }\r\n });\r\n\r\n return proxy;\r\n}\r\n\r\ntype AA = {\r\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\r\n};\r\n\r\ntype T = Awaited>;\r\ntype ProxiedManagers = {\r\n [name in keyof T]?: ModifyFunctionsToAsync;\r\n} & {\r\n acknowledged?: {\r\n [name in keyof T]?: AA;\r\n }\r\n};\r\n\r\nfunction createProxyProxy(proxied: any, ack?: boolean) {\r\n return new Proxy(proxied, {\r\n get: (target, p, receiver) => {\r\n // @ts-ignore\r\n return target[p] ??= createProxy(p as string, ack);\r\n }\r\n });\r\n}\r\n\r\nlet proxied: ProxiedManagers;\r\nexport default function getProxiedManagers() {\r\n if(proxied) {\r\n return proxied;\r\n }\r\n\r\n proxied = createProxyProxy({}, false);\r\n proxied.acknowledged = createProxyProxy({}, true);\r\n return proxied;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport {Database} from '../../config/databases';\r\nimport Modes from '../../config/modes';\r\nimport makeError from '../../helpers/makeError';\r\nimport safeAssign from '../../helpers/object/safeAssign';\r\nimport {logger} from '../logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string,\r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport class IDB {\r\n private static INSTANCES: IDB[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable: boolean;\r\n private log: ReturnType;\r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n\r\n constructor(db: Database) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storageIsAvailable = true;\r\n this.log = logger(['IDB', db.name].join('-'));\r\n this.log('constructor');\r\n\r\n this.openDatabase(true);\r\n\r\n IDB.INSTANCES.push(this);\r\n }\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\r\n const indexNames = Array.from(os.indexNames);\r\n for(const indexName of indexNames) {\r\n os.deleteIndex(indexName);\r\n }\r\n\r\n if(!store.indexes?.length) {\r\n return;\r\n }\r\n\r\n for(const index of store.indexes) {\r\n if(os.indexNames.contains(index.indexName)) {\r\n continue;\r\n }\r\n\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n };\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n createIndexes(os, store);\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n\r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n\r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n\r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n const target = event.target as IDBOpenDBRequest;\r\n const db = target.result;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n\r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n } else {\r\n const txn = target.transaction;\r\n const os = txn.objectStore(store.name);\r\n createIndexes(os, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public static create>(db: T) {\r\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDB) {\r\n this.INSTANCES.forEach((storage) => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\r\n private log: ReturnType;\r\n private storeName: T['stores'][0]['name'];\r\n private idb: IDB;\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n this.storeName = storeName;\r\n this.log = logger(['IDB', db.name, storeName].join('-'));\r\n this.idb = IDB.create(db);\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map((name) => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\r\n const promises = dbNames.map((dbName) => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n\r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n\r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\r\n // return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n public clear(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n // //return Promise.resolve(blobConstruct([blob]));\r\n // if(!(blob instanceof Blob)) {\r\n // blob = blobConstruct(blob);\r\n // }\r\n\r\n // return this.save(fileName, blob);\r\n // }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n\r\n reader.onerror = reject;\r\n });\r\n\r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n\r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[], storeName?: StoreName): Promise;\r\n public get(entryName: string, storeName?: StoreName): Promise;\r\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\r\n // return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n if(!entryName.length) {\r\n return Promise.resolve([]) as any;\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\r\n }\r\n\r\n private getObjectStore(\r\n mode: IDBTransactionMode,\r\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\r\n log?: string,\r\n storeName = this.storeName\r\n ) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.idb.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n const onError = () => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n\r\n // let resolved = false;\r\n const onComplete = (/* what: string */) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf/* , what */);\r\n }\r\n\r\n // if(resolved) {\r\n // return;\r\n // }\r\n\r\n // resolved = true;\r\n const results = requests.map((r) => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n\r\n transaction.onerror = onError;\r\n\r\n // * have to wait while clearing or setting something\r\n const waitForTransactionComplete = mode === 'readwrite';\r\n if(waitForTransactionComplete) {\r\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\r\n }\r\n\r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction, log);\r\n }, 10000);\r\n\r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n\r\n const callbackResult = callback(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(callbackResult);\r\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\r\n\r\n if(waitForTransactionComplete) {\r\n return;\r\n }\r\n\r\n const length = requests.length;\r\n let left = length;\r\n\r\n const onRequestFinished = () => {\r\n if(transaction.error) {\r\n return;\r\n }\r\n\r\n if(!--left) {\r\n onComplete(/* 'requests' */);\r\n }\r\n };\r\n\r\n for(let i = 0; i < length; ++i) {\r\n const request = requests[i];\r\n request.onerror = onError;\r\n request.onsuccess = onRequestFinished;\r\n }\r\n });\r\n });\r\n }\r\n\r\n public getAll(storeName?: StoreName): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n\r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type lang from '../lang';\r\nimport type langSign from '../langSign';\r\nimport type {State} from '../config/state';\r\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\r\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\r\nimport stateStorage from './stateStorage';\r\nimport App from '../config/app';\r\nimport rootScope from './rootScope';\r\nimport {IS_MOBILE} from '../environment/userAgent';\r\nimport deepEqual from '../helpers/object/deepEqual';\r\nimport safeAssign from '../helpers/object/safeAssign';\r\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\r\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\r\nimport wrapUrl from './richTextProcessor/wrapUrl';\r\n\r\nexport const langPack: {[actionType: string]: LangPackKey} = {\r\n 'messageActionChatCreate': 'ActionCreateGroup',\r\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\r\n 'messageActionChatEditTitle': 'ActionChangedTitle',\r\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\r\n 'messageActionChatEditVideo': 'ActionChangedVideo',\r\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\r\n 'messageActionChatReturn': 'ActionAddUserSelf',\r\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\r\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\r\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\r\n 'messageActionChatAddUser': 'ActionAddUser',\r\n 'messageActionChatAddUsers': 'ActionAddUser',\r\n 'messageActionChatLeave': 'ActionLeftUser',\r\n 'messageActionChatLeaveYou': 'YouLeft',\r\n 'messageActionChatDeleteUser': 'ActionKickUser',\r\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\r\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\r\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\r\n 'messageActionChannelCreate': 'ActionCreateChannel',\r\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\r\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\r\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\r\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\r\n 'messageActionHistoryClear': 'HistoryCleared',\r\n 'messageActionDiscussionStarted': 'DiscussionStarted',\r\n\r\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\r\n\r\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\r\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\r\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\r\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\r\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\r\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\r\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\r\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\r\n\r\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\r\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\r\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\r\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\r\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\r\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\r\n\r\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\r\n};\r\n\r\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\r\n\r\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\r\nexport type FormatterArguments = FormatterArgument[];\r\n\r\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\r\n\r\nnamespace I18n {\r\n export const strings: Map = new Map();\r\n export const countriesList: HelpCountry[] = [];\r\n let pluralRules: Intl.PluralRules;\r\n\r\n let cacheLangPackPromise: Promise;\r\n export let lastRequestedLangCode: string;\r\n export let lastRequestedNormalizedLangCode: string;\r\n export let lastAppliedLangCode: string;\r\n export let requestedServerLanguage = false;\r\n export let timeFormat: State['settings']['timeFormat'];\r\n\r\n function setLangCode(langCode: string) {\r\n lastRequestedLangCode = langCode;\r\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\r\n }\r\n\r\n export function getCacheLangPack(): Promise {\r\n if(cacheLangPackPromise) return cacheLangPackPromise;\r\n return cacheLangPackPromise = Promise.all([\r\n stateStorage.get('langPack') as Promise,\r\n polyfillPromise\r\n ]).then(([langPack]) => {\r\n if(!langPack/* || true */) {\r\n return loadLocalLangPack();\r\n } else if(DEBUG && false) {\r\n return getLangPack(langPack.lang_code);\r\n }/* else if(langPack.appVersion !== App.langPackVersion) {\r\n return getLangPack(langPack.lang_code);\r\n } */\r\n\r\n if(!lastRequestedLangCode) {\r\n setLangCode(langPack.lang_code);\r\n }\r\n\r\n applyLangPack(langPack);\r\n return langPack;\r\n }).finally(() => {\r\n cacheLangPackPromise = undefined;\r\n });\r\n }\r\n\r\n function updateAmPm() {\r\n if(timeFormat === 'h12') {\r\n try {\r\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\r\n const date = new Date();\r\n date.setHours(0);\r\n const amText = dateTimeFormat.format(date);\r\n amPmCache.am = amText.split(' ')[1];\r\n date.setHours(12);\r\n const pmText = dateTimeFormat.format(date);\r\n amPmCache.pm = pmText.split(' ')[1];\r\n } catch(err) {\r\n console.error('cannot get am/pm', err);\r\n amPmCache = {am: 'AM', pm: 'PM'};\r\n }\r\n }\r\n }\r\n\r\n export function setTimeFormat(\r\n format: State['settings']['timeFormat'],\r\n haveToUpdate = !!timeFormat && timeFormat !== format\r\n ) {\r\n timeFormat = format;\r\n\r\n updateAmPm();\r\n\r\n if(haveToUpdate) {\r\n cachedDateTimeFormats.clear();\r\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const instance = weakMap.get(element);\r\n\r\n if(instance instanceof IntlDateElement) {\r\n instance.update();\r\n }\r\n });\r\n }\r\n }\r\n\r\n export function loadLocalLangPack() {\r\n const defaultCode = App.langPackCode;\r\n setLangCode(defaultCode);\r\n return Promise.all([\r\n import('../lang'),\r\n import('../langSign'),\r\n import('../countries')\r\n ]).then(([lang, langSign, countries]) => {\r\n const strings: LangPackString[] = [];\r\n formatLocalStrings(lang.default, strings);\r\n formatLocalStrings(langSign.default, strings);\r\n\r\n const langPack: LangPackDifference = {\r\n _: 'langPackDifference',\r\n from_version: 0,\r\n lang_code: defaultCode,\r\n strings,\r\n version: 0,\r\n local: true,\r\n countries: countries.default\r\n };\r\n return saveLangPack(langPack);\r\n });\r\n }\r\n\r\n export function loadLangPack(langCode: string, web?: boolean) {\r\n requestedServerLanguage = true;\r\n const managers = rootScope.managers;\r\n return Promise.all([\r\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\r\n lang_code: langCode,\r\n lang_pack: web ? 'web' : App.langPack\r\n }),\r\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\r\n lang_code: langCode,\r\n lang_pack: 'android'\r\n }),\r\n import('../lang'),\r\n import('../langSign'),\r\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\r\n lang_code: langCode,\r\n hash: 0\r\n }) as Promise,\r\n polyfillPromise\r\n ]);\r\n }\r\n\r\n export function getStrings(langCode: string, strings: string[]) {\r\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\r\n lang_pack: App.langPack,\r\n lang_code: langCode,\r\n keys: strings\r\n });\r\n }\r\n\r\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\r\n for(const i in strings) {\r\n // @ts-ignore\r\n const v = strings[i];\r\n if(typeof(v) === 'string') {\r\n pushTo.push({\r\n _: 'langPackString',\r\n key: i,\r\n value: v\r\n });\r\n } else {\r\n pushTo.push({\r\n _: 'langPackStringPluralized',\r\n key: i,\r\n ...v\r\n });\r\n }\r\n }\r\n\r\n return pushTo;\r\n }\r\n\r\n export function getLangPack(langCode: string, web?: boolean) {\r\n setLangCode(langCode);\r\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\r\n let strings: LangPackString[] = [];\r\n\r\n [localLangPack1, localLangPack2].forEach((l) => {\r\n formatLocalStrings(l.default as any, strings);\r\n });\r\n\r\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\r\n\r\n langPack1.strings = strings;\r\n langPack1.countries = countries;\r\n return saveLangPack(langPack1);\r\n });\r\n }\r\n\r\n export function saveLangPack(langPack: LangPackDifference) {\r\n langPack.appVersion = App.langPackVersion;\r\n\r\n return stateStorage.set({langPack}).then(() => {\r\n applyLangPack(langPack);\r\n return langPack;\r\n });\r\n }\r\n\r\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\r\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\r\n return Promise.resolve();\r\n } else {\r\n return import('./pluralPolyfill').then((_Intl) => {\r\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\r\n });\r\n }\r\n })();\r\n\r\n export function applyLangPack(langPack: LangPackDifference) {\r\n const currentLangCode = lastRequestedLangCode;\r\n if(langPack.lang_code !== currentLangCode) {\r\n return;\r\n }\r\n\r\n try {\r\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\r\n } catch(err) {\r\n console.error('pluralRules error', err);\r\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\r\n }\r\n\r\n try {\r\n pluralRules = new Intl.PluralRules(langPack.lang_code);\r\n } catch(err) {\r\n console.error('pluralRules error', err);\r\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\r\n }\r\n\r\n strings.clear();\r\n\r\n for(const string of langPack.strings) {\r\n strings.set(string.key as LangPackKey, string);\r\n }\r\n\r\n if(langPack.countries) {\r\n countriesList.length = 0;\r\n countriesList.push(...langPack.countries.countries);\r\n\r\n langPack.countries.countries.forEach((country) => {\r\n if(country.name) {\r\n const langPackKey: any = country.default_name;\r\n strings.set(langPackKey, {\r\n _: 'langPackString',\r\n key: langPackKey,\r\n value: country.name\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(lastAppliedLangCode !== currentLangCode) {\r\n rootScope.dispatchEvent('language_change', currentLangCode);\r\n lastAppliedLangCode = currentLangCode;\r\n cachedDateTimeFormats.clear();\r\n updateAmPm();\r\n }\r\n\r\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\r\n elements.forEach((element) => {\r\n const instance = weakMap.get(element);\r\n\r\n if(instance) {\r\n instance.update();\r\n }\r\n });\r\n }\r\n\r\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\r\n const arg = args[indexHolder.i++];\r\n if(Array.isArray(arg)) {\r\n out.push(...arg as any);\r\n } else {\r\n out.push(arg);\r\n }\r\n }\r\n\r\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\r\n const out: ReturnType = [];\r\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\r\n\r\n let lastIndex = 0;\r\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\r\n // console.table({match, p1, p2, offset, string});\r\n\r\n out.push(string.slice(lastIndex, offset));\r\n\r\n if(p1) {\r\n // offset += p1.length;\r\n let element: HTMLElement;\r\n switch(p1) {\r\n case '**': {\r\n element = document.createElement('b');\r\n break;\r\n }\r\n\r\n case '__': {\r\n element = document.createElement('i');\r\n break;\r\n }\r\n }\r\n\r\n element.append(...superFormatter(p2, args, indexHolder) as any);\r\n out.push(element);\r\n } else if(p3) {\r\n out.push(document.createElement('br'));\r\n } else if(p4) {\r\n const idx = p4.lastIndexOf(']');\r\n const text = p4.slice(1, idx);\r\n\r\n const url = p4.slice(idx + 2, p4.length - 1);\r\n let a: HTMLAnchorElement;\r\n if(url && matchUrlProtocol(url)) {\r\n a = document.createElement('a');\r\n const wrappedUrl = wrapUrl(url);\r\n a.href = wrappedUrl.url;\r\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\r\n a.target = '_blank';\r\n } else {\r\n a = args[indexHolder.i++] as HTMLAnchorElement;\r\n\r\n if(a instanceof DocumentFragment) { // right after wrapRichText\r\n a = a.firstChild as any;\r\n }\r\n\r\n a.textContent = ''; // reset content\r\n }\r\n\r\n a.append(...superFormatter(text, args, indexHolder) as any);\r\n\r\n out.push(a);\r\n } else if(args) {\r\n pushNextArgument(out, args, indexHolder);\r\n }\r\n\r\n lastIndex = offset + match.length;\r\n return '';\r\n });\r\n\r\n if(lastIndex !== input.length) {\r\n out.push(input.slice(lastIndex));\r\n }\r\n\r\n return out;\r\n }\r\n\r\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\r\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\r\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\r\n const str = strings.get(key);\r\n let input: string;\r\n if(str) {\r\n if(str._ === 'langPackStringPluralized' && args?.length) {\r\n let v = args[0] as number | string;\r\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\r\n const s = pluralRules.select(v);\r\n // @ts-ignore\r\n input = str[s + '_value'] || str['other_value'];\r\n } else if(str._ === 'langPackString') {\r\n input = str.value;\r\n } else {\r\n // input = '[' + key + ']';\r\n input = key;\r\n }\r\n } else {\r\n // input = '[' + key + ']';\r\n input = key;\r\n }\r\n\r\n const result = superFormatter(input, args);\r\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\r\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\r\n } else {\r\n return result;\r\n }\r\n\r\n /* if(plain) {\r\n if(args?.length) {\r\n const regExp = /un\\d|%\\d\\$.|%./g;\r\n let i = 0;\r\n input = input.replace(regExp, (match, offset, string) => {\r\n return '' + args[i++];\r\n });\r\n }\r\n\r\n return input;\r\n } else {\r\n return superFormatter(input, args);\r\n } */\r\n }\r\n\r\n export const weakMap: WeakMap> = new WeakMap();\r\n\r\n export type IntlElementBaseOptions = {\r\n element?: HTMLElement,\r\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\r\n };\r\n\r\n abstract class IntlElementBase {\r\n public element: IntlElementBaseOptions['element'];\r\n public property: IntlElementBaseOptions['property'];\r\n\r\n constructor(options?: Options) {\r\n this.element = options?.element || document.createElement('span');\r\n this.element.classList.add('i18n');\r\n\r\n this.property = options?.property;\r\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\r\n this.update(options);\r\n }\r\n\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n abstract update(options?: Options): void;\r\n }\r\n\r\n export type IntlElementOptions = IntlElementBaseOptions & {\r\n key?: LangPackKey,\r\n args?: FormatterArguments\r\n };\r\n export class IntlElement extends IntlElementBase {\r\n public key: IntlElementOptions['key'];\r\n public args: IntlElementOptions['args'];\r\n\r\n constructor(options: IntlElementOptions = {}) {\r\n super({...options, property: options.property ?? 'innerHTML'});\r\n }\r\n\r\n public update(options?: IntlElementOptions) {\r\n safeAssign(this, options);\r\n\r\n if(this.property === 'innerHTML') {\r\n this.element.textContent = '';\r\n this.element.append(...format(this.key, false, this.args) as any);\r\n } else {\r\n // @ts-ignore\r\n const v = this.element[this.property];\r\n const formatted = format(this.key, true, this.args);\r\n\r\n // * hasOwnProperty won't work here\r\n if(v === undefined) this.element.dataset[this.property] = formatted;\r\n else (this.element as HTMLInputElement)[this.property] = formatted;\r\n }\r\n }\r\n\r\n public compareAndUpdate(options?: IntlElementOptions) {\r\n if(this.key === options.key && deepEqual(this.args, options.args)) {\r\n return;\r\n }\r\n\r\n return this.update(options);\r\n }\r\n }\r\n\r\n const cachedDateTimeFormats: Map = new Map();\r\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\r\n const json = JSON.stringify(options);\r\n let dateTimeFormat = cachedDateTimeFormats.get(json);\r\n if(!dateTimeFormat) {\r\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\r\n cachedDateTimeFormats.set(json, dateTimeFormat);\r\n }\r\n\r\n return dateTimeFormat;\r\n }\r\n\r\n export let amPmCache = {am: 'AM', pm: 'PM'};\r\n export type IntlDateElementOptions = IntlElementBaseOptions & {\r\n date?: Date,\r\n options: Intl.DateTimeFormatOptions\r\n };\r\n export class IntlDateElement extends IntlElementBase {\r\n public date: IntlDateElementOptions['date'];\r\n public options: IntlDateElementOptions['options'];\r\n\r\n constructor(options: IntlDateElementOptions) {\r\n super({...options, property: options.property ?? 'textContent'});\r\n }\r\n\r\n public update(options?: IntlDateElementOptions) {\r\n safeAssign(this, options);\r\n\r\n let text: string;\r\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\r\n const hours = this.date.getHours();\r\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\r\n // if(this.options.second) {\r\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\r\n // }\r\n\r\n if(timeFormat === 'h12') {\r\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\r\n }\r\n } else {\r\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\r\n const dateTimeFormat = getDateTimeFormat(this.options);\r\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\r\n }\r\n\r\n (this.element as any)[this.property] = text;\r\n }\r\n }\r\n\r\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\r\n return new IntlElement({key, args}).element;\r\n }\r\n\r\n export function i18n_(options: IntlElementOptions) {\r\n return new IntlElement(options).element;\r\n }\r\n\r\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\r\n return new IntlElement({element, key, args, property}).element;\r\n }\r\n}\r\n\r\nexport {I18n};\r\nexport default I18n;\r\n\r\nconst i18n = I18n.i18n;\r\nexport {i18n};\r\n\r\nconst i18n_ = I18n.i18n_;\r\nexport {i18n_};\r\n\r\nconst _i18n = I18n._i18n;\r\nexport {_i18n};\r\n\r\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\r\n const arr = elements.slice(0, 1);\r\n for(let i = 1; i < elements.length; ++i) {\r\n const isLast = (elements.length - 1) === i;\r\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\r\n arr.push(elements[i]);\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n\r\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\r\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\r\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\r\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\r\n const joined = joinElementsWith(elements, (isLast) => {\r\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\r\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\r\n });\r\n\r\n return plain ? joined.join('') : joined;\r\n}\r\n\r\nMOUNT_CLASS_TO.I18n = I18n;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {MyDialogFilter} from '../storages/filters';\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\nexport type REAL_FOLDER_ID = 0 | 1;\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\r\nexport const THUMB_TYPE_FULL = '';\r\n\r\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\r\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\r\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\r\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\r\n","import IS_CALL_SUPPORTED from './callSupport';\r\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\r\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\r\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\r\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\r\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\r\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\r\nimport IS_MOV_SUPPORTED from './movSupport';\r\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\r\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\r\nimport IS_TOUCH_SUPPORTED from './touchSupport';\r\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\r\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\r\nimport IS_WEBM_SUPPORTED from './webmSupport';\r\nimport IS_WEBP_SUPPORTED from './webpSupport';\r\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\r\nimport * as userAgent from './userAgent';\r\nimport IS_OPUS_SUPPORTED from './opusSupport';\r\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\r\nimport IS_APPLE_MX from './appleMx';\r\n\r\nconst ENVIRONMENT = {\r\n CAN_USE_TRANSFERABLES,\r\n IS_APPLE_MX,\r\n IS_CALL_SUPPORTED,\r\n IS_CANVAS_FILTER_SUPPORTED,\r\n IS_EMOJI_SUPPORTED,\r\n IS_GEOLOCATION_SUPPORTED,\r\n IS_GROUP_CALL_SUPPORTED,\r\n IS_MOV_SUPPORTED,\r\n IS_PARALLAX_SUPPORTED,\r\n IS_SCREEN_SHARING_SUPPORTED,\r\n IS_TOUCH_SUPPORTED,\r\n IS_VIBRATE_SUPPORTED,\r\n IS_OPUS_SUPPORTED,\r\n IS_SHARED_WORKER_SUPPORTED,\r\n IS_WEBM_SUPPORTED,\r\n IS_WEBP_SUPPORTED,\r\n IS_WEBRTC_SUPPORTED,\r\n IMAGE_MIME_TYPES_SUPPORTED,\r\n MEDIA_MIME_TYPES_SUPPORTED,\r\n VIDEO_MIME_TYPES_SUPPORTED,\r\n ...userAgent\r\n};\r\n\r\nexport default ENVIRONMENT;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../../../config/app';\r\nimport DEBUG from '../../../../config/debug';\r\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT} from '../../../../config/state';\r\nimport compareVersion from '../../../../helpers/compareVersion';\r\nimport copy from '../../../../helpers/object/copy';\r\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\r\nimport {UserAuth} from '../../../mtproto/mtproto_config';\r\nimport rootScope from '../../../rootScope';\r\nimport stateStorage from '../../../stateStorage';\r\nimport sessionStorage from '../../../sessionStorage';\r\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\r\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\r\nimport {StoragesResults} from '../storages/loadStorages';\r\nimport {logger} from '../../../logger';\r\n\r\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\r\n// const REFRESH_EVERY = 1e3;\r\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\r\n\r\nconst STATE_VERSION = STATE_INIT.version;\r\nconst BUILD = STATE_INIT.build;\r\n\r\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\r\n\r\nconst REFRESH_KEYS: Array = [\r\n 'contactsListCachedTime',\r\n 'stateCreatedTime',\r\n 'maxSeenMsgId',\r\n 'filtersArr'\r\n];\r\n\r\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\r\n\r\nasync function loadStateInner() {\r\n const log = logger('STATE-LOADER');\r\n\r\n const totalPerf = performance.now();\r\n const recordPromise = recordPromiseBound(log);\r\n\r\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\r\n .concat(\r\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\r\n recordPromise(sessionStorage.get('state_id'), 'auth'),\r\n recordPromise(sessionStorage.get('k_build'), 'auth')\r\n )\r\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\r\n\r\n const arr = await Promise.all(promises);\r\n log.warn('promises', performance.now() - totalPerf);\r\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\r\n /* const self = this;\r\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\r\n const getHandler = (path?: string) => {\r\n return {\r\n get(target: any, key: any) {\r\n if(key === 'isProxy') {\r\n return true;\r\n }\r\n\r\n const prop = target[key];\r\n\r\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\r\n target[key] = new Proxy(prop, getHandler(path || key));\r\n return target[key];\r\n }\r\n\r\n return prop;\r\n },\r\n set(target: any, key: any, value: any) {\r\n console.log('Setting', target, `.${key} to equal`, value, path);\r\n\r\n target[key] = value;\r\n\r\n // @ts-ignore\r\n self.pushToState(path || key, path ? self.state[path] : value, false);\r\n\r\n return true;\r\n }\r\n };\r\n }; */\r\n\r\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\r\n const pushedKeys: (keyof State)[] = [];\r\n const pushToState = (key: T, value: State[T]) => {\r\n // appStateManager.pushToState(key, value);\r\n state[key] = value;\r\n // pushed.push({key, value});\r\n pushedKeys.push(key);\r\n };\r\n\r\n const replaceState = (_state: State) => {\r\n // pushed.length = 0;\r\n pushedKeys.length = 0;\r\n state = _state;\r\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\r\n // state = appStateManager.setState(_state);\r\n // appStateManager.storage.set(state);\r\n };\r\n\r\n // let state: State = appStateManager.setState({} as any);\r\n let state: State = {} as any;\r\n\r\n // ! then can't store false values\r\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\r\n const key = ALL_KEYS[i];\r\n const value = arr[i];\r\n if(value !== undefined) {\r\n // @ts-ignore\r\n state[key] = value;\r\n } else {\r\n pushToState(key, copy(STATE_INIT[key]));\r\n }\r\n }\r\n\r\n arr.splice(0, ALL_KEYS.length);\r\n\r\n // * Read auth\r\n let auth = arr.shift() as UserAuth | number;\r\n const stateId = arr.shift() as number;\r\n const sessionBuild = arr.shift() as number;\r\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\r\n if(!auth && shiftedWebKAuth) { // support old webk auth\r\n auth = shiftedWebKAuth;\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\r\n keys.push('user_auth');\r\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\r\n\r\n const obj: any = {};\r\n keys.forEach((key, idx) => {\r\n obj[key] = values[idx];\r\n });\r\n\r\n await sessionStorage.set(obj);\r\n }\r\n\r\n /* if(!auth) { // try to read Webogram's session from localStorage\r\n try {\r\n const keys = Object.keys(localStorage);\r\n for(let i = 0; i < keys.length; ++i) {\r\n const key = keys[i];\r\n let value: any;\r\n try {\r\n value = localStorage.getItem(key);\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n\r\n sessionStorage.set({\r\n [key as any]: value\r\n });\r\n }\r\n\r\n auth = sessionStorage.getFromCache('user_auth');\r\n } catch(err) {\r\n this.log.error('localStorage import error', err);\r\n }\r\n } */\r\n\r\n if(auth) {\r\n // ! Warning ! DON'T delete this\r\n state.authState = {_: 'authStateSignedIn'};\r\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\r\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\r\n auth); // * support old version\r\n }\r\n\r\n const resetStorages: Set = new Set();\r\n if(state.stateId !== stateId) {\r\n if(stateId !== undefined) {\r\n const preserve: Map = new Map([\r\n ['authState', undefined],\r\n ['stateId', undefined]\r\n ]);\r\n\r\n preserve.forEach((_, key) => {\r\n preserve.set(key, copy(state[key]));\r\n });\r\n\r\n state = copy(STATE_INIT);\r\n\r\n preserve.forEach((value, key) => {\r\n // @ts-ignore\r\n state[key] = value;\r\n });\r\n\r\n const r: {[k in keyof StoragesResults]: number} = {\r\n chats: 1,\r\n dialogs: 1,\r\n users: 1\r\n };\r\n for(const key in r) {\r\n resetStorages.add(key as keyof StoragesResults);\r\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\r\n }\r\n\r\n replaceState(state);\r\n }\r\n\r\n await sessionStorage.set({\r\n state_id: state.stateId\r\n });\r\n }\r\n\r\n const time = Date.now();\r\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\r\n if(DEBUG) {\r\n log('will refresh state', state.stateCreatedTime, time);\r\n }\r\n\r\n const r = (keys: typeof REFRESH_KEYS) => {\r\n keys.forEach((key) => {\r\n pushToState(key, copy(STATE_INIT[key]));\r\n\r\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\r\n // if(s?.length) {\r\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\r\n // s.length = 0;\r\n // }\r\n });\r\n };\r\n\r\n r(REFRESH_KEYS);\r\n\r\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\r\n if(DEBUG) {\r\n this.log('will refresh updates');\r\n }\r\n\r\n r(REFRESH_KEYS_WEEK);\r\n } */\r\n }\r\n\r\n // state = this.state = new Proxy(state, getHandler());\r\n\r\n // * support old version\r\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\r\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\r\n pushToState('settings', state.settings);\r\n }\r\n\r\n // * support old version\r\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\r\n state.settings.themes = copy(STATE_INIT.settings.themes);\r\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\r\n if(theme) {\r\n theme.background = state.settings.background;\r\n pushToState('settings', state.settings);\r\n }\r\n }\r\n\r\n // * migrate auto download settings\r\n const autoDownloadSettings = state.settings.autoDownload;\r\n if(autoDownloadSettings?.private !== undefined) {\r\n const oldTypes = [\r\n 'contacts' as const,\r\n 'private' as const,\r\n 'groups' as const,\r\n 'channels' as const\r\n ];\r\n\r\n const mediaTypes = [\r\n 'photo' as const,\r\n 'video' as const,\r\n 'file' as const\r\n ];\r\n\r\n mediaTypes.forEach((mediaType) => {\r\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\r\n oldTypes.forEach((peerType) => {\r\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\r\n });\r\n });\r\n\r\n oldTypes.forEach((peerType) => {\r\n delete autoDownloadSettings[peerType];\r\n });\r\n\r\n pushToState('settings', state.settings);\r\n }\r\n\r\n validateInitObject(STATE_INIT, state, (missingKey) => {\r\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\r\n });\r\n\r\n let newVersion: string, oldVersion: string;\r\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\r\n // reset filters and dialogs if version is older\r\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\r\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\r\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\r\n state.filtersArr = copy(STATE_INIT.filtersArr);\r\n\r\n resetStorages.add('dialogs');\r\n }\r\n\r\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\r\n if(compareVersion(state.version, '1.3.0') === -1) {\r\n let migrated = false;\r\n state.settings.themes.forEach((theme, idx, arr) => {\r\n if((\r\n theme.name === 'day' &&\r\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\r\n theme.background.type === 'image'\r\n ) || (\r\n theme.name === 'night' &&\r\n theme.background.color === '#0f0f0f' &&\r\n theme.background.type === 'color'\r\n )) {\r\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\r\n if(newTheme) {\r\n arr[idx] = copy(newTheme);\r\n migrated = true;\r\n }\r\n }\r\n });\r\n\r\n if(migrated) {\r\n pushToState('settings', state.settings);\r\n }\r\n }\r\n\r\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\r\n newVersion = STATE_VERSION;\r\n oldVersion = state.version;\r\n }\r\n\r\n pushToState('version', STATE_VERSION);\r\n pushToState('build', BUILD);\r\n }\r\n\r\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\r\n sessionStorage.set({k_build: BUILD});\r\n }\r\n\r\n // ! probably there is better place for it\r\n rootScope.settings = state.settings;\r\n\r\n if(DEBUG) {\r\n log('state res', state, copy(state));\r\n }\r\n\r\n // return resolve();\r\n\r\n log.warn('total', performance.now() - totalPerf);\r\n\r\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\r\n\r\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\r\n}\r\n\r\nlet promise: ReturnType;\r\nexport default function loadState() {\r\n return promise ??= loadStateInner();\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport tabId from '../../config/tabId';\r\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\nimport idleController from '../../helpers/idleController';\r\nimport {logger} from '../logger';\r\nimport rootScope from '../rootScope';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManagerProxy from './mtprotoworker';\r\n\r\nexport type AppInstance = {\r\n id: number,\r\n idle: boolean,\r\n time: number\r\n};\r\n\r\nexport type InstanceDeactivateReason = 'version' | 'tabs';\r\n\r\nconst CHECK_INSTANCE_INTERVAL = 5000;\r\nconst DEACTIVATE_TIMEOUT = 30000;\r\nconst MULTIPLE_TABS_THRESHOLD = 20000;\r\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\r\n\r\nexport class SingleInstance extends EventListenerBase<{\r\n activated: () => void,\r\n deactivated: (reason: InstanceDeactivateReason) => void\r\n}> {\r\n private instanceId: number;\r\n private started: boolean;\r\n private masterInstance: boolean;\r\n private deactivateTimeout: number;\r\n private deactivated: InstanceDeactivateReason;\r\n private log = logger('INSTANCE');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n this.log = logger('INSTANCE');\r\n this.instanceId = tabId;\r\n }\r\n\r\n public get deactivatedReason() {\r\n return this.deactivated;\r\n }\r\n\r\n public start() {\r\n this.reset();\r\n\r\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\r\n this.started = true;\r\n\r\n idleController.addEventListener('change', this.checkInstance);\r\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\r\n this.checkInstance();\r\n\r\n try {\r\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n private reset() {\r\n this.masterInstance = false;\r\n this.clearDeactivateTimeout();\r\n this.deactivated = undefined;\r\n }\r\n\r\n private clearInstance = () => {\r\n if(this.masterInstance && !this.deactivated) {\r\n this.log.warn('clear master instance');\r\n sessionStorage.delete('xt_instance');\r\n }\r\n };\r\n\r\n public activateInstance() {\r\n if(this.deactivated) {\r\n this.reset();\r\n this.checkInstance(false);\r\n this.dispatchEvent('activated');\r\n }\r\n }\r\n\r\n private deactivateInstance(reason: InstanceDeactivateReason) {\r\n if(this.masterInstance || this.deactivated) {\r\n return;\r\n }\r\n\r\n this.log.warn('deactivate', reason);\r\n this.clearDeactivateTimeout();\r\n this.deactivated = reason;\r\n\r\n this.dispatchEvent('deactivated', reason);\r\n }\r\n\r\n private clearDeactivateTimeout() {\r\n if(this.deactivateTimeout) {\r\n clearTimeout(this.deactivateTimeout);\r\n this.deactivateTimeout = 0;\r\n }\r\n }\r\n\r\n private checkInstance = async(idle = idleController.isIdle) => {\r\n if(this.deactivated) {\r\n return;\r\n }\r\n\r\n const time = Date.now();\r\n const newInstance: AppInstance = {\r\n id: this.instanceId,\r\n idle,\r\n time\r\n };\r\n\r\n const [curInstance, build = App.build] = await Promise.all([\r\n sessionStorage.get('xt_instance', false),\r\n sessionStorage.get('k_build', false)\r\n ]);\r\n\r\n if(build > App.build) {\r\n this.masterInstance = false;\r\n rootScope.managers.networkerFactory.stopAll();\r\n this.deactivateInstance('version');\r\n apiManagerProxy.toggleStorages(false, false);\r\n return;\r\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\r\n sessionStorage.set({xt_instance: newInstance});\r\n return;\r\n }\r\n\r\n // this.log('check instance', newInstance, curInstance)\r\n if(!idle ||\r\n !curInstance ||\r\n curInstance.id === this.instanceId ||\r\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\r\n sessionStorage.set({xt_instance: newInstance});\r\n\r\n if(!this.masterInstance) {\r\n this.masterInstance = true;\r\n rootScope.managers.networkerFactory.startAll();\r\n this.log.warn('now master instance', newInstance);\r\n }\r\n\r\n this.clearDeactivateTimeout();\r\n } else if(this.masterInstance) {\r\n this.masterInstance = false;\r\n rootScope.managers.networkerFactory.stopAll();\r\n this.log.warn('now idle instance', newInstance);\r\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\r\n }\r\n };\r\n}\r\n\r\nconst singleInstance = new SingleInstance();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\r\nexport default singleInstance;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from '../../config/app';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport Modes from '../../config/modes';\r\nimport loadScript from '../../helpers/dom/loadScript';\r\nimport tsNow from '../../helpers/tsNow';\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(\r\n canRedirect &&\r\n curValue?.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts\r\n ) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect,\r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map((url) => {\r\n return loadScript(url).then((script) => {\r\n script.remove();\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function loadScript(url: string) {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n resolve(script);\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type {PushNotificationObject} from '../serviceWorker/push';\r\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\r\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport {logger} from '../logger';\r\nimport apiManagerProxy from './mtprotoworker';\r\nimport I18n, {LangPackKey} from '../langPack';\r\nimport {IS_MOBILE} from '../../environment/userAgent';\r\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\r\nimport copy from '../../helpers/object/copy';\r\nimport singleInstance from './singleInstance';\r\nimport EventListenerBase from '../../helpers/eventListenerBase';\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager extends EventListenerBase<{\r\n push_notification_click: (n: PushNotificationObject) => void,\r\n push_init: (n: PushSubscriptionNotify) => void,\r\n push_subscribe: (n: PushSubscriptionNotify) => void,\r\n push_unsubscribe: (n: PushSubscriptionNotify) => void\r\n}> {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n super(false);\r\n\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || singleInstance.deactivatedReason) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\r\n\r\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n });\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\r\n if(singleInstance.deactivatedReason) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n this.dispatchEvent('push_notification_click', payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n\r\n this.log.warn('Push', event, subscriptionObj);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\r\nimport {IS_SAFARI} from '../environment/userAgent';\r\nimport {Modify} from '../types';\r\nimport {logger, LogTypes} from './logger';\r\nimport apiManagerProxy from './mtproto/mtprotoworker';\r\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\r\n\r\ntype Result = {\r\n bytes: Uint8Array,\r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport interface ConvertOpusTask extends Modify {\r\n type: 'convertOpus'\r\n}\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker: Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n return IS_OPUS_SUPPORTED;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n // this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n // this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n\r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({\r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({\r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n // console.log('sending command to worker:', task);\r\n // setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n // }, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\r\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\r\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n *\r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport emojiRegExp from '../../vendor/emoji/regex';\r\nimport {MessageEntity} from '../../layer';\r\n\r\nconst EmojiHelper = {\r\n emojiMap: (code: string) => { return code; },\r\n shortcuts: [] as any,\r\n emojis: [] as any\r\n};\r\n\r\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\r\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\r\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\r\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\r\n '\\\\u02bb' + // Hawaiian\r\n '\\\\u0300-\\\\u036f' + // Combining diacritics\r\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\r\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\r\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\r\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\r\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\r\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\r\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\r\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\r\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\r\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\r\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\r\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\r\n '\\\\u200c' + // Zero-Width Non-Joiner\r\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\r\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\r\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\r\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\r\n '\\\\uff66-\\\\uff9f' + // half width Katakana\r\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\r\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\r\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\r\n// Based on Regular Expression for URL validation by Diego Perini\r\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\r\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\r\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\r\n // user:pass authentication\r\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\r\n '(?:' +\r\n // sindresorhus/ip-regexp\r\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\r\n '|' +\r\n // host name\r\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\r\n // domain name\r\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\r\n // TLD identifier\r\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\r\n ')' +\r\n // port number\r\n '(?::\\\\d{2,5})?' +\r\n // resource path\r\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\r\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\r\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\r\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\r\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\r\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\r\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n// const markdownTestRegExp = /[`_*@~]/;\r\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\r\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\r\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\r\n 'Twitter': 'https://twitter.com/hashtag/{1}',\r\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\r\n 'Google Plus': 'https://plus.google.com/explore/{1}'\r\n};\r\n\r\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\r\n// Telegram: '#{1}',\r\n// Twitter: 'https://twitter.com/{1}',\r\n// Instagram: 'https://instagram.com/{1}/',\r\n// GitHub: 'https://github.com/{1}'\r\n// };\r\n\r\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\r\n '`': 'messageEntityCode',\r\n '``': 'messageEntityPre',\r\n '**': 'messageEntityBold',\r\n '__': 'messageEntityItalic',\r\n '~~': 'messageEntityStrike',\r\n '_-_': 'messageEntityUnderline',\r\n '||': 'messageEntitySpoiler'\r\n};\r\n\r\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\r\n 'messageEntityEmoji',\r\n 'messageEntityLinebreak',\r\n 'messageEntityCaret'\r\n]);\r\nfor(const i in MARKDOWN_ENTITIES) {\r\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\r\n}\r\n\r\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\r\n\r\n/* export function parseEmojis(text: string) {\r\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\r\n var emojiCode = EmojiHelper.shortcuts[shortcut]\r\n if (emojiCode !== undefined) {\r\n return EmojiHelper.emojis[emojiCode][0]\r\n }\r\n return all\r\n })\r\n} */\r\n\r\n\r\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\r\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\r\n try {\r\n return decodeURIComponent(str);\r\n } catch (e) {\r\n return str;\r\n }\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\r\nimport type {AppMessagesManager, Dialog, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\r\nimport type {MyDialogFilter} from './storages/filters';\r\nimport type {Folder} from './storages/dialogs';\r\nimport type {UserTyping} from './appManagers/appProfileManager';\r\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\r\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\r\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\r\nimport type {AppManagers} from './appManagers/managers';\r\nimport type {State} from '../config/state';\r\nimport type {Progress} from './appManagers/appDownloadManager';\r\nimport type {CallId} from './appManagers/appCallsManager';\r\nimport type {MyDocument} from './appManagers/appDocsManager';\r\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\r\nimport EventListenerBase from '../helpers/eventListenerBase';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\r\nimport {IS_WORKER} from '../helpers/context';\r\nimport {MTAppConfig} from './mtproto/appConfig';\r\n\r\nexport type BroadcastEvents = {\r\n 'chat_full_update': ChatId,\r\n 'chat_update': ChatId,\r\n\r\n 'channel_update': ChatId,\r\n\r\n 'user_update': UserId,\r\n 'user_auth': UserAuth,\r\n 'user_full_update': UserId,\r\n\r\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\r\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\r\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\r\n 'peer_block': {peerId: PeerId, blocked: boolean},\r\n 'peer_title_edit': PeerId,\r\n 'peer_bio_edit': PeerId,\r\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\r\n 'peer_full_update': PeerId,\r\n\r\n 'filter_delete': MyDialogFilter,\r\n 'filter_update': MyDialogFilter,\r\n 'filter_new': MyDialogFilter,\r\n 'filter_order': number[],\r\n\r\n 'folder_unread': Omit,\r\n\r\n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined},\r\n 'dialog_unread': {peerId: PeerId, dialog: Dialog},\r\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\r\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\r\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\r\n // 'dialog_top': Dialog,\r\n 'dialog_notify_settings': Dialog,\r\n // 'dialog_order': {dialog: Dialog, pos: number},\r\n 'dialogs_multiupdate': Map,\r\n\r\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\r\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\r\n 'history_reply_markup': {peerId: PeerId},\r\n 'history_multiappend': MyMessage,\r\n 'history_delete': {peerId: PeerId, msgs: Set},\r\n 'history_forbidden': PeerId,\r\n 'history_reload': PeerId,\r\n // 'history_request': void,\r\n\r\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\r\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\r\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\r\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\r\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\r\n 'messages_pending': void,\r\n 'messages_read': void,\r\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\r\n 'messages_media_read': {peerId: PeerId, mids: number[]},\r\n\r\n 'replies_updated': Message.message,\r\n\r\n 'scheduled_new': Message.message,\r\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\r\n\r\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\r\n\r\n 'stickers_installed': StickerSet.stickerSet,\r\n 'stickers_deleted': StickerSet.stickerSet,\r\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\r\n 'stickers_top': Long,\r\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\r\n\r\n 'state_cleared': void,\r\n 'state_synchronized': ChatId | void,\r\n 'state_synchronizing': ChatId | void,\r\n\r\n 'contacts_update': UserId,\r\n 'avatar_update': PeerId,\r\n 'poll_update': {poll: Poll, results: PollResults},\r\n 'invalidate_participants': ChatId,\r\n // 'channel_settings': {channelId: number},\r\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\r\n\r\n 'connection_status_change': ConnectionStatusChange,\r\n 'settings_updated': {key: string, value: any, settings: State['settings']},\r\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\r\n\r\n 'background_change': void,\r\n\r\n 'privacy_update': Update.updatePrivacy,\r\n\r\n 'notify_settings': Update.updateNotifySettings,\r\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\r\n\r\n 'notification_reset': string,\r\n 'notification_cancel': string,\r\n\r\n 'language_change': string,\r\n\r\n 'theme_change': void,\r\n\r\n 'media_play': void,\r\n\r\n 'emoji_recent': AppEmoji,\r\n\r\n 'download_progress': Progress,\r\n 'document_downloading': DocId,\r\n 'document_downloaded': DocId,\r\n\r\n 'choosing_sticker': boolean\r\n\r\n 'group_call_update': GroupCall,\r\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\r\n // 'group_call_video_track_added': {instance: GroupCallInstance}\r\n\r\n 'call_update': PhoneCall,\r\n 'call_signaling': {callId: CallId, data: Uint8Array},\r\n\r\n 'quick_reaction': Reaction,\r\n\r\n 'service_notification': Update.updateServiceNotification,\r\n\r\n 'logging_out': void,\r\n\r\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\r\n\r\n 'premium_toggle': boolean,\r\n\r\n 'config': Config,\r\n 'app_config': MTAppConfig\r\n};\r\n\r\nexport type BroadcastEventsListeners = {\r\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\r\n};\r\n\r\nexport class RootScope extends EventListenerBase {\r\n public myId: PeerId;\r\n private connectionStatus: {[name: string]: ConnectionStatusChange};\r\n public settings: State['settings'];\r\n public managers: AppManagers;\r\n public premium: boolean;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.myId = NULL_PEER_ID;\r\n this.connectionStatus = {};\r\n this.premium = false;\r\n\r\n this.addEventListener('user_auth', ({id}) => {\r\n this.myId = id.toPeerId();\r\n });\r\n\r\n this.addEventListener('premium_toggle', (isPremium) => {\r\n this.premium = isPremium;\r\n });\r\n\r\n this.addEventListener('connection_status_change', (status) => {\r\n this.connectionStatus[status.name] = status;\r\n });\r\n\r\n this.dispatchEvent = (e, ...args) => {\r\n super.dispatchEvent(e, ...args);\r\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\r\n };\r\n\r\n if(!IS_WORKER) {\r\n this.addEventListener('settings_updated', ({settings}) => {\r\n this.settings = settings;\r\n });\r\n }\r\n }\r\n\r\n public getConnectionStatus() {\r\n return this.connectionStatus;\r\n }\r\n\r\n public getPremium() {\r\n return this.premium;\r\n }\r\n\r\n public dispatchEventSingle(...args: any[]) {\r\n // @ts-ignore\r\n super.dispatchEvent(...args);\r\n }\r\n}\r\n\r\nconst rootScope = new RootScope();\r\nMOUNT_CLASS_TO.rootScope = rootScope;\r\nexport default rootScope;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../../config/debug';\r\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\r\nimport {WorkerTaskVoidTemplate} from '../../types';\r\n\r\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\r\n type: 'convertWebp',\r\n payload: {\r\n fileName: string,\r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n\r\n private init() {\r\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\r\n this.worker.addEventListener('message', (e) => {\r\n const task = e.data as ConvertWebPTask;\r\n const payload = task.payload;\r\n\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n });\r\n }\r\n\r\n private postMessage(data: ConvertWebPTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n\r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"ecbe3e5cdfb6e654ee52\",\"51\":\"8b4ab19d8c6587b76634\",\"53\":\"8bfa61ba024fd632fdde\",\"61\":\"f5e00b009f2c3385ec4d\",\"63\":\"4e241d02175c70e2e70e\",\"77\":\"808c5b447b007ee7aa9d\",\"104\":\"ba6f2eaff4f47e31c2f7\",\"231\":\"ae6d08dea450cdc2a20b\",\"301\":\"64e4d58535811468fea7\",\"339\":\"513f8f846da243a8904b\",\"392\":\"044ceb2a1f1c13877e64\",\"408\":\"9e46ec9ccf68591b6a7f\",\"436\":\"ca90a733cc3f8caefe72\",\"442\":\"59acb78e0c274fad18de\",\"508\":\"215d590b7bff6cacce80\",\"589\":\"be9fd0d0127f885b73a7\",\"630\":\"5c8af6e9c411419a66e1\",\"641\":\"e5e9850b9d31fff64129\",\"642\":\"cc8956bde224050c852a\",\"670\":\"a9d8d342bbc5dc55110a\",\"678\":\"6c4901ee819c678078d6\",\"709\":\"2627ebc4f7baa177c42d\",\"774\":\"5f09bf7104b9d59508df\",\"776\":\"ce9bc22bd510d270fc19\",\"781\":\"6ea12a6084f2f99d5d04\",\"783\":\"f11cb0c1a31abe1156bd\",\"810\":\"ae3a5a3ebb78c791075f\",\"813\":\"c8b66a1753b73d81badb\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [437,570], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","oldGetScript","oldLoadScript","queryMap","countMap","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","window","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","replaceChildren","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","elem","promise","opacity","state","isPremium","appVersion","lang_code","console","log","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","RootScope","myId","connectionStatus","premium","status","getConnectionStatus","getPremium","dispatchEventSingle","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","u","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","retries","realSrc","cacheBust","baseURI","self","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}