tweb/public/641.1fc33fe3e0c4c0c41a9e.ch...

1 line
32 KiB
Plaintext

{"version":3,"file":"641.1fc33fe3e0c4c0c41a9e.chunk.js","mappings":"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","sources":["webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts","webpack://tweb/./src/helpers/fixBase64String.ts"],"sourcesContent":["/*\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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport loadFonts from '../helpers/dom/loadFonts';\nimport {Config, LangPackDifference, LangPackString} from '../layer';\nimport I18n, {LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport {putPreloader} from './putPreloader';\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = rootScope.managers.apiManager.getConfig().then((config) => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n // I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType<typeof getLang>;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach((string) => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n\n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const key: LangPackKey = 'Login.ContinueOnLanguage';\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: key});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts({text: [I18n.format(key, true)]}).then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach((string) => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\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 {putPreloader} from '../components/putPreloader';\r\nimport Page from './page';\r\nimport CheckboxField from '../components/checkboxField';\r\nimport Button from '../components/button';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport App from '../config/app';\r\nimport I18n, {_i18n, i18n} from '../lib/langPack';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport ripple from '../components/ripple';\r\nimport pageSignQR from './pageSignQR';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport {DcAuthKey} from '../types';\r\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\r\nimport {HelpCountry, HelpCountryCode} from '../layer';\r\nimport stateStorage from '../lib/stateStorage';\r\nimport rootScope from '../lib/rootScope';\r\nimport TelInputField from '../components/telInputField';\r\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\r\nimport CountryInputField from '../components/countryInputField';\r\n\r\n// import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nconst onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n\r\n console.log('Added test country to list!');\r\n } */\r\n\r\n // const countries: Country[] = _countries.default.filter((c) => c.emoji);\r\n // const countries: Country[] = Countries.filter((c) => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter((country) => !country.pFlags?.hidden);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n const countryInputField = new CountryInputField({\r\n onCountryChange: (country, code) => {\r\n lastCountrySelected = country, lastCountryCodeSelected = code;\r\n\r\n if(!code) {\r\n return;\r\n }\r\n\r\n telInputField.value = telInputField.lastValue = '+' + code.country_code;\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n }\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n const countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected ||\r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country &&\r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n countryInputField.override(country, code, countryName);\r\n }\r\n\r\n // if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n // console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned',\r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n rootScope.managers.appStateManager.pushToState('keepSigned', keepSigned);\r\n\r\n apiManagerProxy.toggleStorages(keepSigned, true);\r\n });\r\n\r\n apiManagerProxy.getState().then((state) => {\r\n if(!stateStorage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n // return;\r\n\r\n const phone_number = telInputField.value;\r\n rootScope.managers.apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n // lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n // console.log('got code', code);\r\n\r\n import('./pageAuthCode').then((m) => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch((err) => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n const qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then((module) => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n const tryAgain = () => {\r\n rootScope.managers.apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n telInputField.simulateInputEvent();\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise<any>;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = rootScope.managers.apiManager.getNetworkerVoid(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach((dcId) => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise<void> => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n rootScope.managers.apiManager.getNetworkerVoid(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n\r\n g();\r\n });\r\n\r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n countryInputField.selectCountryByIso2(nearestDcResult.country);\r\n }\r\n\r\n // console.log('woohoo', nearestDcResult, country);\r\n })// .catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26 ?\n nUint6 + 65 :\n nUint6 < 52 ?\n nUint6 + 71 :\n nUint6 < 62 ?\n nUint6 - 4 :\n nUint6 === 62 ?\n 43 :\n nUint6 === 63 ?\n 47 :\n 65;\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 type {DcId} from '../types';\r\nimport Page from './page';\r\nimport {AuthAuthorization, AuthLoginToken} from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport {_i18n, i18n, LangPackKey} from '../lib/langPack';\r\nimport rootScope from '../lib/rootScope';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport pause from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nconst onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then((m) => m.default.mount());\r\n stop = true;\r\n });\r\n\r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n\r\n const options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await rootScope.managers.apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n\r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n rootScope.managers.apiManager.setBaseDcId(loginToken.dc_id);\r\n // continue;\r\n }\r\n\r\n loginToken = await rootScope.managers.apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n rootScope.managers.apiManager.setUser(authorization.user);\r\n import('./pageIm').then((m) => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n const encoded = bytesToBase64(loginToken.token);\r\n const url = 'tg://login?token=' + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then((res) => res.text())\r\n .then((text) => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n // return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: 'L'\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise<void>;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise<void>((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach((el) => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n const timestamp = Date.now() / 1000;\r\n const diff = loginToken.expires - timestamp - await rootScope.managers.timeManager.getServerTimeOffset();\r\n\r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then((m) => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n\r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise<void>>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n // console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then((func) => {\r\n func();\r\n });\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","once","e","disabled","btnQr","btnNext","page","inputWrapper","document","createElement","lastCountrySelected","lastCountryCodeSelected","add","countryInputField","onCountryChange","country","code","telInputField","value","lastValue","country_code","setTimeout","telEl","focus","onInput","formatted","countryName","name","default_name","override","length","style","visibility","input","addEventListener","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","label","toggle","phone_number","api_id","api_hash","settings","_","m","default","mount","Object","assign","catch","err","type","setError","console","error","innerText","container","h4","subtitle","pageEl","querySelector","nearestDcResult","langPack","countries","hash","lang_code","simulateInputEvent","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","selectCountryByIso2","undefined","removeAttribute","uint6ToBase64","nUint6","imageDiv","preloader","putPreloader","btnBack","parentElement","helpList","li","stop","QRCodeStyling","rootScope","options","ignoreErrors","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","user","bytesCmp","url","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","replace","bytesToBase64","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","target","readAsDataURL","qrCode","width","devicePixelRatio","height","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","pause","_canvas","_image","animation","c","children","display","Array","from","slice","el","timestamp","Date","now","diff","expires","handled","func"],"sourceRoot":""}